From 884795c874174fd293bab554ee8a544fe45580c1 Mon Sep 17 00:00:00 2001 From: Pavel Konov Date: Sun, 6 Sep 2026 02:58:32 -0700 Subject: [PATCH] Add optional optimization APIs and automatic native strategies Introduce Gecode::Optimize owning sparse models, explicit result guarantees, starts, exchange, sessions and reusable optimization workflows. Supply numerical LP/MILP and bounded weighted-square continuous QP through HiGHS, plus an exact native integer bridge retaining supported globals and documented C/Python APIs. Select compatible checked LP, cover cuts and branching automatically. Compose bounded exact presolve, independent components and identical-column symmetry. Restore original witnesses, offsets and proofs under one shared solve budget. Use rolling knapsack value rows and packed traceback with work/memory/time caps. Add opt-in sequential strategy racing in C++, with configurable exploration. Probe automatic and ordinary native search, select from checked incumbents and bounds, and restart under the remaining shared time/node/cancellation budget. Preserve the best probe result. Explicitly document increased CPU/solve-time costs and the possibility of discovering a much better strategy for longer solves. Do not expose the new racing option through MiniZinc yet; add no conflict learning. Validation: complete isolated Release build and 75/75 CTest entries pass; focused racing checks pass without checked LP and without native backends. Exhaustive original-oracle, shared-budget and larger-generator checks pass. Preserve historical observations and add the final three-cohort comparison: original pre-algorithm native runtime, current automatic racing and frozen family presets. Expand to observed failed upper inputs without study ceilings, then refine and confirm sampled brackets. Charge exploration to the same ten seconds and retain all witnesses, outcomes, settings and provenance. State nonmonotonicity, backend-reported optimality and combined-policy attribution. --- .editorconfig | 4 + .github/pr/solver-parity-commit.txt | 28 + .github/pr/solver-parity.md | 69 + .../workflows/fast-windows-containment.yml | 49 + .github/workflows/optimize.yml | 335 + CMakeLists.txt | 155 +- Makefile.in | 21 + README.md | 38 + cmake/GecodeConfig.cmake.in | 27 +- cmake/GecodeSources.cmake | 1 + docs/solver-parity/ADAPTIVE-BOUNDARIES.md | 105 + docs/solver-parity/ALGORITHMIC-CHECKPOINT.md | 196 + docs/solver-parity/BENCHMARKS.md | 172 + docs/solver-parity/BINDINGS.md | 714 + docs/solver-parity/BRANCHING-DESIGN.md | 346 + docs/solver-parity/BULK.md | 145 + docs/solver-parity/CAPACITY-SCALING.md | 139 + docs/solver-parity/CATEGORY-SCALING.md | 177 + docs/solver-parity/CONFIGURED-BENCHMARK.md | 116 + docs/solver-parity/CONSTRAINTS.md | 138 + docs/solver-parity/CUT-LOOP.md | 183 + docs/solver-parity/CUTS.md | 211 + docs/solver-parity/DIAGNOSTICS.md | 125 + docs/solver-parity/FAST-REGRESSION.md | 108 + docs/solver-parity/FINAL-BENCHMARK.md | 55 + docs/solver-parity/FLATZINC-CAPTURE.md | 46 + docs/solver-parity/FLATZINC-COMPILER.md | 324 + docs/solver-parity/FLATZINC-DESIGN.md | 404 + docs/solver-parity/FLATZINC-DRIVER.md | 65 + docs/solver-parity/FLATZINC-GLOBALS-DESIGN.md | 345 + docs/solver-parity/GLOBALS.md | 80 + docs/solver-parity/IMPLEMENTATION.md | 134 + docs/solver-parity/IO.md | 70 + docs/solver-parity/LEARNING-DESIGN.md | 211 + docs/solver-parity/LP-BASIS-BINDINGS.md | 39 + docs/solver-parity/LP-BASIS.md | 150 + docs/solver-parity/LP-EVIDENCE-BINDINGS.md | 162 + docs/solver-parity/LP-EVIDENCE-DESIGN.md | 267 + docs/solver-parity/LP-EVIDENCE.md | 40 + docs/solver-parity/LP-OBSERVATIONS-DESIGN.md | 450 + docs/solver-parity/LP-OBSERVATIONS.md | 156 + .../LP-SENSITIVITY-BINDINGS-DESIGN.md | 309 + docs/solver-parity/LP-SENSITIVITY-BINDINGS.md | 163 + docs/solver-parity/LP-SENSITIVITY-DESIGN.md | 501 + docs/solver-parity/LP-SENSITIVITY.md | 185 + docs/solver-parity/MINIZINC.md | 225 + docs/solver-parity/NATIVE-LP.md | 217 + .../NATIVE-NEIGHBORHOODS-DESIGN.md | 488 + docs/solver-parity/NATIVE-NEIGHBORHOODS.md | 226 + docs/solver-parity/NATIVE-PRIMALS-DESIGN.md | 468 + docs/solver-parity/NATIVE-SEARCH.md | 334 + docs/solver-parity/NATIVE.md | 382 + docs/solver-parity/NINTH-CHECKPOINT.md | 147 + docs/solver-parity/POOLS.md | 166 + docs/solver-parity/PRESOLVE.md | 181 + .../PROGRESS-ASSESSMENT-2026-09-05.md | 195 + docs/solver-parity/QUADRATIC-DESIGN.md | 388 + docs/solver-parity/QUADRATIC.md | 200 + docs/solver-parity/README.md | 250 + docs/solver-parity/REGULAR-BINDINGS.md | 31 + docs/solver-parity/REGULAR.md | 172 + docs/solver-parity/RELAXATION.md | 160 + docs/solver-parity/SCENARIO-BINDINGS.md | 140 + docs/solver-parity/SCENARIOS-DESIGN.md | 409 + docs/solver-parity/SCENARIOS.md | 180 + docs/solver-parity/SESSIONS.md | 62 + docs/solver-parity/SPARSE-LP.md | 311 + docs/solver-parity/VALIDATION.md | 751 + docs/solver-parity/WHEELS.md | 106 + docs/solver-parity/WORKFLOWS.md | 59 + .../checkpoints/benchmark-page.json | 1109 + .../solver-parity/checkpoints/boundaries.json | 281540 ++++++ .../checkpoints/capacity-scaling.json | 50605 + .../checkpoints/category-scaling.json | 122644 +++ .../solver-parity/checkpoints/configured.json | 737086 +++++++++++++++ .../checkpoints/native-algorithms.json | 30541 + docs/solver-parity/checkpoints/ninth.json | 680 + docs/solver-parity/dependencies.json | 11 + .../final-benchmark-checkpoint.json | 394 + doxygen/doxygen.conf.in | 12 +- doxygen/doxygen.hh.in | 8 +- doxygen/optimize.hh | 484 + examples/optimize-file.cpp | 107 + examples/optimize-linear.cpp | 27 + experiments/lp-relaxation/driver.cpp | 109 +- experiments/lp-relaxation/tests/backend.cpp | 67 +- experiments/lp-relaxation/tests/cut-loop.cpp | 336 + experiments/lp-relaxation/tests/cuts.cpp | 299 + .../lp-relaxation/tests/integer-backend.cpp | 87 + .../tests/integer-certificate.cpp | 157 + .../lp-relaxation/tests/integer-driver.py | 98 + .../tests/integer-propagator.cpp | 197 + .../lp-relaxation/tests/propagator.cpp | 47 +- .../tests/sparse-certificate.cpp | 165 + .../lp-relaxation/tests/sparse-storage.cpp | 118 + experiments/optimize/benchmark_boundaries.py | 319 + .../optimize/benchmark_capacity_scaling.py | 455 + .../optimize/benchmark_category_scaling.py | 538 + experiments/optimize/benchmark_configured.py | 373 + experiments/optimize/benchmark_final.py | 200 + .../optimize/benchmark_native_algorithms.py | 508 + experiments/optimize/benchmark_progress.py | 634 + experiments/optimize/boundary_instances.py | 189 + .../optimize/build_configured_benchmark.py | 66 + experiments/optimize/build_final_benchmark.py | 66 + .../optimize/build_large_final_benchmark.py | 79 + experiments/optimize/category_instances.py | 386 + experiments/optimize/configured-policy.json | 54 + experiments/optimize/configured_benchmark.cpp | 414 + .../optimize/continue_final_benchmark.py | 156 + .../optimize/export_extended_benchmark.py | 78 + .../optimize/export_final_benchmark.py | 126 + .../optimize/fast-fixtures/cancellation.lp | 7 + .../optimize/fast-fixtures/precision.lp | 9 + experiments/optimize/fast_regression.py | 353 + experiments/optimize/final-policy.json | 53 + experiments/optimize/final_benchmark.cpp | 428 + experiments/optimize/final_instances.py | 170 + experiments/optimize/native_benchmark.cpp | 236 + experiments/optimize/process_containment.py | 354 + .../optimize/resume_final_benchmark.py | 103 + .../optimize/resume_large_final_benchmark.py | 90 + experiments/optimize/scaling_instances.py | 323 + .../optimize/test_benchmark_progress.py | 328 + experiments/optimize/test_boundaries.py | 228 + .../optimize/test_boundary_instances.py | 129 + experiments/optimize/test_capacity_scaling.py | 191 + .../optimize/test_category_instances.py | 192 + experiments/optimize/test_category_scaling.py | 257 + experiments/optimize/test_configured.py | 164 + .../optimize/test_configured_benchmark.py | 160 + experiments/optimize/test_fast_regression.py | 307 + experiments/optimize/test_final_instances.py | 73 + .../optimize/test_native_algorithms.py | 140 + .../optimize/test_process_containment.py | 471 + .../optimize/test_scaling_instances.py | 180 + experiments/optimize/verify_miplib.py | 111 + gecode/flatzinc/capture-records.hh | 122 + gecode/flatzinc/capture.cpp | 323 + gecode/flatzinc/capture.hh | 36 + gecode/flatzinc/lexer.lxx | 57 +- gecode/flatzinc/lexer.yy.cpp | 597 +- gecode/flatzinc/parser.hh | 31 +- gecode/flatzinc/parser.tab.cpp | 1965 +- gecode/flatzinc/parser.tab.hpp | 5 +- gecode/flatzinc/parser.yxx | 263 +- gecode/kernel/core.cpp | 54 +- gecode/kernel/core.hpp | 42 +- gecode/minimodel/lp-backend.hpp | 168 +- gecode/minimodel/lp-certificate.hpp | 314 +- gecode/minimodel/lp-cut-loop.hpp | 315 + gecode/minimodel/lp-cuts.hpp | 422 + gecode/minimodel/lp-model.hpp | 160 +- gecode/minimodel/lp-relaxation.hpp | 156 +- gecode/optimize.hh | 29 + gecode/optimize/CMakeLists.txt | 482 + gecode/optimize/GecodeOptimizeConfig.cmake.in | 44 + gecode/optimize/c_api.cpp | 1361 + gecode/optimize/c_api.h | 788 + gecode/optimize/constraints.cpp | 407 + gecode/optimize/constraints.hpp | 51 + gecode/optimize/diagnostics.cpp | 306 + gecode/optimize/diagnostics.hpp | 76 + gecode/optimize/flatzinc.cpp | 762 + gecode/optimize/flatzinc.hpp | 76 + gecode/optimize/globals.cpp | 198 + gecode/optimize/globals.hpp | 47 + gecode/optimize/io.cpp | 590 + gecode/optimize/learning_reasons_detail.hpp | 125 + gecode/optimize/lp_basis.cpp | 112 + gecode/optimize/lp_basis.hpp | 72 + gecode/optimize/lp_basis_detail.hpp | 15 + gecode/optimize/lp_evidence.cpp | 366 + gecode/optimize/lp_evidence.hpp | 145 + gecode/optimize/lp_observations.cpp | 477 + gecode/optimize/lp_observations.hpp | 147 + gecode/optimize/lp_observations_detail.hpp | 39 + gecode/optimize/lp_sensitivity.cpp | 420 + gecode/optimize/lp_sensitivity.hpp | 163 + gecode/optimize/lp_sensitivity_backend.cpp | 98 + gecode/optimize/lp_sensitivity_backend.hpp | 22 + .../optimize/lp_sensitivity_highs_detail.hpp | 13 + gecode/optimize/model.cpp | 494 + gecode/optimize/model.hpp | 244 + gecode/optimize/native.cpp | 2496 + gecode/optimize/native.hpp | 79 + gecode/optimize/native_components.cpp | 149 + gecode/optimize/native_lp.hpp | 97 + gecode/optimize/native_neighborhoods.hpp | 81 + gecode/optimize/native_preprocess.hpp | 17 + gecode/optimize/native_presolve.cpp | 154 + gecode/optimize/native_regular_limits.hpp | 29 + gecode/optimize/native_search.hpp | 101 + gecode/optimize/native_symmetry.cpp | 82 + gecode/optimize/pool.cpp | 311 + gecode/optimize/pool.hpp | 65 + gecode/optimize/presolve.cpp | 356 + gecode/optimize/presolve.hpp | 88 + gecode/optimize/quadratic.cpp | 133 + gecode/optimize/quadratic.hpp | 100 + gecode/optimize/quadratic_bound.cpp | 120 + gecode/optimize/quadratic_bound.hpp | 41 + gecode/optimize/quadratic_solve.cpp | 383 + gecode/optimize/relaxation.cpp | 392 + gecode/optimize/relaxation.hpp | 95 + gecode/optimize/result.cpp | 221 + gecode/optimize/result.hpp | 168 + gecode/optimize/scenarios.cpp | 436 + gecode/optimize/scenarios.hpp | 108 + gecode/optimize/session.hpp | 66 + gecode/optimize/solve.cpp | 969 + gecode/optimize/solve.hpp | 61 + gecode/optimize/types.hpp | 36 + gecode/optimize/validate.cpp | 292 + gecode/optimize/validate.hpp | 59 + gecode/optimize/workflow.cpp | 337 + gecode/optimize/workflow.hpp | 74 + python/gecode_optimize/__init__.py | 66 + python/gecode_optimize/_runtime.py | 20 + python/gecode_optimize/binding.py | 2298 + python/tests/test_bulk.py | 176 + python/tests/test_conformance.py | 438 + python/tests/test_lp_basis.py | 141 + python/tests/test_lp_evidence.py | 196 + python/tests/test_lp_observations.py | 175 + python/tests/test_lp_sensitivity.py | 204 + python/tests/test_native_starts.py | 90 + python/tests/test_quadratic.py | 245 + python/tests/test_regular.py | 129 + python/tests/test_runtime.py | 53 + python/tests/test_scenarios.py | 231 + python/tests/test_workflows.py | 291 + test/flatzinc-capture/capture.cpp | 147 + test/flatzinc/on_restart_sol_float.cpp | 87 +- test/optimize/brancher_lifecycle.cpp | 95 + test/optimize/bulk.cpp | 178 + test/optimize/c_api.c | 677 + test/optimize/constraints.cpp | 257 + test/optimize/consumer/CMakeLists.txt | 56 + test/optimize/consumer/main.cpp | 182 + test/optimize/diagnostics.cpp | 299 + test/optimize/fast_benchmark.cpp | 756 + .../flatzinc-fixtures/boolean-channel.fzn | 5 + .../cli-v1-constant-objective.fzn | 3 + .../flatzinc-fixtures/cli-v1-empty-output.fzn | 3 + .../cli-v1-global-distinct.fzn | 9 + .../cli-v1-global-element.fzn | 6 + .../cli-v1-global-repeated-alias.fzn | 6 + .../cli-v1-infeasible-alias.fzn | 4 + .../cli-v1-malformed-arity.fzn | 4 + .../flatzinc-fixtures/cli-v1-max-linear.fzn | 8 + .../cli-v1-reified-complement.fzn | 7 + .../cli-v1-reified-signed-alias.fzn | 8 + .../cli-v1-satisfy-hidden.fzn | 6 + .../cli-v1-unbounded-domain.fzn | 4 + .../cli-v1-unknown-predicate.fzn | 4 + .../cli-v2-circuit-empty.fzn | 3 + .../cli-v2-circuit-offset.fzn | 6 + .../cli-v2-circuit-singleton.fzn | 3 + .../cli-v2-circuit-subtours.fzn | 3 + .../cli-v2-cumulative-fixed-alias.fzn | 12 + .../cli-v2-cumulative-half-open.fzn | 5 + .../cli-v2-cumulative-malformed-four.fzn | 4 + .../cli-v2-cumulative-overlap-unsat.fzn | 4 + ...-v2-cumulative-positive-duration-unsat.fzn | 4 + .../cli-v2-cumulative-unfixed-parameter.fzn | 7 + .../cli-v2-cumulative-unsupported-seven.fzn | 4 + .../cli-v2-cumulative-unsupported-six.fzn | 4 + .../cli-v2-cumulative-wrong-arity.fzn | 4 + .../cli-v2-cumulative-zero-duration.fzn | 5 + .../cli-v2-domain-contiguous.fzn | 4 + .../flatzinc-fixtures/cli-v2-holey-alias.fzn | 7 + .../cli-v2-table-alias-unsat.fzn | 4 + .../flatzinc-fixtures/cli-v2-table-empty.fzn | 4 + .../flatzinc-fixtures/cli-v2-table-holes.fzn | 5 + .../cli-v2-table-zero-arity.fzn | 3 + .../cli-v3-regular-alias-repeat.fzn | 5 + .../cli-v3-regular-bad-count.fzn | 3 + .../cli-v3-regular-bad-initial.fzn | 3 + .../cli-v3-regular-bad-target.fzn | 3 + .../cli-v3-regular-dead-transition.fzn | 3 + .../cli-v3-regular-empty-accept.fzn | 4 + .../cli-v3-regular-empty-finals.fzn | 3 + .../cli-v3-regular-empty-reject.fzn | 3 + .../cli-v3-regular-final-interval.fzn | 4 + .../cli-v3-regular-malformed-matrix.fzn | 3 + .../cli-v3-regular-nonliteral-parameter.fzn | 5 + .../cli-v3-regular-nonunit-finals.fzn | 4 + .../cli-v3-regular-rejected-word.fzn | 3 + .../cli-v3-regular-unsupported-set.fzn | 3 + .../flatzinc-fixtures/cli-v3-regular-word.fzn | 5 + .../cli-v3-regular-wrong-arity.fzn | 3 + .../cli-v3-regular-zero-symbol.fzn | 3 + .../flatzinc-fixtures/linear-alias.fzn | 4 + .../flatzinc-fixtures/unsupported.fzn | 3 + test/optimize/flatzinc.cpp | 718 + test/optimize/flatzinc_driver.cpp | 129 + test/optimize/flatzinc_driver_cli.py | 374 + test/optimize/globals.cpp | 196 + test/optimize/io.cpp | 269 + test/optimize/lp_basis.cpp | 170 + test/optimize/lp_basis_c_api.c | 83 + test/optimize/lp_basis_failure.cpp | 62 + test/optimize/lp_evidence.cpp | 115 + test/optimize/lp_evidence_binding_cleanup.cpp | 52 + test/optimize/lp_evidence_c.c | 123 + test/optimize/lp_evidence_coordinator.cpp | 122 + test/optimize/lp_observations.cpp | 159 + test/optimize/lp_observations_c.c | 119 + test/optimize/lp_observations_checks.cpp | 190 + test/optimize/lp_sensitivity.cpp | 210 + .../lp_sensitivity_binding_cleanup.cpp | 55 + test/optimize/lp_sensitivity_c.c | 121 + test/optimize/lp_sensitivity_coordinator.cpp | 120 + test/optimize/lp_sensitivity_factor.cpp | 69 + test/optimize/lp_sensitivity_fixture.hpp | 24 + test/optimize/lp_sensitivity_oracle.hpp | 63 + .../minizinc-fixtures/mzn-alias-holes.mzn | 1 + .../minizinc-fixtures/mzn-all-different.mzn | 1 + .../mzn-circuit-negative.mzn | 1 + .../minizinc-fixtures/mzn-circuit-offset.mzn | 1 + .../mzn-cumulative-fixed-alias.mzn | 1 + .../mzn-cumulative-half-open.mzn | 1 + .../mzn-cumulative-unsat.mzn | 1 + .../minizinc-fixtures/mzn-cumulative-zero.mzn | 1 + .../minizinc-fixtures/mzn-element-offset.mzn | 1 + .../minizinc-fixtures/mzn-linear-max.mzn | 1 + .../minizinc-fixtures/mzn-linear-min.mzn | 1 + .../minizinc-fixtures/mzn-regular-alias.mzn | 1 + .../mzn-regular-complement.mzn | 1 + .../minizinc-fixtures/mzn-regular-dead.mzn | 1 + .../mzn-regular-decomposed-reif.mzn | 1 + .../minizinc-fixtures/mzn-regular-empty.mzn | 1 + .../minizinc-fixtures/mzn-regular.mzn | 1 + .../minizinc-fixtures/mzn-reified-le.mzn | 1 + .../minizinc-fixtures/mzn-reject-float.mzn | 1 + .../minizinc-fixtures/mzn-reject-reif-eq.mzn | 1 + .../minizinc-fixtures/mzn-reject-search.mzn | 1 + .../minizinc-fixtures/mzn-reject-set.mzn | 1 + .../minizinc-fixtures/mzn-reject-times.mzn | 1 + .../mzn-reject-variable-cumulative.mzn | 1 + .../minizinc-fixtures/mzn-satisfy.mzn | 1 + .../minizinc-fixtures/mzn-table-alias.mzn | 1 + test/optimize/minizinc-fixtures/mzn-table.mzn | 1 + test/optimize/minizinc-fixtures/mzn-unsat.mzn | 1 + test/optimize/minizinc_configure.py | 51 + test/optimize/minizinc_registration.py | 296 + test/optimize/model.cpp | 250 + test/optimize/native.cpp | 273 + test/optimize/native_auto.cpp | 126 + test/optimize/native_branching.cpp | 261 + test/optimize/native_components.cpp | 115 + test/optimize/native_knapsack.cpp | 399 + test/optimize/native_lp.cpp | 345 + test/optimize/native_neighborhoods.cpp | 341 + test/optimize/native_presolve.cpp | 176 + test/optimize/native_race.cpp | 90 + test/optimize/native_search.cpp | 465 + test/optimize/native_starts.cpp | 315 + test/optimize/native_symmetry.cpp | 64 + .../package_origin/consumer/CMakeLists.txt | 27 + .../package_origin/producer/CMakeLists.txt | 33 + test/optimize/package_origin/run.py | 69 + test/optimize/pool.cpp | 333 + test/optimize/presolve.cpp | 273 + test/optimize/presolve_solve.cpp | 63 + test/optimize/quadratic.cpp | 251 + test/optimize/quadratic_bound.cpp | 100 + test/optimize/regular.cpp | 239 + test/optimize/regular_c_api.c | 86 + test/optimize/relaxation.cpp | 459 + test/optimize/result.cpp | 287 + test/optimize/scenarios.cpp | 201 + test/optimize/scenarios_c.c | 148 + test/optimize/scenarios_coordinator.cpp | 149 + test/optimize/session.cpp | 217 + test/optimize/session_limits.cpp | 93 + test/optimize/solve.cpp | 206 + test/optimize/validate.cpp | 336 + test/optimize/workflow.cpp | 434 + tools/flatzinc/configure-optimize-msc.cmake | 44 + tools/flatzinc/fzn-gecode-optimize.cpp | 219 + tools/flatzinc/gecode-optimize.msc.in | 15 + tools/flatzinc/minizinc-release.json | 10 + .../mznlib-optimize/fzn_all_different_int.mzn | 3 + .../flatzinc/mznlib-optimize/fzn_circuit.mzn | 8 + .../mznlib-optimize/fzn_cumulative.mzn | 7 + .../flatzinc/mznlib-optimize/fzn_regular.mzn | 5 + .../mznlib-optimize/fzn_table_int.mzn | 4 + .../mznlib-optimize/redefinitions.mzn | 16 + tools/python/build_macos_wheel.py | 260 + tools/python/test_build_macos_wheel.py | 141 + tools/research/CMakeLists.txt | 37 + tools/research/cadical-dependency.json | 14 + tools/research/cadical_protocol.cpp | 260 + 395 files changed, 1290593 insertions(+), 1345 deletions(-) create mode 100644 .github/pr/solver-parity-commit.txt create mode 100644 .github/pr/solver-parity.md create mode 100644 .github/workflows/fast-windows-containment.yml create mode 100644 .github/workflows/optimize.yml create mode 100644 docs/solver-parity/ADAPTIVE-BOUNDARIES.md create mode 100644 docs/solver-parity/ALGORITHMIC-CHECKPOINT.md create mode 100644 docs/solver-parity/BENCHMARKS.md create mode 100644 docs/solver-parity/BINDINGS.md create mode 100644 docs/solver-parity/BRANCHING-DESIGN.md create mode 100644 docs/solver-parity/BULK.md create mode 100644 docs/solver-parity/CAPACITY-SCALING.md create mode 100644 docs/solver-parity/CATEGORY-SCALING.md create mode 100644 docs/solver-parity/CONFIGURED-BENCHMARK.md create mode 100644 docs/solver-parity/CONSTRAINTS.md create mode 100644 docs/solver-parity/CUT-LOOP.md create mode 100644 docs/solver-parity/CUTS.md create mode 100644 docs/solver-parity/DIAGNOSTICS.md create mode 100644 docs/solver-parity/FAST-REGRESSION.md create mode 100644 docs/solver-parity/FINAL-BENCHMARK.md create mode 100644 docs/solver-parity/FLATZINC-CAPTURE.md create mode 100644 docs/solver-parity/FLATZINC-COMPILER.md create mode 100644 docs/solver-parity/FLATZINC-DESIGN.md create mode 100644 docs/solver-parity/FLATZINC-DRIVER.md create mode 100644 docs/solver-parity/FLATZINC-GLOBALS-DESIGN.md create mode 100644 docs/solver-parity/GLOBALS.md create mode 100644 docs/solver-parity/IMPLEMENTATION.md create mode 100644 docs/solver-parity/IO.md create mode 100644 docs/solver-parity/LEARNING-DESIGN.md create mode 100644 docs/solver-parity/LP-BASIS-BINDINGS.md create mode 100644 docs/solver-parity/LP-BASIS.md create mode 100644 docs/solver-parity/LP-EVIDENCE-BINDINGS.md create mode 100644 docs/solver-parity/LP-EVIDENCE-DESIGN.md create mode 100644 docs/solver-parity/LP-EVIDENCE.md create mode 100644 docs/solver-parity/LP-OBSERVATIONS-DESIGN.md create mode 100644 docs/solver-parity/LP-OBSERVATIONS.md create mode 100644 docs/solver-parity/LP-SENSITIVITY-BINDINGS-DESIGN.md create mode 100644 docs/solver-parity/LP-SENSITIVITY-BINDINGS.md create mode 100644 docs/solver-parity/LP-SENSITIVITY-DESIGN.md create mode 100644 docs/solver-parity/LP-SENSITIVITY.md create mode 100644 docs/solver-parity/MINIZINC.md create mode 100644 docs/solver-parity/NATIVE-LP.md create mode 100644 docs/solver-parity/NATIVE-NEIGHBORHOODS-DESIGN.md create mode 100644 docs/solver-parity/NATIVE-NEIGHBORHOODS.md create mode 100644 docs/solver-parity/NATIVE-PRIMALS-DESIGN.md create mode 100644 docs/solver-parity/NATIVE-SEARCH.md create mode 100644 docs/solver-parity/NATIVE.md create mode 100644 docs/solver-parity/NINTH-CHECKPOINT.md create mode 100644 docs/solver-parity/POOLS.md create mode 100644 docs/solver-parity/PRESOLVE.md create mode 100644 docs/solver-parity/PROGRESS-ASSESSMENT-2026-09-05.md create mode 100644 docs/solver-parity/QUADRATIC-DESIGN.md create mode 100644 docs/solver-parity/QUADRATIC.md create mode 100644 docs/solver-parity/README.md create mode 100644 docs/solver-parity/REGULAR-BINDINGS.md create mode 100644 docs/solver-parity/REGULAR.md create mode 100644 docs/solver-parity/RELAXATION.md create mode 100644 docs/solver-parity/SCENARIO-BINDINGS.md create mode 100644 docs/solver-parity/SCENARIOS-DESIGN.md create mode 100644 docs/solver-parity/SCENARIOS.md create mode 100644 docs/solver-parity/SESSIONS.md create mode 100644 docs/solver-parity/SPARSE-LP.md create mode 100644 docs/solver-parity/VALIDATION.md create mode 100644 docs/solver-parity/WHEELS.md create mode 100644 docs/solver-parity/WORKFLOWS.md create mode 100644 docs/solver-parity/checkpoints/benchmark-page.json create mode 100644 docs/solver-parity/checkpoints/boundaries.json create mode 100644 docs/solver-parity/checkpoints/capacity-scaling.json create mode 100644 docs/solver-parity/checkpoints/category-scaling.json create mode 100644 docs/solver-parity/checkpoints/configured.json create mode 100644 docs/solver-parity/checkpoints/native-algorithms.json create mode 100644 docs/solver-parity/checkpoints/ninth.json create mode 100644 docs/solver-parity/dependencies.json create mode 100644 docs/solver-parity/final-benchmark-checkpoint.json create mode 100644 doxygen/optimize.hh create mode 100644 examples/optimize-file.cpp create mode 100644 examples/optimize-linear.cpp create mode 100644 experiments/lp-relaxation/tests/cut-loop.cpp create mode 100644 experiments/lp-relaxation/tests/cuts.cpp create mode 100644 experiments/lp-relaxation/tests/integer-backend.cpp create mode 100644 experiments/lp-relaxation/tests/integer-certificate.cpp create mode 100644 experiments/lp-relaxation/tests/integer-driver.py create mode 100644 experiments/lp-relaxation/tests/integer-propagator.cpp create mode 100644 experiments/lp-relaxation/tests/sparse-certificate.cpp create mode 100644 experiments/lp-relaxation/tests/sparse-storage.cpp create mode 100644 experiments/optimize/benchmark_boundaries.py create mode 100644 experiments/optimize/benchmark_capacity_scaling.py create mode 100644 experiments/optimize/benchmark_category_scaling.py create mode 100644 experiments/optimize/benchmark_configured.py create mode 100644 experiments/optimize/benchmark_final.py create mode 100644 experiments/optimize/benchmark_native_algorithms.py create mode 100644 experiments/optimize/benchmark_progress.py create mode 100644 experiments/optimize/boundary_instances.py create mode 100644 experiments/optimize/build_configured_benchmark.py create mode 100644 experiments/optimize/build_final_benchmark.py create mode 100644 experiments/optimize/build_large_final_benchmark.py create mode 100644 experiments/optimize/category_instances.py create mode 100644 experiments/optimize/configured-policy.json create mode 100644 experiments/optimize/configured_benchmark.cpp create mode 100644 experiments/optimize/continue_final_benchmark.py create mode 100644 experiments/optimize/export_extended_benchmark.py create mode 100644 experiments/optimize/export_final_benchmark.py create mode 100644 experiments/optimize/fast-fixtures/cancellation.lp create mode 100644 experiments/optimize/fast-fixtures/precision.lp create mode 100644 experiments/optimize/fast_regression.py create mode 100644 experiments/optimize/final-policy.json create mode 100644 experiments/optimize/final_benchmark.cpp create mode 100644 experiments/optimize/final_instances.py create mode 100644 experiments/optimize/native_benchmark.cpp create mode 100644 experiments/optimize/process_containment.py create mode 100644 experiments/optimize/resume_final_benchmark.py create mode 100644 experiments/optimize/resume_large_final_benchmark.py create mode 100644 experiments/optimize/scaling_instances.py create mode 100644 experiments/optimize/test_benchmark_progress.py create mode 100644 experiments/optimize/test_boundaries.py create mode 100644 experiments/optimize/test_boundary_instances.py create mode 100644 experiments/optimize/test_capacity_scaling.py create mode 100644 experiments/optimize/test_category_instances.py create mode 100644 experiments/optimize/test_category_scaling.py create mode 100644 experiments/optimize/test_configured.py create mode 100644 experiments/optimize/test_configured_benchmark.py create mode 100644 experiments/optimize/test_fast_regression.py create mode 100644 experiments/optimize/test_final_instances.py create mode 100644 experiments/optimize/test_native_algorithms.py create mode 100644 experiments/optimize/test_process_containment.py create mode 100644 experiments/optimize/test_scaling_instances.py create mode 100644 experiments/optimize/verify_miplib.py create mode 100644 gecode/flatzinc/capture-records.hh create mode 100644 gecode/flatzinc/capture.cpp create mode 100644 gecode/flatzinc/capture.hh create mode 100644 gecode/minimodel/lp-cut-loop.hpp create mode 100644 gecode/minimodel/lp-cuts.hpp create mode 100644 gecode/optimize.hh create mode 100644 gecode/optimize/CMakeLists.txt create mode 100644 gecode/optimize/GecodeOptimizeConfig.cmake.in create mode 100644 gecode/optimize/c_api.cpp create mode 100644 gecode/optimize/c_api.h create mode 100644 gecode/optimize/constraints.cpp create mode 100644 gecode/optimize/constraints.hpp create mode 100644 gecode/optimize/diagnostics.cpp create mode 100644 gecode/optimize/diagnostics.hpp create mode 100644 gecode/optimize/flatzinc.cpp create mode 100644 gecode/optimize/flatzinc.hpp create mode 100644 gecode/optimize/globals.cpp create mode 100644 gecode/optimize/globals.hpp create mode 100644 gecode/optimize/io.cpp create mode 100644 gecode/optimize/learning_reasons_detail.hpp create mode 100644 gecode/optimize/lp_basis.cpp create mode 100644 gecode/optimize/lp_basis.hpp create mode 100644 gecode/optimize/lp_basis_detail.hpp create mode 100644 gecode/optimize/lp_evidence.cpp create mode 100644 gecode/optimize/lp_evidence.hpp create mode 100644 gecode/optimize/lp_observations.cpp create mode 100644 gecode/optimize/lp_observations.hpp create mode 100644 gecode/optimize/lp_observations_detail.hpp create mode 100644 gecode/optimize/lp_sensitivity.cpp create mode 100644 gecode/optimize/lp_sensitivity.hpp create mode 100644 gecode/optimize/lp_sensitivity_backend.cpp create mode 100644 gecode/optimize/lp_sensitivity_backend.hpp create mode 100644 gecode/optimize/lp_sensitivity_highs_detail.hpp create mode 100644 gecode/optimize/model.cpp create mode 100644 gecode/optimize/model.hpp create mode 100644 gecode/optimize/native.cpp create mode 100644 gecode/optimize/native.hpp create mode 100644 gecode/optimize/native_components.cpp create mode 100644 gecode/optimize/native_lp.hpp create mode 100644 gecode/optimize/native_neighborhoods.hpp create mode 100644 gecode/optimize/native_preprocess.hpp create mode 100644 gecode/optimize/native_presolve.cpp create mode 100644 gecode/optimize/native_regular_limits.hpp create mode 100644 gecode/optimize/native_search.hpp create mode 100644 gecode/optimize/native_symmetry.cpp create mode 100644 gecode/optimize/pool.cpp create mode 100644 gecode/optimize/pool.hpp create mode 100644 gecode/optimize/presolve.cpp create mode 100644 gecode/optimize/presolve.hpp create mode 100644 gecode/optimize/quadratic.cpp create mode 100644 gecode/optimize/quadratic.hpp create mode 100644 gecode/optimize/quadratic_bound.cpp create mode 100644 gecode/optimize/quadratic_bound.hpp create mode 100644 gecode/optimize/quadratic_solve.cpp create mode 100644 gecode/optimize/relaxation.cpp create mode 100644 gecode/optimize/relaxation.hpp create mode 100644 gecode/optimize/result.cpp create mode 100644 gecode/optimize/result.hpp create mode 100644 gecode/optimize/scenarios.cpp create mode 100644 gecode/optimize/scenarios.hpp create mode 100644 gecode/optimize/session.hpp create mode 100644 gecode/optimize/solve.cpp create mode 100644 gecode/optimize/solve.hpp create mode 100644 gecode/optimize/types.hpp create mode 100644 gecode/optimize/validate.cpp create mode 100644 gecode/optimize/validate.hpp create mode 100644 gecode/optimize/workflow.cpp create mode 100644 gecode/optimize/workflow.hpp create mode 100644 python/gecode_optimize/__init__.py create mode 100644 python/gecode_optimize/_runtime.py create mode 100644 python/gecode_optimize/binding.py create mode 100644 python/tests/test_bulk.py create mode 100644 python/tests/test_conformance.py create mode 100644 python/tests/test_lp_basis.py create mode 100644 python/tests/test_lp_evidence.py create mode 100644 python/tests/test_lp_observations.py create mode 100644 python/tests/test_lp_sensitivity.py create mode 100644 python/tests/test_native_starts.py create mode 100644 python/tests/test_quadratic.py create mode 100644 python/tests/test_regular.py create mode 100644 python/tests/test_runtime.py create mode 100644 python/tests/test_scenarios.py create mode 100644 python/tests/test_workflows.py create mode 100644 test/flatzinc-capture/capture.cpp create mode 100644 test/optimize/brancher_lifecycle.cpp create mode 100644 test/optimize/bulk.cpp create mode 100644 test/optimize/c_api.c create mode 100644 test/optimize/constraints.cpp create mode 100644 test/optimize/consumer/CMakeLists.txt create mode 100644 test/optimize/consumer/main.cpp create mode 100644 test/optimize/diagnostics.cpp create mode 100644 test/optimize/fast_benchmark.cpp create mode 100644 test/optimize/flatzinc-fixtures/boolean-channel.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-constant-objective.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-empty-output.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-global-distinct.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-global-element.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-global-repeated-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-infeasible-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-malformed-arity.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-max-linear.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-reified-complement.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-reified-signed-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-satisfy-hidden.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-unbounded-domain.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v1-unknown-predicate.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-circuit-empty.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-circuit-offset.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-circuit-singleton.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-circuit-subtours.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-fixed-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-half-open.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-malformed-four.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-overlap-unsat.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-positive-duration-unsat.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-unfixed-parameter.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-seven.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-six.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-wrong-arity.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-cumulative-zero-duration.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-domain-contiguous.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-holey-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-table-alias-unsat.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-table-empty.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-table-holes.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v2-table-zero-arity.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-alias-repeat.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-bad-count.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-bad-initial.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-bad-target.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-dead-transition.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-empty-accept.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-empty-finals.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-empty-reject.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-final-interval.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-malformed-matrix.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-nonliteral-parameter.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-nonunit-finals.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-rejected-word.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-unsupported-set.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-word.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-wrong-arity.fzn create mode 100644 test/optimize/flatzinc-fixtures/cli-v3-regular-zero-symbol.fzn create mode 100644 test/optimize/flatzinc-fixtures/linear-alias.fzn create mode 100644 test/optimize/flatzinc-fixtures/unsupported.fzn create mode 100644 test/optimize/flatzinc.cpp create mode 100644 test/optimize/flatzinc_driver.cpp create mode 100644 test/optimize/flatzinc_driver_cli.py create mode 100644 test/optimize/globals.cpp create mode 100644 test/optimize/io.cpp create mode 100644 test/optimize/lp_basis.cpp create mode 100644 test/optimize/lp_basis_c_api.c create mode 100644 test/optimize/lp_basis_failure.cpp create mode 100644 test/optimize/lp_evidence.cpp create mode 100644 test/optimize/lp_evidence_binding_cleanup.cpp create mode 100644 test/optimize/lp_evidence_c.c create mode 100644 test/optimize/lp_evidence_coordinator.cpp create mode 100644 test/optimize/lp_observations.cpp create mode 100644 test/optimize/lp_observations_c.c create mode 100644 test/optimize/lp_observations_checks.cpp create mode 100644 test/optimize/lp_sensitivity.cpp create mode 100644 test/optimize/lp_sensitivity_binding_cleanup.cpp create mode 100644 test/optimize/lp_sensitivity_c.c create mode 100644 test/optimize/lp_sensitivity_coordinator.cpp create mode 100644 test/optimize/lp_sensitivity_factor.cpp create mode 100644 test/optimize/lp_sensitivity_fixture.hpp create mode 100644 test/optimize/lp_sensitivity_oracle.hpp create mode 100644 test/optimize/minizinc-fixtures/mzn-alias-holes.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-all-different.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-circuit-negative.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-circuit-offset.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-cumulative-fixed-alias.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-cumulative-half-open.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-cumulative-unsat.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-cumulative-zero.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-element-offset.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-linear-max.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-linear-min.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular-alias.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular-complement.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular-dead.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular-decomposed-reif.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular-empty.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-regular.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reified-le.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-float.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-reif-eq.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-search.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-set.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-times.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-reject-variable-cumulative.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-satisfy.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-table-alias.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-table.mzn create mode 100644 test/optimize/minizinc-fixtures/mzn-unsat.mzn create mode 100644 test/optimize/minizinc_configure.py create mode 100644 test/optimize/minizinc_registration.py create mode 100644 test/optimize/model.cpp create mode 100644 test/optimize/native.cpp create mode 100644 test/optimize/native_auto.cpp create mode 100644 test/optimize/native_branching.cpp create mode 100644 test/optimize/native_components.cpp create mode 100644 test/optimize/native_knapsack.cpp create mode 100644 test/optimize/native_lp.cpp create mode 100644 test/optimize/native_neighborhoods.cpp create mode 100644 test/optimize/native_presolve.cpp create mode 100644 test/optimize/native_race.cpp create mode 100644 test/optimize/native_search.cpp create mode 100644 test/optimize/native_starts.cpp create mode 100644 test/optimize/native_symmetry.cpp create mode 100644 test/optimize/package_origin/consumer/CMakeLists.txt create mode 100644 test/optimize/package_origin/producer/CMakeLists.txt create mode 100644 test/optimize/package_origin/run.py create mode 100644 test/optimize/pool.cpp create mode 100644 test/optimize/presolve.cpp create mode 100644 test/optimize/presolve_solve.cpp create mode 100644 test/optimize/quadratic.cpp create mode 100644 test/optimize/quadratic_bound.cpp create mode 100644 test/optimize/regular.cpp create mode 100644 test/optimize/regular_c_api.c create mode 100644 test/optimize/relaxation.cpp create mode 100644 test/optimize/result.cpp create mode 100644 test/optimize/scenarios.cpp create mode 100644 test/optimize/scenarios_c.c create mode 100644 test/optimize/scenarios_coordinator.cpp create mode 100644 test/optimize/session.cpp create mode 100644 test/optimize/session_limits.cpp create mode 100644 test/optimize/solve.cpp create mode 100644 test/optimize/validate.cpp create mode 100644 test/optimize/workflow.cpp create mode 100644 tools/flatzinc/configure-optimize-msc.cmake create mode 100644 tools/flatzinc/fzn-gecode-optimize.cpp create mode 100644 tools/flatzinc/gecode-optimize.msc.in create mode 100644 tools/flatzinc/minizinc-release.json create mode 100644 tools/flatzinc/mznlib-optimize/fzn_all_different_int.mzn create mode 100644 tools/flatzinc/mznlib-optimize/fzn_circuit.mzn create mode 100644 tools/flatzinc/mznlib-optimize/fzn_cumulative.mzn create mode 100644 tools/flatzinc/mznlib-optimize/fzn_regular.mzn create mode 100644 tools/flatzinc/mznlib-optimize/fzn_table_int.mzn create mode 100644 tools/flatzinc/mznlib-optimize/redefinitions.mzn create mode 100644 tools/python/build_macos_wheel.py create mode 100644 tools/python/test_build_macos_wheel.py create mode 100644 tools/research/CMakeLists.txt create mode 100644 tools/research/cadical-dependency.json create mode 100644 tools/research/cadical_protocol.cpp diff --git a/.editorconfig b/.editorconfig index c237a6304c..873de24dba 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,6 +13,10 @@ charset = utf-8 indent_style = space indent_size = 2 +# Python sources and tools use the existing four-space convention. +[*.py] +indent_size = 4 + # Makefiles need to use Tab indentation [Makefile*] indent_style = tab diff --git a/.github/pr/solver-parity-commit.txt b/.github/pr/solver-parity-commit.txt new file mode 100644 index 0000000000..f797022890 --- /dev/null +++ b/.github/pr/solver-parity-commit.txt @@ -0,0 +1,28 @@ +Add optional optimization APIs and automatic native strategies + +Introduce Gecode::Optimize owning sparse models, explicit result guarantees, +starts, exchange, sessions and reusable optimization workflows. Supply numerical +LP/MILP and bounded weighted-square continuous QP through HiGHS, plus an exact +native integer bridge retaining supported globals and documented C/Python APIs. + +Select compatible checked LP, cover cuts and branching automatically. Compose +bounded exact presolve, independent components and identical-column symmetry. +Restore original witnesses, offsets and proofs under one shared solve budget. +Use rolling knapsack value rows and packed traceback with work/memory/time caps. + +Add opt-in sequential strategy racing in C++, with configurable exploration. +Probe automatic and ordinary native search, select from checked incumbents and +bounds, and restart under the remaining shared time/node/cancellation budget. +Preserve the best probe result. Explicitly document increased CPU/solve-time +costs and the possibility of discovering a much better strategy for longer solves. +Do not expose the new racing option through MiniZinc yet; add no conflict learning. + +Validation: complete isolated Release build and 75/75 CTest entries pass; +focused racing checks pass without checked LP and without native backends. +Exhaustive original-oracle, shared-budget and larger-generator checks pass. +Preserve historical observations and add the final three-cohort comparison: +original pre-algorithm native runtime, current automatic racing and frozen +family presets. Expand to observed failed upper inputs without study ceilings, +then refine and confirm sampled brackets. Charge exploration to the same ten +seconds and retain all witnesses, outcomes, settings and provenance. State +nonmonotonicity, backend-reported optimality and combined-policy attribution. diff --git a/.github/pr/solver-parity.md b/.github/pr/solver-parity.md new file mode 100644 index 0000000000..61b64f8d64 --- /dev/null +++ b/.github/pr/solver-parity.md @@ -0,0 +1,69 @@ +# Add optional optimization APIs and automatic native strategies + +Add `Gecode::Optimize` for applications that need owning optimization models, +explicit result guarantees and reusable solve workflows. Native integer solving +now chooses suitable strengthening automatically. An opt-in race can compare +that policy with ordinary Gecode search before committing the remaining budget. +Existing Gecode modeling, propagation and search interfaces remain available. + +## Changes + +- Add sparse models, starts, LP/MPS exchange, sessions, ordered objectives, + diagnostics, repair, pools, scenarios and documented C/Python bindings. + HiGHS supplies numerical LP/MILP and bounded weighted-square continuous QP; + the native bridge retains its exact integer subset and supported globals. +- Add checked LP deductions, verified cover cuts, frontier search, reliability + branching and bounded binary neighborhoods. Structural native selection uses + compatible mechanisms without problem-family labels or reference objectives. +- Compose bounded exact presolve, independent components and symmetry constraints + for identical columns. Restore original coordinates and objective offsets; + incomplete component solutions never become full-model incumbents or proofs. +- Strengthen eligible binary knapsack models with exact DP, rolling value rows + and packed traceback. Separate work, memory and local time caps provide a + fallback to native search, with independently checked original witnesses. +- Add `NativeRaceOptions` and `solve_native_race` in C++. Two bounded sequential + probes compare the automatic policy and ordinary BAB. Selection uses validated + incumbents and valid bounds; the chosen strategy restarts under the same global + time, node and cancellation budget. Keep the best original incumbent and bound + even if restarting makes no progress. + +Racing is opt-in: the ordinary automatic dispatcher does not silently enable it. +Exploration and restarting can increase total CPU work or solve time. Configurable +trials of several seconds or longer may pay off by finding a much better strategy +for the remaining solve. Early progress is a heuristic, not a speedup guarantee. +The new racing option is not exposed through MiniZinc/FlatZinc yet. No conflict +learning or parallel racing is added. + +## Validation and measured limits + +The complete isolated Release build passes **75/75 CTest entries**, including +FAST. Focused racing checks also pass without checked LP and without native +backends. Exhaustive min/max oracle checks cover strategy selection, shared node +limits, retained exact results, starts and interruption. Generator checks preserve +every historical input's JSON and text bytes and independently validate larger +feasible witnesses. Earlier sanitizer validation remains separately documented; +this racing change does not claim a new sanitizer run. + +The [final benchmark](../../docs/solver-parity/FINAL-BENCHMARK.md) compares the +preserved pre-algorithm Gecode runtime, current automatic racing and frozen +family presets. Ten seconds includes all exploration and restarting. Each +configuration expands until an observed failed upper size, then refines the +bracket to adjacent sizes or approximately 2% for larger inputs. Both repetitions +and every knapsack variant must pass at the reported lower size. All initial +observations remain in the amended, uncapped study. + +These are seeded-instance brackets, not mathematical maximum-size guarantees. +Original witnesses are independently checked; large-instance exact optimality is +backend-reported. The same families informed development and preset selection. +The comparison measures combined policies, not an ablation establishing that +racing alone caused the gains. Historical studies remain separate. + +General MIQP/QCP/nonlinear optimization and production learning remain outside +scope. Remote platform CI and a rebuild of the older wheel are still pending. + +## Review base + +Compare `codex/solver-parity-pr` with `codex/solver-parity-base` (`e10562fd9`), the +preserved pre-project source snapshot. The review branch contains the same final +tree as `codex/solver-parity` in one commit over that base. The prerequisite base +must be available in the target repository before opening the upstream PR. diff --git a/.github/workflows/fast-windows-containment.yml b/.github/workflows/fast-windows-containment.yml new file mode 100644 index 0000000000..d12d5ccc3c --- /dev/null +++ b/.github/workflows/fast-windows-containment.yml @@ -0,0 +1,49 @@ +name: Pending Windows FAST containment + +on: + workflow_dispatch: + pull_request: + paths: + - 'experiments/optimize/*containment*.py' + - 'experiments/optimize/*fast_regression.py' + - '.github/workflows/fast-windows-containment.yml' + push: + branches: [main, 'release/**'] + paths: + - 'experiments/optimize/*containment*.py' + - 'experiments/optimize/*fast_regression.py' + - '.github/workflows/fast-windows-containment.yml' + +permissions: + contents: read + +defaults: + run: + shell: cmd + +jobs: + containment: + name: Real Job Objects / Python ${{ matrix.architecture }} + runs-on: windows-2022 + timeout-minutes: 5 + strategy: + fail-fast: false + matrix: + architecture: [x64, x86] + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + architecture: ${{ matrix.architecture }} + - name: Record runtime and verify architecture + run: >- + python -c "import os,platform,struct; print(platform.platform(),platform.python_version(),struct.calcsize('P')*8); assert os.name=='nt'; assert struct.calcsize('P')=={'x64':8,'x86':4}['${{ matrix.architecture }}']" + - name: Require actual Job Object and failure-path coverage + run: python experiments/optimize/test_process_containment.py --require-windows -v + - name: Exercise Windows runner limits and the production Unsupported gate + run: python experiments/optimize/test_fast_regression.py -v + # This workflow supplies containment evidence only. It deliberately cannot + # enable the production runner, and does not assert a 21-case timing result. diff --git a/.github/workflows/optimize.yml b/.github/workflows/optimize.yml new file mode 100644 index 0000000000..90c4ca2ec1 --- /dev/null +++ b/.github/workflows/optimize.yml @@ -0,0 +1,335 @@ +name: Optimization component + +on: + pull_request: + push: + branches: + - main + - 'release/**' + +permissions: + contents: read + +defaults: + run: + shell: bash + +jobs: + core: + name: Core / ${{ matrix.os }} / shared=${{ matrix.shared }} + runs-on: ${{ matrix.os }} + timeout-minutes: 20 + strategy: + fail-fast: false + max-parallel: 2 + matrix: + os: [ubuntu-24.04, macos-15, windows-2022] + shared: ['OFF', 'ON'] + include: + - os: windows-2022 + generator: Visual Studio 17 2022 + - os: ubuntu-24.04 + generator: Unix Makefiles + - os: macos-15 + generator: Unix Makefiles + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - name: Configure standalone core + run: >- + cmake -S gecode/optimize -B build -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DBUILD_SHARED_LIBS=${{ matrix.shared }} + -DGECODE_OPTIMIZE_WITH_HIGHS=OFF + -DGECODE_OPTIMIZE_BUILD_TESTS=ON + -DBUILD_TESTING=ON + - name: Build + run: cmake --build build --config Release --parallel 2 + - name: Run core conformance tests + run: | + export PATH="$(pwd)/build/Release:$(pwd)/build/Release/bin:$(pwd)/build/bin/Release:$(pwd)/build/highs/bin/Release:$(pwd)/build/highs/bin:$(pwd)/build/bin:$(pwd)/build:$PATH" + ctest --test-dir build -C Release --output-on-failure \ + --no-tests=error --timeout 120 --parallel 2 -R '^optimize-' + - name: Install + run: cmake --install build --config Release --prefix "$(pwd)/install" + - name: Configure installed consumer + run: >- + cmake -S test/optimize/consumer -B consumer -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_PREFIX_PATH="$(pwd)/install" + -DPACKAGE_MODE=standalone + -DEXPECT_BACKEND_DISABLED=ON + - name: Build installed consumer + run: cmake --build consumer --config Release --parallel 2 + - name: Run installed consumer, including Windows DLL loading + run: | + export PATH="$(pwd)/install/bin:$PATH" + ctest --test-dir consumer -C Release --output-on-failure \ + --no-tests=error --timeout 60 + + native: + name: Native combined / ${{ matrix.os }} / shared=${{ matrix.shared }} + runs-on: ${{ matrix.os }} + timeout-minutes: 45 + strategy: + fail-fast: false + max-parallel: 2 + matrix: + include: + - os: ubuntu-24.04 + generator: Unix Makefiles + shared: 'OFF' + static: 'ON' + python: python3 + - os: windows-2022 + generator: Visual Studio 17 2022 + shared: 'ON' + static: 'OFF' + python: python + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - name: Check package ownership and standalone native boundary + run: >- + ${{ matrix.python }} test/optimize/package_origin/run.py + --generator "${{ matrix.generator }}" + --check-native-boundary + - name: Configure combined native bridge without HiGHS + # The bridge must compile against this checkout's native int/search + # components. Standalone native configuration is explicitly unsupported. + run: >- + cmake -S . -B build-native -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DGECODE_BUILD_SHARED=${{ matrix.shared }} + -DGECODE_BUILD_STATIC=${{ matrix.static }} + -DGECODE_ENABLE_OPTIMIZE=ON + -DGECODE_OPTIMIZE_WITH_NATIVE=ON + -DGECODE_OPTIMIZE_WITH_HIGHS=OFF + -DGECODE_OPTIMIZE_BUILD_TESTS=ON + -DBUILD_TESTING=ON + -DGECODE_ENABLE_QT=OFF + -DGECODE_ENABLE_GIST=OFF + -DGECODE_ENABLE_MPFR=OFF + -DGECODE_ENABLE_SET_VARS=ON + -DGECODE_ENABLE_FLOAT_VARS=ON + -DGECODE_ENABLE_MINIMODEL=ON + -DGECODE_ENABLE_DRIVER=ON + -DGECODE_ENABLE_FLATZINC=ON + -DGECODE_ENABLE_EXAMPLES=OFF + - name: Build native bridge and conformance tests + run: cmake --build build-native --config Release --parallel 2 + - name: Exercise enabled native bridge and core conformance + run: | + export PATH="$(pwd)/build-native/gecode/optimize/Release:$(pwd)/build-native/gecode/optimize:$(pwd)/build-native/bin/Release:$(pwd)/build-native/bin:$(pwd)/build-native/Release:$(pwd)/build-native:$PATH" + ctest --test-dir build-native -C Release --output-on-failure \ + --no-tests=error --timeout 120 --parallel 2 -R '^(optimize-|gecode-flatzinc-capture$)' + - name: Install combined native package + run: cmake --install build-native --config Release --prefix "$(pwd)/install-native" + - name: Configure installed combined bridge consumer + # CHECK_NATIVE in this consumer explicitly requests Backend::Native + # and Guarantee::Exact, independently of the absent HiGHS/Auto backend. + run: >- + cmake -S test/optimize/consumer -B consumer-native -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_PREFIX_PATH="$(pwd)/install-native" + -DPACKAGE_MODE=combined + -DEXPECT_BACKEND_DISABLED=ON + - name: Build and run installed bridge consumer + run: | + cmake --build consumer-native --config Release --parallel 2 + export PATH="$(pwd)/install-native/bin:$PATH" + ctest --test-dir consumer-native -C Release --output-on-failure \ + --no-tests=error --timeout 60 + - name: Configure independent native-only consumer + run: >- + cmake -S test/optimize/consumer -B consumer-native-only -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_PREFIX_PATH="$(pwd)/install-native" + -DPACKAGE_MODE=native-only + - name: Build and run native-only consumer without HiGHS discovery + run: | + cmake --build consumer-native-only --config Release --parallel 2 + export PATH="$(pwd)/install-native/bin:$PATH" + ctest --test-dir consumer-native-only -C Release --output-on-failure \ + --no-tests=error --timeout 60 + + numerical: + name: HiGHS / ${{ matrix.os }} / shared=${{ matrix.shared }} + runs-on: ${{ matrix.os }} + timeout-minutes: 45 + strategy: + fail-fast: false + max-parallel: 2 + matrix: + include: + - os: ubuntu-24.04 + generator: Unix Makefiles + shared: 'OFF' + - os: macos-15 + generator: Unix Makefiles + shared: 'OFF' + - os: windows-2022 + generator: Visual Studio 17 2022 + shared: 'ON' + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - name: Check out pinned HiGHS source + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + repository: ERGO-Code/HiGHS + ref: 04024d701f79feb8e2f18bc3df0dffc04ef05088 + path: dependencies/highs + persist-credentials: false + - name: Configure standalone numerical component + # CMake receives local source explicitly; it never fetches dependencies. + run: >- + cmake -S gecode/optimize -B build -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DBUILD_SHARED_LIBS=${{ matrix.shared }} + -DGECODE_OPTIMIZE_WITH_HIGHS=ON + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$(pwd)/dependencies/highs" + -DGECODE_OPTIMIZE_BUILD_TESTS=ON + -DBUILD_TESTING=ON + -DBUILD_SHARED_EXTRAS_LIB=OFF + -DBUILD_CXX_EXE=OFF + -DZLIB=OFF + - name: Build component and pinned backend + run: cmake --build build --config Release --parallel 2 + - name: Run numerical and original-model/parser conformance tests + run: | + export PATH="$(pwd)/build/Release:$(pwd)/build/Release/bin:$(pwd)/build/bin/Release:$(pwd)/build/highs/bin/Release:$(pwd)/build/highs/bin:$(pwd)/build/bin:$(pwd)/build:$PATH" + ctest --test-dir build -C Release --output-on-failure \ + --no-tests=error --timeout 120 --parallel 2 -R '^optimize-' + - name: Install component and backend + run: cmake --install build --config Release --prefix "$(pwd)/install" + - name: Configure installed numerical consumer + run: >- + cmake -S test/optimize/consumer -B consumer -G "${{ matrix.generator }}" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_PREFIX_PATH="$(pwd)/install" + -DPACKAGE_MODE=standalone + -DEXPECT_BACKEND_DISABLED=OFF + - name: Build installed numerical consumer + run: cmake --build consumer --config Release --parallel 2 + - name: Run installed numerical consumer, including Windows DLL loading + run: | + export PATH="$(pwd)/install/bin:$PATH" + ctest --test-dir consumer -C Release --output-on-failure \ + --no-tests=error --timeout 60 + + sanitizers: + name: Full-source ASan and UBSan + runs-on: ubuntu-24.04 + timeout-minutes: 60 + env: + CC: clang + CXX: clang++ + ASAN_OPTIONS: detect_leaks=1:halt_on_error=1 + UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1 + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - name: Check out pinned HiGHS source + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + repository: ERGO-Code/HiGHS + ref: 04024d701f79feb8e2f18bc3df0dffc04ef05088 + path: dependencies/highs + persist-credentials: false + - name: Configure all source with one sanitizer toolchain + # Instrument C and C++ in both the adapter and HiGHS. Linking an + # uninstrumented installed backend can mix incompatible vector annotations. + run: >- + cmake -S gecode/optimize -B build -G "Unix Makefiles" + -DCMAKE_BUILD_TYPE=Debug + -DBUILD_SHARED_LIBS=OFF + -DGECODE_OPTIMIZE_WITH_HIGHS=ON + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$(pwd)/dependencies/highs" + -DGECODE_OPTIMIZE_BUILD_TESTS=ON + -DBUILD_TESTING=ON + -DBUILD_SHARED_EXTRAS_LIB=OFF + -DBUILD_CXX_EXE=OFF + -DZLIB=OFF + -DCMAKE_C_FLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer" + -DGECODE_OPTIMIZE_TEST_PYTHON=OFF + -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer" + -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,undefined" + -DCMAKE_SHARED_LINKER_FLAGS="-fsanitize=address,undefined" + - name: Build instrumented component and backend + run: cmake --build build --config Debug --parallel 2 + - name: Run instrumented conformance tests + run: >- + ctest --test-dir build -C Debug --output-on-failure + --no-tests=error --timeout 120 --parallel 2 -R '^optimize-' + + native-sanitizers: + name: Full native and HiGHS hybrid ASan and UBSan + runs-on: ubuntu-24.04 + timeout-minutes: 60 + env: + CC: clang + CXX: clang++ + ASAN_OPTIONS: detect_leaks=1:halt_on_error=1 + UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1 + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: false + - name: Check out pinned HiGHS source for the hybrid + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + repository: ERGO-Code/HiGHS + ref: 04024d701f79feb8e2f18bc3df0dffc04ef05088 + path: dependencies/highs + persist-credentials: false + - name: Configure fully instrumented native kernel, HiGHS and optimization facade + run: >- + cmake -S . -B build-native-sanitizers -G "Unix Makefiles" + -DCMAKE_BUILD_TYPE=Debug + -DGECODE_BUILD_SHARED=OFF -DGECODE_BUILD_STATIC=ON + -DGECODE_ENABLE_OPTIMIZE=ON -DGECODE_OPTIMIZE_WITH_NATIVE=ON + -DGECODE_OPTIMIZE_WITH_HIGHS=ON -DGECODE_OPTIMIZE_BUILD_TESTS=ON + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$(pwd)/dependencies/highs" + -DBUILD_SHARED_EXTRAS_LIB=OFF -DBUILD_CXX_EXE=OFF -DZLIB=OFF + -DGECODE_OPTIMIZE_TEST_PYTHON=OFF -DBUILD_TESTING=ON + -DGECODE_ENABLE_QT=OFF -DGECODE_ENABLE_GIST=OFF + -DGECODE_ENABLE_MPFR=OFF -DGECODE_ENABLE_SET_VARS=ON + -DGECODE_ENABLE_FLOAT_VARS=ON -DGECODE_ENABLE_MINIMODEL=ON + -DGECODE_ENABLE_DRIVER=ON -DGECODE_ENABLE_FLATZINC=ON + -DGECODE_ENABLE_EXAMPLES=OFF + -DCMAKE_C_FLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer" + -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer" + -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,undefined" + -DCMAKE_SHARED_LINKER_FLAGS="-fsanitize=address,undefined" + - name: Build native lifecycle and boundary tests + run: >- + cmake --build build-native-sanitizers --parallel 2 --target + optimize-brancher-lifecycle-test optimize-native-test + optimize-native_lp-test optimize-pool-test optimize-pool-coordinator-test + optimize-native_search-test optimize-native-search-coordinator-test optimize-native-lp-coordinator-test + optimize-native_branching-test optimize-native-branching-coordinator-test + optimize-native_starts-test optimize-native-start-coordinator-test + optimize-native_neighborhoods-test optimize-native-neighborhood-coordinator-test + optimize-lp_observations-test optimize-lp_observations_checks-test optimize-lp-observations-c-test + optimize-lp_basis-test optimize-lp-basis-failure-test optimize-lp-basis-c-api-test + optimize-regular-test optimize-regular-c-api-test + optimize-scenarios-test optimize-scenarios-coordinator-test + optimize-scenarios-c-test optimize-lp_evidence-test optimize-lp-evidence-coordinator-test + optimize-lp-evidence-c-test optimize-lp-evidence-binding-cleanup-test + optimize-lp_sensitivity-test optimize-lp-sensitivity-coordinator-test optimize-lp-sensitivity-factor-test + optimize-lp-sensitivity-c-test optimize-lp-sensitivity-binding-cleanup-test + optimize-quadratic-test optimize-quadratic_bound-test + optimize-quadratic-coordinator-test optimize-quadratic-arithmetic-rejection-test + gecode-flatzinc-capture-test fzn-gecode-optimize optimize-flatzinc-driver-test optimize-flatzinc-test + optimize-presolve-test optimize-presolve_solve-test optimize-cut-proofs-test optimize-cut-loop-test + optimize-globals-test optimize-c-api-test + - name: Check native engine, checked LP, pools and C ownership with sanitizers + run: >- + ctest --test-dir build-native-sanitizers --output-on-failure + --no-tests=error --timeout 120 + -R '^(gecode-flatzinc-capture|optimize-(flatzinc|flatzinc-driver|flatzinc-driver-cli|minizinc-configure|brancher-lifecycle|native|native_lp|native_search|native_branching|native_starts|native-start-coordinator|native_neighborhoods|native-neighborhood-coordinator|lp_observations|lp_observations_checks|lp-observations-c|lp_basis|lp-basis-failure|lp-basis-c-api|lp_evidence|lp-evidence-coordinator|lp-evidence-c|lp-evidence-binding-cleanup|lp_sensitivity|lp-sensitivity-coordinator|lp-sensitivity-factor|lp-sensitivity-c|lp-sensitivity-binding-cleanup|regular|regular-c-api|scenarios|scenarios-coordinator|scenarios-c|native-search-coordinator|native-lp-coordinator|native-branching-coordinator|quadratic|quadratic_bound|quadratic-coordinator|quadratic-arithmetic-rejection|pool|pool-coordinator|presolve|presolve_solve|cut-proofs|cut-loop|globals|c-api))$' diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f1a9a00f6..d1cae016b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,6 +119,7 @@ option(GECODE_ENABLE_SET_VARS "Build set variables module" ON) option(GECODE_ENABLE_FLOAT_VARS "Build float variables module" ON) option(GECODE_ENABLE_MINIMODEL "Build minimodel module" ON) option(GECODE_ENABLE_LP_RELAXATION "Enable certified LP relaxation module (requires HiGHS)" OFF) +option(GECODE_ENABLE_OPTIMIZE "Build additive numerical optimization API" OFF) option(GECODE_ENABLE_DRIVER "Build driver module" ON) option(GECODE_ENABLE_FLATZINC "Build FlatZinc module" ON) @@ -1073,11 +1074,36 @@ if(DOXYGEN_FOUND AND GECODE_UV_EXECUTABLE) ${CMAKE_CURRENT_SOURCE_DIR}/misc/doxygen/gecode-logo-100.png ${CMAKE_CURRENT_BINARY_DIR}/doc/html COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen.conf.use + COMMAND ${CMAKE_COMMAND} -E make_directory + ${CMAKE_CURRENT_BINARY_DIR}/doc/html/checkpoints + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/benchmark-page.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/native-algorithms.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/capacity-scaling.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/category-scaling.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/boundaries.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/configured.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/ninth.json + ${CMAKE_CURRENT_BINARY_DIR}/doc/html/checkpoints COMMAND ${CMAKE_COMMAND} "-DGECODE_DOXYGEN_HTML_DIR=${CMAKE_CURRENT_BINARY_DIR}/doc/html" -P ${GECODE_DOXYGEN_COMPAT_ALIASES} DEPENDS gecode-varimp-gen ${CMAKE_CURRENT_BINARY_DIR}/doxygen.hh + ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/optimize.hh + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/BENCHMARKS.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/ALGORITHMIC-CHECKPOINT.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/CAPACITY-SCALING.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/CATEGORY-SCALING.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/ADAPTIVE-BOUNDARIES.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/CONFIGURED-BENCHMARK.md + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/benchmark-page.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/native-algorithms.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/capacity-scaling.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/category-scaling.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/boundaries.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/configured.json + ${CMAKE_CURRENT_SOURCE_DIR}/docs/solver-parity/checkpoints/ninth.json ${CMAKE_CURRENT_BINARY_DIR}/doxygen.conf.use ${CMAKE_CURRENT_BINARY_DIR}/header.html ${CMAKE_CURRENT_SOURCE_DIR}/misc/doxygen/footer.html @@ -1347,9 +1373,16 @@ if(GECODE_ENABLE_LP_RELAXATION) list(APPEND GECODE_EXPORT_TARGETS gecodelp) endif() +if(GECODE_ENABLE_OPTIMIZE) + add_subdirectory(gecode/optimize) + list(APPEND GECODE_LIBRARY_COMPONENTS optimize) + list(APPEND GECODE_INSTALL_TARGETS gecodeoptimize gecodeoptimize_c) + list(APPEND GECODE_EXPORT_TARGETS gecodeoptimize gecodeoptimize_c) +endif() + # Compatibility aggregate target for downstream projects expecting Gecode::gecode. add_library(gecode INTERFACE) -foreach(component IN ITEMS support kernel search int set float minimodel driver flatzinc gist lp) +foreach(component IN ITEMS support kernel search int set float minimodel driver flatzinc gist lp optimize) if(TARGET gecode${component}) target_link_libraries(gecode INTERFACE gecode${component}) endif() @@ -1372,6 +1405,60 @@ if(GECODE_ENABLE_FLATZINC) INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") endif() list(APPEND GECODE_INSTALL_TARGETS fzn-gecode) + if(TARGET gecodeoptimize) + # Separate executable; experimental registration is explicitly opt-in below. + add_executable(fzn-gecode-optimize tools/flatzinc/fzn-gecode-optimize.cpp) + target_link_libraries(fzn-gecode-optimize PRIVATE gecodeflatzinc gecodeoptimize) + if(APPLE) + set_target_properties(fzn-gecode-optimize PROPERTIES + INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR}") + elseif(UNIX) + set_target_properties(fzn-gecode-optimize PROPERTIES + INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") + endif() + list(APPEND GECODE_INSTALL_TARGETS fzn-gecode-optimize) + endif() +endif() + +option(GECODE_OPTIMIZE_MINIZINC_REGISTRATION "Build/install the explicit experimental MiniZinc solver registration" OFF) +set(GECODE_OPTIMIZE_MINIZINC_EXECUTABLE "" CACHE FILEPATH "Optional pinned MiniZinc compiler for experimental registration tests (no download)") +if(GECODE_OPTIMIZE_MINIZINC_REGISTRATION) + if(NOT TARGET fzn-gecode-optimize OR NOT GECODE_OPTIMIZE_WITH_NATIVE) + message(FATAL_ERROR "Experimental MiniZinc registration requires the optimization FlatZinc driver and native backend") + endif() + if(IS_ABSOLUTE "${CMAKE_INSTALL_BINDIR}" OR IS_ABSOLUTE "${CMAKE_INSTALL_DATADIR}") + message(FATAL_ERROR "Relocatable experimental MiniZinc registration requires relative CMAKE_INSTALL_BINDIR and CMAKE_INSTALL_DATADIR") + endif() + set(_gecode_optimize_msc_template "${PROJECT_SOURCE_DIR}/tools/flatzinc/gecode-optimize.msc.in") + set(_gecode_optimize_msc_encoder "${PROJECT_SOURCE_DIR}/tools/flatzinc/configure-optimize-msc.cmake") + set(_gecode_optimize_build_msc "${PROJECT_BINARY_DIR}/minizinc/$/gecode-optimize.msc") + # Target paths are expanded before the encoder escapes them as JSON. This + # also supports multi-configuration builds and source/build paths with quotes. + add_custom_target(gecode-optimize-minizinc-config ALL + COMMAND "${CMAKE_COMMAND}" + "-DTEMPLATE=${_gecode_optimize_msc_template}" "-DVERSION=${GECODE_VERSION}" + "-DDRIVER=$" + "-DMZNLIB=${PROJECT_SOURCE_DIR}/tools/flatzinc/mznlib-optimize" + "-DOUTPUT=${_gecode_optimize_build_msc}" -P "${_gecode_optimize_msc_encoder}" + DEPENDS fzn-gecode-optimize "${_gecode_optimize_msc_template}" "${_gecode_optimize_msc_encoder}" + VERBATIM) + set(_gecode_optimize_msc_destination "${CMAKE_INSTALL_DATADIR}/minizinc/solvers") + file(RELATIVE_PATH _gecode_optimize_installed_driver "/${_gecode_optimize_msc_destination}" + "/${CMAKE_INSTALL_BINDIR}/fzn-gecode-optimize${CMAKE_EXECUTABLE_SUFFIX}") + file(RELATIVE_PATH _gecode_optimize_installed_library "/${_gecode_optimize_msc_destination}" + "/${CMAKE_INSTALL_DATADIR}/minizinc/gecode-optimize-experimental") + set(_gecode_optimize_install_msc "${PROJECT_BINARY_DIR}/minizinc/install/gecode-optimize.msc") + execute_process(COMMAND "${CMAKE_COMMAND}" + "-DTEMPLATE=${_gecode_optimize_msc_template}" "-DVERSION=${GECODE_VERSION}" + "-DDRIVER=${_gecode_optimize_installed_driver}" "-DMZNLIB=${_gecode_optimize_installed_library}" + "-DOUTPUT=${_gecode_optimize_install_msc}" -P "${_gecode_optimize_msc_encoder}" + COMMAND_ERROR_IS_FATAL ANY) + if(GECODE_INSTALL) + install(FILES "${_gecode_optimize_install_msc}" DESTINATION "${_gecode_optimize_msc_destination}") + install(DIRECTORY tools/flatzinc/mznlib-optimize/ + DESTINATION "${CMAKE_INSTALL_DATADIR}/minizinc/gecode-optimize-experimental" + FILES_MATCHING PATTERN "*.mzn") + endif() endif() if(BUILD_TESTING) @@ -1393,6 +1480,61 @@ if(BUILD_TESTING) endif() if(GECODE_ENABLE_FLATZINC) + if(NOT TARGET Threads::Threads) + find_package(Threads REQUIRED) + endif() + add_executable(gecode-flatzinc-capture-test test/flatzinc-capture/capture.cpp) + target_compile_features(gecode-flatzinc-capture-test PRIVATE cxx_std_17) + target_link_libraries(gecode-flatzinc-capture-test PRIVATE gecodeflatzinc Threads::Threads) + if(MSVC) + target_compile_options(gecode-flatzinc-capture-test PRIVATE /UNDEBUG) + else() + target_compile_options(gecode-flatzinc-capture-test PRIVATE -UNDEBUG) + endif() + add_test(NAME gecode-flatzinc-capture COMMAND gecode-flatzinc-capture-test) + set_tests_properties(gecode-flatzinc-capture PROPERTIES TIMEOUT 120) + if(TARGET gecodeoptimize AND GECODE_OPTIMIZE_BUILD_TESTS) + add_executable(optimize-flatzinc-driver-test test/optimize/flatzinc_driver.cpp) + target_link_libraries(optimize-flatzinc-driver-test PRIVATE gecodeflatzinc gecodeoptimize) + if(GECODE_OPTIMIZE_WITH_NATIVE OR GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-flatzinc-driver-test PRIVATE GECODE_FLATZINC_DRIVER_EXPECT_BACKEND=1) + endif() + if(MSVC) + target_compile_options(optimize-flatzinc-driver-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-flatzinc-driver-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-flatzinc-driver COMMAND optimize-flatzinc-driver-test) + set_tests_properties(optimize-flatzinc-driver PROPERTIES TIMEOUT 120) + find_package(Python3 3.9 COMPONENTS Interpreter QUIET) + if(Python3_Interpreter_FOUND AND GECODE_OPTIMIZE_WITH_NATIVE) + if(GECODE_OPTIMIZE_WITH_HIGHS) + set(_gecode_cli_highs available) + else() + set(_gecode_cli_highs unavailable) + endif() + add_test(NAME optimize-flatzinc-driver-cli COMMAND "${CMAKE_COMMAND}" -E env + "PYTHONDONTWRITEBYTECODE=1" "${Python3_EXECUTABLE}" + "${PROJECT_SOURCE_DIR}/test/optimize/flatzinc_driver_cli.py" + --binary "$" --highs "${_gecode_cli_highs}") + set_tests_properties(optimize-flatzinc-driver-cli PROPERTIES TIMEOUT 90) + add_test(NAME optimize-minizinc-configure COMMAND "${CMAKE_COMMAND}" -E env + "PYTHONDONTWRITEBYTECODE=1" "${Python3_EXECUTABLE}" -B + "${PROJECT_SOURCE_DIR}/test/optimize/minizinc_configure.py" --cmake "${CMAKE_COMMAND}") + set_tests_properties(optimize-minizinc-configure PROPERTIES TIMEOUT 60) + if(GECODE_OPTIMIZE_MINIZINC_REGISTRATION AND GECODE_OPTIMIZE_MINIZINC_EXECUTABLE) + if(NOT EXISTS "${GECODE_OPTIMIZE_MINIZINC_EXECUTABLE}") + message(FATAL_ERROR "The explicitly configured MiniZinc test compiler is missing") + endif() + add_test(NAME optimize-minizinc-registration COMMAND "${CMAKE_COMMAND}" -E env + "PYTHONDONTWRITEBYTECODE=1" "${Python3_EXECUTABLE}" -B + "${PROJECT_SOURCE_DIR}/test/optimize/minizinc_registration.py" + --minizinc "${GECODE_OPTIMIZE_MINIZINC_EXECUTABLE}" + --binary "$" --registration "${_gecode_optimize_build_msc}") + set_tests_properties(optimize-minizinc-registration PROPERTIES TIMEOUT 150) + endif() + endif() + endif() add_executable(gecode-test-blackbox-exec ${GECODE_TEST_BLACKBOX_EXEC_SOURCE}) target_compile_features(gecode-test-blackbox-exec PRIVATE cxx_std_17) @@ -1654,12 +1796,23 @@ if(GECODE_INSTALL) PATTERN "flatzinc/blackbox.hh" EXCLUDE PATTERN "flatzinc/blackbox-backend.hh" EXCLUDE PATTERN "flatzinc/blackbox-process.hh" EXCLUDE + PATTERN "optimize/quadratic_bound.hpp" EXCLUDE + PATTERN "optimize/lp_observations_detail.hpp" EXCLUDE + PATTERN "optimize/lp_basis_detail.hpp" EXCLUDE + PATTERN "optimize/learning_reasons_detail.hpp" EXCLUDE + PATTERN "optimize/lp_sensitivity_backend.hpp" EXCLUDE + PATTERN "optimize/lp_sensitivity_highs_detail.hpp" EXCLUDE + PATTERN "optimize/native_regular_limits.hpp" EXCLUDE PATTERN "exampleplugin" EXCLUDE PATTERN "standalone-example" EXCLUDE PATTERN "abi*" EXCLUDE) install(FILES ${PROJECT_BINARY_DIR}/gecode/support/config.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/gecode/support/) + if(GECODE_ENABLE_OPTIMIZE) + install(FILES gecode/optimize/c_api.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/gecode/optimize/) + endif() if(GECODE_REGENERATE_VARIMP) install(FILES ${GECODE_VAR_TYPE_HPP} ${GECODE_VAR_IMP_HPP} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/gecode/kernel/) diff --git a/Makefile.in b/Makefile.in index b446405125..0fcb74581f 100755 --- a/Makefile.in +++ b/Makefile.in @@ -1957,6 +1957,20 @@ DOXYGEN_MIN_VERSION = 1.17.0 .PHONY: doc DOCSRC_NOTGENERATED = \ + doxygen/optimize.hh \ + docs/solver-parity/BENCHMARKS.md \ + docs/solver-parity/ALGORITHMIC-CHECKPOINT.md \ + docs/solver-parity/CAPACITY-SCALING.md \ + docs/solver-parity/CATEGORY-SCALING.md \ + docs/solver-parity/ADAPTIVE-BOUNDARIES.md \ + docs/solver-parity/CONFIGURED-BENCHMARK.md \ + docs/solver-parity/checkpoints/benchmark-page.json \ + docs/solver-parity/checkpoints/native-algorithms.json \ + docs/solver-parity/checkpoints/capacity-scaling.json \ + docs/solver-parity/checkpoints/category-scaling.json \ + docs/solver-parity/checkpoints/boundaries.json \ + docs/solver-parity/checkpoints/configured.json \ + docs/solver-parity/checkpoints/ninth.json \ misc/doxygen/back.png misc/doxygen/footer.html \ misc/doxygen/gecode-logo-100.png \ misc/doxygen/stylesheet.css \ @@ -2016,6 +2030,13 @@ doc: mkcompiledirs $(ALLGECODEHDR:%=$(top_srcdir)/%) $(VARIMPHDR) \ cp -f $(top_srcdir)/misc/doxygen/back.png \ $(top_srcdir)/misc/doxygen/gecode-logo-100.png doc/html doxygen doxygen.conf.use + mkdir -p doc/html/checkpoints + cp -f "$(top_srcdir)/docs/solver-parity/checkpoints/benchmark-page.json" \ + "$(top_srcdir)/docs/solver-parity/checkpoints/native-algorithms.json" \ + "$(top_srcdir)/docs/solver-parity/checkpoints/capacity-scaling.json" \ + "$(top_srcdir)/docs/solver-parity/checkpoints/category-scaling.json" \ + "$(top_srcdir)/docs/solver-parity/checkpoints/boundaries.json" \ + "$(top_srcdir)/docs/solver-parity/checkpoints/ninth.json" doc/html/checkpoints ifeq "@ENABLEDOCSEARCH@" "yes" # Work around a doxygen bug (a missing div screws up the layout) diff --git a/README.md b/README.md index a75b48fbf3..94853903d4 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,43 @@ In particular, Gecode comes with [extensive tutorial and reference documentation](https://gecode.github.io/documentation.html). +## Optional optimization API + +The [adaptive size-boundary study](docs/solver-parity/ADAPTIVE-BOUNDARIES.md) +searches each native version separately under ten-second limits, stopping +expansion after a failed size and confirming sampled boundaries. It checks +original witnesses; it does not independently recompute reference optima. + +The [seven-category native scaling study](docs/solver-parity/CATEGORY-SCALING.md) +records 132 fixed ten-second comparisons with independent original-model checks. +It reports tested sizes and unfinished cases; it is not a general solver-capacity +or commercial-parity claim. + +`Gecode::Optimize` adds a sparse owning model API, numerical HiGHS LP/MILP +solving, checked solution starts, bounded logical constraints, ordered +objectives, persistent sessions, numerical conflict diagnostics and strict +LP/MPS exchange. Owning LP observations, basis starts, numerical rays/Farkas +evidence and selected-basis sensitivity retain original-model coordinates. +Scenario batches and bounded continuous convex/concave quadratic models have +explicit separate contracts. A bounded exact-integer bridge compiles sparse +models and typed globals to native Gecode; explicit checked LP/frontier search +and one bounded incumbent neighborhood are also available. +The numerical component builds independently; both routes build +through `-DGECODE_ENABLE_OPTIMIZE=ON`. Existing native interfaces remain available. +See the [build and API guide](docs/solver-parity/README.md), +[validation record](docs/solver-parity/VALIDATION.md), and +[implementation roadmap](docs/solver-parity/IMPLEMENTATION.md) for supported +scope and the native-solver work that remains. +The native reference documentation includes an Optimize task group and guide +from [doxygen/optimize.hh](doxygen/optimize.hh). The +[current integrated checkpoint](docs/solver-parity/NINTH-CHECKPOINT.md) records +the completed scope; the [benchmark report](docs/solver-parity/BENCHMARKS.md) +separates correctness, common-workload timing and remaining limitations. +The [fast regression gate](docs/solver-parity/FAST-REGRESSION.md) checks 35 +required cases within a 28-second whole-command budget using prebuilt binaries. +These additions do not establish commercial-solver parity. Further feature +implementation is on hold after the current checkpoint. + ## CMake Build Options CMake exposes options aligned with the Autoconf build switches. @@ -44,6 +81,7 @@ Version metadata shared by autoconf and CMake lives in `gecode-version.m4`. | `--enable-set-vars` | `GECODE_ENABLE_SET_VARS` | Supported directly | Default `ON` | | `--enable-float-vars` | `GECODE_ENABLE_FLOAT_VARS` | Supported directly | Default `ON` | | `--enable-minimodel` | `GECODE_ENABLE_MINIMODEL` | Supported directly | Default `ON` | +| None | `GECODE_ENABLE_OPTIMIZE` | CMake-only | Optional numerical optimization component; default `OFF`; standalone build also available | | `--enable-driver` | `GECODE_ENABLE_DRIVER` | Supported directly | Default `ON` | | `--enable-flatzinc` | `GECODE_ENABLE_FLATZINC` | Supported directly | Default `ON` | | `--enable-mpfr` | `GECODE_ENABLE_MPFR` | Supported directly | Default `ON`; uses `find_package(MPFR)` | diff --git a/cmake/GecodeConfig.cmake.in b/cmake/GecodeConfig.cmake.in index 9c8f8be229..ece4cd5e8b 100644 --- a/cmake/GecodeConfig.cmake.in +++ b/cmake/GecodeConfig.cmake.in @@ -11,6 +11,7 @@ set(_gecode_supported_components float minimodel lp + optimize driver flatzinc gist) @@ -75,6 +76,8 @@ while(_gecode_dependency_queue) set(_gecode_component_dependencies int set search float) elseif(_gecode_dependency_component STREQUAL lp) set(_gecode_component_dependencies minimodel) + elseif(_gecode_dependency_component STREQUAL optimize AND "@GECODE_OPTIMIZE_WITH_NATIVE@") + set(_gecode_component_dependencies int search) elseif(_gecode_dependency_component STREQUAL gist) set(_gecode_component_dependencies search int set float) elseif(_gecode_dependency_component STREQUAL driver) @@ -90,16 +93,22 @@ while(_gecode_dependency_queue) endwhile() include(CMakeFindDependencyMacro) -if(@GECODE_ENABLE_LP_RELAXATION@) +if(optimize IN_LIST _gecode_component_closure AND "@GECODE_OPTIMIZE_WITH_HIGHS@") find_dependency(highs 1.15 CONFIG) +elseif(lp IN_LIST _gecode_component_closure) + find_dependency(highs CONFIG) +endif() +if(lp IN_LIST _gecode_component_closure OR + (optimize IN_LIST _gecode_component_closure AND "@GECODE_OPTIMIZE_WITH_HIGHS@")) if(NOT TARGET highs::highs) set(Gecode_FOUND FALSE) - set(Gecode_NOT_FOUND_MESSAGE "Gecode was built with LP relaxation, but the highs::highs target was not found") + set(Gecode_NOT_FOUND_MESSAGE "Requested Gecode optimization component requires highs::highs") return() endif() endif() -if(support IN_LIST _gecode_component_closure AND - "@GECODE_PACKAGE_NEEDS_THREADS@" STREQUAL "ON") +if((support IN_LIST _gecode_component_closure AND + "@GECODE_PACKAGE_NEEDS_THREADS@" STREQUAL "ON") OR + optimize IN_LIST _gecode_component_closure) find_dependency(Threads) endif() if(float IN_LIST _gecode_component_closure AND @@ -182,6 +191,16 @@ unset(_gecode_qt_version) set(PACKAGE_PREFIX_DIR "${_gecode_package_prefix_dir}") include("${CMAKE_CURRENT_LIST_DIR}/GecodeTargets.cmake") +if(TARGET Gecode::gecodeoptimize AND NOT TARGET Gecode::optimize) + add_library(Gecode::optimize INTERFACE IMPORTED) + set_target_properties(Gecode::optimize PROPERTIES + INTERFACE_LINK_LIBRARIES Gecode::gecodeoptimize) +endif() +if(TARGET Gecode::gecodeoptimize_c AND NOT TARGET Gecode::optimize_c) + add_library(Gecode::optimize_c INTERFACE IMPORTED) + set_target_properties(Gecode::optimize_c PROPERTIES + INTERFACE_LINK_LIBRARIES Gecode::gecodeoptimize_c) +endif() set(Gecode_VERSION "@GECODE_PROJECT_VERSION@") set_and_check(Gecode_INCLUDE_DIRS "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") diff --git a/cmake/GecodeSources.cmake b/cmake/GecodeSources.cmake index 0c9defc0f1..6b9b06951d 100644 --- a/cmake/GecodeSources.cmake +++ b/cmake/GecodeSources.cmake @@ -238,6 +238,7 @@ set(GECODE_FLATZINC_SOURCES gecode/flatzinc/blackbox-process-windows.cpp gecode/flatzinc/blackbox-propagator.cpp gecode/flatzinc/branch.cpp + gecode/flatzinc/capture.cpp gecode/flatzinc/flatzinc.cpp gecode/flatzinc/lexer.yy.cpp gecode/flatzinc/parser.tab.cpp diff --git a/docs/solver-parity/ADAPTIVE-BOUNDARIES.md b/docs/solver-parity/ADAPTIVE-BOUNDARIES.md new file mode 100644 index 0000000000..4c0aa72618 --- /dev/null +++ b/docs/solver-parity/ADAPTIVE-BOUNDARIES.md @@ -0,0 +1,105 @@ +# Adaptive ten-second problem-size boundaries + +This study uses independent exponential bracketing and integer binary search to +find a ten-second boundary for each native solver version. A version stops +expanding after its first failed size. It then searches smaller sizes between +its last success and failure. The candidate and its adjacent sizes receive two +runs; every knapsack size includes both profit variants. Failed confirmations +remain recorded and can lower the reported boundary. + +The displayed value is the **largest sampled, confirmed size**, not an absolute +solver limit. Integer-programming difficulty is not monotonic in variable count. +A larger untested instance can be easier than a smaller failed one. The report +preserves observed reversals, unconfirmed discoveries, search ceilings and every +actual input and decision. Missing outcomes are unknown, never synthetic +failures or estimated completion times. + +After both searches, timing points within the smaller confirmed boundary (plus +its adjacent size) are shared where needed. The weaker version is not run across +the stronger version's large-size range. Each curve uses only actual observations +for that version. Discovery uses one run; confirmation uses two. A knapsack +point summarizes both variants and all its runs, with the complete timing range. +No full-cohort completion-time estimate is shown if any run is unfinished. + +## Recorded results + +The local run records **162 measurements across 71 sampled inputs** in **931.62 seconds**, plus two loader probes. The measured tooling source is `f724bd01795a87b2c310ba368c66d36bb09f660f`. Every headline size passes two runs per version and every knapsack variant. + +| Category | Before confirmed | Optimized confirmed | Next tested failure (before / optimized) | +| --- | --- | --- | --- | +| Knapsack | 33 items / 33 model variables | 407 items / 407 model variables | 34 / 408 in natural size units | +| Assignment | 17 tasks / 289 model variables | 17 tasks / 289 model variables | 18 / 18 in natural size units | +| Facility location | 8 sites / 136 model variables | 8 sites / 136 model variables | 9 / 9 in natural size units | +| Bin packing | 17 items / 108 model variables | 17 items / 108 model variables | 18 / 18 in natural size units | +| Production planning | 11 periods / 88 model variables | 11 periods / 88 model variables | 12 / 12 in natural size units | +| Routing | 21 cities / 42 model variables | 21 cities / 42 model variables | 22 / 22 in natural size units | +| Weighted queens | 23 queens / 92 model variables | 23 queens / 92 model variables | 24 / 24 in natural size units | + +Knapsack expands from 33 to 407 items (12.33 times the sampled size). At 33 items, the older correlated case takes 9.990 and 9.730 seconds; the boundary is sensitive to host timing. Both 407-item optimized variants complete near 28 ms. The other six confirmed capacities match. + +One assignment timeout reports 25.724 seconds internally but 8.819 seconds externally. The host clocks disagreed; the cause is not established. That observation remains unfinished and has no completion-time estimate. Its second confirmation also reaches the limit with consistent clocks. No completed result has this discrepancy. + +The [complete portable record](checkpoints/boundaries.json) preserves raw results, inputs, decisions, untested cohorts and clock details. Earlier observations are not pooled into this adaptive experiment. + +## Models and interpretation + +Inputs use deterministic extensions of the previous seeded model blocks. The +new generator preserves their existing data where dimensions coincide. Facility +location now has twice as many customers as candidate sites; bin packing uses +`ceil(items/3)` candidate bins. These dimensions differ from some cases in the +previous fixed suite, so this is a separate study. + +| Category | Natural size | Model variables | Search domain | +| --- | --- | --- | --- | +| Knapsack | Items `n`, both profit variants | `n` Binary | 8..512 | +| Assignment | Tasks/workers `n` | `n*n` Binary | 3..32 | +| Facility location | Sites `n`, customers `2*n` | `n+2*n*n` Binary | 2..16 | +| Bin packing | Items `n`, bins `b=ceil(n/3)` | `n*b+b` Binary | 4..32 | +| Production planning | Periods `n`, eight options | `8*n` Binary | 3..48 | +| Circuit routing | Cities `n` | `2*n` integer, including cost columns | 4..96 | +| Weighted queens | Queens `n` | `4*n` integer, including diagonal/cost columns | 4..32 | + +Counts compare versions within one category, not difficulty across categories. +The native driver and before/current runtime libraries are the same preserved +products as the earlier seven-category study. There is no solver algorithm or +ABI change in this experiment. + +Every accepted solution is independently checked against its original model, +objective and auxiliary values. Exact optimality is reported by the backend; +this study does **not** independently recompute all reference optima. Matching +reported objective and bound alone is not an independent optimality certificate. +Cross-version and repeated optimum disagreements, better feasible peer solutions, +contradictory peer bounds, malformed results and process failures reject the +study instead of becoming a size boundary. + +## Execution and reproduction + +Every solve uses Native/BAB, Exact, one thread, no starts, seed zero, zero gap +allowances and a ten-second internal budget. Capture allows eleven seconds plus +at most 0.5 seconds cleanup. The full invocation is bounded to 2,400 seconds, +480 subprocess attempts including loader probes, and 32 distinct sizes per +category. Confirmation can reconsider a changed boundary at most six times. +A ceiling or unfinished confirmation is reported as unresolved. + +The generator, source hashes and search policy are fixed before measurement. +Each deterministic input is saved and hashed before its first solve. Every +attempt is recorded before launch; raw output, monotonic offsets, search choices +and every failed confirmation are retained. Two loader probes establish the +actual library cohorts, and final integrity checks cover source, driver, inputs +and libraries. Preparation/validation occurs outside internal solve timing. + +From the repository root, using the preserved local products: + +```sh +python3 -B experiments/optimize/benchmark_boundaries.py \ + --output-dir build/adaptive-boundaries/results +``` + +Choose a new output directory for another study. Existing directories are never +overwritten. The runner builds or downloads nothing and does not resume or retry +an interrupted solve. Sixteen focused generator/runner tests cover encodings, +original validation, independent search behavior, confirmation and budget gates. + +The complete portable results are linked from the benchmark page. Earlier +[fixed category results](CATEGORY-SCALING.md), [capacity results](CAPACITY-SCALING.md) +and [algorithm results](ALGORITHMIC-CHECKPOINT.md) remain separate checkpoints. diff --git a/docs/solver-parity/ALGORITHMIC-CHECKPOINT.md b/docs/solver-parity/ALGORITHMIC-CHECKPOINT.md new file mode 100644 index 0000000000..25d61c96e1 --- /dev/null +++ b/docs/solver-parity/ALGORITHMIC-CHECKPOINT.md @@ -0,0 +1,196 @@ +# Native search algorithm checkpoint + +This checkpoint adds a bounded exact optimization for binary capacity models in +`Gecode::Optimize`. It adds no new model class, public option or ABI. The larger +commercial-parity roadmap remains unfinished and on hold. + +## Changes + +Ordinary native search recognizes a pure capacity model: every active variable +is Binary with domain `[0,1]`, and one integral row covers every variable with +strictly positive weights and an upper capacity, or the equivalent negative +weights and lower capacity. The opposite row side must be absent or redundant. +Active indicators, globals, additional rows and uncovered columns are excluded. +Explicit checked-LP and local-neighborhood construction retain their existing +behavior. + +An exact item/capacity dynamic program computes the best objective for each +at-most capacity. The full table keeps reconstruction independent of overwritten +predecessors. Capacity is capped at **65,536**, and the complete table, including +its base row, at **one million 64-bit cells** (at most 8 MB of table storage). +The frozen 80-variable knapsack uses 27,378 cells. Shape or size-cap misses fall +back to ordinary search. Time/cancellation checks remain active; an unfinished +computation supplies no bound. Costs are normalized for both objective senses; +the exact offset remains separate. + +After reconstructing and independently recomputing its binary witness, row load +and original objective, the optimization supplies a **one-sided objective bound** +and an owning, domain-checked branch preference. Existing search still validates +and publishes incumbents, statuses, bounds and node counts. DP cells are +preprocessing work, not invented search nodes. Generic smallest-domain, +minimum-first branching and non-DP frontier order remain unchanged. DP hints +follow each engine's actual descent order; BestBound favors the region containing +the verified DP witness only when objective bounds tie, preventing a flat exact +bound from delaying that solution behind unrelated siblings. Original Gecode +user-defined branchers and numerical HiGHS solving are unaffected. + +This is a deliberately capped, pseudopolynomial exact special case, using the +standard take/skip recurrence described in +[MIT's knapsack notes, pages 1–3](https://ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011/95e744ee64464cb6bc8f8264faeea080_MIT6_006F11_rec21.pdf). +It is not a new general MILP engine or a state-of-the-art core knapsack solver. +The small eligible model can avoid a long enumeration without tuning parameters +or new dependencies. + +## Validation + +The frozen solver product is `b57bf49ad`; final source identity and runtime hashes +are retained in the accepted benchmark record. The current **70/70 Release +CTest entries pass**, including the original native tests, actual FlatZinc and +MiniZinc pipeline, and **84 Python tests**. The **12 affected native ASan/UBSan +tests pass**, using the existing instrumented native/HiGHS build with leak +checking disabled and halt-on-error enabled. The new backend-disabled boundary +case also passes. Release and sanitizer gates ran in parallel in separate build +directories; their elapsed times are validation durations, not performance +comparisons. The earlier full sanitizer/platform records remain historical. + +The new native capacity test checks **1,494 finite-oracle and budget +configurations**, including both objective senses and row orientations, signed +and zero costs, offsets, aliases/tombstones, caps, fallback models, starts, +LP bypass and clone ownership. A zero-cost tie fixture requires all three search +modes to finish within a linear node quota. Two coordinator-only fault cases +interrupt after one completed DP row: neither cancellation nor allocation +failure may publish the tighter optimum bound or a witness from that partial +table. Existing frontier, start, neighborhood and fault-publication assertions +remain intact. All 2,963 preserved original source/input hashes still match. + +The final FAST gate passes **35/35** in **5.8439 seconds** external wall time. +The capture helper passes **13/13** short process fixtures, and its benchmark +validator passes **7/7** tests. An existing macOS process-group cleanup race was +exposed by these fixtures: the helper now reaps an exiting leader before one +bounded retry when group termination initially returns permission denied. +Persistent denial and reaping failures still propagate. Initial failed fixture +runs remain in the local record. This changes the helper hash between pilot +and accepted studies; both final cohorts use the same fixed helper. The driver, +runner, models, reference records and time limits are unchanged. + +## Accepted measured results + +Final measured source is `5d533bcd4f66e9f065e24bac5ed7a7c976d715db`; only the +capture harness changed after compiled solver commit `b57bf49ad`. All **60/60** +returned witnesses pass independent checks. Before completes **24/30** runs; +after completes **30/30**. There are six before-cohort solver time limits and +no hard timeouts, output failures or validation errors. Ordinary Native improves +from **7/8 to 8/8** completed problem units and DepthFirst from **1/2 to 2/2**; +a unit requires all three repetitions to prove the independently known optimum. +The fixed panel takes 18.8507 seconds including its two separate loader probes. + +| Problem / route | Before completion | Now completion | Before median wall time | Now median wall time | +| --- | --- | --- | --- | --- | +| Knapsack / ordinary Native | 0/3 | 3/3 | Unfinished at 2 s solver limit | 12.55 ms | +| Knapsack / DepthFirst | 0/3 | 3/3 | Unfinished at 2 s solver limit | 10.46 ms | +| Facility location / Native | 3/3 | 3/3 | 453.43 ms | 453.99 ms | +| Assignment / Native | 3/3 | 3/3 | 105.34 ms | 106.50 ms | +| Binary TSP / Native | 3/3 | 3/3 | 34.85 ms | 34.39 ms | +| Production / Native | 3/3 | 3/3 | 19.91 ms | 20.60 ms | +| Bin packing / Native | 3/3 | 3/3 | 10.74 ms | 10.91 ms | +| Circuit TSP / Native | 3/3 | 3/3 | 20.06 ms | 21.93 ms | +| Weighted queens / Native | 3/3 | 3/3 | 19.40 ms | 21.02 ms | +| Bin packing / DepthFirst | 3/3 | 3/3 | 10.83 ms | 10.57 ms | + +**Lower time is better; higher completion is better.** All these problem types +were supported before and remain supported. For knapsack the change makes a +previously unfinished solve complete within this limit; it adds no model class. +No speed ratio is assigned to an unfinished baseline. Current knapsack returns +and proves **−2464** in every run. Previously, ordinary Native returned −1947; +DepthFirst returned −1792, −1780 and −1792. These minimization objectives favor +lower values. Its 159 current DFS admissions replace roughly 1.87–1.88 million +admissions in the unfinished baseline; the bin-packing control stays at 57. + +The eight completed control units have mixed wall-time changes: median changes +range from 2.4% less to 9.4% more. The largest absolute increase is circuit TSP, +about 1.88 ms; its internal solve median actually falls slightly. Weighted queens +rises about 1.62 ms externally and 0.17 ms internally. These small desktop timings +remain visible and do not establish a general speed improvement or absence of +overhead. The benchmark page plots the recorded medians and all repetition ranges. + +## Rejected ordering pilot + +An initial generic objective-endpoint/DFS-ordering experiment passed 70 Release +CTest entries and 35 FAST cases, but its 60-run timing panel did not justify +shipping it. Both versions completed 7/8 ordinary Native and 1/2 DFS units. +Ordinary knapsack's two-second incumbent worsened from **−1947 to −1831**; +the independently known optimum is −2464. DFS bin packing grew from 57 to 75 +admitted nodes. A small DFS knapsack incumbent improvement did not offset that +regression. The generic defaults and their path-dependent fixture changes were +reverted. All pilot records and failures from initial test development remain +available, separately from the accepted comparison. + +The same frozen problem panel is reused to assess the narrower algorithm. +Because the pilot informed development, this is an adaptive regression panel, +**not an untouched holdout**. No instance, reference, repetition or time limit +is removed to improve the result. + +## Fixed comparison method + +The immediate prior source is `530a3b7837205d8255c6640425018831d3f8ee0e`, whose +C++ solver binaries were compiled at `c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60`. +Before rebuilding, all required runtime libraries were copied and hashed. +The same benchmark executable loads each cohort through process-local library +paths; actual dynamic-loader traces and post-run hashes verify the cohorts. +The before/after build configuration is the same Release AppleClang/macOS +configuration. No original checkout file or saved benchmark input is modified. + +Eight existing instances were selected before observing candidate performance: +six binary families (knapsack, facility location, assignment, TSP, production, +bin packing) plus native circuit TSP and weighted queens. Ordinary Native solves +all eight. Explicit DepthFirst separately solves knapsack and bin packing. +The ten problem/route units each receive three alternating before/after pairs: +**60 measured executions**, two-second solver limits, three-second child caps +and a 240-second outer allowance. Two additional loader probes establish +runtime provenance; they are retained separately from measurements. + +All builds and agent solver work stop before timing. Ordinary desktop activity +can still affect short runs. The exact source, complete input/reference hashes, +all outcomes, internal solve time and external wall time are retained. No +solver start or known optimum is supplied. Independent original-problem +validators check each returned witness and objective. Saved optima come from +prior independent combinatorial oracles; their frozen records and witnesses +are rechecked without repeating expensive enumeration. + +**Lower completion time is better; higher optimal completion is better.** +All three repetitions must finish with independently verified optima for a +completion-time bar or paired speed ratio. Time-limited runs remain unfinished, +including when their incumbent equals the known optimum. Every attempted run +stays in the denominator. Ordinary Native has no public node counter; missing +counts remain unavailable. DepthFirst reports actual frontier counters. + +## Evidence and reproduction + +The [complete public record](checkpoints/native-algorithms.json) includes +all repetitions and the audited summary. Private local artifacts remain in +`build/comparison-algorithms/`: `before/manifest.json`, build/test logs, +`fast-accepted.json`, `fast-accepted-wall.json`, and `final-results/` with loader traces, +raw solver output, `report.json`, `summary.json` and local resolved paths. +The rejected pilot remains in `results/`; the same measured executable is +preserved byte-for-byte in `fixed-driver/`. + +```sh +cmake --build build/native-compat --target optimize-native-benchmark --parallel 2 +python3 -B experiments/optimize/benchmark_native_algorithms.py \ + --before-libraries build/comparison-algorithms/before/lib \ + --after-libraries build/native-compat/gecode/optimize \ + --after-libraries build/native-compat \ + --binary build/comparison-algorithms/fixed-driver/optimize-native-benchmark \ + --output-dir build/comparison-algorithms/new-results +``` + +The preserved baseline is a prerequisite; never recreate it from candidate +libraries. Output directories must be new. This runner is currently for the +recorded macOS dynamic-library layout; it does not claim Windows/Linux runtime +validation. Build before measuring, then stop other project jobs. The benchmark +page imports frozen evidence without invoking any solver. + +The earlier [before-project comparison](BENCHMARKS.md) and +[ninth checkpoint](NINTH-CHECKPOINT.md) retain their original cohorts and results. +They are not pooled with these measurements. Three repeated pairs form a small +diagnostic, not evidence of statistical significance or industrial-wide speed. diff --git a/docs/solver-parity/BENCHMARKS.md b/docs/solver-parity/BENCHMARKS.md new file mode 100644 index 0000000000..52ea544c17 --- /dev/null +++ b/docs/solver-parity/BENCHMARKS.md @@ -0,0 +1,172 @@ +# Before and after: supported problems and measured time + +The [adaptive boundary study](ADAPTIVE-BOUNDARIES.md) searches the two native +versions separately under ten-second limits. Expansion stops after a failed +size, followed by bounded search and confirmation; the result is a sampled +boundary, not an absolute solver limit. Original witnesses are independently +validated, while optimality is reported by the backend without a separate +reference oracle. Its observations remain separate from the fixed panels. + +For the fixed local native size panel, see the +[seven-category scaling study](CATEGORY-SCALING.md): 33 fixed cases, 132 runs, +ten-second limits, grouped knapsack variants and explicit integer-model +dimensions. Its observations remain separate from the earlier studies below. + +This is the preserved before-project to ninth-checkpoint study. The later +[native algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md) has its own fixed +comparison panel and separately retained observations. +The subsequent [capacity scaling study](CAPACITY-SCALING.md) holds that solver +product fixed and measures the largest tested sizes proved within ten seconds: +32 to 384 variables for each of two knapsack distributions, unchanged assignment +capacity, and an explicitly retained 512-variable fallback limit. Its 52 runs +remain separate from the historical timing panels below. + +These results compare preserved pre-project Gecode binaries with the ninth +integrated implementation on 5 September 2026. **Less elapsed time is better; +more completed, checked solves is better.** An unsupported API has no timing. +A time-limited solve is unfinished and must not be scored as a fast completion. + +The visual benchmark page is the `/progress` route in the sibling +`benchmark-site` project. Its downloadable JSON contains every repetition and +support notes. This document also enters Gecode's native Doxygen documentation +through the Optimize task pages. The source checkout and old benchmark artifacts +remain unchanged. + +## What was compared + +- **Before:** preserved `enhanced-binary` and `enhanced-fzn` binaries from the + pre-project experimental Gecode 6.4 checkout. This baseline already had native + integer CP, global constraints, FlatZinc, parallel CP and an experimental + binary linear adapter. It is not untouched upstream Gecode. +- **Now:** compiled product `c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60`, measured + from documentation/report head `2da8c21a64dddcce6aed58232238a0a138675509`. + Later documentation changes do not change the measured solver binaries. +- **Machine and limits:** Apple M1 Pro, macOS 15.7.4, one solver process at a time, + three paired repetitions in alternating version order, a two-second solver + limit, no supplied solution starts. Startup, input reading, search and output + are included in external wall time. A separate process deadline contains + overruns; time limits are cooperative, not exact wall-time completion promises. +- **Scope:** five existing pure-binary MIPLIB models and four unchanged native + FlatZinc regression fixtures. These are two distinct panels, not a pooled + performance score or a representative industrial benchmark. + +The preserved before binaries are self-contained; the current executables load +shared Gecode libraries. Actual loader paths and library hashes are retained. +This is an end-to-end comparison of usable builds and routes. It does not isolate +algorithm changes from process startup, loading or file-format costs. + +## Binary optimization: completion improved, not every runtime + +The old route is the experimental binary `auto` adapter. The new route is +`optimize-file` using HiGHS 1.15.1. Original TXT and MPS inputs are independently +checked for exact mathematical equivalence. Each returned witness is checked +against the original integer rows/domains, and completed answers must match the +known optimum. Numerical HiGHS termination is not an exported exact proof. + +| Model | Before: completed runs | Now: completed runs | Before: median completion wall | Now: median completion wall | +| --- | ---: | ---: | ---: | ---: | +| p0033 | 3/3 | 3/3 | 16.43 ms | 30.77 ms | +| p0201 | 0/3 | 3/3 | No completion within limit | 640.65 ms | +| p0282 | 0/3 | 3/3 | No completion within limit | 159.08 ms | +| p0548 | 0/3 | 3/3 | No completion within limit | 70.55 ms | +| lseu | 0/3 | 3/3 | No completion within limit | 190.52 ms | + +The current route completed all five models in every repetition, versus one +model before: **15/15 versus 3/15 completed runs**. All returned witnesses were +feasible under independent exact checking, including the twelve old runs that +stopped without proof. The old p0201 witness equals the known optimum, but the +solver had not established completion; it is counted as unfinished. This panel +measures optimal completion, not merely time to any feasible solution. + +p0033 takes more wall time now. The four censored models have no old completion +time, so no finite speedup ratio is claimed for them. A two-second cap is not a +measured time to optimum. Binary models were supported before and now; the +improved result is practical completion on these inputs, not newly added binary +problem-class support. + +## Native CP: retained correctness, more startup-scale wall time + +Both versions use the original native FlatZinc path, matching the existing exact +expected-output fixtures. This oracle is not an independent mathematical proof. +All **12/12 runs per version** matched, including termination output. + +| Original fixture | Before median external wall | Now median external wall | +| --- | ---: | ---: | +| Job-shop scheduling | 5.04 ms | 10.60 ms | +| Cumulative scheduling | 4.21 ms | 9.19 ms | +| Sudoku | 4.56 ms | 9.88 ms | +| Multidimensional knapsack | 4.44 ms | 9.37 ms | + +These tiny cases take longer end to end in the current shared-library build. +Median reported internal search is approximately 0.02–0.18 ms, much smaller +than process wall time. Startup, loading, parsing and output therefore dominate; +these results do not establish a twofold slowdown in the underlying propagation +or search algorithms. The public page shows the longer bars and the build-layout +difference explicitly. No regression result is hidden because it is unfavorable. + +## Capability changes are distinct from timing changes + +The initial source snapshot is `e10562fd9`. The implemented API scope is described +in the [current guide](README.md) and native Optimize Doxygen task pages. + +| Problem or workflow | Before project | Ninth checkpoint | +| --- | --- | --- | +| Binary/bounded integer CP, globals and native FlatZinc | Already supported | Retained; explicit owning model/compiler routes added | +| General continuous LP and mixed continuous/integer linear models | No general numerical MP route | Numerical HiGHS LP/MILP with explicit scale and guarantee limits | +| Continuous convex quadratic objective | No dedicated numerical QP API | Bounded continuous weighted-affine-square subset through HiGHS; no arbitrary Hessian/QCP/MIQP | +| LP observations, basis starts, rays and sensitivity | No unified owning original-model API | Numerical data and evidence; selected-basis coefficient/equality-RHS sensitivity | +| Repeated solves and application workflows | Application-managed | Sessions, serial scenarios, ordered objectives, grouped conflicts, weighted L1 repair and ranked pools, each with documented limits | +| Native incumbent neighborhoods | Application-defined heuristics possible | One explicit bounded BinaryHamming improvement attempt; C++ only | +| Owning optimization C/Python package | No corresponding Optimize facade | Versioned handles and Python ctypes; installed ninth libraries tested; older wheel unchanged | +| General MIQP/QCP/global nonlinear MP | No equivalent dedicated engine | Still outside Optimize scope; original finite-domain/FloatVar facilities remain distinct | +| Parallel native CP | Already supported | Retained; added Optimize routes currently use one worker | +| Production learning/parallel hybrid/action callbacks | No matching integrated hybrid facility | Remains unfinished | + +Missing support does not mean Gecode could never express a related model using +custom CP code. Conversely, a new wrapper does not make a complete problem class +or all combinations of workflows supported. HiGHS-delivered capability is +labeled numerical and delegated. No CPLEX/Gurobi execution or parity is claimed. + +## Fresh regression and evidence + +The fresh **35/35 FAST gate passed in 5.8003 seconds external wall time** +(5.7168 seconds reported inside its runner). Its unchanged outer budget is +28 seconds; compilation is excluded. The new sensitivity fixture checks 63 +conditions; the native neighborhood fixture checks 14, including a real local +improvement and the independently enumerated global optimum of −29. These are +correctness-fixture times, not large-model new-feature benchmarks. + +The previous eighth-to-ninth comparison is a separate historical result in +[NINTH-CHECKPOINT.md](NINTH-CHECKPOINT.md). Five complete paired 33-case runs +passed; an additional current panel hit the four-second `cp_distinct` deadline. +That failed repeat remains disclosed. It is not part of this pre-project panel +and is not replaced by the fresh FAST pass. + +Raw evidence is in `build/before-project-comparison/results/`: `report.json` +retains commands, all 54 run records and original/model/binary/runtime hashes; +`summary.json` contains the graph-ready repeated measurements; +`provenance.public.json` contains path-free provenance; and `current-fast.json` +plus `current-fast-wall.json` record the fresh gate. The committed page snapshot +is [checkpoints/benchmark-page.json](checkpoints/benchmark-page.json). + +Reproduce from the implementation repository with preserved original artifacts: + +```sh +python3 -B experiments/optimize/benchmark_progress.py \ + --before-source /path/to/original/gecode \ + --current-build build/native-compat \ + --output-dir build/progress-repeat \ + --seconds 2 --repetitions 3 --budget-seconds 180 +``` + +The output directory must be new. Do not compile, generate documentation or run +other test jobs during timing. Reproduction requires the preserved original +experimental binaries and their metadata, current compiled libraries and cached +inputs; it does not download or rebuild solvers. The runner exposes the exact +path options through `--help`. It retains failed/censored outcomes and refuses +to silently compare mismatched input mathematics. + +The page's `scripts/import-progress.py` imports records without running solvers. +Short-run medians have no statistical confidence intervals; there is no broad +holdout, memory comparison or overall solver score. Actual Windows/Linux +execution and a ninth-checkpoint wheel rebuild remain outside this batch. diff --git a/docs/solver-parity/BINDINGS.md b/docs/solver-parity/BINDINGS.md new file mode 100644 index 0000000000..cace22e398 --- /dev/null +++ b/docs/solver-parity/BINDINGS.md @@ -0,0 +1,714 @@ +# Version 1 C and Python bindings + +The additive optimization facade has a versioned C99 ABI and a small Python +`ctypes` package. Both build the same owning model and call the same +solver/session implementation as C++. They support continuous, integer, binary, +semicontinuous and semiinteger variables, ranged linear rows, a single linear +objective with an offset and min/max sense, edits, numerical LP/MPS I/O, solver +selection, limits, sparse primal starts, cancellation, persistent sessions, and +immutable historical results. Typed AllDifferent, Element, Table, Cumulative, +Circuit and Regular records, bounded indicators, and Boolean AND/OR helpers are +also exposed. +Ranked discrete-projection pools and explicit weighted feasibility repairs have +separate owning workflow results, including copied nested solve results. +Scenario batches, finite-box continuous quadratic objectives expressed as weighted +squares, LP observations, basis submission, ray/Farkas evidence and basis +sensitivity analysis have dedicated owning interfaces described below. +Atomic bulk variable, row and CSR construction is exposed through the same +C++ transaction boundary; see [bulk construction](BULK.md#c-and-python-bulk-construction). + +This is a bounded first binding surface. There are no C/Python builders for +arbitrary quadratic expressions, multiobjective workflows, conflict refinement, +callback registration, lazy constraints or proof certificates. Those require +additional versioned entry points. The explicit native selector reaches only models in the C++ native +backend's supported subset. Binding availability does not imply that either +solver backend was built. `capabilities` reports backend availability; unsupported +models and guarantees return a solver `UNSUPPORTED` result without changing the +requested semantics. Standalone `Model.solve(AUTO)` selects Native when the +model has active typed globals, otherwise HiGHS. A persistent session's AUTO +route remains HiGHS and explicitly rejects active globals. Explicit Native is +available through standalone solves and supported standalone workflows; +persistent Native session calls return `UNSUPPORTED`. A session never silently +changes its backend. + +## Using Python + +No Python solver implementation or extension-module ABI is involved. Python 3.9+ +uses the standard library and the built `gecodeoptimize_c` shared library. For +source-tree use, put the repository's `python/` directory on +`PYTHONPATH` and set `GECODE_OPTIMIZE_LIBRARY` to an absolute path to the shared +library (`.dylib`, `.so`, or `.dll`). Alternatively pass that path or an explicit +`Library` instance to `Model`, `Session`, and `Cancellation`. Importing the Python +package does not load the library. Failure to locate/load a binary is explicit. +The [experimental macOS wheel recipe](WHEELS.md) packages a matching library +that the installed package discovers automatically. Explicit library arguments +and `GECODE_OPTIMIZE_LIBRARY` take precedence over that bundled library; this +recipe does not publish to PyPI or provide Linux/Windows distributions. + +```python +from gecode_optimize import Model, Options, Session, Termination, VariableType + +with Model() as model, Session() as session: + quantity = model.add_variable(VariableType.INTEGER, upper=8, name="quantity") + model.add_row({quantity: 2}, lower=3) + model.set_objective({quantity: 3}, offset=-1) + with session.solve(model, Options()) as result: + if result.termination == Termination.OPTIMAL: + print(result.objective, result.value(quantity)) # 5.0, 2.0 + model.set_bounds(quantity, 4, 8) + historical = session.solve(model) + +# Results own their snapshot data and survive model/session destruction. +with historical: + print(historical.objective, historical.value(quantity)) # 11.0, 4.0 +``` + +Use `close()` or context managers for Model, Session, Result, PoolResult, +RepairResult and Cancellation. +Sequential `close()` is idempotent; later operations raise `RuntimeError`. +Destructors provide only best-effort fallback cleanup. Variable, Row, GlobalConstraint and Indicator values are +immutable typed identities, not owners, and remain useful for historical result +lookup. Cross-model, removed, and wrong-kind identities are rejected. Imported +models have new owner/slot identities; old identities cannot index their results. +Library-instance checks prevent accidentally mixing Python objects created +through separate `Library` instances. Python integers are range checked before +conversion to fixed-width C fields, and strings containing embedded NUL are +rejected. Names and paths use UTF-8; filesystem support for those paths follows +the platform C++ I/O implementation. + +An `ApiError` has a numeric `code` and copied error text. It represents malformed +arguments, bad handles, rejected model edits, or wrapper/backend exceptions. +Ordinary solver outcomes, including infeasibility, limits, missing backends and +unsupported guarantees, are represented by `Result.termination`. Always inspect +`has_solution` before reading values. Optional objective/bound/gap properties are +`None` when absent. `values` returns fresh per-slot records with separate `active` +and `present` masks; a removed slot cannot be mistaken for a zero-valued variable. +`backend`, `backend_version`, `message`, `info`, and session `statistics` are copies. + +## Typed globals and logical helpers + +```python +from gecode_optimize import Model, VariableType + +with Model() as model: + x = model.add_variable(VariableType.INTEGER, 0, 2) + y = model.add_variable(VariableType.INTEGER, 0, 2) + distinct = model.add_all_different([x, y], name="distinct") + model.add_table([x, y], [(0, 1), (2, 0)]) + model.set_objective({x: 1, y: 2}) + with model.solve() as result: # AUTO chooses Native for typed globals + print(result.termination, result.objective) + model.set_name(distinct, "different choices") + model.remove(distinct) +``` + +`add_element(index, elements, result, index_base=0)` selects an array variable +using the explicit base. `add_circuit(successors, index_base=0)` requires one +cycle through the nonempty successor array. `add_cumulative(starts, durations, +heights, capacity)` has mandatory tasks with fixed integer durations/heights and +half-open intervals; a zero duration or height uses no resource. Global arrays +preserve aliases: AllDifferent([x,x]) is infeasible, and repeated Table/Element +variables retain equality of their occurrences. No alias is silently removed. +Integer constants and bases use checked int64 conversion; the shared model +contract additionally requires exact representation within +/-2^53. Native +execution has its narrower finite-domain integer limits. In Python, mismatched +tuple arity is rejected before posting. C tables take an explicit row-major flat +array, arity, tuple count and value count; checked multiplication must reproduce +the provided value count. Cumulative arrays carry separate checked counts. +A table of arity zero with no tuples is false, while one empty tuple is true. + +These methods return `GlobalConstraint` identities; `remove` and `set_name` +accept them. Removing a variable referenced by an active global is rejected. +A removed global cannot be renamed or removed again. All record building and +identity validation work even when no solver backend is compiled. LP/MPS export +rejects active typed globals, and an unsupported solver route returns +`UNSUPPORTED` without dropping the records. See [GLOBALS.md](GLOBALS.md) for the +shared model and Native semantics. + +`add_indicator(activator, active_value, terms, lower, upper, name="")` requires +a Binary activator and an actual Python bool for `active_value` (C accepts exactly +0 or 1). It invokes the bounded C++ formulation: required inactive activity +bounds must be finite, M is derived, and original logical metadata remains for +independent validation. The returned `Indicator` includes `inactive_gate`, which +is a Variable or None. `model.remove(indicator)` removes its generated rows and +metadata in one revision; an auxiliary gate remains as a variable and may then +be removed through `model.remove(indicator.inactive_gate)` when unused. Widening +domains that justified the indicator is rejected until its formulation is rebuilt. +Generated row identities are not exposed by this binding, and their semantics +cannot be weakened through generic row edits. Active indicators cannot be exported +to LP/MPS through the strict I/O facade. A tautological indicator still has a +logical identity even when no gate or row was required. + +`add_boolean_and(result, inputs=())` and `add_boolean_or(result, inputs=())` +atomically post ordinary rows and return None. Variables must have Binary type; +AND(empty) fixes true, OR(empty) fixes false. Duplicate inputs and output/input +aliases follow the C++ helper's logical semantics. This initial binding exposes no +row list or helper-group removal for Boolean postings; their generated ordinary +rows stay in the model. Build explicit rows when individual row editing/removal +is required. C++ helpers perform validation/allocation before commit, and wrapper +output conversion adds no allocation after posting; malformed bound/type/owner, +dimension and required-output cases leave model identity/revision unchanged. + +## C ownership and ABI contract + +Include `gecode/optimize/c_api.h` from C99 or C++, link `gecodeoptimize_c`, and +check every API return code. The header contains only fixed-width C fields and +plain caller-owned records. All exported functions use the `gecode_opt_v1_` +prefix and `gecode_opt_v1_abi_version()` returns 1. Published enum values are +mapped explicitly to C++ enums. Options and metadata records have versioned +names and exact-size checks; initialize options using +`gecode_opt_v1_options_default(&options, sizeof options)`. A NULL options pointer +requests defaults. Size mismatches and unknown enums fail. Struct layout follows +the platform's standard C ABI; callers must not use packed/reordered records. + +Opaque `uint64_t` handles identify Model, Session, Result, Cancellation, PoolResult +or RepairResult objects. +Zero is invalid. A registry checks kind and lifetime, and tokens are not reused. +Entity identities contain owner, slot, an explicit kind (Variable=1, Row=2, +GlobalConstraint=3, Indicator=4) and a reserved zero field. The added kinds and +entry points preserve the existing ABI-1 24-byte identity layout. New clients +require these additive symbols; old clients retain their existing entry points. Keep these tokens and identities within the library/process instance +that created them; they are not serialized addresses or transferable capabilities. +The registry itself holds ownership; C callers must destroy every successfully +created owning handle. Results have independent ownership and never borrow model, +session, backend-vector, or caller-array memory. + +All non-NULL pointers must refer to live, correctly aligned accessible C storage. +The caller remains responsible for actual buffer lengths and NUL termination; +portable C cannot validate arbitrary addresses or detect an undersized allocation +behind a valid pointer. Counts are checked for exact address/vector-size +representability before conversion. A nonzero input count requires a non-NULL +array. Coefficients and primal starts must be finite; bounds, options and model +edits use the C++ facade's domain/range checks. Inputs must remain stable for the +duration of a call and are copied before a backend solve. Outputs must not alias +input objects or each other. On an API error, output storage is unspecified unless +the specific rule below says otherwise; model builder failures follow the C++ +facade's transactional checks. + +Creating/solving functions zero the output owner token before work, except when +the output pointer itself is invalid. `result_number` returns a `present` flag and +sets the value to zero when absent. `result_value` returns `NO_SOLUTION` if no +validated incumbent exists. `result_values` exposes the original slot mask and +writes zero for absent/deleted values with distinct presence flags. Query buffer +sizes using all NULL buffers and capacity zero, allocate, then call again. Text +sizes include the terminating NUL. Insufficient capacity returns +`BUFFER_TOO_SMALL`, reports the required capacity, and writes no buffer elements. +Immutable results make the two-call buffer protocol stable. + +Every fallible C entry point catches all C++ exceptions; none cross the boundary. +`last_error()` is a fixed-size, thread-local, NUL-terminated message (at most 4095 +bytes). Copy it before the next ordinary API call on that thread, which clears or +replaces it. Version and error-message queries leave it intact. `MODEL_ERROR` is +used for facade validation exceptions, `INVALID_ARGUMENT` for C-record misuse, +`INVALID_HANDLE` for stale/wrong-kind opaque tokens, and `INTERNAL_ERROR` for other +backend exceptions. They are distinct from solver termination values. + +## Concurrency, sessions, and limits + +Registry ownership lookup holds a short global mutex; it never holds that mutex +through solver execution. Each model serializes edits and snapshot creation. +Each session serializes solve/reset/statistics. A session solve first copies the +model under its lock, releases that lock, then locks the session; there is no +model/session lock-order cycle. Independent model/session objects can solve +concurrently, subject to backend behavior. Results are immutable and can be read +concurrently. Cancellation uses the shared monotonic C++ token and can be signaled +from another thread. A canceled token cannot be reset. + +Destroy removes the token immediately. An operation that already acquired shared +ownership may finish successfully; a later lookup fails cleanly. This prevents +use-after-free, and deliberately does not promise that destroy cancels or waits +for an in-flight solve. Concurrent Python `close()` calls on the same owner are +not promised to be idempotent; coordinate ownership at the application level. + +Every solve receives fresh options. Model edits use the C++ session's compatibility +checks to select a backend update or rebuild; no C-level basis or witness memory +is exposed. Time limits subtract wrapper preparation and session-lock waiting +before entering the solver. They remain cooperative limits, not process-kill +wall-clock guarantees; snapshots, mutex waits, cleanup and output copying can +finish after the deadline. `elapsed_seconds` is the underlying C++ solve's measured +elapsed time, excluding the wrapper preparation and session-lock wait. Canceling +an active solve uses the same backend callback lifetime rules as the C++ API. + +## Validation and build integration + +The shared target compiles `c_api.cpp` with `GECODE_OPT_C_API_EXPORTS` and links the +matching `gecodeoptimize` build. A C++ wrapper and foundation library must use the +same headers/layout; do not link a wrapper built before a `ModelSnapshot` layout +change to a newer C++ foundation binary. The public C layout is independent of +those internal C++ layouts. CMake/install registration is owned by the main build. +The Python package contains no build-time code generator or runtime download. + +The C conformance file must be compiled as **C99**, then linked with the shared +library. It checks malformed/null/oversized arguments, API/solver error separation, +wrong-kind/foreign/deleted identities, copied result buffers, immutable result +lifetime, session edits, cancellation, and explicit/missing backend selection. +The Python suite exercises analytic LP/MIP and continuous recourse optima, all five +variable domains including the semi zero branch, min/max offsets, model edits, +I/O and destination preservation, bad Python conversions, lifetime/context +management, starts, missing/canceled/unsupported results, independent parallel +solves and thread-local errors. + +```sh +PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=python \ + GECODE_OPTIMIZE_LIBRARY=/absolute/path/to/libgecodeoptimize_c.so \ + python3 -m unittest discover -s python/tests -v +``` + +Run the same C and Python suites against backend-enabled and backend-disabled +builds. A disabled backend must return `UNSUPPORTED`, not skip the contract tests. +C ownership/error paths are also exercised with address/undefined sanitizers. +Expanded tests cover every typed global builder, aliases, nonzero/negative bases, +zero-arity tables, zero-resource cumulative tasks, removed/foreign handles, +checked dimensions and atomic failed edits; indicator domain guards/removal and +Boolean truth tables also run through this same C ABI. Native-aware assertions +require actual native optima/infeasibility when Native is available and explicit +UNSUPPORTED results otherwise; no backend-dependent contract case is skipped. +These small conformance tests do not establish backend performance, concurrent +speedup, full commercial Python API compatibility, binary distribution support, +or portability beyond the platforms actually tested. Native-enabled integration, +shared-library export/install loading, and Windows calling convention checks belong +to the matching main-build CI matrix; a local macOS run alone is not that matrix. + +## Solution pools + +`Model.solve_pool(PoolOptions(...))` calls the same repeated-optimization workflow +as C++: one representative per finite Integer/Binary projection assignment. +Continuous recourse is optimized within each class; it is not enumerated. +`projection=None` uses all active Integer/Binary variables in original slot order. +An explicit projection preserves caller order and must contain unique, active +variables with supported finite domains. An empty projection is supported only +when the source has no active variables; requesting it for a nonempty model +returns `UNSUPPORTED`. See [POOLS.md](POOLS.md) for arithmetic and backend limits. + +```python +from gecode_optimize import Model, Options, PoolOptions, VariableType + +with Model() as model: + x = model.add_variable(VariableType.INTEGER, -1, 1) + y = model.add_variable(upper=4) # continuous recourse + model.add_row({x: 1, y: 1}, lower=2) + model.set_objective({x: 2, y: 1}, offset=5) + with model.solve_pool(PoolOptions(Options(), max_solutions=5, + projection=[x])) as pool: + print(pool.completion, pool.ranked_prefix) + for i in range(pool.info["entry_count"]): + entry = pool.entry(i) # frozen copied metadata, no owning token + with pool.entry_result(i) as result: + print(entry.projection_values, entry.rank_established, + result.objective) # (-1,): 6; (0,): 7; (1,): 8 +``` + +`PoolCompletion` is independent of `Termination`. `EXHAUSTED` requires the +remaining-model infeasibility check; reaching `max_solutions` gives +`REQUESTED_LIMIT` / `SOLUTION_LIMIT`, even if that last entry happens to be the +final feasible class. `ranked_prefix` counts entries with established rank. +An interrupted timely candidate may be returned as a final unranked entry; +inspect its flag instead of assuming every returned objective has a proved rank. +Ties have unspecified order. Numerical ranks/exhaustion are tolerance-qualified; +Exact enumeration requires an explicitly supported Native request. + +`entry_result(i)` allocates a **new owning Result** with historical source +identity and masks. It survives closing the pool and source model. Its +termination is `UNKNOWN` and its global bound/gaps are absent: a later pool solve +optimizes a restricted feasible set and cannot supply a new original-model +optimality claim. `attempt(i)` is frozen metadata preserving that oracle's +termination, guarantee, optional objective and **remaining-model** bound. An +attempt's bound must not be interpreted as a bound on the unrestricted source. +`projection`, `entry(i)` and `attempt(i)` copy data without allocating C owner +tokens; indexed retrieval avoids creating handles for entries the caller will +never inspect. + +C callers initialize `gecode_opt_pool_options_v1` with +`gecode_opt_v1_pool_options_default`. `has_projection=0` requires a NULL pointer +and count zero; `has_projection=1` distinguishes an explicitly empty projection. +`pool_info`, `pool_entry_info`, and `pool_attempt_info` require the exact record +size. `pool_projection`, `pool_entry_projection`, and `pool_message` use the +existing query/allocate/copy buffer protocol. `pool_entry_result` returns a +token that must be destroyed with `result_destroy`; the parent owner uses +`pool_destroy`. All handles are kind checked. + +## Feasibility repairs + +`Model.relax_feasibility(RepairOptions(...))` selects explicit row or variable +bound sides and minimizes their positive weighted L1 violation. Unselected sides +and integrality stay hard. Narrowed Binary bounds can relax only within the +intrinsic `[0,1]` domain. Optional phase two optimizes the original objective +among minimum-violation repairs. The source model is never edited. + +```python +from gecode_optimize import (Model, Options, RepairOptions, + RelaxationSelection, RelaxationSide) + +retained = None +with Model() as model: + x = model.add_variable(upper=2) + demand = model.add_row({x: 1}, lower=3, name="demand") + model.set_objective({x: -1}) + options = RepairOptions( + solve=Options(), + selections=[RelaxationSelection(demand, RelaxationSide.LOWER, 1)], + optimize_original_objective=True, + ) + with model.relax_feasibility(options) as repair: + if repair.has_repair: + print(repair.original_value(x), repair.weighted_violation) # 2, 1 + print(repair.original_validation.valid) # False: demand still fails + print(repair.item(0).violation) # independently recomputed: 1 + private_x = repair.variable_map[x.slot].private + retained = repair.final_result() + +# An explicitly private result remains independently owned and usable. +if retained is not None: + with retained: + print(retained.value(private_x)) +``` + +`has_repair` means the assignment passed the private repair model and independent +repair checks; it does not mean that it is feasible for the original model. +`original_validation` is the separate frozen original-model validation report. +Always inspect `has_repair` before reading original values or interpreting that +report. `minimum_violation_established` and `original_objective_optimized` are +separate flags. An `OPTIMAL` repair termination establishes only the requested +repair workflow, not original feasibility or unconstrained original optimality. +The optional scalar observations are `minimum_weighted_violation`, +`weighted_violation`, and `original_objective`; absence is `None`. + +`variable_map` returns copied frozen records for every original variable slot, +including tombstones, with the source ID, private ID (or None before private +construction), and historical active mask. `original_values` separately returns +active/present/value records, with None for missing or deleted slots. +`original_value(variable)` accepts only an active source variable. Private IDs +are rejected there; source IDs are rejected when indexing private solve results. +All historical masks and observations remain available after source destruction. + +`item(i)` includes the original source row or variable, selected side, copied +name, original bound, penalty, private slack/penalty-row IDs, and independently +recomputed optional activity/violation/weighted-violation/slack-value observations. +Items follow the C++ canonical order (row sides, then variable sides), not input +selection order. `stage(i)` returns copied name, index, completion flag and +optional retention threshold. `stage_result(i)` returns a new owning **private** +Result for that stage. Different stage revisions can reflect different lock +rows. `final_result()` returns a new owning private feasible Result, with +`UNKNOWN` termination and no scalar global bound. Neither accessor silently +remaps the result to the source model. `violation_lock` exposes the optional +private row identity, and `objective_values` copies the ordered workflow values. +`info` also preserves the internal workflow termination, guarantee and stage +counts separately from repair completion. `workflow_message` is copied text. +The binding does not expose an editable private model or a general +multiobjective builder. + +C callers initialize `gecode_opt_repair_options_v1` through its default function +and pass `gecode_opt_relaxation_selection_v1` records. Each contains a Variable or +Row ID, explicit Lower/Upper enum, zero reserved field and positive finite +penalty. Indexed metadata access checks record sizes and bounds before writing. +The optional-number record uses an explicit presence flag and zero absent value; +there is no NaN absence sentinel. `repair_original_values` and +`repair_variable_map` support all-NULL buffers with capacity zero to query the +original slot count. Short buffers report the required size and leave every +array element unchanged. `repair_text` supports message, workflow message, +original validation message, item name and stage name; non-indexed fields require +index zero. A missing violation lock returns presence zero and a zero ID. +Private/final/stage Result handles must be destroyed separately from +`repair_destroy`. + +Both workflows copy all options and snapshot the model before entering C++. +Existing cancellation tokens and cooperative time limits apply across their +stages; wrapper preparation is subtracted first. Unsupported starts, node +budgets, variable domains, active globals/indicators and guarantees retain their +documented C++ outcome; no fallback or semantic dropping occurs. Pools and repairs +use standalone workflow calls, never a persistent session. See +[POOLS.md](POOLS.md) and [RELAXATION.md](RELAXATION.md) for the precise support +matrix. + +Malformed ABI sizes/reserved fields, unknown side/kind enums, impossible counts, +NULL nonempty arrays, and nonpositive/nonfinite penalties return an API error. +Well-formed workflow requests with a foreign/deleted/duplicate selected entity or +other invalid model semantics return a workflow `INVALID_MODEL` result, following +C++. Missing backends and supported-API/unsupported-solver requests return +`UNSUPPORTED` result owners. Retrieval using a foreign/deleted source identity +returns `MODEL_ERROR`; retrieving a missing validated assignment returns +`NO_SOLUTION`. Out-of-range nested indices return `INVALID_ARGUMENT`, with a zero +owner token from result-producing calls. Closing an owner invalidates its token +without invalidating already copied child Results. + +These are additive ABI-1 symbols and new versioned records; existing records and +identity layouts are unchanged. The updated Python package requires a library +exporting the new symbols and reports a missing symbol explicitly at load time. +New tests include numerical and Native pools, recourse, negative projections, +ties/max offsets, requested-limit versus exhaustion, zero-variable/zero-item +workflows, historical tombstones, repair binary-domain guards, phase-two locks, +private/original ownership, malformed C records/buffers, cancellation, and a +source close during an active pool call. The threaded fixture checks the call is +still unfinished before cancel/close when HiGHS is present; it does not assert +which backend callback was active. Backend-disabled builds check explicit owning +Unsupported outcomes rather than skipping API contracts. + +## Atomic bulk construction + +`Model.add_variables(sequence[VariableSpec])`, `add_rows(sequence[RowSpec])` and +`add_rows_sparse(SparseRowBatch)` each make one C mutation call. They return +handles in input order and advance the revision once for a nonempty batch. +A valid empty batch leaves the revision unchanged, including a CSR with a valid +unused column mapping. Foreign/deleted mappings are still errors in that case. +Python names and arrays remain alive through conversion and the call; C copies +them. All five variable types and ordinary row canonicalization apply unchanged. + +The additive ABI 1 records have exact size/reserved checks and separate array +counts. Output capacity must be supplied before mutation: unlike result +retrieval, there is no NULL-buffer query that posts a batch. Errors leave output +elements and model state unchanged. Post-commit C ID copies do not allocate. +An interrupted Python interpreter or a `MemoryError` while constructing Python +return objects after a successful C call cannot roll back the C transaction. +The [bulk API contract and example](BULK.md#c-and-python-bulk-construction) +specify CSR dimensions, UTF-8 validation, ownership, and tested failure cases. + + +## Distinct continuous quadratic models + +The additive QP binding uses `QuadraticModel` and `QuadraticResult` in Python and +new `quadratic_model_*`, `quadratic_solve`, and `quadratic_result_*` C symbols. +They are separate registry kinds, not aliases for ordinary model/result handles. +Ordinary solve, session, pool, repair and mutation operations reject a quadratic +handle. No operation converts a quadratic model to its private linear core. +The existing ABI remains version 1 with all earlier layouts and symbols unchanged; +the updated Python package requires the new additive symbols from its library. + +The scope matches [the C++ quadratic contract](QUADRATIC.md): continuous variables +with explicit finite bounds, ordinary linear rows, and positive weighted squared +affine forms. Integer/semi domains, indicators, globals, arbitrary Hessians, QCP, +nonconvex objectives, QP sessions and QP workflow retention are unavailable. +`Library.quadratic_capabilities()["available"]` (C: `quadratic_capabilities`) +reports whether the numerical HiGHS QP backend and required arithmetic environment +are available. It does not claim support for other quadratic problem classes. + +```python +from gecode_optimize import QuadraticModel, QuadraticOptions, WeightedSquare + +with QuadraticModel() as model: + x = model.add_continuous(-4, 4, name="decision") + model.add_row({x: 1}, lower=0) + model.minimize_squares([WeightedSquare({x: 1}, offset=-2, weight=2)], + linear={x: 4}, offset=-7) + historical = model.solve(QuadraticOptions()) + +with historical: # still owns original values and checks after model.close() + if historical.has_solution: + print(historical.value(x), historical.objective) # about 1, -1 + print(historical.termination, historical.checks) +``` + +`minimize_squares(squares, linear=(), offset=0)` minimizes +`linear + offset + sum(weight * residual**2)`. +`maximize_concave_squares` maximizes +`linear + offset - sum(weight * residual**2)`; weights stay strictly positive. +Each residual is `sum(coefficient * variable) + square.offset`. +Both methods replace the complete objective atomically. They accept `WeightedSquare` +records whose `terms` are ordinary mappings or sequences of `(Variable, coefficient)` +pairs, as for linear row construction. No NumPy dependency or borrowed solver buffer +is involved. Names and term arrays are copied. Malformed later squares, wrong-owner +IDs, nonpositive weights, nonfinite input and invalid linear terms preserve the old +objective and revision. A variable still referenced by a square cannot be removed. +Rows, finite variable bounds and row coefficients can be edited explicitly; removed +slots retain their historical identities in already completed results. + +For C, initialize each `gecode_opt_weighted_square_v1` with zero reserved fields and +`struct_size=sizeof(record)`, then call `quadratic_model_set_objective` with a counted +array, separately counted linear terms, `GECODE_OPT_MINIMIZE` or +`GECODE_OPT_MAXIMIZE`, and the original objective offset. The latter sense means +**subtract** the positive squares. `NULL` arrays require zero counts. Non-NULL +strings must be accessible NUL-terminated UTF-8. The entire square/name/term input +is copied and validated before the C++ objective transaction commits. + +```c +gecode_opt_handle model = 0, result = 0; +gecode_opt_id x; +gecode_opt_term term; +gecode_opt_weighted_square_v1 square = {0}; +gecode_opt_quadratic_options_v1 options; +/* Check every returned API error code in production code. */ +gecode_opt_v1_quadratic_model_create(&model); +gecode_opt_v1_quadratic_model_add_continuous(model, -4, 4, "x", &x); +term.variable = x; term.coefficient = 1; +square.struct_size = sizeof(square); square.terms = &term; +square.term_count = 1; square.offset = -2; square.weight = 1; +gecode_opt_v1_quadratic_model_set_objective(model, &square, 1, NULL, 0, + GECODE_OPT_MINIMIZE, 0); +gecode_opt_v1_quadratic_options_default(&options, sizeof(options)); +gecode_opt_v1_quadratic_solve(model, &options, &result); +gecode_opt_v1_quadratic_model_destroy(model); +/* Inspect using quadratic_result_*; ordinary result_* rejects this token. */ +gecode_opt_v1_quadratic_result_destroy(result); +``` + +`QuadraticOptions.solve` is the existing `Options` record. The QP-specific options +expose the C++ iteration/storage limits and stationarity, complementarity and +optimality acceptance tolerances, with identical defaults. Both outer and embedded +C options require exact v1 sizes before their other fields are consumed; reserved +fields must be zero. Malformed options raise a binding/model error. Unsupported +policies (Native, Exact/Certified, starts, node quotas, multiple workers or nonzero +seed) return explicit `UNSUPPORTED` solver results. There is no backend fallback or +silent option drop. `optimality_tolerance=1e-6` is an absolute numerical acceptance +tolerance in original objective units, independent of large objective offsets and +of the common options' requested search gaps. Production regularization is zero. + +Cancellation retains shared token ownership throughout solve. Snapshot copying and +C preparation are charged to the same end-to-end time limit. Backend cancellation +is cooperative and QPAS is checked before and after the backend call; this is not +a hard latency promise. A late candidate is not returned as an accepted solution. +A result owns its original snapshot identity, copied slot masks/values and checks +after model edits or destruction. No pointer to solver-owned memory crosses C. + +`QuadraticResult.info` includes original model/revision, slots, termination, +guarantee, accepted-solution flags, elapsed time, QP iteration count and configured +regularization. It remains a numerical result even when its checks pass. +`objective`, `best_bound`, `absolute_gap`, `relative_gap` and `native_gap` use explicit +optional presence (`None` in Python). `vendor_objective` and `vendor_dual_estimate` +are separate optional diagnostics for the backend's normalized minimization +problem; they are not independent original-model bounds. + +`checks` is an immutable copied `QuadraticChecks` record. Primal/objective validity, +KKT availability/validity and bound validity remain distinct flags, independent of +termination. KKT residual maxima are absent unless KKT evidence is available. +Original objective, normalized lower bound and offset-free `gap_upper_bound` have +separate presence fields. The offset-free gap can be tight while the rounded full +scalar `absolute_gap` is larger; neither is silently replaced by the other. + +`values` copies original-slot records with distinct active and present masks. +`value(variable)` rejects foreign/deleted IDs and unvalidated candidates. +`square_residuals` contains the original affine residuals, **not** their squared +weighted contributions, in objective input order. `original_gradient` contains +derivatives of the original objective in original-slot order; inactive slots are +zero. Both arrays are `None` when complete original-objective evaluation is +unavailable, and may be empty for a successfully checked empty model. The C array +accessor reports length zero in the unavailable case; inspect `objective_valid` +to distinguish that from a valid empty array. Query/copy and short-buffer atomicity +follow the existing ABI conventions. + +QP conformance adds C99 wrong-kind, destroyed, foreign and tombstone handle cases; +malformed outer/nested options and square records; atomic objective failures; +copy/query buffers; unavailable evidence; and historical results. Python adds 18 +closed-form min/max parameter combinations, coupled squares with an equality and +nonzero original gradient, constant objectives, huge offsets, row edits, copied +inputs, removal/destruction, and explicit missing-backend/unsupported/limited +states. These supplement the C++ exact-bound and backend-coordinator oracles; +passing the bindings tests does not expand the numerical solver's supported scope. + + +Local validation of this binding slice: the C99 consumer and all 37 Python test +methods passed with both backends disabled, with Native+HiGHS enabled, and against +fully ASan/UBSan-instrumented facade/native/HiGHS libraries. The Python sanitizer +run preloaded the ASan runtime before loading the shared library. LeakSanitizer +is unavailable on this macOS configuration; the successful runs used address and +undefined-behavior checks with leak detection disabled. These are local conformance +results; cross-platform CI execution and binary wheels are separate validation. + + +## Original-coordinate LP observations + +The additive O1 surface exposes ordinary continuous LP row activities/slacks, +row duals, column reduced costs, basis statuses and independent numerical KKT +checks. It requires HiGHS and Numerical policy; it does not relax fixed integer +variables, active indicators or globals into this scope. Explicit Native, +Exact/Certified and unsupported model classes return Unsupported. Basis export is +not basis submission, a ray, a sensitivity interval or a proof certificate. +`Library.lp_observation_capabilities()` returns an immutable record containing +availability, dual/basis support, backend/version and copied limitations. + +```python +from gecode_optimize import Model, LpObservationOptions, LpObservationState + +with Model() as model: + x = model.add_variable(lower=0, upper=10) + demand = model.add_row({x: 1}, lower=3) + model.set_objective({x: 1}, offset=7) + with model.solve_lp_observed(LpObservationOptions()) as observed: + data = observed.observations + result = observed.copy_result() + if data is not None and data.dual_point.state == LpObservationState.AVAILABLE: + marginal_cost = data.row(demand).dual +# data is a frozen Python copy; result is a separately owned ordinary Result. +with result: + status = result.termination +``` + +`Session.solve_lp_observed(model, options)` uses the same options and owning result +contract. Options contain the existing `Options` record plus `duals`/`basis` +Boolean requests and four finite, nonnegative absolute tolerances in original +units: `dual_feasibility`, `stationarity`, `complementarity`, and `objective_gap`. +Defaults match C++ (1e-7, 1e-7, 1e-6, 1e-6). The shared cooperative deadline covers +snapshot conversion, backend solving and observation checks; binding preparation +reduces the remaining solve deadline. Requests do not change ordinary solve or +session defaults. A limited new session solve never returns the previous solve's +duals or basis as new observations. + +`LpObservedResult` is a distinct token. Its `info` contains the original ordinary +result metadata and separate observation identity/count/presence fields; +`copy_result()` creates a new ordinary Result handle. Closing the observed result +cannot close that copy. `observations` is either `None` or an immutable copied +`LpObservations`, with original model ID/revision, frozen metadata/groups/checks, +and tuples of all historical row and column slots. It has no borrowed solver +storage and remains usable after the result/model/session closes. Its `row(id)` +and `column(id)` lookups reject wrong kinds, foreign owners and tombstones; +bulk `rows`/`columns` retain inactive slots with absent fields. IDs refer to the +historical snapshot, so later removal from the live model cannot erase an older +observation. + +The primal-row, dual-point and basis groups independently distinguish +NotRequested, Available, Unavailable and Rejected, each with a typed reason and +copied message. Empty available arrays differ from unavailable evidence. A valid +primal point can exist while duals or basis are unavailable. Optional metrics and +row/column values are `None` when missing. Their C records use `present=0,value=0` +and `has_basis=0,basis=0` for absence; zero without its flag has no mathematical +meaning. Checks retain their own validity flags and optional residual maxima, +dual objective estimate and normalized primal-minus-dual gap. The gap cancels the +common objective offset before accumulation. Accepted KKT observations remain +Numerical and never upgrade the ordinary result to Exact or Certified. + +Dual signs follow `A^T * row_dual + reduced_cost = c` in the original objective +sense. Row lower slack is `activity-lower`, upper slack is `upper-activity`; an +infinite side has no slack value. After adapter elision of constant rows, complete +original basis export is unavailable. A dual accepted for a retained model can +include original constant-row dual zero tagged DerivedConstantRow. Backend duals +are tagged Backend; missing duals use None. Metadata includes requested original +check tolerances, the primal check tolerance and optional effective vendor +primal/dual tolerances, plus backend name/version. + +The C functions `solve_lp_observed` and `session_solve_lp_observed` return distinct +owning tokens. `lp_observed_result_copy_result` is their only conversion to ordinary +Result. Versioned options/info/metadata/group/row/column/check records have exact +size validation and zero reserved fields, including the nested solve options. +Bulk row/column functions additionally validate `element_size`; standard +query/copy functions check counts and write no elements on a short buffer. All +accessors are passive copies and do not solve or perform analysis. The additive +`NO_OBSERVATIONS` error covers a missing observation owner; `info` and result-copy +remain available in that case. ABI version 1 and all older record layouts remain +unchanged. C declarations are in `gecode/optimize/c_api.h`. + +Tests in `test/optimize/lp_observations_c.c` and +`python/tests/test_lp_observations.py` check analytic min/max dual signs and +reduced costs, huge objective offsets, primal slacks, basis positions and constant +row basis absence. They also exercise opt-out groups, exact-size/reserved/flag +errors, buffer atomicity, wrong-kind/foreign/deleted handles, historical ownership, +session edits and stopped calls, unsupported fixed-MIP/global/Native/Exact +requests, and backend-free absence. These bindings complement the C++ observation +checker/oracle tests and do not expand the admitted solver scope. +The new C99 conformance test and all 44 Python test methods pass locally with +both backends disabled, with HiGHS enabled, and with the complete facade/HiGHS +path instrumented by ASan+UBSan. The sanitizer Python host preloads ASan; leak +detection is disabled because LeakSanitizer is unsupported on this macOS setup. +Combined native integration and cross-platform execution remain separate gates. + +## Native starts through the existing ABI + +The existing `Options.primal_start` now reaches the complete-start native path +without an ABI change. Supplied entries must be exact integers satisfying their +original domains; no rounding is performed, even for Numerical policy. Every +active original slot must be known. Missing live `inactive_gate` slots may be +derived from their indicator's exact activator relation, including seeded chains; +explicit inconsistent gates are invalid. Remaining partial starts are Unsupported. +A gate retained after indicator removal must be supplied explicitly and is never +derived from its old origin tag. Once independently checked and published, a +start is an incumbent for strict-improvement search on the original unfixed model. +It is not a domain fixing. This applies to supported standalone native solves; +persistent Native sessions remain Unsupported. See +[NATIVE-PRIMALS-DESIGN.md](NATIVE-PRIMALS-DESIGN.md). diff --git a/docs/solver-parity/BRANCHING-DESIGN.md b/docs/solver-parity/BRANCHING-DESIGN.md new file mode 100644 index 0000000000..1f208ad3fe --- /dev/null +++ b/docs/solver-parity/BRANCHING-DESIGN.md @@ -0,0 +1,346 @@ +# W8: budgeted native reliability branching design + +Status: the bounded W8a slice is implemented as an explicit optional policy; +the remaining sections retain the design rationale and W8b research boundary. +It was designed against native frontier commit `73ff282b9`. See +[NATIVE-SEARCH.md](NATIVE-SEARCH.md#optional-binary-reliability) for the implemented +API, validation and precise accounting. Solver defaults remain unchanged. + +The implemented first slice is an explicit, bounded **binary +propagation-gain reliability policy in the frontier coordinator**. Probe full +native clones, learn directional bound gains, and use the results only to select +a variable. Preserve the built-in brancher as fallback. This establishes the +budget and lifecycle machinery before introducing classical LP-displacement +pseudocosts for general integer variables. It does not complete all of W8 or +claim equivalence to commercial solver branching. + +## Current implementation and constraints + +[`NativeSpace`](../../gecode/optimize/native.cpp) constructs compact integer +variables, semi-integer holes, ordinary rows, reified original indicators, +native globals, objective equality and an optional checked LP actor. It finally +posts `INT_VAR_SIZE_MIN()` / `INT_VAL_MIN()`. Its copy constructor delegates to +`Space(other)` and updates both variable and cost handles; clones retain all +propagators and the LP actor's owning backend/certificate state. + +The explicit frontier in the same file owns stable Spaces. `evaluate()` charges +a node admission, calls `status()`, reads the propagated integer cost bound, +and checks every incumbent against the original snapshot before publication. +An expanding parent remains in `active_bound` until every child has been +evaluated and either discharged or enqueued. Interrupted bounds aggregate the +incumbent, every queued region and this active parent. Maximization uses a +negated internal bound; the original offset is added only at the public boundary. + +There is currently no candidate callback, pseudocost table, per-node LP primal +point, probe accounting or way to interrupt the inside of `Space::status()`. +The LP actor's propagated integer bound is valid evidence; a root-cover-loop +primal suggestion is an old heuristic vector and is not a current-node point. +An optional LP actor may run during a probe, including verified global root +covers. Its raw floating status or objective must not become pruning evidence. + +The kernel's [`Choice`/`Brancher` contract](../../gecode/kernel/core.hpp) requires +a stable preceding status and at most one `choice()` per decision; a later +choice invalidates older choices on that Space. `clone()` is logically const +but temporarily updates forwarding pointers. Probing must therefore be +sequential and must never interleave concurrent clones of the same parent. + +## Research and how it applies + +Achterberg, Koch and Martin's *Branching Rules Revisited* defines directional +pseudocosts as observed objective gain divided by branch displacement from the +LP point. Reliability requires enough observations in both directions; +unreliable variables receive bounded strong-branching evaluations, stopped +after a limited run without an improved score. This motivates count-based +initialization and lookahead caps, but native propagated integer gains are a +different observation from solved LP gains. [Paper, §§2.2–2.6](https://webdoc.sub.gwdg.de/ebook/serien/ah/reports/zib/zib2004/paperweb/reports/ZR-04-13.pdf) + +Gamrath's *Improving Strong Branching by Domain Propagation* evaluates +propagation inside tentative branches before LP evaluation. This is directly +relevant because our native globals can reveal consequences absent from the +ordinary linear relaxation. Its computational results do not establish a +benefit for this implementation; we must measure cloning, propagation and LP +cost together. [Paper](https://webdoc.sub.gwdg.de/ebook/serien/ah/ZIB/ZR-13-47rev.pdf) + +SCIP's versioned implementation keeps directional counts, caps candidate and +LP-iteration effort, distinguishes infeasible directions from finite samples, +and can reduce strong-branching effort under degeneracy. Iteration-limited +samples have explicit policy controls. Inspect `needsStrongBranching`, +`continueStrongBranchingLookahead`, and the update section of `execRelpscost`; +do not transplant SCIP's richer LP/conflict statistics into fields we cannot +measure. [SCIP 10.0.0 source](https://scipopt.org/doc-10.0.0/html/branch__relpscost_8c_source.php) + +The current upstream release source adds discounted/ancestor histories and +tree-size lookahead machinery. Those are later experiments, not prerequisites +for a first bounded policy. Version-pin comparisons rather than relying on a +moving `master` or copying default constants. [SCIP v10.0.2 source](https://raw.githubusercontent.com/scipopt/scip/v10.0.2/src/scip/branch_relpscost.c) + +Our decisions below are a proposed Gecode design, not claims that these sources +implement the same native algorithm. No proprietary source is used or copied. + +## Coordinator split versus a custom brancher + +| Choice | Advantages | Additional obligations | Recommendation | +|---|---|---|---| +| Coordinator selects a typed split and posts it on a clone | Budget, parent ownership, observations and errors stay together; no new kernel actor; straightforward fault injection | Preserve stable status and fallback choice sequencing; prove split coverage and progress | First frontier-only implementation | +| Small native brancher with integer column/split in its `Choice` | Natural `choice/commit/archive` integration; could later serve BAB/recomputation | Clone-safe view arrays, brancher identity, archive round trips, actor disposal, no raw parent pointers or mutable shared learning state inside choices | Revisit only when BAB/recomputation support is required | +| Variable-selection callback embedded in the existing brancher | Small-looking selection hook | Callback has no safe independent probe/budget ownership contract; capturing parent Space or coordinator state complicates cloning | Do not use for strong probing | + +Keep the existing brancher installed. The enabled coordinator bypasses +`choice()` only when it has selected a manual split. It posts `rel()` on each +child and then uses the existing `evaluate()`/enqueue path. For a fallback, +create exactly one built-in choice after all probes are destroyed. Do not create +a choice before probing, call parent `status()` a second time gratuitously, or +commit a stale choice. Subsequent child status handles the dormant built-in +brancher's normal variable scan. Test this explicit assumption against the +kernel lifecycle suite, including parents cloned repeatedly before fallback. + +## First implementable slice: binary directional gains + +Add an optional `NativeBranchingSettings` to `NativeSearchOptions`, absent by +default. Initial policy name: `BinaryReliability`. Scope is original active +`VariableType::Binary` columns whose current domain is exactly `{0,1}`. Exclude +generated indicator gates from the initial candidate panel using the typed +indicator metadata; never rely on a variable name. All other variable types, +including two-valued semi-integers, retain the existing brancher as fallback. +Mixed models remain fully supported because the fallback eventually branches +on every remaining unassigned compact variable. + +The internal candidate is an owning value record, not a public callback: + +```cpp +struct SplitCandidate { + std::size_t original_slot; + int compact_column; + int split; // first slice: 0 +}; +// Down: x <= split; Up: x >= split + 1. +``` + +Validate the mapping, current domain, integral split and `split+1` before any +clone. The generic helper can use checked wider arithmetic and require +`min(x) <= split < max(x)`, but this first policy emits only binary splits. +Future general-integer splits partition the actual domain even with holes: +`D ∩ (-∞,k]` and `D ∩ [k+1,∞)` are disjoint and cover `D`. Both are nonempty +when `k` lies between distinct domain extrema, and both strictly reduce it. +Never replace a sparse domain with its hull when posting the split. +The implemented candidate panel is local to one call on a stable parent, so +no persistent decision identifier is needed. Delayed child observations or +cached probe reuse would require an explicit decision/generation identifier. + +Store a solve-local directional history per eligible original slot. No history +survives a model edit, another solve, a worker, or a changed relaxation policy. +Each direction has a checked sample count, finite running mean and zero-gain +count. A stable probe gives + +`gain = max(0, normalized_child_bound - stable_parent_bound)`. + +Compute the integer subtraction in a wider checked type before converting a +ranking value to floating point. Binary observations have unit displacement; +this is a native directional-gain statistic, **not** the LP pseudocost +`gain / fractional_distance`. A reliable variable initially needs two finite +completed observations in each direction. Two is an experimental opt-in +starting point, not a tuned default recommendation. + +Rank by `(min(down,up), max(down,up), -original_slot)` lexicographically, using +means for reliable histories and current completed probe gains when available. +This avoids arbitrary multiplication/epsilon scores and produces stable ties. +Unknown history starts at zero, is marked unknown, and remains eligible for +bounded initialization. All-zero or insufficient-information panels fall back +to the original brancher. Later compare this score with the literature's +weighted/product scores under the same work budget. + +Candidate enumeration is a deterministic bounded scan of compact columns. +Build only a capped panel; use a bounded heap if history ordering is desired. +Charge every examined column and comparison. For early exploration, a +solve-local rotating start index can avoid permanent prefix starvation, but +must be explicit in the trace and reset per solve. First implementation may +use a fixed prefix to minimize hidden state; the benefit gate must expose that +limitation. + +## Probe interface and publication rules + +The coordinator keeps one stable parent baseline and frozen incumbent version +for the whole candidate panel. A probe owns one `unique_ptr`: + +1. Check shared stop state and deterministic probe/work/storage allowances. +2. Reserve one resident-Space slot, clone the stable parent, and post one split. +3. Charge the probe propagation attempt before calling `status()`. +4. Recheck cancellation/time after status, then read only a stable normalized + integer cost bound. Clamp it below by the parent's inherited bound. +5. Destroy the clone, recheck stop state, and stage the directional observation. +6. Publish a pair of observations only after both directions complete and the + publication checkpoint passes. A half-pair never increments reliability. + +Do not call the ordinary `evaluate()` helper for probes: it admits search nodes, +checks/publishes incumbents and discharges regions. Extract a narrowly scoped +propagation/bound observation helper while leaving ordinary evaluation's +publication sequence intact. Probe outcomes distinguish finite stable gain, +native failure, cancelled/time stopped, and operational error. An `SS_SOLVED` +probe is only a stable finite observation; it does not publish a solution. + +Native failure is a categorical ranking event for the current candidate, not +an infinite pseudocost sample. For the first slice, do not update either finite +history from a pair containing a failed direction, and do not reuse a failed +probe as a proof to skip ordinary child evaluation. A completed failed pair +may prioritize that split using a separate leading rank of two/one/zero failed +directions; it never stores infinity in the means. Both normal children are +still created and evaluated. No probe tightens the parent, applies a learned fixing, changes +the incumbent, seeds an enqueue bound, or removes an unresolved region. + +Ordinary selected children can later contribute directional history only when +the parent baseline and incumbent version match the stored decision record, +both observations are stable/finite, and that `(decision,direction)` was not +already sampled by a probe. The first implementation should collect probe +pairs only; delayed-child updates are a separately tested optimization. + +## Coverage and bound proof + +Let `R` be the active parent's feasible region, already intersected with any +ancestor incumbent cutoffs. Its stored bound `b` is valid for all of `R`. +Probing copies `R` and adds a temporary disjunction arm; destroying that copy +does not change `R`, the parent Space or `b`. Mutable backend warm starts can +change numerical effort but cannot change this ownership/proof statement: +the LP backend restores every requested bound and each actor checks its own +certificate against its own domains. Keep the immutable root-cut evidence +alive exactly as in the current frontier. + +For the selected split, `R = R_down ∪ R_up` and the regions are disjoint. +Until both normal arms are discharged or safely enqueued, retain the parent +and `active_bound=b`. Partial expansion can temporarily duplicate coverage; +it must never omit an arm. After complete transfer, ordinary propagated child +keys and checked incumbents replace the parent. Pseudocosts affect only which +partition is chosen, so even corrupt, stale or deliberately adversarial scores +cannot invalidate the global bound or delete a feasible point. + +Before the first normal child is propagated, an interrupted public bound must +therefore be exactly the previously established frontier/parent aggregate, +regardless of how strong any discarded probe appeared. Max sense and offsets +use the existing normalization unchanged. Finite-domain progress plus the +complete fallback preserves termination when the outer limits allow exhaustion. + +## Budget and failure contract + +Proposed opt-in settings (all finite): +`max_candidates_per_decision`, `max_probe_status_calls`, +`max_probe_status_calls_per_decision`, `max_branching_work`, +`reliability_samples`, `max_nonimproving_pairs`, and `max_history_entries`. +Example starting caps are 8 candidates, 128 total probe status calls, 8 per +decision, 100,000 coordinator work units, 2 samples, and 2 nonimproving pairs. +These are experiment settings; no automatic policy is selected by them. +Zero resource/lookahead caps skip the corresponding optional work; a zero +reliability sample threshold is invalid because an empty history must never be +treated as initialized. All-zero caps must exactly select built-in fallback. + +| Resource or event | Required behavior | +|---|---| +| Shared cancellation/deadline | Check before/after cloning, posting, propagation, clone destruction, pair publication and selection; preserve active parent; return the precise outer stop | +| Shared node limit | In the enabled policy, charge every probe status attempt through `SolveBudget::add_nodes()` as well as ordinary admissions; publish `budget_nodes = admitted_nodes + probe_status_calls`; document this explicit opt-in accounting change | +| Probe budget / branching work cap | Stop probing, keep earlier completed ranking observations, and use a valid selected split or built-in fallback; this cap does not terminate the solve | +| Remaining node quota | Do not begin a probe pair without room for both probe directions and two normal child admissions; check using safe remaining-count arithmetic; each actual admission still rechecks the shared limit | +| Resident Spaces | Count queued Spaces + active parent + temporary probe against the existing `max_open_nodes`; process directions sequentially; never hold a probe while constructing a real child | +| Insufficient optional probe slot/history cap | Skip optional probing/history growth; normal child allocation retains existing MemoryLimit behavior | +| Allocation exception | Return MemoryLimit with parent still represented; do not treat an actual allocator failure as a successful optional cap exit | +| Native/backend implementation error | Return BackendError and the existing conservative initial-bound fallback; do not continue on potentially corrupted semantic state | +| Invalid options / count overflow | Reject before search, or fail explicitly before the overflowing update; never silently wrap | + +`max_branching_work` bounds coordinator scans, comparisons, samples and +allocation sizes. It is **not** a hard bound on propagator instructions. Native +`status()` runs to fixpoint/failure and is cooperative only at its boundaries. +Use `StatusStatistics` to report observed propagation work, but do not promise +an interruptible per-propagator quota without separate kernel work. An LP actor +uses its existing per-attempt limits; its calls/time are already part of total +relaxation statistics. Report probe-specific LP deltas separately as a subset, +not additional calls to add to the solve total. Later LP-iteration budgets need +a measured backend counter and explicit API, rather than inferring iterations +from elapsed time. + +Stop lookahead after the configured number of complete nonimproving pairs. +Zero objective gain is an observation, not numerical failure or proof that a +candidate has no future value. For degenerate objectives, use the fixed small +probe cap and fallback initially. Later evaluate inference/domain-reduction +signals; do not label a zero native gain as measured LP dual degeneracy. + +## Classical LP pseudocost extension after the first gate + +W8b needs a copied finite **current-node** LP point with source/backend identity +and the exact parent box at which it was obtained. Requesting it must consume +the same budget and report its LP calls. A projected or stale root hint is not +a classical branching point. Candidate fractional coordinates must satisfy a +positive, explicitly checked displacement; skip near-integral or nonfinite +coordinates without making a feasibility claim. + +For a candidate `xbar`, a standard split uses `k=floor(xbar)`; +`d_down=xbar-k`, `d_up=k+1-xbar`. Both must be strictly positive and bounded +away from floating underflow for heuristic division. Domain holes require an +explicit convention: initially reject fractional candidates whose point lies +outside the actual domain intervals, or use the adjacent feasible values with +separate metadata; never silently mix the two displacement definitions. + +Keep native propagated-gain and numerical LP-gain histories separate. A finite +checked bound need not be the LP optimum, and differences of two lower bounds +are not the true relaxation improvement. They remain useful ranking hints but +must be labeled accordingly. Genuine LP-optimal samples require a backend +completion contract; iteration-limited observations need separate counts and +weights and cannot establish reliability merely by repetition. Confidence +intervals, discounted histories, degeneracy scores, symmetric transfer, learned +branching, probe-result reuse and parent fixings are later experiments. + +## Implementation ownership and acceptance gates + +First source slice: + +- `native_search.hpp`: append opt-in settings and branching statistics. +- `native.cpp`: coordinator-owned candidate/split/probe/history helpers and + conditional branch selection only; preserve BAB/ordinary NativeLP defaults. +- `test/optimize/native_branching.cpp`: independent tiny oracle and pure + history/budget/trace tests; extend existing frontier fault tests minimally. +- CMake/CI registrations plus NATIVE-SEARCH documentation and a small explicit + FAST correctness case, coordinated with their owner. + +No kernel, native global implementation, model schema, parser, C/Python API, +root-cover proof logic or HiGHS dependency changes are required for W8a. +Run a no-native build to validate unavailable capability and malformed options. +Native-only and combined LP/root-cover builds must exercise the same policy. + +W8a implementation validation: 2,397 combined configurations pass both normal +and complete native+HiGHS ASan/UBSan builds; 2,381 native-only configurations +and the core unavailable/options checks pass. The existing default frontier +coordinator retains its 2,723 passing configurations. Independent reviews of +the probe lifecycle, parent coverage and pair publication found no correctness +blocker. Generated-gate exclusion uses the original variable metadata, including +retained gates after indicator removal. Performance gates below remain open. + +Correctness gates are mandatory before benefit measurements: + +1. Enumerate every original assignment for tiny binary/mixed models; compare + optima, all returned witnesses and every interrupted global bound. Include + min/max, signed/zero costs, offsets, ties, infeasibility, empty/fixed models, + tombstones, holes, original indicators/gates and all native global families. +2. Verify exact split coverage and strict progress on sparse domains; verify + binary-only eligibility and complete fallback on general/semi-integer models. +3. Cross all node quotas through exhaustion, zero/one/pair probe caps, work and + history caps, both frontier orders, resident limits 0/1/2, LP off/on and root + covers off/on. Assert explicit shared-node and subset-LP counter identities. +4. Inject cancellation, time expiry and allocation/backend errors at every + probe lifecycle gate, between directions, before sample publication, after + selection and through ordinary child transfer. Assert unchanged parent + coverage, no probe incumbent/bound publication and no half-pair reliability. +5. Inject adversarial/zero/huge history scores. Only traversal may change. + Repeat identical runs and concurrent independent solves; verify no model, + history, parent-domain or sibling-bound leakage. Stress clone-then-fallback + against brancher lifecycle checks under full-source ASan/UBSan. + +Then compare whole-command wall time, time to first solution, total LP work, +search admissions **plus probes**, peak live Spaces and bound progress across +several families. Include fixtures where small-domain branching is already +good, propagation-heavy scheduling/globals, sparse binary packing/covering, +zero-cost degeneracy and mixed general-integer fallback. Separate tuning from +held-out instances; preserve timeouts and failed/unsupported runs in reports. +Show ablations for baseline, ranking without probes, fixed bounded probes, and +reliability reuse with identical outer budgets and root-cut settings. + +An implementation can ship as experimental when exact/fault/build gates pass. +Automatic/default use requires reproducible whole-solve improvement on a +held-out panel and explicit protected-regression thresholds agreed before +tuning. Fewer admitted nodes alone is insufficient when probing consumes the +saved work. The existing frontier remains the default until that gate passes. diff --git a/docs/solver-parity/BULK.md b/docs/solver-parity/BULK.md new file mode 100644 index 0000000000..957992b927 --- /dev/null +++ b/docs/solver-parity/BULK.md @@ -0,0 +1,145 @@ +# Atomic bulk model construction + +The C++ model supports `add_variables(vector)`, +`add_rows(vector)` and `add_rows_sparse(SparseRowBatch)`. Each nonempty +batch is a single atomic edit and advances the model revision once. A valid +empty batch is a no-op. Returned handles follow input order, belong to the same +model and receive fresh slots after existing tombstones. + +```cpp +#include +namespace O = Gecode::Optimize; +O::Model model; +auto vars = model.add_variables({ + {O::VariableType::Integer, -3, 7, "production"}, + {O::VariableType::Continuous, 0, 10, "recourse"} +}); +O::SparseRowBatch rows; +rows.columns = vars; +rows.row_start = {0, 2}; +rows.column = {0, 1}; +rows.coefficient = {2, 3}; +rows.lower = {7}; +rows.upper = {std::numeric_limits::infinity()}; +rows.names = {"demand"}; +auto constraints = model.add_rows_sparse(rows); +model.minimize({{vars[0], 4}, {vars[1], 5}}, 2); +``` + +The CSR column array is an explicit mapping to **unique live variable handles**; +its order need not match model slots. Every mapping entry is checked, including +unused columns. Indices refer to that array. Row offsets start at zero, are +monotone, and end at the coefficient count. Their length is one more than the +number of lower/upper bounds. Names are empty or have one entry per row. Empty +rows retain their ordinary mathematical meaning, including constant +contradictions. Rows can refer to existing variables only; adding variables and +then rows is two distinct atomic batches, not one cross-batch transaction. + +Within each row, unsorted or repeated column indices use exactly the ordinary +row builder's deterministic compensated coefficient coalescing. This preserves +the existing numerical model contract; it does not introduce exact rational +arithmetic. All five variable domains, finite-coefficient rules, infinite-bound +conventions and validation errors are the same as the scalar API. + +Validation, normalization, names and return handles are prepared before any +entity is appended. Allocation or validation failure leaves the previous model, +its revision, and existing entity references unchanged. Final vector growth is +the last potentially throwing operation; entity moves are required to be +nonthrowing. Capacity grows geometrically so repeated small batches do not +introduce quadratic reallocation behavior. Successful additions can invalidate +existing references into the model, as with ordinary vector-backed additions; +stable handles and owning historical snapshots remain valid. + +CSR handling uses memory proportional to columns, rows and nonzeros, plus the +owning model and temporary normalized rows. It never materializes a dense +rows-by-columns matrix. Column-identity validation sorts a temporary ID array; +each row's terms use the existing canonical sort/coalescing routine. This API +reduces call overhead and gives atomic construction; no measured solver speedup +or zero-copy data ownership is implied. + +`optimize-bulk` checks scalar/batch equivalence, arbitrary CSR mapping order, +large-coefficient cancellation, all variable domains, tombstones, historical +snapshots, malformed CSR dimensions/indices, stale/foreign handles, invalid late +entries, no-op batches and moved-from models. Allocation failure is injected at +each successive allocation until every batch type succeeds; failed calls must +retain original values, revision and reference addresses. A 16,384-square +diagonal model permits no individual allocation above 4 MiB, making accidental +dense construction fail the test. The fast gate's `bounded_integer` case also +uses the bulk variable and CSR row paths and retains its independent optimum +oracle. Bulk column insertion and general edit transactions remain subsequent +API work; the C/Python bulk surface is described below. + +## C and Python bulk construction + +ABI 1 adds `gecode_opt_v1_model_add_variables`, `model_add_rows` and +`model_add_rows_sparse`. The input records are `gecode_opt_variable_spec_v1`, +`gecode_opt_row_spec_v1` and `gecode_opt_sparse_row_batch_v1`. Every record has +an exact `struct_size` and a zero `reserved` field. Set variable bounds +explicitly in C; the enum does not change a supplied upper bound. + +Each function requires a caller-owned ID array whose capacity covers the +already-known number of input entities. For CSR that number is `lower_count`. +There is **no size-query mutation**: a short output returns `BUFFER_TOO_SMALL` +and posts nothing. A nonzero output capacity requires a non-NULL pointer; +a valid zero batch permits NULL with zero capacity. API errors leave output +array elements untouched, so callers must use returned IDs only after `OK`. +Outputs must not overlap input records/arrays/names. All non-NULL pointers must +refer to accessible storage of the declared length for the entire call. + +Conversion, UTF-8 validation, string copies, output-capacity checks, and C++ +normalization happen before commitment. The result IDs are copied into caller +storage without allocation after the atomic C++ operation. No C++ exception +crosses the ABI. API/model errors preserve the model and revision. Successful +nonempty calls advance the revision once, and valid empty calls do not. +A separate variable batch followed by a row batch remains two transactions. + +CSR has independent pointer/count pairs for columns, row starts, column indices, +coefficients, lower bounds, upper bounds and names. A valid zero-row CSR still +has `row_start={0}` and validates any supplied column mapping. Indices are +unsigned 64-bit integers with checked conversion to the platform's `size_t`; +there is no truncation on a 32-bit consumer. NULL arrays require count zero. +Names may be omitted with count zero or supplied one per row. An individual +NULL name means the empty string. Bulk C names must be NUL-terminated UTF-8; +invalid/overlong encodings, surrogates and values above U+10FFFF are rejected. +The first NUL terminates a C name. Python rejects embedded NULs before calling C. +Input arrays and strings can be released or changed after the call returns. + +Python exports `VariableSpec`, `RowSpec` and `SparseRowBatch`; each accepts +ordinary sequences, and a `RowSpec.terms` also accepts a mapping. Each public +bulk method performs exactly one C mutation call, returning a tuple of handles. +No NumPy dependency or per-nonzero C call is involved. Data is copied; this is +not a zero-copy buffer protocol. Python default variable upper bounds match the +scalar binding: 1 for Binary, +infinity otherwise. + +```python +from gecode_optimize import Model, VariableSpec, SparseRowBatch, VariableType + +with Model() as model: + x, y = model.add_variables([ + VariableSpec(VariableType.INTEGER, -3, 7, "production"), + VariableSpec(upper=10, name="recourse"), + ]) + rows = model.add_rows_sparse(SparseRowBatch( + columns=[x, y], row_start=[0, 2], column=[0, 1], + coefficient=[2, 3], lower=[7], upper=[float("inf")], + names=["demand"], + )) +``` + +Python conversion failures occur before the C mutation. The C transaction +covers input validation, normalization and model allocation. Constructing Python +return objects after a successful C call can itself raise `MemoryError`; Python +interpreter allocation failure is not a rollback protocol. Existing handles and +owning results retain their historical identities across successful batches and +model destruction. A historical result cannot look up a variable added later. + +The C99 consumer exercises all three bulk functions, output preflight, invalid +records/counts, malformed UTF-8, all five domains, late model failures, CSR +mapping/offset errors, unused foreign/deleted zero-row mappings, revision and +result-history preservation. Python conformance adds scalar/CSR model-file +and optimum equivalence, Unicode name lifetime, empty contradictions, +wrong-library handles, checked index conversions and dispatch counting for a +1,024-nonzero batch. Local C99 and all 28 Python tests pass with both backends +disabled and with Native+HiGHS; C99 and Python also pass against a fully +ASan/UBSan-instrumented numerical foundation and HiGHS. These are correctness +checks; no timing claim or completed Windows runtime verification follows. diff --git a/docs/solver-parity/CAPACITY-SCALING.md b/docs/solver-parity/CAPACITY-SCALING.md new file mode 100644 index 0000000000..c3458af1e1 --- /dev/null +++ b/docs/solver-parity/CAPACITY-SCALING.md @@ -0,0 +1,139 @@ +# Native capacity scaling + +With a ten-second solver allowance, the largest tested knapsack size proved +optimal in both repetitions rises from **32 to 384 binary variables** in each +of two fixed distributions. That is a **12-fold increase in tested size**, +not a speed ratio or an estimate of the solver's maximum size. The assignment +control remains at **256 variables**. Both versions reach their time limit at +the 512-variable knapsack stress point. + +This study measures the existing bounded exact capacity optimization from the +[algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md). No solver algorithm, option +or ABI changed for this measurement. The broader commercial-parity roadmap +remains incomplete. + +## Largest tested size + +A size counts only if both repetitions return independently verified `Optimal` +results within the internal ten-second allowance. Every tested point, including +the 512-variable stress case, participates in this calculation. + +| Family | Tested binary variables | Before | Current | Ratio of tested sizes | +| --- | --- | ---: | ---: | ---: | +| Uncorrelated capacity | 8, 32, 128, 384, 512 | 32 | 384 | 12 | +| Correlated capacity | 8, 32, 128, 384 | 32 | 384 | 12 | +| Assignment | 9, 25, 81, 256 | 256 | 256 | 1 | + +There is one seeded instance at each size. The two repetitions measure the same +instance, not two independent samples. Sizes between the listed points were not +tested. In particular, the before result does not establish that 32 is its +largest solvable size, and the current correlated result gives no upper limit. + +## Complete outcome census + +All **52 required observations** completed and returned an independently valid +original-model witness. Before proves **16/26** optima and reaches its time +limit in **10/26** runs; current proves **24/26** and reaches its time limit in +**2/26**. No failed or capped result is removed. The whole invocation takes +**150.1307507 seconds**, including two separate loader probes and preparation. + +Each table cell reports the number of proved optima out of two repetitions. +`0/2, limit` means both runs return `TimeLimit` with feasible incumbents, not +that the model is infeasible. Objectives minimize negative profit for capacity +models and positive cost for assignment. + +| Family | Variables | Reference objective | Before | Current | +| --- | ---: | ---: | --- | --- | +| Uncorrelated capacity | 8 | -337 | 2/2 | 2/2 | +| Uncorrelated capacity | 32 | -1,096 | 2/2 | 2/2 | +| Uncorrelated capacity | 128 | -4,318 | 0/2, limit | 2/2 | +| Uncorrelated capacity | 384 | -13,832 | 0/2, limit | 2/2 | +| Uncorrelated capacity, stress | 512 | -18,731 | 0/2, limit | 0/2, limit | +| Correlated capacity | 8 | -62 | 2/2 | 2/2 | +| Correlated capacity | 32 | -312 | 2/2 | 2/2 | +| Correlated capacity | 128 | -1,211 | 0/2, limit | 2/2 | +| Correlated capacity | 384 | -3,648 | 0/2, limit | 2/2 | +| Assignment | 9 | 87 | 2/2 | 2/2 | +| Assignment | 25 | 162 | 2/2 | 2/2 | +| Assignment | 81 | 146 | 2/2 | 2/2 | +| Assignment | 256 | 145 | 2/2 | 2/2 | + +The [complete public record](checkpoints/capacity-scaling.json) retains all +individual statuses, incumbent objectives, bounds and internal/external times, +plus the frozen models and reference witnesses. A speed ratio is left absent +whenever either version has an unfinished repetition. Sub-millisecond solves +and two repetitions do not support a general timing claim; the primary result +here is the difference in proved sizes. + +## Frozen inputs and independent references + +The 13 cases, sizes, distributions, seeds and order were fixed and hashed before +measurement. There are no planted optima or selected replacement instances. + +- Capacity tiers contain 8, 32, 128 and 384 Binary variables with weights drawn + uniformly from 1 through 31. Capacity is `6*n`. Uncorrelated profits are + uniform from 1 through 100 with seed `20260906`; correlated profits are + `weight + uniform(0,10)` with seed `20260907`. Each family uses nested item + prefixes. The 512-item uncorrelated stress case continues the same prefix. +- Assignment uses 3, 5, 9 and 16 tasks, encoded as 9, 25, 81 and 256 Binary + variables. Costs are uniform from 1 through 100, using the top-left square + of one 16-by-16 master matrix with seed `20260908`. Row and column equalities + are represented by pairs of lower-bounded sparse rows: `4*q` rows and + `4*q*q` nonzeros for `q` tasks. This control is outside the single-row DP. +- Capacity reference optima use exact minimum-weight-by-profit dynamic + programming, independently of the product's weight-indexed objective DP. + Assignment references use exact column-subset dynamic programming. Small + subset/permutation enumeration tests cross-check both oracles. The measured + phase verifies frozen identities and original witnesses without recomputing + the references. Solver TXT files contain `incumbent 0`; no reference objective + or reference assignment enters solve options. + +The product's work depends on capacity as well as variable count. Its complete +table has `(n+1)*(capacity+1)` cells and is capped at one million cells, with a +separate capacity limit of 65,536. The 384-item cases use **887,425 cells**; +the 512-item case would need **1,576,449**, so it deliberately exercises the +unchanged ordinary-search fallback. Both cohorts return incumbent -11,574 in +both stress repetitions without proving the reference optimum -18,731. This +visible limit prevents extrapolating the 12-fold size result to arbitrary +capacities, larger models or additional constraints. + +## Execution and provenance + +The runner makes two alternating paired repetitions: before/current for every +case in the first repetition and current/before in the second. Each call uses +ordinary Native/BAB, `Exact`, one thread, seed zero, zero gap tolerances and a +**10-second internal limit**. Capture allows **11 seconds per child**, plus at +most 0.5 seconds for cleanup; the invocation has a **cooperative 600-second +allowance**. Internal limits include native compilation/search/checking but +not the driver's sparse model construction. External times additionally include +startup, parsing, construction and output. Cooperative cleanup can make a +time-limited result's reported duration slightly exceed ten seconds. + +One adjacent pair of recorded UTC start times implies an apparent 51.3 ms +overlap. The runner executes sequentially and reaps each child before launching +the next; elapsed durations use monotonic clocks. UTC timestamps therefore do +not independently establish nonoverlap or machine quietness. + +Before libraries are the preserved source `530a3b783` / compiled product +`c2fabb78f1`. Current libraries contain the accepted capacity algorithm and all +five runtime library hashes match the prior algorithm-checkpoint candidate. +Two loader probes verify the actual cohorts. The same freshly frozen executable +serves both versions; its sole driver change raises the accepted time-limit +argument ceiling from five to ten seconds. The earlier study's frozen driver +remains unchanged. + +The measured source/tooling head is `f76dd776af77d2b416d58ea164099b8fdca22dc5`. +The frozen model manifest SHA256 is +`ce41bc1e75e35c6dbe708b65ff3f97904533aa66c9f57b1e10d9534b55ff13d3`. +Model, source, executable, baseline-manifest and loaded-library integrity checks +all pass. Eighteen new generator/runner tests pass in **1.430 seconds**, including +reference isolation, hash rejection, ten-second classification, stress-point +inclusion and structured failed-probe preservation. These are tooling checks; +the existing solver product and its prior correctness gates are unchanged. + +Reproduction uses `experiments/optimize/benchmark_capacity_scaling.py`: first +`--freeze-only --freeze-dir NEW_DIRECTORY`, then a separate measurement with +the printed `--manifest-sha256`, a ten-second-capable frozen driver, the preserved +and current library directories, and a new output directory. Local evidence is +under `build/capacity-scaling/`; the public JSON above includes the report, +summary, models and validation record without workstation paths. diff --git a/docs/solver-parity/CATEGORY-SCALING.md b/docs/solver-parity/CATEGORY-SCALING.md new file mode 100644 index 0000000000..e7fe48c64a --- /dev/null +++ b/docs/solver-parity/CATEGORY-SCALING.md @@ -0,0 +1,177 @@ +# Native scaling across seven benchmark categories + +The expanded local study covers **33 fixed cases and 132 measured runs** across +knapsack, assignment, facility location, bin packing, production, circuit routing +and weighted queens. With ten-second solver limits, the largest tested knapsack +size proved in both repetitions and **both distributions** rises from **32 to +384 model variables**. The other six category maxima are unchanged. + +This measures the existing [capacity algorithm](ALGORITHMIC-CHECKPOINT.md); +there is no solver algorithm, API or ABI change in this study. The earlier +[52-run capacity study](CAPACITY-SCALING.md) remains a separate record. Its +knapsack and assignment inputs are reused, so this is not a new independent +sample of those families. Neither study establishes general CPLEX/Gurobi parity +or a solver's maximum problem size. + +## Largest tested groups proved within ten seconds + +The main knapsack group at each size requires all four results per version: +two uncorrelated and two correlated runs. Every other category requires both +repetitions of its single variant. The 512-variable uncorrelated stress point +is retained separately with its variant count; it cannot stand in for a missing +correlated variant in the main category maximum. + +| Category | Tested main model-variable counts | Before | Current | +| --- | --- | ---: | ---: | +| Knapsack, both distributions | 8, 32, 128, 384 | 32 | 384 | +| Assignment | 9, 25, 81, 256 | 256 | 256 | +| Facility location | 8, 28, 104, 300 | 104 | 104 | +| Bin packing | 15, 36, 65, 102 | 102 | 102 | +| Production | 24, 48, 96, 192 | 48 | 48 | +| Circuit routing | 8, 16, 24, 32 | 32 | 32 | +| Weighted queens | 16, 32, 40, 48 | 48 | 48 | + +The knapsack ratio is **12 times the tested variable count**, not a speed ratio. +Untested intermediate or larger sizes could change each maximum. Variable +counts compare versions within a category; they do not rank difficulty across +these different formulations. Circuit routing uses `2*n` model variables for +`n` cities, including one cost variable per successor. Weighted queens uses +`4*n` for `n` queens, including diagonal and cost variables. Thus the largest +native routing case has **16 cities / 32 model variables**, and the largest +queen case has **12 queens / 48 model variables**. These variables are integer, +not Binary; the other five categories use Binary formulations. + +## Complete case census + +Before returns **50 Optimal and 16 TimeLimit** results; current returns +**58 Optimal and 8 TimeLimit**, out of 66 runs each. All **132 returned witnesses** +pass independent original-model validation. There are no missing observations +or discarded limits. The complete measured invocation takes **277.4355438 +seconds**, including two loader probes and measurement preflight; model and +reference freezing occurs separately. + +Each entry below shows proved optima out of two repetitions. `0/2, limit` +means both runs return feasible incumbents with `TimeLimit`. It is not an +infeasibility result. All objectives are minimization values, with negative +profit used for knapsack. Production reports the encoded linear objective; +its documented constant relates that value to physical production/holding cost. + +| Case | Model variables | Reference objective | Before | Current | +| --- | ---: | ---: | --- | --- | +| Knapsack uncorrelated, sanity | 8 | -337 | 2/2 | 2/2 | +| Knapsack uncorrelated, small | 32 | -1,096 | 2/2 | 2/2 | +| Knapsack uncorrelated, medium | 128 | -4,318 | 0/2, limit | 2/2 | +| Knapsack uncorrelated, large | 384 | -13,832 | 0/2, limit | 2/2 | +| Knapsack correlated, sanity | 8 | -62 | 2/2 | 2/2 | +| Knapsack correlated, small | 32 | -312 | 2/2 | 2/2 | +| Knapsack correlated, medium | 128 | -1,211 | 0/2, limit | 2/2 | +| Knapsack correlated, large | 384 | -3,648 | 0/2, limit | 2/2 | +| Assignment, 3 tasks | 9 | 87 | 2/2 | 2/2 | +| Assignment, 5 tasks | 25 | 162 | 2/2 | 2/2 | +| Assignment, 9 tasks | 81 | 146 | 2/2 | 2/2 | +| Assignment, 16 tasks | 256 | 145 | 2/2 | 2/2 | +| Facility, 2 sites / 3 customers | 8 | 90 | 2/2 | 2/2 | +| Facility, 4 sites / 6 customers | 28 | 147 | 2/2 | 2/2 | +| Facility, 8 sites / 12 customers | 104 | 224 | 2/2 | 2/2 | +| Facility, 12 sites / 24 customers | 300 | 350 | 0/2, limit | 0/2, limit | +| Bin packing, 4 items / 3 available bins | 15 | 3 | 2/2 | 2/2 | +| Bin packing, 8 items / 4 available bins | 36 | 3 | 2/2 | 2/2 | +| Bin packing, 12 items / 5 available bins | 65 | 4 | 2/2 | 2/2 | +| Bin packing, 16 items / 6 available bins | 102 | 5 | 2/2 | 2/2 | +| Production, 3 periods / 8 options | 24 | 267 | 2/2 | 2/2 | +| Production, 6 periods / 8 options | 48 | 484 | 2/2 | 2/2 | +| Production, 12 periods / 8 options | 96 | 1,447 | 0/2, limit | 0/2, limit | +| Production, 24 periods / 8 options | 192 | 4,600 | 0/2, limit | 0/2, limit | +| Circuit routing, 4 cities | 8 | 320 | 2/2 | 2/2 | +| Circuit routing, 8 cities | 16 | 384 | 2/2 | 2/2 | +| Circuit routing, 12 cities | 24 | 408 | 2/2 | 2/2 | +| Circuit routing, 16 cities | 32 | 436 | 2/2 | 2/2 | +| Weighted queens, 4 queens | 16 | 105 | 2/2 | 2/2 | +| Weighted queens, 8 queens | 32 | 121 | 2/2 | 2/2 | +| Weighted queens, 10 queens | 40 | 86 | 2/2 | 2/2 | +| Weighted queens, 12 queens | 48 | 98 | 2/2 | 2/2 | +| Knapsack uncorrelated, stress | 512 | -18,731 | 0/2, limit | 0/2, limit | + +The [complete public record](checkpoints/category-scaling.json) includes every +repetition's status, incumbent, bound and internal/external time, along with +all frozen models, references and provenance. Time ratios remain absent if +either version has an unfinished repetition. Tiny completed cases and two +repetitions do not support a general speed claim. + +## Inputs and independent optima + +All sizes, seeds and generation rules are frozen before measurement. There is +one nested seeded instance per tier and variant, repeated twice without model +replacement. No optimum is planted to favor a search order. + +| Category | Generation and independent reference | +| --- | --- | +| Knapsack | Existing seeds 20260906/20260907; weights 1..31, capacity `6*n`, uncorrelated profits 1..100 or weight plus 0..10. Exact minimum-weight-by-profit DP, distinct from the product's weight-indexed objective DP. | +| Assignment | Existing seed 20260908; top-left squares of a 16-by-16 cost matrix, entries 1..100. Exact column-subset assignment DP. | +| Facility location | Seed 20260909; prefixes of 12 sites and 24 customer coordinates in 0..30, Manhattan service cost plus one, opening cost 15..60. Enumerate site subsets and independently choose each customer's cheapest open site; the tiny case also permits full binary enumeration. | +| Bin packing | Seed 20260910; item-weight prefixes in 2..10. Capacity follows the existing total-weight/available-bin rule and is increased only if deterministic first-fit needs too many bins. Exact item-subset DP over bin count and last-bin load, checked against small set-partition enumeration. | +| Production | Seed 20260911; nested demands in 1..7, eight quantity options, fixed/unit/overtime costs and bounded inventory. Exact inventory-state DP; small quantity schedules independently check physical and encoded objectives. | +| Circuit routing | Seed 20260912; prefixes of 16 points in 0..99, Manhattan arc costs plus one on nonself arcs. Exact Held-Karp subset DP, checked against tiny tour enumeration. | +| Weighted queens | Seed 20260913; top-left squares of a 12-by-12 cost matrix in 1..50. Independent queen-placement enumeration with original row, column and diagonal checks. | + +References are computed before the manifest is frozen. Measurement checks +their hashes and original witnesses without recomputing optima. Binary TXT +contains `incumbent 0`. Native TXT contains a reference-free zero placeholder +vector required by the legacy format; the driver discards it. Neither format +feeds the oracle witness, its objective or a solution start into the solver. + +The 384-item knapsacks use 887,425 DP cells. The 512-item point needs 1,576,449, +exceeding the one-million-cell admission cap, so ordinary search handles it. +It remains visible as a single-variant stress group. Capacity and coefficients +matter as well as item count; the observed gain does not extend automatically +to larger capacities, multiple rows, globals or other categories. + +## Execution, validation and reproduction + +Every call uses ordinary Native/BAB, `Exact`, one thread, seed zero, zero gap +tolerances and a ten-second internal limit. There are two paired repetitions: +before/current in the first, current/before in the second. Per-child capture +allows 11 seconds plus at most 0.5 seconds for cleanup; the complete invocation +has a cooperative 1,500-second allowance. The runner reaps each child before +launching the next and records monotonic start/end offsets. Solver and external +durations use monotonic clocks; UTC timestamps are annotations. External time +also includes process startup, parsing, model construction and output. + +The preserved before cohort is source `530a3b783`, compiled product `c2fabb78f1`. +The current cohort is the unchanged accepted capacity-algorithm product. +Both use the same frozen ten-second-capable driver, SHA256 +`fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4`. +The measured source/tooling head is `272d360d02b7c4ed1b511d82219bd11c3b0c7394`; +the model manifest SHA256 is +`855c2630073be58b62682532d53f9a58314e7638ca242fbc8b3004a902b10e11`. +Loader probes and final input/source/driver/library integrity checks pass. +Eight generator and nine runner tests pass (**17 new tooling tests**); prior +solver correctness results are retained without claiming a new solver build. + +From the repository root, freeze into a new directory before measurement: + +```sh +python3 -B experiments/optimize/benchmark_category_scaling.py \ + --freeze-only --freeze-dir build/category-scaling/frozen +``` + +Use the printed manifest hash and the existing frozen driver in a separate run: + +```sh +python3 -B experiments/optimize/benchmark_category_scaling.py \ + --freeze-dir build/category-scaling/frozen \ + --manifest-sha256 PRINTED_SHA256 \ + --binary build/capacity-scaling/fixed-driver/optimize-native-benchmark \ + --before-libraries build/comparison-algorithms/before/lib \ + --after-libraries build/native-compat/gecode/optimize \ + --after-libraries build/native-compat \ + --output-dir build/category-scaling/results +``` + +These example directories already contain this study's evidence; choose new +freeze/output directories for another invocation. The runner performs no build +or download. Local raw logs and path details remain under +`build/category-scaling/`; the public JSON above is portable. The seven selected +families do not time scheduling, graph coloring, continuous/nonlinear models, +every native global or every API capability. Those remain separate capability +and correctness questions in the broader roadmap. diff --git a/docs/solver-parity/CONFIGURED-BENCHMARK.md b/docs/solver-parity/CONFIGURED-BENCHMARK.md new file mode 100644 index 0000000000..dd12e3fce8 --- /dev/null +++ b/docs/solver-parity/CONFIGURED-BENCHMARK.md @@ -0,0 +1,116 @@ +# Family-specific native benchmark settings + +This study compares ordinary Native/BAB with explicitly configured routes in +**the same accepted solver build**. It isolates settings from implementation +changes. Every solve has ten seconds, one thread, exact discrete guarantees, +zero gap tolerances, and no supplied starting solution or oracle objective. + +## Why the earlier results differed + +The previous seven-family boundary study invoked only `solve_native`. The +older 18-family experiment used a different native LP-informed policy, common +starting solutions, objective-aware AFC branching, and optional LP primal and +neighborhood heuristics. Its observations are not pooled into this study. +The separate historical MIPLIB numerical comparison used HiGHS; that is also a +different solver route and baseline. + +## Selection and supported combinations + +The driver exposes ordinary native search, root LP, root LP with checked covers, +LP after bound changes (interval four) with covers, DFS reliability branching, +and combinations with a bounded radius-four incumbent neighborhood. Every +configuration reports its exact settings and actual LP, cut, probe and +neighborhood counters. Requested features can be skipped when a model is +already solved; a true flag alone is not evidence of useful work. + +Eligible pure binary knapsacks retain the exact capacity dynamic program. +Requesting checked LP disables that program. Above its one-million-cell cap, +a separate LP fallback is eligible. Binary reliability and Hamming neighborhoods +are unsuitable for routing and queens, which contain integer variables and +native globals. Their ordinary native global propagators remain active. + +Integer presolve remains available as an explicit API. Its current postsolve +contract returns an original feasible witness with unknown optimization status +and no transferred global bound. This benchmark does not invent an optimal +status by composing that API with exact solving. A production proof-preserving +presolve composition is separate implementation work. + +## Measurement method + +An exploratory pilot compares every exposed route at the next previously +failing binary size. All candidate outcomes are retained. No neighborhood configuration beat the selected preset for its family; a few +paired times improved slightly, and one facility incumbent improved. +The family policy is then saved before the independent adaptive measurement begins; it never picks +the fastest route after seeing an individual result. Knapsack dispatch depends +only on the table admission rule. Selection and measurement reuse these seeded +families, so they are not an independent holdout. + +Both versions use the same executable and libraries. Inputs are saved before +execution, checked against the deterministic generator, and hashed. The complete +solve call is timed with a steady clock, including optional work and cleanup. +Capture is bounded at eleven seconds. Loader traces, build/source identities, +configuration fields, counters, witnesses and final hashes are checked. Exact +optimality is backend-reported; original feasibility, objective and auxiliary +values are independently validated. Inconsistent exact optima or contradicted +bounds reject the study. No incomplete run becomes a completed timing. + +Each cohort doubles to a failure or a fixed search ceiling, bisects independently, +and confirms the candidate and neighboring sizes twice. Both knapsack profit +variants must pass. These are sampled boundaries; difficulty is not monotonic +and larger untested sizes remain unknown. A reached search ceiling is a lower +bound on supported size, never a discovered solver limit. + +## Recorded results + +The separate pilot records **42 candidate measurements** in **181.33 seconds**. The adaptive comparison records **176 measurements** across **78 sampled inputs** in **794.28 seconds**. All source, driver, input and library integrity checks pass. Every returned solution passes original-model validation. There are no process errors, hard timeouts or memory stops. + +| Category | Previous settings | Configured | Next failure / configured ceiling | +| --- | --- | --- | --- | +| Knapsack | 407 items | 512 items | Search ceiling reached; the upper limit is still unknown. | +| Assignment | 17 tasks | 31 tasks | Next tested failure: 32 tasks (0/2 completed). | +| Facility location | 8 sites | 16 sites | Search ceiling reached; the upper limit is still unknown. | +| Bin packing | 17 items | 30 items | Next tested failure: 31 items (0/2 completed). | +| Production planning | 11 periods | 28 periods | Next tested failure: 29 periods (0/2 completed). | +| Routing | 21 cities | 21 cities | Next tested failure: 22 cities (0/2 completed). | +| Weighted queens | 23 queens | 23 queens | Next tested failure: 24 queens (0/2 completed). | + +Knapsack and facility location reach the fixed generator ceilings, so their configured results mean **at least 512 items** and **at least 16 sites**. No upper solver limit is established for either. Assignment, bin packing and production have adjacent observed failures. The unchanged native controls confirm 21 routing cities and 23 weighted queens. + +Production at 28 periods finishes near 9.6 seconds; routing at 21 cities also has a narrow time margin. Exact sampled boundaries can move with host activity or another seed. Aggregate completion rates are not compared because each configuration samples different sizes. + +## Selected settings and actual activity + +| Category | Selected settings | LP calls | Covers | Probe calls | +| --- | --- | ---: | ---: | ---: | +| Knapsack | Exact capacity DP; LP + reliability above its cap | 127995 | 29 | 1280 | +| Assignment | Checked LP bounds at the root | 11 | 0 | 0 | +| Facility location | Checked LP bounds updated during search | 1824 | 0 | 0 | +| Bin packing | Checked LP bounds at the root | 12 | 0 | 0 | +| Production planning | Updated LP bounds, covers and reliability branching | 369563 | 45 | 1920 | +| Routing | Native circuit and table constraints | 0 | 0 | 0 | +| Weighted queens | Native distinct and table constraints | 0 | 0 | 0 | + +Activity totals include discovery and confirmation solves for the configured cohort. Root-cover LP calls are already included in the LP total. Neighborhoods are disabled in the selected policy; all pilot neighborhood attempts and the one accepted facility incumbent improvement remain in the portable evidence. + +**Validation:** seven focused runner tests and three driver test groups pass. The driver tests execute 28 tiny route/model combinations with independent exhaustive optimum checks, actual mechanism activity checks, malformed-input rejection and start isolation. The solver libraries are unchanged, so the prior 70-test Release and 35-case FAST solver gates are retained rather than presented as newly executed. + +The [complete portable record](checkpoints/configured.json) includes the projection, every adaptive input/run/decision, and the entire exploratory pilot. The [saved policy](checkpoints/configured.json) specifies the active settings for reproduction. Ordinary public solve defaults are unchanged; these are explicit benchmark presets. + +## Reproduction + +Build the separate driver without rebuilding or modifying solver libraries: + +```sh +python3 -B experiments/optimize/build_configured_benchmark.py +python3 -B experiments/optimize/benchmark_configured.py --pilot \ + --binary build/configured-bench/optimize-configured-benchmark \ + --output-dir build/configured-bench/NEW-PILOT +python3 -B experiments/optimize/benchmark_configured.py \ + --policy experiments/optimize/configured-policy.json \ + --binary build/configured-bench/optimize-configured-benchmark \ + --output-dir build/configured-bench/NEW-RESULTS +``` + +Choose new output directories; prior evidence is never overwritten. The driver +build manifest is required alongside the executable. The historical frozen +benchmarks and core solver runtime remain unchanged. diff --git a/docs/solver-parity/CONSTRAINTS.md b/docs/solver-parity/CONSTRAINTS.md new file mode 100644 index 0000000000..70465d1ce5 --- /dev/null +++ b/docs/solver-parity/CONSTRAINTS.md @@ -0,0 +1,138 @@ +# Bounded logical modeling helpers + +`gecode/optimize/constraints.hpp` adds numerical linear formulations to +`Gecode::Optimize::Model`. It does not change the native Gecode `Space` API or +introduce backend-native indicators. All handles must belong to the model, and +logical variables must have `VariableType::Binary`; an integer with bounds +`[0,1]` is not accepted as a substitute. + +```cpp +#include +#include + +using namespace Gecode::Optimize; +Model model; +auto enabled = model.add_binary("enabled"); +auto amount = model.add_continuous(0.0, 100.0, "amount"); +auto condition = add_indicator(model, enabled, true, + {{amount, 1.0}}, 20.0, + std::numeric_limits::infinity(), + "minimum_when_enabled"); +// enabled == 1 implies amount >= 20; enabled == 0 imposes no such lower bound. +``` + +`add_indicator(model, b, active_value, terms, lower, upper)` means +`b == active_value => lower <= sum(terms) <= upper`. It supports either activation +value, one-sided or ranged rows, negative coefficients, terms containing the +activator, and constant rows. Duplicate terms use the same deterministic +coalescing as ordinary model rows. Both infinite bounds represent a tautology. + +## Formulation and numerical semantics + +The helper computes separate lower and upper relaxation constants from the +variable bounds captured when it is called. For each original term, it selects +the appropriate signed endpoint of the inactive domain. The activator is fixed +to its inactive value in this calculation. A semi-continuous or semi-integer +variable's domain includes zero, even when its stored nonzero lower bound is +positive. Only endpoints needed by the finite row bounds must be finite. +Constraints elsewhere in the model are not used to infer tighter endpoints. + +Multiplication and summation bounds are rounded outwards with `nextafter`; +relaxation constants enclose the resulting violation of each finite row bound. +Unbounded required endpoints, NaNs, nonfinite coefficients, or arithmetic that +cannot be enclosed by finite doubles throw `ModelError` with a domain-tightening +or rescaling suggestion. The implementation never guesses or silently clamps M. +It conservatively rejects some extreme but representable models rather than +underestimating a relaxation constant. + +When either M is positive, an auxiliary binary `g` represents inactivity: + +| Activation condition | Gate equality | +| --- | --- | +| `b == 1` | `g + b = 1` | +| `b == 0` | `g - b = 0` | + +The finite lower side becomes `sum(terms) + M_lower*g >= lower`; the finite +upper side becomes `sum(terms) - M_upper*g <= upper`. This preserves the original +stored coefficients and bounds on the active side, including a small coefficient +on `b` that could otherwise be lost when combined with a large M. At exactly +integral activation and gate values, the linear formulation has the specified +logical meaning. This is a numerical double model, not exact rational arithmetic +or a proof certificate. + +The result exposes the `Indicator` handle, optional auxiliary gate, generated row +handles, and each optional M. A one-sided indicator adds one original-side row; +a ranged indicator adds two. A needed gate adds one binary variable and one +equality row. If all M values are zero, no gate is added. A tautology adds no +variables or rows but still retains its original indicator metadata. + +Large M values can weaken relaxations and interact poorly with floating point +solver tolerances. Backend coefficient limits and numerical validation still +apply; successful modeling does not promise that every backend can safely solve +the resulting scale. The independent validator rounds the activator to decide +whether the implication is active, then evaluates the original row with the +submitted values and requested feasibility tolerance. It reports +`max_indicator_violation` separately. Thus an almost-integral gate cannot hide a +large original-row violation behind an otherwise numerically feasible M row. +The result must pass the original check to be marked solution-validated. + +## Mutation, snapshots, and removal + +Posting any helper succeeds as one revision or leaves the model unchanged, +including when construction of a later generated row fails. The transaction is +an internal staging operation, not a public callback API. + +An active indicator captures the domains that justify its lowering. Bounds may +be tightened and later widened within the captured domain. Widening beyond that +domain is rejected; remove and rebuild the indicator to use new bounds. Original +variables referenced by an active indicator cannot be removed. Generated row +coefficient/bound edits and individual generated-row removals are rejected, as +are changes to an active gate's `[0,1]` bounds. Renaming is allowed. + +`remove_indicator(model, condition.indicator)` atomically deactivates the logical +metadata and all its generated rows. This releases its domain guards. The gate +remains an ordinary model variable because other rows or the objective may use +it; callers can remove it explicitly after removing any remaining references. +Handles and slots are never reused. Removed indicator records remain tombstones. + +Snapshots own `IndicatorData`, original terms, captured domains, and generated +row/gate origin tags. Moving a model and copying snapshots preserves this +metadata. Structural validation checks the lowering against its original +meaning, rederives safe M values, and rejects stale domains, missing metadata, +aliased gates, inconsistent lifecycle flags, and changed generated rows. Code +that constructs or edits public snapshots must preserve this structure. + +An LP/MPS serialization of only the lowered rows cannot preserve the original +logical validation contract. Exporters must reject active original indicators +unless their format and reader explicitly preserve this metadata; no native +indicator interchange is provided by this helper slice. + +## Boolean AND and OR + +```cpp +auto a = model.add_binary("a"); +auto b = model.add_binary("b"); +auto all = model.add_binary("all"); +auto any = model.add_binary("any"); +auto and_rows = add_boolean_and(model, all, {a, b}); +auto or_rows = add_boolean_or(model, any, {a, b}); +``` + +These functions encode equality with the Boolean AND/OR of the inputs. Empty +AND is true; empty OR is false. One input produces an equality. Duplicate inputs +are idempotent, and the result may also appear among the inputs. For two or more +distinct inputs they add one row per input plus one aggregate row, without an +auxiliary variable. They return ordinary row handles that can be edited or +removed using the normal model API. Boolean helpers need no large constants; +ordinary numerical row and integrality validation applies. + +## Correctness checks + +`test/optimize/constraints.cpp` exhaustively compares tiny integral assignments +with an independent logical oracle for both activation values, signed terms, +activator terms, and one-sided/ranged bounds. It also checks semi-variable zero +domains, redundant and impossible rows, empty/single/multiple Boolean inputs, +aliases and duplicates, failure atomicity, invalid/foreign handles, unsupported +unbounded domains, mutation guards, hostile snapshot edits, small active +coefficients with large M, and near-integral gate loopholes. Tests compile and +run without a numerical backend, including address/undefined sanitizer builds. diff --git a/docs/solver-parity/CUT-LOOP.md b/docs/solver-parity/CUT-LOOP.md new file mode 100644 index 0000000000..bc1886d4db --- /dev/null +++ b/docs/solver-parity/CUT-LOOP.md @@ -0,0 +1,183 @@ +# Explicit root LP cover loop + +`gecode/minimodel/lp-cut-loop.hpp` adds a bounded, opt-in root LP/cover loop to +the experimental integer LP module. It does not change native search, Optimize +facades, solver selection, presets or default propagation. It uses the original +source/proof contracts in [CUTS.md](CUTS.md) and native arithmetic restrictions in +[SPARSE-LP.md](SPARSE-LP.md). This is root strengthening, not branch-and-cut. + +```cpp +#include +namespace LP = Gecode::Experimental::LpRelaxation; +namespace Cuts = LP::Cuts; + +LP::BoundedIntegerModel input; +input.linear.row_start = {0,2}; input.linear.column = {0,1}; +input.linear.a = {-3,-3}; input.linear.b = {-5}; // 3*x+3*y <= 5 +input.linear.c = {-2,-2}; +input.lower = {0,0}; input.upper = {1,1}; +Cuts::SourceModel original(std::move(input)); +Cuts::RootLoopOptions options; +options.max_rounds = 4; +options.deadline = std::chrono::steady_clock::now() + std::chrono::seconds(1); +auto result = Cuts::root_cover_loop(original,options); +// The verified x+y<=1 cover changes the checked integer lower bound -3 to -2. +// result.model owns original rows followed by the negated <= cover rows. +``` + +## Numerical suggestions and exact proof boundary + +`BoundResult` has a new optional `primal_suggestion`, an owning `vector`. +Existing three-argument `bound(lower,upper,retain_certificate)` overloads remain +available with unchanged default behavior and no primal-copy cost. A new +four-argument overload requests the copy with `retain_primal=true`. The backend +copies only after an actual HiGHS call without error, when `value_valid` is true, +the column count matches and every value is finite. A missing dual certificate +does not invalidate this selection-only hint. Zero matrices, which skip HiGHS, +do not invent a primal suggestion. The immutable model and serialized sibling +bound-restoration behavior are unchanged. + +The loop projects a finite suggestion into the **original** box and counts +projected coordinates. `rational_selection_point` rounds the projected vector +to the nearest grid point, with ties away from zero. The common denominator +must be a power of two between 1 and 1,048,576. Validated native endpoints times +that denominator have magnitude below 2^51, so endpoint conversion and scaling +are exact in double and the checked int64 numerator conversion is safe. Invalid +shape, nonfinite values and unsupported denominators are rejected. + +This vector need not satisfy the original rows and is never an integer solution, +primal bound, cut proof or optimality claim. Projection and grid rounding can +miss useful cuts, which affects strength only. Every separated cut is verified +against the immutable **original** `SourceModel` with `Scope::global()`. Later +rounds never use added rows as proof premises, never use a tightened/local box, +and never promote local records. Floating infeasibility reports are diagnostic +counts only; they do not authorize pruning or an infeasible completion status. + +## Augmentation and bound ownership + +Each successful round stages a fresh sparse model and backend. Original domain +arrays, objective coefficients, row order, row bounds and CSR entries are kept +exactly. Canonical global covers are deduplicated by the existing `CutPool`. +For each accepted `sum(a*x)<=upper`, the appended row is +`sum(-a*x)>=-upper`. Original row `i` retains its index, and appended row +`original_row_count+k` is attributed to `result.cuts[k]`. + +Before publication the loop checks total dimensions and structural storage +limits, uses checked negation, runs the full bounded-integer native +coefficient/activity preflight, constructs another immutable `SourceModel`, and +successfully builds its new backend. Only then are model, backend and record +vector moved/swapped into the result. A failure during staging leaves the last +published augmentation intact. Previously supplied source models and backends +are never modified. New backend workspaces are independent; their per-call +serialization remains safe when callers later share one backend. + +`result.best_bound` retains the strongest checked lower bound seen, its exact +immutable augmented model, its certificate and the corresponding original-source +cut records. It does not borrow the loop's latest backend matrix. After one LP +round, for example, the result may already contain a new cut while its best +bound still comes from the original unaugmented matrix. The retained provenance +distinguishes those states. Every such augmented feasible integer set equals +the original feasible set, so an earlier checked lower bound remains valid. +Keeping the maximum of checked lower bounds prevents reported regression if a +later numerical solve proposes a weaker certificate. No raw LP objective enters +this bound selection. + +All retained cuts own their source identity. Source-handle destruction, input +mutation and later loop calls cannot change existing models, records or bound +evidence. Public result fields are ordinary C++ values; callers must preserve +their association rather than overwrite fields and treat the edited object as +an independently checked result. + +## Budgets and completion + +Default limits are four root LP attempts, four million structural work units, +200,000 columns, 200,000 augmented rows and two million augmented nonzeros. +Existing `PoolLimits` and `SeparationOptions` impose additional bounded cut, +term, row, candidate and per-separation work limits. A limit never evicts a +proof, removes an original row or weakens an inequality to fit. + +Work is reserved for coordinate conversion, full model copy/preflight shapes, +pool comparison/copy shapes and the separator's deterministic work meter. +Copy/preflight reservations count three column-array values, two row-array +values, two nonzero-array values and one CSR sentinel per scan. This bounds +structural work; it is not a CPU-time, byte-allocation or RSS measurement. +HiGHS' internal work is separately bounded by its existing 10,000 simplex +iterations and 0.2-second allowance per LP call. Source construction/validation +precedes the loop and is not charged to its budget. Temporary staged storage is +bounded by the shape limits, but multiple original, current, staged and retained +bound snapshots can coexist; the limits do not mean only one matrix is resident. + +An optional absolute `steady_clock` deadline composes with an outer solve. The +optional `stop_requested` predicate is checked before/after LP work, separation, +copies/preflights and publication gates. These are cooperative checks: an active +LP or bounded separation step can return after the requested stop. A callback +must be thread safe if shared between simultaneous calls and must not mutate +structural/work options while the loop reads them. The executing predicate may +shorten its borrowed deadline; it must not race another thread's option access. +Predicate exceptions, including +`bad_alloc`, return `CallbackError`; they never publish completion or discard +an earlier model/bound. Model/backend allocation failures return +`AllocationFailure`, and other operational exceptions return `BackendError`. + +`RootLoopCompletion` distinguishes: + +- `NoNewCuts`: this configured heuristic inserted no new cuts. It does not + prove complete separation, LP optimality or integer feasibility. +- `RoundLimit`, `WorkLimit`, `StorageLimit`, `SeparationLimit`: the named bound + stopped further work. Returned augmentation and evidence remain valid. +- `Cancelled`, `TimeLimit`: cooperative external stops. +- `NoPrimalSuggestion`, `InvalidSuggestion`: no usable selection vector. +- `CallbackError`, `BackendError`, `AllocationFailure`: operational failure + with the previous published state retained. + +Unsupported free nonbinary source rows, oversized rows and arithmetic-rejected +candidates are skipped and counted. When a separator work cap is reached, only +already verified cuts can be staged; exhausting total work before publication +discards that pending round. A storage cap can publish an accepted prefix if its +complete new backend fits before stopping. Zero rounds/work do not create a +backend. Malformed options and moved-from source handles throw before work. + +## Validation + +`experiments/lp-relaxation/tests/cut-loop.cpp` independently enumerates original +finite integer boxes and compares full feasible sets with every returned +augmentation and retained bound matrix. It reconstructs cut proofs and verifies +appended-row attribution, original CSR prefixes, domains and objectives. It +also checks the actual fractional HiGHS fixture above, 180 generated signed +models at three round budgets, nondecreasing retained checked bounds, finite +projection and exact rounding boundaries, unsupported rows, empty/contradictory +models, all total work limits 0–649, round/storage/separation caps, cancellation, +deadline and throwing predicates at every checkpoint, immutable old certificates, +concurrent loops and restored sibling bounds on a shared augmented backend. + +Optional `GECODE_LP_CUT_LOOP_TEST_HOOKS` enables targeted allocation/backend +exception injection around LP, bound publication and augmentation construction +and publication. Optional `GECODE_LP_CUT_LOOP_TEST_NATIVE` posts returned models +through the actual native integer interface and compares every enumerated native +solution and cost with the original independent oracle. Neither macro changes a +normal consumer build. + +Build with C++17, warnings and assertions, configured Gecode/HiGHS include paths, +and the pinned HiGHS library. Add matching native int/search/kernel/support +libraries when enabling native checks. HiGHS may additionally require zlib and +platform thread libraries. For ASan/UBSan, instrument the complete test/header +code **and HiGHS**, plus native libraries when enabled. Mixing instrumented +libc++ vector code with an uninstrumented dependency can invalidate sanitizer +results. No sanitizer suppressions are needed; the macOS run disables leak +detection and halts on address/undefined-behavior errors. + +The normal and fully instrumented native+HiGHS runs pass 1,650 configurations +and 7,319 exact feasible-set checks with both optional test macros enabled. +The final-round post-publication cancellation regression retains its completed +augmentation and earlier bound evidence while reporting `Cancelled`. +The unchanged binary and bounded-integer backend suites also pass normal and +full-HiGHS ASan/UBSan rebuilds, including 40 and 80 serialized sibling calls. + +The default-off native-facade integration is described in +[NATIVE-LP.md](NATIVE-LP.md#optional-verified-root-covers) and +[NATIVE-SEARCH.md](NATIVE-SEARCH.md#optional-checked-lp). It retains the full loop +evidence, re-evaluates the current backend and combines root totals with later +backend deltas. The loop now reports rejected-bound totals, including completed +backend work when a bound call throws before returning. Dynamic local tree cuts +and performance evaluation remain separate work. No solver default or timing +benchmark changed in this slice. diff --git a/docs/solver-parity/CUTS.md b/docs/solver-parity/CUTS.md new file mode 100644 index 0000000000..b2fc9e5650 --- /dev/null +++ b/docs/solver-parity/CUTS.md @@ -0,0 +1,211 @@ +# Exact scoped cover-cut records + +`gecode/minimodel/lp-cuts.hpp` adds an explicit cut-record, cover-separation and +bounded-pool layer beside the existing experimental LP headers. It does not +modify `solve`, native propagation, HiGHS import, default presets or the existing +`lp-strengthening.hpp` behavior. This is a first W7 proof/ownership slice, not a +complete branch-and-cut implementation. + +## Source and proof contract + +```cpp +#include +namespace LP = Gecode::Experimental::LpRelaxation; +namespace Cuts = LP::Cuts; + +LP::BoundedIntegerModel model; +model.linear.row_start = {0,2}; +model.linear.column = {0,1}; +model.linear.a = {-3,-3}; +model.linear.b = {-5}; // 3*x + 3*y <= 5 +model.linear.c = {0,0}; +model.lower = {0,0}; model.upper = {1,1}; +Cuts::SourceModel source(std::move(model)); + +auto cut = Cuts::verify_cover(source, + Cuts::CoverProof{0,{1,0},Cuts::Scope::global()}); +// cut.inequality(): columns {0,1}, coefficients {1,1}, upper 1. +``` + +`SourceModel` validates and owns an immutable `BoundedIntegerModel` snapshot. +The native domain/coefficient/activity limits described in [SPARSE-LP.md](SPARSE-LP.md) +apply. Copies of `SourceModel` share identity; a separately constructed equal +model has a distinct identity. Input mutation, source-handle destruction, and +moving the source do not alter retained cut records. Accessing a moved-from +source is rejected. This module has no connection to mutable Optimize model +IDs or revisions: a later integration must explicitly establish and preserve +that association. + +`CoverProof` is untrusted input: an original row index, selected original column +indices, and a scope. The checker obtains coefficients, signs, bounds and +weights from the owned source. Selected indices are sorted; duplicates, absent +terms and fixed variables are rejected. There is no interface for attaching a +validity label to an arbitrary user-supplied inequality. `VerifiedCut` has a +private constructor, read-only proof/inequality accessors, and retains the source +snapshot, scope, exact capacity and cover weight. + +Proof verification does not depend on a candidate LP point, floating tolerance, +dual multiplier, objective value or solver status. Calling `verify_cover` on a +valid cover that does not violate a particular point still succeeds. + +## Exact transformation and validity + +The original row is `A*x >= b`. Within the certified box, substitute exactly +fixed integer variables, whose contribution is `F`. Every remaining nonzero +term must have an integral binary domain `[0,1]`. Other free integer terms are +explicitly unsupported; terms fixed to any supported signed integer value can +be substituted. Zero coefficients cannot occur in canonical source CSR. + +For each free term, use literal `x[j]` when `a[j]<0`, and literal `1-x[j]` when +`a[j]>0`. Then the row is exactly equivalent, inside its scope, to + +```text +sum(abs(a[j]) * literal[j]) <= sum(positive free a[j]) - b + F. +``` + +All weights are positive. If a selected subset has total weight strictly greater +than the capacity, its literals cannot all equal one. Therefore +`sum(selected literals) <= number_selected - 1` is valid. Translating complemented +literals back to original variables yields canonical coefficients in `{-1,1}` +and a checked integral upper bound. If the capacity is negative, the empty cover +proves `0 <= -1` in that scope. Equality of cover weight and capacity is +insufficient and is rejected. + +The implementation reuses `Strengthening::Detail::add`, `subtract`, `Term` and +`PackingRow` from `lp-strengthening.hpp`, along with its established signed-literal +translation and grow-then-minimize cover rule. It does not invoke the legacy +dense `Builder`: that API returns strengthened dense rows without the original +proof/scope ownership needed here. The legacy clique, pair, fixing and cover +features remain unchanged. Checked signed int64 arithmetic protects new fixed +substitution and rational-point operations; unsupported arithmetic fails without +publishing an unchecked record. This cut layer does not require int128 support. + +## Global and local scope + +A global proof uses the original model bounds and must not carry a local box. +A local proof carries lower/upper arrays for every original variable; they must +form nonempty subintervals of the source bounds. Local bounds are never silently +promoted to global validity, even when they happen to equal the source box. + +For example, `2*x+2*y+2*z <= 4` permits `x=y=1` when `z=0`. Inside the local box +`z=1`, exact substitution proves `x+y <= 1`. That cut must not enter the sibling +with `z=0`. + +```cpp +Cuts::Box node{source.model().lower,source.model().upper}; +// Tighten node bounds for the intended proof scope, then: +auto local = Cuts::verify_cover(source, + Cuts::CoverProof{row_index,cover_columns,Cuts::Scope::local(node)}); +bool usable = local.applies_to(source,current_node_box); +``` + +`applies_to` requires the same immutable source identity and a valid current box +contained in the certified local box. Global records accept any valid box inside +their original source domains. Malformed, empty, widened and foreign-model boxes +fail that guard. The proof uses interval hulls; it does not depend on unrecorded +domain holes, node IDs, mutable variable handles or an assumed tree ancestry. + +This module intentionally has no operation that posts a `SparseCut` to a solver. +A future consumer must preserve original-variable mapping and check scope at the +point of use. Copying the naked inequality and discarding its record would +discard the information required for safe local reuse. + +## Deterministic bounded separation + +```cpp +Cuts::FractionalPoint point{{3,3},4}; // x=y=3/4 +Cuts::SeparationOptions options; +options.max_work = 100000; +auto separated = Cuts::separate_covers(source,point,Cuts::Scope::global(),options); +``` + +The point is an exact rational vector with a shared positive int64 denominator. +It must lie in the requested box; it need not satisfy all original rows. Points +and checked operations that cannot be represented in the supported arithmetic +are rejected. Converting numerical LP solutions to this rational representation +is a future adapter responsibility. There is no hidden floating rounding policy. + +The separator tries point-value, descending-weight and literal-index orderings, +with explicit index tie breaks. Starting from a bounded number of positions, it +grows a cover, then removes light terms while the remaining weight still exceeds +capacity. Each candidate must be exactly violated by the rational point and must +pass the independent source-based proof checker before being returned. A fixed +merge-sort schedule makes budget prefixes independent of the standard library's +`std::sort` implementation. + +Defaults bound work to 100,000 units, 256 visited rows, 512 source nonzeros per row, +32 returned cuts, four returned cuts per row and four starts per ordering. Work +units cover box/point coordinates, source-term visits, sorting comparisons and +output entries, greedy/minimization steps, proof reconstruction and cut-key +comparisons. Source construction/validation is a separate one-time operation. +Ordinary allocation, vector copying and destruction are not wall-clock budget +measurements; their sizes are bounded by source shape and accepted work/output. + +The result reports reached work/row/cut caps, oversized and unsupported rows, +arithmetic rejections and duplicate cuts. Work exhaustion preserves previously +verified returned cuts. A zero work or cut budget can return immediately without +validating unused point/proof input. This is a bounded heuristic: an empty result +does not prove that no violated cover exists. No wall-clock or performance claim +follows from its work counter. + +## Bounded pool and duplicate policy + +```cpp +Cuts::CutPool pool(source,Cuts::PoolLimits{64,4096,16384}); +for (const auto& cut : separated.cuts) pool.insert(cut); +auto active_records = pool.applicable(current_node_box); +``` + +The pool accepts only verified records for its source identity. Defaults limit +it to 64 records, 4,096 total cut nonzeros and 16,384 stored local-scope endpoint +values. These are structural storage limits, not an allocator byte/RSS promise; +the shared source snapshot is stored once. Capacity rejection and allocation +failure leave the previous pool unchanged. No eviction or unproved weakening is +performed to make a new record fit. + +Canonical equality compares sorted columns, signs and upper bounds, independent +of original-row provenance or the order of a submitted cover. An existing +identical cut with a broader proved scope makes a narrower candidate redundant. +A separately verified broader candidate can replace narrower identical records, +including a global proof replacing local ones. Incomparable local boxes remain +separate; the pool never takes their interval hull or guesses their union is a +valid scope. Returned records are owning values and retain their historical scope +after later pool edits. The pool does not implement general inequality dominance, +lifting, aging, effectiveness scoring or thread-safe concurrent mutation. + +## Correctness checks and remaining W7 work + +`experiments/lp-relaxation/tests/cuts.cpp` uses independent original-row enumeration +without calling Gecode search, HiGHS, the legacy strengthening algorithm or the +certificate checker as an oracle. It exercises 750 signed integer models with +global and local scopes: 2,092 verified covers, 20,884 rejected proof requests, +955 separated cuts and 659 feasible sibling witnesses that would be removed if +scope checks were omitted. Targeted fixtures cover signed complements, positive +and negative fixed integers, strict/equal capacity, empty contradictions, +immutable identity, stale/foreign records, forged claims, pool scope dominance, +capacity rejection, arithmetic overflow and exact fractional separation. + +All work limits from zero through 299 produce reproducible bounded prefixes on +the same fixture. A 16,384-variable source verifies that point-coordinate scans +also stop at the work cap and that a two-term pool record remains sparse. + +The standalone test requires a configured native include directory for Gecode +configuration headers, but links neither a solver nor native Gecode libraries: + +```sh +c++ -std=c++17 -Wall -Wextra -pedantic -UNDEBUG -DGECODE_NO_AUTOLINK \ + -Ipath/to/configured-gecode-build -I. \ + experiments/lp-relaxation/tests/cuts.cpp -o build/lp-cuts/cuts +build/lp-cuts/cuts +``` + +Normal and ASan+UBSan runs pass with assertions enabled and the warning flags +above. The sanitizer run instruments the complete cut implementation, since it +is header based and links no solver libraries. Address/undefined-behavior errors +halt the test; leak detection is disabled for the macOS run. + +Remaining work includes cut consumption with scoped native/LP ownership, +interrupted-search behavior, numerical candidate conversion, integration with the +legacy strengthening API, lifted covers, verified clique/MIR/Gomory families, +cut aging/selection and performance evaluation. No change to default solver +behavior or timing benchmark accompanies this slice. diff --git a/docs/solver-parity/DIAGNOSTICS.md b/docs/solver-parity/DIAGNOSTICS.md new file mode 100644 index 0000000000..5d90932f50 --- /dev/null +++ b/docs/solver-parity/DIAGNOSTICS.md @@ -0,0 +1,125 @@ +# Numerical conflict diagnosis + +`gecode/optimize/diagnostics.hpp` provides `analyze_conflict(model, options)` for +linear LP/MILP models. It first asks a feasibility oracle whether the original +constraint system is infeasible. Only after an unambiguous numerical infeasible +result does it run a deterministic deletion filter. The original model, its +objective, revision, and stable handles remain unchanged. + +```cpp +#include +#include +using namespace Gecode::Optimize; +Model model; +auto stock = model.add_continuous(0, 10, "stock"); +model.add_row({{stock, 1}}, 11, std::numeric_limits::infinity(), "demand"); +ConflictOptions options; +options.solve.time_limit_seconds = 30; +options.retain_deletion_witnesses = true; +auto conflict = analyze_conflict(model, options); +// On completed analysis: the demand row and stock's upper bound form the +// conflict. Its lower bound is unnecessary and is removed from the result. +if (conflict.irreducible()) { + for (const auto& group : conflict.groups) { + // Inspect group.name, kind, and original row/variable/indicator handles. + // group.deletion_witness satisfies the conflict with this group removed. + } +} +``` + +## What is minimal + +The result is **group-minimal**: deleting any one reported group makes the +remaining conflict numerically feasible. This is not a minimum-cardinality +conflict, and groups containing several conditions are not individual IIS +members. Different deletion orders can produce different valid conflicts. + +| Group | Included conditions | Removing the group | +| --- | --- | --- | +| `Row` | Both finite sides of one original ranged row | Removes that whole row | +| `LowerBound` | A continuous/integer variable's finite lower bound | Sets its lower bound to negative infinity | +| `UpperBound` | A continuous/integer variable's finite upper bound | Sets its upper bound to positive infinity | +| `Integrality` | One ordinary integer variable's integer restriction | Makes it continuous, preserving retained numeric bounds | +| `VariableDomain` | A binary or semi-variable's entire domain, including bounds and integer restrictions | Makes it continuous and free | +| `IndicatorComponent` | Connected original indicators, their generated rows, and the full domains of every participating variable and auxiliary gate | Deactivates those indicators and generated rows, and makes their participating variables continuous and free | + +Unbounded continuous variables need no domain group. Deleted variable and row +slots remain tombstones. Ordinary Boolean-helper rows are treated as rows. +Variable-domain groups preserve semi-variable semantics `{0} union [lower,upper]` +while retained; removing one removes the entire disjunction, not just its +nonzero interval. Ordinary integer bounds are kept as their original numeric +endpoints: relaxing integrality of `[0.25,0.75]` permits real values in that +interval rather than rounding it into an empty integer interval. + +Indicator components connect indicators sharing any activator, original term +variable, or auxiliary gate, transitively. Their component groups include every +such variable's complete original domain. This deliberately coarser granularity +keeps captured-domain guards and safe big-M lowerings intact whenever an +indicator remains active. It also handles exposed gates used by other indicators. +No generated indicator row is presented as an independent original logical +cause. `indicators`, `generated_rows`, and `grouped_variables` provide the full +attribution. A component can be an irreducible one-group conflict even when a +smaller individual logical conflict exists inside it. + +The deterministic deletion order is original ordinary row slot order, then +variable slot order (lower bound, upper bound, integrality, or whole domain), +then indicator components ordered by their lowest participating variable slot. +Each attempted deletion either permanently removes an infeasible subset's +unnecessary group or retains a group with an independently checked feasible +deletion witness. All deletions are relaxations, so witnesses remain feasible +after later unnecessary groups are removed. When witness retention is enabled, +they are also independently rechecked against the final reported subset. + +## Status, evidence, and budgets + +`ConflictStatus::Feasible` returns an independently validated feasible assignment +in `feasible_witness`, using original variable slots. The original objective is +irrelevant: every private oracle model uses a constant zero objective. An +unbounded original optimization problem can therefore have a feasible +constraint system and return `Feasible` here. + +`Irreducible` means the filter finished and every retained group's necessity was +established. `infeasibility_established` records whether an unambiguous numerical +infeasible oracle result has been obtained. Before that point, a stopped or +ambiguous analysis is `Unknown` and reports no conflict. Afterwards it is +`Incomplete` and reports the last numerically established infeasible subset; +that subset must not be called an IIS. Its `necessity_verified` flags identify +groups for which deletion feasibility has already been checked. Backend +unavailability, invalid input, and failures have explicit statuses. `termination` +is the stopping reason, or `Optimal` for completed feasibility and `Infeasible` +for completed conflict diagnosis. + +All evidence is `Guarantee::Numerical`, using the backend's numerical +infeasibility determination and independent original-unit feasibility and +integrality tolerances for witnesses. No exact proof, rational certificate, +minimum-size guarantee, or solver-native conflict refiner is claimed. +`Exact` and `Certified` requests return `Unsupported`. + +One outer monotonic budget covers copying, partitioning, every oracle solve, +and witness checking. Each solve receives only the remaining time and the same +cancellation token. Any interrupted, ambiguous, invalid, or failed oracle stops +analysis; even a limited oracle carrying a feasible incumbent is not advanced. +An oracle returning after the outer budget stops cannot establish a new fact. +Limits are cooperative inside backend calls and elapsed time can exceed the +requested limit. A node limit is explicitly unsupported because cumulative +backend node consumption is not yet reported. Sparse starts are ignored; other +options are validated and native gap targets are forced to zero. + +The filter needs at most one initial feasibility solve plus one solve per +candidate group. Repeated model copies and numerical solves make this suitable +for diagnostic work, not a replacement for a specialized large-model conflict +refiner. Optional deletion witnesses can occupy one full original-slot vector +per retained group; they are omitted by default. No reference assignments or +cross-model witness caches are used. + +## Checks + +The normal test executable covers contradictory rows, bound/row attribution, +integer-only infeasibility, whole binary/semi domains, constant contradictions, +feasible and originally unbounded models, tombstones, indicator components, +untouched original snapshots, and independent reconstruction and validation of +every retained deletion witness. The separate +`GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER` mode supplies a deterministic oracle to +test interrupted and ambiguous results, late cancellation, invalid witnesses, +contradictory statuses, decreasing shared deadlines, and retention of the last +established infeasible subset without timing-dependent sleeps. diff --git a/docs/solver-parity/FAST-REGRESSION.md b/docs/solver-parity/FAST-REGRESSION.md new file mode 100644 index 0000000000..f8775d13ea --- /dev/null +++ b/docs/solver-parity/FAST-REGRESSION.md @@ -0,0 +1,108 @@ +# Fast native and numerical regression gate + +This is a small correctness gate for prebuilt binaries with a default **28-second outer wall budget**. Build time is separate. It is designed to catch material native CP and numerical optimization regressions during development; it is not a substitute for full conformance, solver-quality or scaling benchmarks, and does not establish CPLEX/Gurobi parity. + +From the source root, run one command: + +```sh +python3 experiments/optimize/fast_regression.py \ + --native-binary build/native-compat/bin/gecode-test \ + --optimize-binary build/native-compat/bin/optimize-fast-benchmark +``` + +These executable paths are verified for the combined `build/native-compat` build. Its optimization library is `build/native-compat/gecode/optimize/libgecodeoptimize.dylib` on the local macOS build; paths and suffixes vary on other platforms. Build the `gecode-test` and `optimize-fast-benchmark` targets (the latter also builds the C shared library) before running the gate. Build time remains separate from its deadline. + +The complete gate now requires the optimization binary to include both HiGHS and the native integer bridge (`GECODE_OPTIMIZE_WITH_HIGHS=ON` and `GECODE_OPTIMIZE_WITH_NATIVE=ON`). The reference configuration is the combined build with `GECODE_ENABLE_OPTIMIZE=ON`. The hybrid case additionally requires the checked 128-bit certificate implementation available on supported GCC/Clang compilers. A numerical-only standalone binary cannot pass the required native Exact case, even when a separate CP test binary is provided. The existing `gecode-test` executable supplies the original native CP cases; there is no need to run its entire suite. A missing binary, unavailable backend, omitted case or unmatched native test pattern fails the command. No feature case is optionally skipped. + +The command emits a JSON report on stdout and exits zero only if all 35 required cases pass before the outer deadline. `--output /new/path/report.json` additionally saves a new report and refuses to overwrite any existing file. No existing benchmark output is modified. Optional repeated `--library /path/to/library` arguments record hashes of dynamically linked solver libraries. Hash those libraries when comparing shared builds: an executable hash alone does not identify its runtime dependencies. + +## Required cases and independent answers + +| Case | Coverage and oracle | +|---|---| +| `native_neighborhoods` | Eight-assignment oracle proves optimum -29 after an actual radius-one incumbent improvement; original witness, global proof and shared status accounting are checked. | +| `lp_sensitivity` | Selected-basis coefficient and equality RHS intervals for both senses, tagged finite/infinite endpoints, objective slopes, quota rejection and historical source ownership. | +| `lp_evidence` | Both objective senses recover a feasible original base point and improving ray with fixed-variable and row recession checks; a contradictory bounded LP gives signed Farkas multipliers `y=1,z=-1`, summing to `0 >= 1`. Private solve identities, checked witnesses, historical ownership and exact auxiliary-call counts are required. Status is `evidence_checked`; margins/slopes are not source objective values. | +| `cp_distinct` | Existing `Int::Distinct::Dom::Dense`: domain-consistent all-different tested against the original assignment predicate. | +| `cp_element` | Existing `Int::Element::Matrix::Int::IntVar::XY`: two-dimensional indexed selection with the original direct lookup oracle. | +| `cp_cumulative` | Existing four-task, capacity-two cumulative case with both propagation flags; original resource-usage predicate checks 500 seeded assignments. | +| `cp_search` | Existing single-thread DFS with binary branching and recomputation distance two; original known solution count and resumption after a failure stop are checked. | +| `lp_min_offset` | Two-variable LP, minimum `4`. Primal `(1,4)` and the sum of the two lower-bound rows give matching cost `11`, before offset `-7`. | +| `lp_max_offset` | Two-variable LP, maximum `15`, primal `(2,2)` including offset `5`; nonnegative row multipliers `4/3` and `1/3` give the matching upper bound. | +| `bounded_integer` | Atomic bulk variables and CSR row construction with a reversed column mapping; Negative and positive bounded integer domains; all 66 integer pairs are enumerated outside the solver. Minimum `13`. | +| `mixed_recourse` | Six fixed-charge MILPs with binary opening, bounded integer production and continuous recourse. For each integer choice, optimal recourse is `max(0,demand-3*n)`; exhaustive enumeration gives `[-1,5,8,21,24,30]`. Both C++ and Python compute that oracle. | +| `indicators_boolean` | Both indicator activation values plus AND/OR helpers; expected activation `1`, quantity `7` and objective `-13`. Original logical metadata is independently validated. | +| `semis` | Semi-continuous lower `3` and semi-integer lower `2.5`; active-domain optimum is `8`, then row edits permit zero in both domains and objective `-1`. | +| `multiobjective` | Two ordered objectives with offsets and opposite senses, plus a sparse start. First minimize total to `14`, then maximize the second objective to `1`; expected `(x,y)=(0,4)`. | +| `infeasible` | Integer `x` in `[0,0.5]` and `x>=0.25` has no integer witness. Requires `Infeasible`. | +| `unbounded` | A free variable minimizing itself has the explicit improving ray `x=-t`. Requires `Unbounded`, rather than accepting an ambiguous status. | +| `edits_io` | Historical result survives bounds edits; objectives `5→7`; LP and MPS reimports each retain `7`; cancellation fixture yields `-1`. Separate precision witnesses reject `x=1` and accept `x=2` before and after both file round trips. | +| `limit_contracts` | Zero deadline, cancelled token and unsupported certified request must produce their distinct documented terminations. | +| `session_reoptimization` | Compatible LP row/bound/objective edits give `5,13,18,-6` while preserving the historical result and reusing one loaded model. MIP objectives `2,3,5,5` check reuse of a revalidated feasible incumbent, rejection after an invalidating bound edit, and explicit-start precedence. | +| `diagnostics_groups` | `x in [0,10]` with `x>=11` must report the upper-bound/row conflict. Integer `[0.25,0.75]` must report lower bound, upper bound and integrality. Every retained deletion witness is checked against an independently reconstructed free-system subset; original models remain unchanged. | +| `native_exact_reified` | Explicit `Backend::Native` with `Guarantee::Exact`, both indicator activation values, exposed gate and a semi-integer zero alternative. C++ and Python independently enumerate 56 original assignments and obtain minimum `-11`, maximum `12`; native proof completion must report the matching bound. | +| `native_regular` | Sparse signed-symbol DFA with two reachable states in a billion-state namespace. Missing zero edges reject; independent parity enumeration gives exact min/max `-3`/`1`. | +| `scenario_batches` | Four continuous scenarios override a variable bound, objective coefficient/offset and row sides. Both reused and cold solves must reach analytic objectives `[5,9,-11,7]`, retain private per-scenario identities and pass original-model checks. | +| `native_globals` | A three-task schedule combines all-different, table, element with negative base, cumulative resource capacity, and a three-node circuit with negative labels. Independent schedule/cycle enumeration gives minimum `7` and maximum `30`. Auto must select native search and preserve Exact completion. | +| `c_api_ownership` | The C ABI solves a MILP with continuous recourse at `5.75`, then changes the integer bound and obtains `6.25`. Both historical results retain copied values after destroying their model and session. | +| `feasibility_repair` | An impossible demand requires minimum weighted violation `1` and original objective `-1`; its repair must fail the original feasibility check and pass the private model check. A demand edit permits zero violation, then ordered refinement reaches objective `-2`. | +| `native_checked_lp` | Signed bounded-integer ranged-row model, both objective senses and offset, repeated checked LP deductions. Both languages enumerate the feasible box and obtain minimum `13` and maximum `26`; the native result must include actual LP calls and accepted bounds. | +| `solution_pool` | Three integer projections with continuous recourse, ranked objectives `[1,2,3]`, independent original witnesses and an infeasible remainder proving exhaustion. A second solve stops at two entries and must report RequestedLimit, without claiming exhaustion or original scalar optimality for later entries. | +| `integer_presolve` | Exact fixed substitution and signed ranged-row propagation followed by native min/max solves. Reconstructed original-slot witnesses give objectives `3` and `7`, keep tombstones and original identity, and clear the reduced solve's scalar status/bounds. | +| `native_frontier_bounds` | Best-bound search proves min/max `-17`/`17`; depth-first search interrupted at four admitted nodes retains incumbents `-15`/`15`, valid unresolved-frontier bounds `-17`/`17` and gap `2`. Both original witnesses are checked. | +| `convex_quadratic` | Bounded continuous convex minimization and concave maximization using weighted affine squares; optima `3.5` and `2.5`. Independent `x+y=1` identity, original primal/KKT checks and outward tangent-bound gap check; explicit HiGHS QP provenance. | +| `native_root_covers` | Binary `3*x+3*y<=5` implies `x+y<=1`; min/max `15`/`19`, original witnesses, one independently verified root cover and separate LP/cut accounting. | +| `native_binary_branching` | Exact binary min/max `-17`/`17`, actual complete reliability probe pairs, manual choices and the ordinary-node plus probe-attempt accounting identity; no LP calls. | +| `native_complete_start` | Exactly feasible but poor original starts omit their live indicator gate; native min/max must accept them, derive the gate and improve to independently enumerated objectives `-4`/`7`, with exact completed bounds. | +| `lp_observations` | Analytic continuous min/max LPs reach objectives `15`/`19`; original row duals `2`/`3`, reduced costs `(0,1)`/`(-1,0)`, finite-side slacks, basis availability and independent KKT checks must agree. The exported owning basis is submitted to a second solve, which must retain the independently checked optimum. | + +Native selections are exact manifest entries passed through the existing prefix selector. The runner requires exactly one output line containing that full name and one positive test marker. Empty output, multiple matches, duplicated cases or a negative marker cannot pass. Native iterations and threads are fixed at one and the seed is `1701`. + +HiGHS solves use one thread, seed `1701`, zero requested MIP gap, a shared remaining deadline within each case, and the original-model validator. The native integer bridge uses its required deterministic seed `0`, exact integer checking, and explicit native selection or automatic global-model dispatch; its reported guarantee is `exact`. The session and diagnostics cases report `HiGHS` and `numerical`. Native bridge provenance comes from its solve results: plain native cases use `Gecode native`, and the explicit hybrid uses `Gecode native + checked LP` with both versions. The frontier and reliability cases report `Gecode native frontier`. Pools retain HiGHS numerical provenance. The quadratic case uses its required seed `0`, reports `HiGHS QP` and retains a numerical guarantee. + +Assertions are not used for the panel's correctness checks, so release builds still execute every check. The runner independently checks the expected status, objective array, finite timing values, positive check count, correct backend identity, version and guarantee. Native Exact objectives require exact equality with the independent integer oracle. Other optimization results are numerical, tolerance-qualified checks. Neither route emits proof certificates. + +The precision fixture intentionally uses witness validation and file round trips, rather than demanding that the numerical backend solve an ill-scaled model. Its coefficients `100000000000000.125` and `100000000000000.25` must remain distinct. Broader numerical robustness remains part of the full conformance and stress suites. + +## Time bound, cleanup and evidence + +The outer monotonic clock begins at runner entry and covers argument processing, source and binary hashing, child startup, all cases, checking, cleanup and report writing. A default 0.75-second reserve is removed from the work budget. Each subprocess additionally has a four-second wall limit, reduced to the remaining outer work budget; `--budget-seconds` may reduce the outer limit but cannot exceed 28 seconds. `--case-seconds` may adjust the per-case limit within the outer limit. Required cases remaining at exhaustion are explicitly recorded as `not_run` and the run fails. + +A watchdog enforces the outer deadline even during a blocked child or report write. Its last-resort exit code is `124`; that failure can leave no complete JSON report. Ordinary timeout paths kill the child's process group and reap it within the cleanup reserve. Process groups are also killed after successful parent exit so that descendants cannot linger. Output uses bounded temporary files, avoiding inherited stdout/stderr pipe hangs; more than 64 KiB on either stream fails. Any stderr is retained and fails the case. Temp directories are unique and removed after the run. + +The process-group runner currently supports **POSIX/macOS/Linux**. A Windows Job Object implementation is present for platform testing, but Windows FAST support remains **unfinished and disabled**. The main command returns `Unsupported`, records all required cases as `not_run`, and launches no benchmark binary. `WINDOWS_RUNTIME_VERIFIED` is a checked-in false constant; there is no environment or command-line bypass. This guard records missing platform evidence, not a request for permission. Deliberate session escape by a child and an unresponsive operating system are outside the containment/timing promise; this is a regression harness for trusted solver binaries. + +Reports include per-case wall time, command, return code, stdout/stderr, observed status/objectives, backend/version/guarantee, correctness and failures; SHA-256 hashes of both executables and optional shared libraries; content hashes for the optimization sources, panel, fixtures, runner, containment module, the four sparse LP/certificate headers and relevant original CP test sources; platform, Python version, seeds and threads. The report's `elapsed_seconds` is sampled immediately before report serialization; the watchdog and successful-exit deadline check also cover serialization and output. An external wall measurement is used to verify the complete command stays below 30 seconds. + +Timings collected while builds or other workloads run are correctness diagnostics only. The report defaults to `timing_comparable: false`; compare performance only in a separate uncontended run with matching compiler/configuration, hardware, dependencies and artifacts. This small panel provides a fast failure signal, not reliable aggregate solver speed rankings. + +## Harness tests + +```sh +python3 -m unittest experiments/optimize/test_fast_regression.py experiments/optimize/test_process_containment.py -v +``` + +The runner tests cover absent/multiple native matches, wrong optimization statuses/objectives, incorrect native/backend guarantee attribution, missing checks, NaN/infinity, malformed JSON, stderr, nonzero exits, missing executables, excessive output, per-process and whole-run deadlines, descendant cleanup, explicit incomplete-case reporting, and preservation of an existing report. Run the numerical panel for correctness separately from the uncontended whole-command wall measurement. + +## Pending Windows containment and verification gates + +`process_containment.py` uses `ctypes.WinDLL` with explicit argument and result types. Windows `DWORD`/`BOOL` stay 32 bits, while handles, `SIZE_T` and attribute identifiers follow pointer width. Tests check structure sizes and offsets against the Windows SDK declarations for `STARTUPINFOEXW`, process information and Job Object accounting/limits. Windows x86 and x64 CI runs are required; passing layout mocks on macOS does not verify the calling convention or runtime behavior. [Microsoft STARTUPINFOEXW](https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexw), [extended job limits](https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_extended_limit_information), [Windows SDK attribute definitions](https://github.com/microsoft/win32metadata/blob/main/generation/WinSDK/RecompiledIdlHeaders/um/WinBase.h). + +Before launch, the runner publishes the process owner to its existing outer watchdog. It creates an unnamed, non-inheritable job with `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE`; neither breakaway flag is enabled. `PROC_THREAD_ATTRIBUTE_JOB_LIST` assigns the child to that job during `CreateProcessW`, and `CREATE_SUSPENDED` prevents execution until a successful membership check and `ResumeThread` returning exactly one. Creation-time assignment avoids the orphaned suspended-process interval in a create-then-assign sequence. Failure to install the attribute or verify membership aborts launch; there is no uncontained fallback. This requires Windows 10 / Server 2016 or newer. [Microsoft process attributes](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute), [CreateProcessW](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw), [ResumeThread](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-resumethread). + +Only separately duplicated stdin, stdout and stderr handles appear in `PROC_THREAD_ATTRIBUTE_HANDLE_LIST`. Caller-owned handles retain their inheritance flags; the job, process and thread handles are never inherited. Attribute buffers and their referenced handle arrays live through process creation and attribute-list deletion. The executable and working directory must be fully qualified paths, and the command line uses CRT argument quoting with the documented UTF-16 size limit. [Microsoft process attributes](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute), [DuplicateHandle](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-duplicatehandle), [CreateProcessW](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw). + +Cleanup terminates the entire job even after a successful root exit, waits for the root within the existing reserve, and checks `ActiveProcesses` until descendants exit or that reserve expires. Every owned handle is closed, with the job closed last as an additional termination path. Termination, query, wait and close failures fail the case. An unsuccessfully closed job stays attached to the watchdog, and another case cannot start. The watchdog terminates the job and exits without waiting; process exit closes the final owner handle. The same outer 28-second clock, output checks and report rules apply to the implementation under test. [Microsoft job accounting](https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information), [TerminateJobObject](https://learn.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-terminatejobobject), [Job Objects](https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects). + +Job containment covers ordinary `CreateProcess` descendants, including nested jobs. It is not a security sandbox: for example, Microsoft documents that processes launched through WMI `Win32_Process.Create` are outside this inheritance. Restricted containing jobs may reject creation; that remains an explicit failure. No PowerShell or `taskkill` cleanup fallback is used. [Microsoft Job Objects](https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects). + +The new `.github/workflows/fast-windows-containment.yml` workflow exercises Python x64 and x86 on Windows Server 2022. Its mandatory real-API command is: + +```text +python experiments/optimize/test_process_containment.py --require-windows -v +python experiments/optimize/test_fast_regression.py -v +``` + +The first command rejects non-Windows hosts, missing real fixtures, or any skipped test. Required runtime evidence includes suspended launch and membership, Unicode/quoted arguments, stdout/stderr and exit codes, termination after root success, nested jobs, denied breakaway, stdio-only inheritance, post-creation verification/resume failures, abrupt owner exit, and watchdog termination. Runner tests additionally exercise deadline, flood, missing-binary and fail-closed command behavior. Mock tests inject failures at job creation/configuration, each stdio duplicate, attribute setup, process creation, membership, resume, termination, wait, exit-code retrieval, accounting query and handle close; they verify kill/close attempts and bounded waits. + +**Evidence at implementation time:** local macOS protocol, POSIX process-group and Windows API-mock tests pass. Windows runtime tests are unavailable locally and are explicitly skipped. The workflow is configured but has not been executed here. Windows FAST completion requires recorded successful runs of both architectures, review of that evidence, and a separate change enabling the main command. It then still requires the full required native/numerical panel on Windows with prebuilt matching binaries and an independently measured whole-command wall time below 30 seconds. Containment-only CI cannot satisfy that solver/timing gate. diff --git a/docs/solver-parity/FINAL-BENCHMARK.md b/docs/solver-parity/FINAL-BENCHMARK.md new file mode 100644 index 0000000000..ba0ef9df5a --- /dev/null +++ b/docs/solver-parity/FINAL-BENCHMARK.md @@ -0,0 +1,55 @@ +# Final native algorithm comparison + +All three cohorts use the same deterministic original models, one thread, and ten seconds per owning solve. The automatic clock includes every sequential racing probe and selected restart. Measured processes ran serially. + +Original Gecode is the preserved optimization-facade baseline before the algorithm changes, not a pristine upstream release. Auto + race combines exact structural preprocessing, compact DP, checked LP/branching selection, and opt-in sequential exploration. Configured uses the frozen family presets; no strategy was changed in response to this final study. + +| Problem | Original solved / failed upper | Auto + race solved / failed upper | Configured solved / failed upper | +|---|---:|---:|---:| +| Knapsack | 33 items / 34 | 2304 items / 2336 | 2304 items / 2336 | +| Assignment | 17 tasks / 18 | 64 tasks / 66 | 31 tasks / 32 | +| Facility location | 8 sites / 9 | 44 sites / 45 | 54 sites / 56 | +| Bin packing | 17 items / 18 | 47 items / 48 | 30 items / 31 | +| Production planning | 11 periods / 12 | 27 periods / 29 | 28 periods / 29 | +| Routing | 21 cities / 22 | 21 cities / 22 | 21 cities / 22 | +| Weighted queens | 23 queens / 24 | 23 queens / 24 | 23 queens / 24 | + +356 measured attempts plus three runtime-loader probes; cumulative active study wall time 2044.41 seconds (preparation between phases excluded). + +The user removed the initial study ceilings after discovery had started. The original phase is preserved by hash, and every prior observation was retained. Each cohort was extended until a failed upper input was observed in both repetitions. Bisection narrows large brackets to approximately 2% of the solved lower size (one-unit brackets for small sizes). Any unresolved wider bracket caused by mixed confirmations is explicitly flagged in the export. No harness cap is reported as solver failure. + +Bars show the largest sampled size passing both repetitions and every variant. The table also reports the observed failed upper. Seeded-instance difficulty need not be monotonic: reversals and mixed confirmations remain in the raw report, so these are sampled brackets, not mathematical maximum-size guarantees. + +Every returned original witness was independently checked. Exact optimal status is backend-reported; no independent optimum oracle is claimed. The same seeded families informed the earlier frozen configured policy, so this is not a holdout study. + +Automatic diagnostics across measured attempts: 18 races skipped for direct-path compatibility; 66 one-probe results; 68 two-probe results; 114 selected automatic; 20 selected ordinary. Counts are parsed from the saved solver diagnostics, and runtime probes are excluded. + +This comparison measures combined policies, not an ablation. A first automatic probe that proves optimality does not establish a benefit from racing; the gains may come from DP, preprocessing, LP bounds or branching. A separate ablation would be required to isolate individual contributions. + +Racing may increase total CPU burden or solve time because exploration and restarting repeat work. Several seconds or longer can still be worthwhile when exploration identifies a much more effective strategy for the remaining solve. Early progress is a heuristic, not a promise of future speedup. + +The public JSON retains every initial and extension probe/attempt, wall time, objective, bound, original witness, frozen model hash, policy, source hash, phase amendment, and verified loader identity. + +Original source: 530a3b7837205d8255c6640425018831d3f8ee0e +Current source / extension runner: 95b54f2f5553fb078502bff483fb9067c4b37887 +Report SHA256: f0635189a62c78e69d36f11d562751153924ee8afec22d0dc530b8d9da25bb9b + +The interrupted automatic result at 4096 knapsack items omitted its optional backend-version string. The raw packet was preserved and revalidated with all original model, witness, bound, gap and clock checks; driver and loaded-library hashes establish runtime identity. No solve was repeated for this metadata correction. + +Assignment at 128 tasks initially exceeded the driver's 10,000-variable TXT transport guard before entering solve. That rejected invocation is archived separately under `harness-attempts` and in the report protocol, and is not a solver failure. A driver rebuild changed parser guards only; all solver library hashes stayed identical. Earlier timings remain comparable because their clocks surround the owning solve call and exclude parsing/model construction. The larger driver then performed the actual solve at 128. + +The configured knapsack preset remains compact native DP with ordinary BAB fallback after DP admission or its local time cap fails. It was not changed to LP based on extension results. Production auto has a 27/29 observed bracket: size 28 had mixed confirmations, so its two-unit interval remains explicitly unresolved against the one-unit target. + +Reproduction (from the solver checkout; the preserved original runtime and build manifests are required): + +```sh +python3 experiments/optimize/build_final_benchmark.py +python3 experiments/optimize/benchmark_final.py --output-dir build/final-benchmark/results --binary build/final-benchmark/optimize-final-benchmark --runtime-build build/native-structure/native-build +python3 experiments/optimize/continue_final_benchmark.py --report build/final-benchmark/results/report.json --output-dir build/final-benchmark/extended-results --binary build/final-benchmark/optimize-final-benchmark --runtime-build build/native-structure/native-build +python3 experiments/optimize/resume_final_benchmark.py --report build/final-benchmark/extended-results/report.json --output-dir build/final-benchmark/resumed-results --binary build/final-benchmark/optimize-final-benchmark --runtime-build build/native-structure/native-build +python3 experiments/optimize/build_large_final_benchmark.py +python3 experiments/optimize/resume_large_final_benchmark.py --report build/final-benchmark/resumed-results/report.json --output-dir build/final-benchmark/final-results --binary build/final-benchmark/large-driver/optimize-final-benchmark --runtime-build build/native-structure/native-build +python3 experiments/optimize/resume_large_final_benchmark.py --report build/final-benchmark/final-results/report.json --export-only +``` + +These phase commands record the actual amended study and guarded resumptions; their preconditions deliberately reject unexpected failures. Exporting the saved final report invokes no solver. Output directories must be new for a fresh measurement. diff --git a/docs/solver-parity/FLATZINC-CAPTURE.md b/docs/solver-parity/FLATZINC-CAPTURE.md new file mode 100644 index 0000000000..59c70821f5 --- /dev/null +++ b/docs/solver-parity/FLATZINC-CAPTURE.md @@ -0,0 +1,46 @@ +# FlatZinc capture (slice A) + +`Gecode::FlatZinc::Capture::parse` and `parse_string` capture owning model records without constructing a `FlatZincSpace`, posting a registry constraint, applying restart state, creating search, or solving. This is the parser boundary for the separate compiler/checker described in [FLATZINC-DESIGN.md](FLATZINC-DESIGN.md). A `Complete` capture does **not** certify that an optimization backend supports the model. + +## Public boundary and semantics + +Include `gecode/flatzinc/capture.hh` when linking the native FlatZinc parser library. Include `capture-records.hh` for the configuration-independent types used by a standalone compiler or checker. The latter requires only the C++ standard library. Public record types and namespaces are identical through both headers. Parser entry points have the native FlatZinc shared-library export policy. + +The result owns a `shared_ptr`. Expressions, variable specifications, domains, annotations, source names and output entries contain no AST, stream, parser, registry or `Space` pointers. They survive input/parser destruction. Separate capture calls have independent state. Failed calls publish diagnostics and no partial records. Locations report the parser's reduction/end line, not an exact source start span; generated declaration-domain rows are located at the completed declaration boundary. + +`raw_variables` and `raw_domains` are copied at the end of the declaration list, before processing any explicit constraint. Their reference keys are `(Type, index)`, with separate integer, Boolean, float and set namespaces. The combined vector position is not an entity key. A declaration alias refers to an earlier slot in its own namespace. Its extra declared restrictions remain explicit domain predicates; assigned literals remain literals. Arrays reuse variable slots for aliases and introduce fixed slots for literal elements. Parameters are expanded into their typed values, including named parameters in variable-array initializers. + +`raw_constraints` retains every explicit predicate's identifier, ordered typed arguments and annotations. Unknown ordinary predicates are retained; the compiler must reject predicates outside its semantic whitelist. A predicate declaration supplies no executable definition and does not confer support on a registry plugin. Native restart-state predicates beginning `gecode_on_restart_` return `Unsupported` because their stateful meaning is outside this capture contract. + +`variables`, `domains`, `constraints` and `coverage` are derived audit records. Integer and Boolean reference equalities are normalized into aliases; restrictions on the merged slot become synthesized domains. Each explicit raw predicate has exactly one coverage entry, either retained or an alias equality. Alias resolution uses path compression and final canonical targets, preventing repeated old references from repeatedly walking a descending equality chain. Float/set equalities remain explicit. The authoritative compiler input is the **raw** set of variables, declaration domains and predicates; consumers need not trust or reproduce the normalization. + +`SolveGoal` preserves satisfaction, minimization or maximization and the original typed variable/literal objective. Constant and parameter objectives never become the legacy zero-valued dummy objective. Output uses original source-slot references, before printer shrinking. Scalar output is a typed reference. Array output keeps the legacy `arrayNd` text fragments and the positional array of references; typed `output_array` dimension sets remain in declaration annotations. Output dimensions are checked against array length, including empty arrays, with checked products. Calls preserve positional argument structure: `f([a,b])` is distinct from `f(a,b)`. + +## Dialect and limits + +The implementation accepts the existing textual grammar with capture-specific guards. It is not a new general MiniZinc or FlatZinc-JSON parser. Parameter declaration annotations are explicitly rejected; the upstream grammar forbids them, so they cannot be silently omitted from the capture. Native integer limits still bound integer literals and storage indices; decimal, hexadecimal and explicit octal tokens are consumed completely. Decimal `010` means ten and `0o10` means eight. Floats are parsed using the classic locale; nonfinite values and nonzero literals that underflow to zero fail. Finite binary64 rounding remains the float record representation. Explicit integer sets are sorted and deduplicated without changing their membership semantics. + +Input must be valid UTF-8 and contain no embedded NUL. Annotation strings decode named C escapes, including newline, tab, backslash and escaped quotes; numeric and unknown escapes explicitly return `Unsupported`. Strings are retained as values, not executed. The source preflight counts bracket/parenthesis nesting while respecting comments and escaped strings. + +Defaults cap input at 16 MiB, variables at one million, each declared/captured array at one million elements, raw predicates plus declaration-domain predicates at one million, and nesting at 64. Input size/nesting are checked before invoking the C parser. Declared bulk dimensions and internal integer index limits are checked before corresponding bulk storage. Explicit initializer lists are bounded by input size while parsing, then their exact variable/record counts are checked; these are not a byte-exact allocator quota or a parsing wall-clock deadline. Declaration-domain limits also apply during generation. Nonpositive or out-of-range array references, invalid alias namespaces, selected unsafe built-in signatures, incorrect initializer types/counts and malformed output annotations fail before publication. Arbitrary predicate type checking belongs to the independent compiler. + +Normal syntax, semantic and explicit-resource failures clean parser-owned variable specifications, constraints, output ASTs and scanner state. The generated parser has capture-only semantic destructors for discarded grammar values and capture actions release temporary initializers after ownership transfer. Allocation failure may propagate `std::bad_alloc`; deterministic allocator-failure injection and a strong cleanup guarantee for exceptions interrupting arbitrary C-parser reductions are not implemented. + +The existing `FlatZinc::parse` entry points have a null capture bridge. Their native posting, equality normalization, objective convention, scanner behavior and printer ownership path are retained. Capture does not intercept posted actors or require a `FlatZincSpace` layout change. + +## Verification and regeneration + +`test/flatzinc-capture/capture.cpp` is a standalone assertion-based test outside the legacy `test/flatzinc/` registration glob. It checks all four variable namespaces; literal/alias/domain preservation; holey/empty domains and arrays; min/max literal and variable goals; output ordering and alias positions; annotation call/string structure; reification retention; unknown predicates; registry noninvocation; arity/type/reference/UTF-8/limit failures; exception-enabled streams; every truncated prefix of a complete model; repeated failed captures; and concurrent captures. A separate case exercises the unchanged native parser and confirms actual integer propagation. Passing these tests establishes parser-record correctness, not backend parity or solve performance. + +Local validation on macOS arm64 / AppleClang 17 passed **236 capture checks**, 32 captures across four concurrent threads, and the native-parser compatibility assertion. The normal executable used C++17, `-O1 -g -Wall -Wextra -pedantic`. A separate Debug static build compiled every linked Gecode source (support, kernel, search, integer, set, float, minimodel, driver, FlatZinc/parser/scanner) with `-fsanitize=address,undefined -fno-omit-frame-pointer`; the capture/test sources used the same instrumentation and the complete panel passed with sanitizer errors fatal. Build and test artifacts are local to `build/flatzinc-capture*`. LeakSanitizer was disabled on this platform; the macOS `leaks` utility could not obtain the child task port, so no leak-detector pass is claimed. Linux leak detection and allocator fault injection remain additional verification gates. These runs made no timing or throughput claim. + +The checked-in parser is generated with **GNU Bison 3.8.2**. The scanner uses **Flex 2.6.4 (Apple flex-35)**. Regenerate from the repository root: + +```sh +bison -t -o gecode/flatzinc/parser.tab.cpp -d gecode/flatzinc/parser.yxx +flex -o gecode/flatzinc/lexer.yy.cpp gecode/flatzinc/lexer.lxx +``` + +Only trailing whitespace and extra terminal blank lines are normalized after generation; no generated parser/scanner logic is edited. The local Bison bootstrap used the official `bison-3.8.2.tar.gz` archive with SHA-256 `06c9e13bdf7eb24d4ceb6b59205a4f67c2c7e7213119644430fe82fbd14a0abb`, verified against the [GNU release announcement](https://lists.gnu.org/archive/html/bug-bison/2021-09/msg00056.html). No system toolchain was replaced. + +The [upstream FlatZinc specification](https://docs.minizinc.dev/en/stable/fzn-spec.html) defines parameter substitution, declaration aliases, predicate calls, literal objectives, annotations and output conventions. This implementation's unsupported syntax and resource limits above are additional explicit restrictions. Compiler support and end-to-end solve checks are separate gates. diff --git a/docs/solver-parity/FLATZINC-COMPILER.md b/docs/solver-parity/FLATZINC-COMPILER.md new file mode 100644 index 0000000000..7bb6713ea6 --- /dev/null +++ b/docs/solver-parity/FLATZINC-COMPILER.md @@ -0,0 +1,324 @@ +# Explicit FlatZinc source-record compiler + +The first C++ compiler slice admits finite integer/Boolean declaration domains, +declaration aliases, interval and finite-set membership (including holes), signed integer +comparisons, integer plus/minus, sparse linear equalities/inequalities, Boolean +linear equality with variable integer RHS, bool2int, Boolean equality/order/not, +AND/OR (including arrays), and clauses. It also admits integer `<=` reification, +integer `<=`/equality implication, AllDifferent, 1-based integer Element and +positive-arity `gecode_table_int`, explicit-offset `gecode_circuit`, and the +four-argument fixed-data `gecode_cumulatives`/`cumulatives` interface, and +six-argument deterministic `gecode_regular`. +It retains satisfaction versus min/max +and the actual integer variable or literal objective. The separate opt-in `fzn-gecode-optimize` driver uses this compiler; the existing +`fzn-gecode` path is unchanged. + +```cpp +#include + +// records is a complete FlatZinc::Capture::Records from the opt-in parser. +auto compiled = Gecode::Optimize::compile_flatzinc(records); +if (compiled.compiled) { + Gecode::Optimize::SolveOptions options; + options.backend = Gecode::Optimize::Backend::Native; + options.guarantee = Gecode::Optimize::Guarantee::Exact; + auto result = Gecode::Optimize::solve(compiled.compiled->model(), options); + auto checked = Gecode::Optimize::validate_flatzinc(*compiled.compiled, result); +} +``` + +Compilation uses the complete **raw** declaration/domain/predicate records. +The parser's normalized alias state and coverage entries are retained for audit +but never replace a source predicate. A removed equality therefore cannot be +lost through an incomplete registry observer. Each source namespace/index maps +to a stable model variable; repeated declaration aliases retain separate source +mapping entries and output positions. Bool and int slot zero are different. + +An immutable owning artifact is published only after every source predicate, +objective, control annotation and output entry is admitted. Unknown predicates, +equality reification, other globals, float/set variables and unhandled +search controls are explicitly Unsupported in this first slice. These limits +apply even when a construct appears redundant or an ordinary native poster +supports it. No solver is called during compilation, and no partial model is +returned on rejection. + +The additional predicate names are `int_le_reif`, `int_lin_le_reif`, +`int_le_imp`, `int_lin_le_imp`, `int_eq_imp`, `all_different_int`, +`array_int_element`, `array_var_int_element`, `gecode_table_int` and +`gecode_circuit`, `gecode_cumulatives`, `cumulatives` and `gecode_regular`. Linear coefficients and RHS are +integer parameters; operands may be integer references or literals. The last +argument of a reified/implication predicate is Boolean. Full `<=` reification +posts both implications: guard true enforces `sum <= k`, guard false enforces +`sum >= k+1`. The complement and constant substitution use checked integer +arithmetic and exact model-number conversion. An `_imp` predicate imposes only +the true-guard implication. Literal or fixed guards are simplified only after +operand/type admission. Equality reification remains Unsupported. + +Guarded relations retain the existing indicator's original logical metadata; +its finite-domain M is conservatively derived, never guessed. Native solving +uses the retained original integer implication. Numerical backends use the +safe linear formulation, followed by the independent original-source check. +Private indicator gates are not source variables or output entries. + +AllDifferent preserves every occurrence, including aliases and repeated +literals; duplicates can make it infeasible. Integer Element uses precisely +the source array order and indices `1..size`; an empty array or out-of-range +index is infeasible. `array_int_element` requires a parameter integer array; +`array_var_int_element` admits integer references and literals. This follows the +[FlatZinc integer signatures](https://docs.minizinc.dev/en/latest/lib-flatzinc-int.html), +even though the existing native registry shares a permissive poster for the two +names. Boolean Element, offset/2-D Element and other global predicates remain +Unsupported. Literal global operands receive private fixed integer slots, with +equal literals sharing a slot while occurrences remain present in the global. +Empty AllDifferent is true. Globals remain typed global metadata: explicit +HiGHS solving rejects the full compiled model rather than dropping them; +Native/Auto can use the native global propagators within their supported domain. + +`gecode_table_int` takes an array of integer references/literals and a flat +parameter-integer relation in row-major order. The operand arity must be positive +and divide the cell count exactly. A positive-arity empty relation is false. +Repeated rows, repeated variables, aliases and fixed operands retain their source +meaning. Variable or Boolean relation cells are InvalidInput. A zero-arity empty +flat relation is Unsupported because flattening has lost the distinction between +zero tuples and one empty tuple; a zero-arity relation containing cells is +InvalidInput. Other names, including `table_int`, `fzn_table_int` and Boolean-table +variants, are not inferred aliases. This whitelist follows this repository's +`gecode_table_int` MiniZinc declaration and registry entry; see the pinned-source +[signature design](FLATZINC-GLOBALS-DESIGN.md). + +`gecode_circuit(offset, successors)` requires a nonnegative integer literal +offset and a nonempty array of integer references or literals. Nodes are the +source positions `offset..offset+size-1`; successors must form one cycle visiting +every node. A singleton is true exactly when its value equals the offset. A +self-loop in a larger array, a subtour or an out-of-range successor is false. +Every position remains present, including repeated handles, declaration aliases +and fixed literals; the compiler does not deduplicate nodes or infer an offset +from output-array dimensions. It posts typed `CircuitData` and retains the raw +predicate for a separate source-order cycle check. + +The index endpoint is checked before posting and must remain within the exact +model-number range. Negative offsets are Unsupported for this explicitly scoped +low-level signature; the bundled high-level MiniZinc wrapper shifts negative +index sets before emitting it. Wrong types/arity and an empty successor array +are InvalidInput. Unprefixed, double-prefixed, wrapper, reified, cost-circuit and +subcircuit names are not inferred aliases. This follows the bundled registry's +two-argument `gecode_circuit` entry; generic typed Model circuit capabilities do +not widen that FlatZinc signature. Large exact offsets can compile while Native +range preflight returns Unsupported. Explicit HiGHS rejects the retained global. + +Exactly four arguments to `gecode_cumulatives(starts, durations, heights, capacity)` +or the legacy spelling `cumulatives` denote one resource with fixed task data. +The three integer arrays must have equal lengths. Starts may be integer +references or literals. Every duration, height and capacity must be an integer +literal or have a nonempty singleton domain established by original declarations, +assigned values and raw domain intersections on its alias representative. The +compiler does not propagate ordinary equality rows, fix an unfixed parameter to +its lower bound, or infer a parameter from an empty domain's dummy model slot. +Referenced fixed parameters keep their source mappings and original checks; +only literal starts may create private fixed slots. + +Durations and heights must be nonnegative (negative values are InvalidInput). +Negative capacity and nonfixed parameters are Unsupported in this slice. Task +usage is `start <= time < start+duration`, so zero duration or zero height uses no +capacity and equal end/start times do not overlap. Repeated/aliased starts still +describe separate tasks whose demands add. An empty schedule with nonnegative +capacity is true; a positive-duration task above capacity is infeasible. +The original checker reads parameter values from the raw source, builds checked +integer endpoints and processes ending demands before starting demands at each +time. It does not reuse the embedded `CumulativeData` constants as source proof. + +The bundled legacy four-argument poster has a known singleton shortcut imposing +`height <= capacity` even at zero duration. Thus `durations=[0], heights=[2], +capacity=1` is feasible under the implemented half-open semantics but rejected by +that old shortcut. This specific disagreement is tested and is not treated as a +reason to weaken the independent source oracle. See the scheduling evidence in +[FLATZINC-GLOBALS-DESIGN.md](FLATZINC-GLOBALS-DESIGN.md). + +Six- and seven-argument calls remain explicitly Unsupported: their machine arrays, +per-machine bounds and upper/lower resource rules are distinct semantics. Other +arities of the two selected names are InvalidInput. `fzn_cumulative`, +`fzn_cumulatives`, optional scheduling and guessed prefix aliases remain +Unsupported. Actual native solving retains its additional endpoint, energy and +propagation arithmetic guards; exact source representability does not imply +native support. No scheduling constraint is silently dropped for HiGHS. + +Exactly six arguments to `gecode_regular(word, Q, S, d, q0, F)` describe a +deterministic finite automaton. This explicit compiler requires positive `Q` +and `S`, an integer-literal initial state in `1..Q`, exactly `Q*S` literal +integer transition cells in row-major order, and a literal integer final-state +set contained in `1..Q`. Every target must be in `0..Q`; target zero means +failure. Word operands are integer references or literals and must take values +in `1..S` to be accepted. The signature and ordering follow this repository's +[`fzn_regular.mzn`](../../gecode/flatzinc/mznlib/fzn_regular.mzn) and registry; +the state/symbol convention follows the official +[MiniZinc regular documentation](https://docs.minizinc.dev/en/stable/lib-globals-extensional.html#regular). + +The compiler subtracts one from positive state IDs while retaining symbol +labels, and omits zero-target edges. This produces the typed sparse +`RegularData`; state zero in that typed API is an ordinary state, so the source +failure state must never be copied as a usable transition. The separate +original-source checker walks the retained raw row-major table with checked +index arithmetic, rejects input symbols outside `1..S`, and treats a zero +target as rejection. It does not use the compiled sparse transition record as +evidence. Empty words are accepted exactly when `q0` belongs to `F`, including +when every table cell is zero; an empty final set rejects every word. Duplicate +finals are harmless. Repeated operands, declaration aliases and private literal +slots retain every source position. + +All automaton parameters must be primitive captured literals/set data. A +reference with a singleton original domain is still InvalidInput in these +parameter positions; ordinary propagation and alias domains never infer a DFA. +Wrong arity/type, nonpositive counts, out-of-range states/targets and incorrect +matrix cell counts are InvalidInput. Integer/product representability failure +is Unsupported. `regular`, `fzn_regular`, `gecode_regular_set`, regex/NFA, +reified and guessed prefix variants remain Unsupported. These admission checks +also apply to an empty word and after an earlier contradiction. + +Checked work/storage admission precedes sparse-payload allocation and expansion +of interval final sets. Payload accounting charges three scalar parameters, +word positions, original table cells, three cells per retained nonzero edge, +and every expanded final-state entry. Private fixed word variables use the +existing variable limit. Time/cancellation and work exhaustion publish no +partial artifact. The native bridge's additional alphabet/count/layer safety +limits remain separate from exact source representability. Explicit HiGHS +rejects the resulting global; Native and Auto retain whole-model checking. +See [REGULAR.md](REGULAR.md) for typed ownership, backend limits and tests. + +Finite domain lists are normalized privately, preserving the raw lists for +checking and history. Declaration domains and every raw `int_in` restriction are +intersected on the declaration-alias representative. Intervals stay symbolic: a +sparse set spanning ±2^53 does not trigger interval enumeration. Lists are sorted +and deduplicated with metered work, intersected exactly, then filtered by interval +bounds. A contiguous result becomes bounds alone; a remaining holey result gets +its exact hull plus one unary typed table. An empty result produces an explicit +contradictory row. Raw literal `int_in` remains a checked constant predicate. +This also admits finite-set restrictions that supply bounds for otherwise +unbounded declarations. Boolean intrinsic bounds remain `0..1`. Output-array +index sets retain their separate contiguous-index requirement. + +A retained unary domain table has the same backend boundary as other globals: +explicit HiGHS returns Unsupported. If intersection removes every hole, the +ordinary linear model can still use HiGHS. Native domain/activity limits apply +independently of frontend representability; compilation alone does not promise +that every admitted model can be solved by every backend. + +Integer arithmetic uses checked int64 operations and exact conversion to model +doubles (integers within ±2^53). Declared aliases use cycle checking and path +compression. Signed constants and duplicated variable coefficients are combined +before posting. Domain contradictions become explicit contradictory rows rather +than invalid bound pairs. Integer variables must have finite explicit bounds +after declaration aliases and membership restrictions; no artificial large bounds +are supplied. Backend-specific activity limits may still reject a compiled model. +Arithmetic that cannot be checked safely is Unsupported, or a failed source +witness check if encountered during checking. + +`FlatZincCompileOptions` bounds source and generated variables/rows, generated +nonzeros, value depth and structural work. It supports a monotonic deadline and +cancellation token. Work counts visited records, operands, copied data and alias +traversals; it is not a CPU-cycle bound. Parsing is a separate operation with its +own input limits. Allocation, standard-container operations and source copying +are cooperative; compilation checks the deadline again before publication. +Invalid input, Unsupported, resource exhaustion, cancellation and deadline have +distinct frontend outcomes. None is an infeasibility proof. +Generated-variable limits include private gates/fixed literal slots. Global +operand occurrences count against the nonzero/work budget, and each global counts +as a generated constraint. Table operands plus every relation cell, including +duplicate rows, count as nonzeros; a unary domain table counts its operand and +remaining members. Each input domain list is also capped by `max_nonzeros` before +normalization/copying, so even a large duplicate-only list can be rejected. +Circuit successor occurrences count as nonzeros, including repeats; one circuit +counts as a generated constraint and fixed literals count as private variables. +Cumulative counts all three arrays plus its scalar (`3*task_count+1`) as payload +cells, one generated constraint, and any private literal start slots. Count and +work admission precede payload allocation; the original checker reserves at most +two events per task. Its public interface has no cancellation/deadline argument, +so callers can checkpoint around validation but not interrupt the event sweep. +Sorting comparisons, intersection scans and table rows/cells consume `max_work`; +limits are reserved before the corresponding private payload allocation. No +interval width is charged or enumerated. These are structural limits, not byte +or elapsed-time guarantees. Indicator posting reserves a conservative maximum +footprint before the transactional helper allocates, then charges the actual +generated rows/gates; a tight cap can reject an operation whose eventual simplified +form would be smaller. No partial artifact is published. + +`validate_flatzinc` checks result identity/revision, the complete active mask, +every compiled model slot, and tolerance-qualified integer rounding. It then +checks every original declared domain/alias/fixed value and every raw predicate +with independent integer operations, and recomputes the original objective. +Reification/implication is evaluated directly as source Boolean logic; +AllDifferent compares source values, Element indexes the source array, Table +compares directly with original flat rows, Circuit walks raw source successors +from source node zero through every node, and domain membership reads the raw +interval/list. The evaluator does not read a generated global to establish source +truth. +These checks never infer source truth from generated rows or helper values. +This exact check of a rounded point does not upgrade a numerical solver bound or +its overall guarantee. Results remain usable after parser/input destruction or +later changes to the caller's source records. + +`format_flatzinc_solution` buffers output only after that full witness check. +Integer/Boolean scalars, repeated array values, and checked arrayNd dimensions +are reconstructed from typed records; arbitrary legacy string fragments are not +executed or copied as formatting instructions. The result contains assignments +and `----------`, never an optimality/enumeration marker. The separate driver must +apply the distinct satisfaction/optimization/interruption status contract. +Requested output annotations must have a corresponding captured output entry. + +The compiler has no FlatZinc parser, Space, registry or HiGHS linkage dependency. +It builds in the backend-free optimization component. The installed `capture-records.hh` uses only standard C++ types. The separate +`capture.hh` parser API requires the native FlatZinc component and its matching +configuration headers; the standalone optimization library does not provide it. Parser capture and the opt-in file driver are separate integration components. + +The backend-free suite covers 3,308 source configurations and 248,201 independent +assignments; the Native/HiGHS build adds two native-only configurations. It +compares original-source and generated-model feasible sets, both senses and +constant objectives, aliases/conflicting domains, all admitted Boolean forms, +malformed/unknown records, resource/time/cancellation limits, identity/masks, +owned history and complete output. Actual Native and HiGHS solves are checked +against tiny independently known optima. Normal backend-free, Native/HiGHS and +fully instrumented native/HiGHS ASan+UBSan runs pass (LeakSanitizer is unavailable +on this macOS configuration). See `test/optimize/flatzinc.cpp`. + +The independent oracle existentially enumerates every generated helper slot for +each original source assignment; it never assumes private gates are zero. Table +tests enumerate every relation on binary operands of arities one through three, +with perturbed tuple order and duplicates. Domain tests exhaust all 1,024 pairs +of subsets of a signed five-element universe. Additional tests cover alias chains, +assigned conflicts, empty lists/relations, literal-only tables, raw source history, +±2^53 sparse gaps, contiguity after intersection, invalid relation shapes/types, +zero-arity rejection, and exact work/cell/variable/constraint caps without partial +artifacts. Min/max native solves combine tables, holes, reification, AllDifferent +and Element; explicit HiGHS rejection and missing-backend contracts are checked. +The older reification/global regressions retain their negative coefficients, +strict complements, empty/repeated/aliased operands, out-of-range Element indices, +and corrupted-helper checks. Source mapping/output contains only original +variables. Pre-cancel and zero-deadline cases test interruption admission; there is +no timing-sensitive mid-normalization cancellation test. + +Circuit tests independently generate Hamiltonian cycles from permutations and +compare them against every successor assignment for sizes 1–5 and offsets 0, 1 +and 3, including values just outside the legal range. They cover singleton +cycles, subtours/self-loops, aliases, repeated operands, literal-only circuits, +wrong signatures/namespaces, endpoint overflow, exact-range compilation versus +Native range rejection, and precise work/cell/variable/constraint caps. Min/max +fixtures combine Circuit with Table, holey domains, reification, AllDifferent and +Element, preserving shifted original objectives. Normal backend-free and +Native/HiGHS checks pass, as does the complete Native/HiGHS source sanitizer +configuration. These are correctness gates; no performance gain is claimed. + +Cumulative tests enumerate bounded starts for sizes 0–4 against a direct +integer-time usage oracle, exhaust all duration/height combinations in `{0,1,2}` +through two tasks, and cover both selected spellings. They include touching +endpoints, negative/coincident/aliased starts, zero duration/demand/capacity, +original singleton parameter aliases and assigned values, exact set intersections, +empty-domain and ordinary-equality non-inference, and preserved source outputs. +Separate min/max cases combine scheduling with Table, holes, reification, +AllDifferent and Element. Arithmetic fixtures distinguish source admission from +the existing Native endpoint/energy envelope. Resource boundaries reserve exactly +`3*n+1` cells; wrong 4/6/7 signatures retain distinct outcomes. + +The actual bundled `fzn-gecode` executable reported `UNSATISFIABLE` on the +zero-duration singleton fixture described above. The new compiler's native path +accepts it, and the independent half-open oracle verifies its feasibility. +Normal backend-free/Native+HiGHS and full-source ASan+UBSan checks cover these +extensions; parser/CLI registration and integration fixtures are separate gates. diff --git a/docs/solver-parity/FLATZINC-DESIGN.md b/docs/solver-parity/FLATZINC-DESIGN.md new file mode 100644 index 0000000000..4c78c14df9 --- /dev/null +++ b/docs/solver-parity/FLATZINC-DESIGN.md @@ -0,0 +1,404 @@ +# W4 FlatZinc capture: first implementation design + +Status: design and source audit only, 2026-09-05. No parser changes, builds, +solver executions or performance measurements were made for this audit. +The audited sources are the branch at `23aaa32ac`; the parent integration has +additional Optimize features but the Model record layouts used here agree. +Source references below give repository paths and line numbers at that revision. + +Implement a separate, opt-in **parser capture path**, followed by a compiler from +owned semantic records to `Optimize::Model`. Keep `fzn-gecode`, its configuration, +existing `parse` overloads, registry dispatch, search and native output unchanged. +The first vertical slice should cover bounded integer/Boolean linear models, +selected reified comparisons, AllDifferent and Element, and complete objective +and output reconstruction. An unsupported predicate must prevent publication or +solving of the captured model. Reading back posted Gecode actors cannot establish +that the full FlatZinc model was retained. + +The original W4 planning criteria were to preserve aliases, reification and +globals, keep old examples passing, and check MiniZinc cases. The common model +must be usable from normal frontends without losing native semantics. This +design covers the initial capture boundary, not the full global registry or +MiniZinc packaging; see [the implemented compiler](FLATZINC-COMPILER.md) and +[current MiniZinc registration](MINIZINC.md) for the delivered scope. + +## Why the capture boundary belongs in the parser + +| Source hook | Observed behavior | Required design consequence | +|---|---|---| +| `gecode/flatzinc/parser.hh:184` | ParserState owns symbol/array tables, separate int/bool/set/float VarSpec vectors, domain constraints, constraints and output nodes. | Keep capture state local to one parse. No global recorder or state attached to cloned spaces. | +| `gecode/flatzinc/parser.yxx:791`, `:823`, `:967` | Declarations can create literals or aliases; array declarations reuse existing slots, create literal slots and synthesize domain constraints. | Retain the complete slot-to-variable mapping, including repeated array entries and non-output variables. Names alone are not unique identities. | +| `parser.yxx:200` and `:210` | Declaration restrictions become `int_in`, `float_le`, and related ConExpr records. | Capture both domainConstraints and constraints. Capturing only explicit constraint items loses declaration restrictions. | +| `parser.yxx:230` and `:1631` | Equality between two int variables is consumed into an alias. The discarded representative's domain becomes an `int_in` record; Boolean equality is handled similarly at `:1656`. | Capture final alias representatives and the generated domain records before disposal. A registry observer never sees these equality constraints. | +| `parser.yxx:1570` | Restart/status/last-value predicates are consumed before normal constraint dispatch. | Record every original predicate name and location before this switch, and classify every consumed item. An unsupported restart predicate cannot disappear from coverage accounting. | +| `parser.yxx:272` | `initfg` constructs native variables, then deletes VarSpecs at `:287`, `:299`, `:310`, `:322`. Later it posts restart actors and both constraint vectors at `:463`. | Freeze capture records at the entry to initfg. Capture-only mode must bypass the entire native initialization/posting block. | +| `gecode/flatzinc/flatzinc.cpp:1027` | Constraints are sorted by arity, dispatched, then deleted. | Freeze before posting; preserve original sequence/provenance separately from posting order. | +| `gecode/flatzinc/registry.cpp:60`, `:70` | Registry holds native posting callbacks, and automatically registers `gecode_` and `fzn_` aliases. Plugins can replace entries through `add`. | Use an independent, explicit capture whitelist with exact signatures. Do not infer support by stripping arbitrary prefixes or by the existence of a native poster. | +| `gecode/flatzinc.hh:591` | Initialization, variable construction, posting and solve methods are nonvirtual. | A FlatZincSpace subclass does not intercept the parser's calls. Do not add fake overriding methods or inspect actors afterward. | +| `parser.yxx:2023` | Variable objectives preserve a typed slot, but literal and parameter objectives at `:2037`, `:2058`, `:2065` become a new **zero-valued** integer variable. | Capture the actual solve expression in its grammar action before normalization. `minimize 7` must retain offset 7, even though the legacy path does not need its value to find a satisfying assignment. | +| `parser.hh:245`, `:249`; `flatzinc.cpp:3014` | Output construction sorts names and transfers AST ownership; Printer later rewrites variable indices during shrinking. | Freeze a separate typed output plan before getOutput/shrinkArrays. Never use shrunk indices to address Optimize values. | +| `tools/flatzinc/fzn-gecode.cpp:57` | Legacy execution is parse → createBranchers → shrinkArrays → run. | The opt-in driver must route before this sequence, not bolt another solver onto an already-shrunk space. | + +The current model supports owning sparse rows, five variable domains, indicators +and five typed globals, but no FlatZinc namespaces or output descriptions +(`gecode/optimize/model.hpp:100`, `:130`, `:167`). Keep frontend provenance and +output records in a companion artifact; do not overload Model variable names or +introduce AST pointers into ModelSnapshot. + +## Proposed interfaces and ownership + +Use two layers so the existing FlatZinc library does not acquire a mandatory +Optimize/HiGHS dependency: + +1. **Parser-owned records**, in new `gecode/flatzinc/capture.hh/.cpp`. Define a + noncopyable parse context and an immutable `CapturedFlatZinc` result with + typed literals/references/arrays, declarations, normalized constraints, + source coverage records, SolveGoal and OutputPlan. No Optimize types and no + live Space, VarSpec, ConExpr, AST, scanner, input stream or plugin callback + survive publication. Set/float values can be recorded for diagnostics even + when the first compiler rejects their use. +2. **Optimize bridge**, in new `gecode/optimize/flatzinc.hpp/.cpp`. Compile the + captured artifact into a private local Model plus maps. Publish it only after + all declarations, predicates, annotations, objectives and outputs have been + classified and checked. Return a typed outcome such as Complete, + Unsupported, InvalidInput or ResourceLimit, with location/reason. Unsupported + is a frontend outcome, not an infeasibility proof. A partial Model is never + returned as usable. Allocation failures remain explicit exceptions/outcomes. + +A new `parse_capture(std::istream&, CaptureOptions)` entry point invokes the +same generated parser with an explicit capture mode in ParserState. Existing +parse entry points construct a context with capture disabled. Do not change the +layout or public virtual interface of FlatZincSpace or introduce capture members +into search clones. The capture result is a historical frontend artifact, not a +mutable alias of ParserState. + +Concrete parser changes for that path: + +- Before the `constraint_item` optimization switch, classify the exact predicate + and check the argument counts/types that the switch will inspect. Preserve + source item ordinal, literal identifier, full copied typed arguments and annotations. + Ordinary constraints remain in the existing vectors; the coverage ledger + records which original equalities became aliases and which special items + would be consumed. Reject unsupported restart/blackbox/plugin semantics here, + before native callbacks or external processes could be invoked. +- At the start of initfg, freeze final VarSpecs, alias edges, both constraint + vectors and the coverage ledger. Resolve aliases with checked indices and a + cycle guard. In capture-only mode skip **all** native initialization, restart + posting and registry calls, then dispose temporary objects exactly once. + Do not create a partially initialized FlatZincSpace and use it as a result. +- Record the original objective kind/value/slot in `solve_expr` and the method + and annotations in `solve_item`. Capture mode does not call `fg->solve`, + `minimize` or `maximize`. All paths accessing `pp->fg` are in initfg and these + solve actions today; guard them explicitly, not with a null-space convention. +- Preserve `_output` as typed owned entries before getOutput transfers nodes. + At scalar/array declaration actions, retain the original domain/initializer + and annotation records before alias/domain normalization and destruction. + These support an original-source checker independent of the normalized + compiler input, as well as output dimensions and control classification. + This is additional declaration plumbing, not information recoverable from + only the final VarSpecs. After getOutput, `_output` contains old pointers; + cleanup must never treat it and the transferred tree as separate owners. +- Capture-mode cleanup must cover syntax errors, invalid aliases, rejected + predicates, exceptions, empty models and EOF after a partial declaration. + Existing ConExpr owns/deletes its args and annotations + (`gecode/flatzinc/conexpr.hh:72`). Avoid duplicate ownership when copying and + when deleting an alias's displaced domain. Alias constructors do not initialize + every non-alias VarSpec field (`varspec.hh:86`, `:108`); branch on `alias` + **before** reading assigned/domain data. Equality rewrites can also leave + `assigned=true` while replacing `i` with an alias index: the old value belongs + to the synthesized domain relation, not the alias's `i`. A generated `int_in` + may address a BoolVar; preserve its namespace rather than indexing intvars. + +Record an item ordinal and parser filename for every object. The current grammar +uses scanner line numbers for errors, rather than Bison location tracking +(`parser.yxx:67`, `:78`). Add a token-start location or `%locations` if start lines +are promised; the current scanner line at reduction is only an end/nearby line. +Do not report an invented exact source span. Synthesized constraints point back +to their declaration/equality and carry a distinct synthesized marker. + +### Lexical and input-size gate + +The current integer lexer calls `strtol(text, NULL, 0)` and checks the numeric +range (`gecode/flatzinc/lexer.lxx:60`), while accepting `0o` spellings at `:101`. +The missing end-pointer check means that accepted spelling can be partially +consumed; leading-zero decimal spellings can also be interpreted with C's radix +rules. This is source evidence, not a reproduced runtime claim in this audit. +The AST integer is already too late to recover the lexeme. + +Capture mode must either perform checked full-lexeme conversion according to the +lexer alternative before assigning the semantic value, or explicitly reject +noncanonical decimal/hex/octal spellings it cannot preserve. Prefer correct +checked conversion for all accepted alternatives and tests for `0o10`, `010`, +`08`, signed forms, boundary values and trailing junk. Keep any change in legacy +lexical behavior a separately reviewed fix; the initial capture mode can guard +its own accepted spelling. The current lexer already limits integer literals to +Gecode's native range; the first capture API must disclose that it is not an +arbitrary int64 FlatZinc reader. Float conversion uses unchecked `strtod` at +`:110`; the first compiler rejects floating data rather than accepting overflow +or quietly changing FloatVar semantics. + +Bound input bytes/counts before converting to ParserState's unsigned/int sizes +(`parser.hh:185`, `:197`) and before creating arrays. Validate objective array +indices and symbol lookup before the legacy `solve_expr` array access at +`parser.yxx:2072`; its current zero/upper-bound check is not sufficient for a +capture path accepting negative literals. Error paths must not dereference an +uninitialized SymbolEntry. A deadline/cancellation check before and after parse +is useful, but a claimed whole-command parse deadline additionally needs token +or input-loop checks; do not claim it from a solver-only timer. + +## First admitted semantic subset + +The first executable should be a distinct opt-in tool, tentatively +`fzn-gecode-optimize`, initially with explicit Native/Exact and HiGHS/Numerical +routes. The normal `fzn-gecode` remains the default. Do not publish a MiniZinc +solver configuration that advertises arbitrary FlatZinc support yet. + +| Construct | First compiler behavior | +|---|---| +| Bounded `var int`, fixed int, `var bool`, fixed bool | Create Integer/Binary variables with exact bounds. Same-type aliases reuse the representative handle; fixed aliases preserve their restrictions. Require a finite interval after declaration/alias-domain intersections for this first slice. Do not substitute Gecode's implicit Int::Limits for an unbounded mathematical declaration. | +| Integer/Boolean arrays, literal entries, repeated references | Preserve per-type source slots and array order. Literal entries become fixed hidden variables only when a global/helper requires a handle; ordinary linear literals fold into an exact checked RHS. | +| Interval `int_in` and contiguous explicit finite domains | Intersect restrictions across aliases before emitting IR. Empty restrictions become an explicit constant contradiction, with a harmless fixed placeholder for a source slot if needed; never an invalid IR bound pair. Preserve the original empty-domain record for source validation. Nonconvex domains are initially Unsupported, never replaced by their hull. | +| `int_eq`, `int_le`, `int_lt`, `int_ge`, `int_gt` | Equality/ranged rows; strict integer inequalities shift the bound by one with checked arithmetic. Constants on either side are supported. Normalized equality aliases still appear in coverage accounting. | +| `int_lin_eq`, `int_lin_le`; `bool_lin_eq`, `bool_lin_le` | Exact checked sparse rows; equal coefficient/variable lengths, mixed fixed entries, empty rows and duplicate aliases supported. `bool_lin_eq` permits a variable integer RHS; move it to the LHS instead of assuming a constant RHS. | +| `int_plus`, `int_minus`, `bool_eq`, `bool_le`, `bool_not`, `bool2int` | Direct linear equalities/inequalities, including typed constants. `bool2int` is a channel equality between an Integer and a Binary variable, not a reason to overwrite the original variable's domain/type. | +| `bool_and`, `bool_or`, `array_bool_and`, `array_bool_or`, `bool_clause` | Use existing helpers or exact Boolean linear rows; handle empty lists and repeated literals. Do not infer XOR support from an OR helper. | +| `int_le_reif`, `int_lin_le_reif`, corresponding `_imp`, and `int_eq_imp` | Preserve the direction rules below. Boolean literal guards are handled semantically. All required indicator activity bounds must be finite and conservatively representable, otherwise Unsupported. | +| `all_different_int`; `array_int_element`, `array_var_int_element` | Preserve typed AllDifferent/Element records. Plain FlatZinc element uses `index_base=1`; keep duplicate positions and aliases, including index/result aliases. Do not deduplicate a global's variable array. | +| Satisfy, integer variable/array-element objective, integer constant/parameter objective | Keep an explicit SAT/MIN/MAX method. Variable objective is coefficient 1 on its mapped handle; a constant objective is its actual offset. Preserve source objective identity even when aliased or hidden. | +| `output_var`, integer/Boolean `output_array`, declaration/constraint metadata | Freeze a typed output plan. Keep modern 1-D output and existing legacy multidimensional array descriptors. Validate dimension cardinality with checked multiplication. | + +This is a whitelist, including explicitly tested registry aliases where desired. +It does not automatically admit every `fzn_`/`gecode_` spelling. The capture +compiler's signature table is authoritative for the accelerated route; plugins +that override native posters do not silently override that table. Plugin-enabled +or custom semantic routes must select the legacy frontend until a versioned +capture implementation exists. + +The integer source evaluator should accumulate coefficients, literals, alias +coalescing and strict-bound shifts using checked exact arithmetic. Require every +value eventually stored as a double to round-trip exactly (including objective +constants and summed coefficients). Reject overflow/unrepresentable conversion +with a location; do not rely on long-double accumulation as a proof of integer +exactness. The existing Model's numerical normalization remains a second check, +not the frontend's exact source representation. Native's own narrower activity +checks can still return Unsupported after successful capture +(`gecode/optimize/native.cpp:32`, `:104`, `:134`). + +### Reification is a semantic requirement + +For an integer expression `L` and integer bound `k`, compile: + +- `int_lin_le_imp(a,x,k,b)`: `b=1 ⇒ L≤k`; impose no converse when `b=0`. +- `int_lin_le_reif(a,x,k,b)`: both `b=1 ⇒ L≤k` and `b=0 ⇒ L≥k+1`. +- `int_eq_imp(x,y,b)`: `b=1 ⇒ x−y=0`, one ranged indicator. + +These use `add_indicator`'s original logical metadata and finite-bound checks +(`gecode/optimize/constraints.hpp:17`). Build the whole compiled artifact locally: +a failure while adding the second direction must not publish the first direction +as a completed constraint. Evaluate constant guards without fabricating a Binary +handle unless a helper needs one. In particular false `_imp` is true, while false +`_reif` requires the negated relation. The guard for a linear comparison is the +**fourth** argument; validate arity before indexing. The native registry itself +uses `ce[3]` for posting (`registry.cpp:252`, `:267`), so do not copy a suspicious +literal-guard shortcut at `:230` as a specification. + +Full equality/disequality reification, XOR, reified globals and arbitrary +nonlinear reification remain explicitly Unsupported in the first slice. +`b ⇔ L=k` requires a disjunction for its false branch; two oppositely activated +equality indicators are incorrect. A later extension may introduce exact +less/equal/greater selectors with an exhaustive truth-table gate. Integer +complement shifts do not generalize to continuous strict inequalities. + +The primary definition confirms that reification is equivalence and `_imp` is +one-way implication; integer linear reification has a final Boolean argument. +[MiniZinc reification rules](https://docs.minizinc.dev/en/2.9.7/fzn-spec.html#reified-and-half-reified-predicates), +[integer builtins](https://docs.minizinc.dev/en/stable/lib-flatzinc-int.html#int-lin-le-reif). +The Boolean builtin signatures also distinguish the variable RHS of +`bool_lin_eq` and the Boolean-to-integer channel. +[Boolean builtins](https://docs.minizinc.dev/en/stable/lib-flatzinc-bool.html#bool-lin-eq). + +## Globals and routing: no incomplete model may run + +A Complete capture requires accounting for **every** declared variable, source +predicate, generated domain constraint, solve item and requested output. +A coverage entry must be a compiled relation, a checked alias/domain equivalent, +a proven constant relation, or an explicit Unsupported item. Merely marking a +poster as known is insufficient. Constant-false constraints remain contradictions; +constant-true constraints retain provenance even if they emit no row. + +Routing rules: + +- **Legacy native (default):** existing full native parse/search path, unchanged. +- **Optimize Native/Exact:** requires Complete capture, then the current native + compiler; retains typed globals and returns explicit Unsupported if it cannot + compile a retained record. +- **Optimize HiGHS/Numerical:** requires Complete capture and backend capability + checks. Any retained active global unsupported by HiGHS rejects the full route. + An AllDifferent plus linear rows never becomes a linear-only MIP. +- **Optimize Auto, if exposed later:** means the current complete Model route + selector, not permission to discard unsupported frontend constructs. Current + Model Auto chooses Native when globals are present, otherwise HiGHS. +- Do not add automatic retry against a partially built model. An optional future + legacy fallback must reparse the **original immutable input** into a fresh + legacy context, report the selected route, and preserve all constraints. Syntax + errors, numeric conversion errors and contradictory status claims are not + fallback triggers. No fallback is needed for the first vertical slice. + +First-slice rejection fixtures must include set/float variables, nonconvex +integer domains, unknown/plugin/blackbox predicates, restart-state predicates, +`regular`, variable-duration cumulative, reified AllDifferent, nonlinear +multiplication, unhandled search controls and unsupported output types. + +Subsequent typed-global extensions should be individually admitted: + +| Candidate | Exact correspondence to verify before enabling | +|---|---| +| `gecode_table_int` / bool table | Registry flattens row-major tuples and calls unshare before posting (`registry.cpp:1269`). Validate arity/divisibility and retain repeated source variables. A zero-arity flattened array cannot distinguish zero from one empty tuple without an explicit convention; reject that form until specified/tested. | +| `gecode_circuit` | Native poster expects explicit offset plus successor array (`registry.cpp:1543`), matching CircuitData's index base. Do not route costed circuit variants into the uncosted record. | +| Fixed-duration/height cumulative | Model supports nonnegative fixed durations/heights/capacity and zero-duration no-resource semantics. The existing `cumulatives` poster is overloaded and has special empty/singleton paths (`registry.cpp:1333`, `:1409`). Admit only a separately pinned signature and reconciled zero-duration convention; do not label all `cumulatives` calls supported. | +| Holey integer domains | Unary TableData can preserve membership on Native, but makes the HiGHS route unsupported unless a verified exact encoding is added. Limit table size; never enumerate huge intervals to recover an interval representation. | +| Linear floats / continuous recourse | Define numerical FlatZinc input and output tolerances, strict/reified predicate exclusions, lexical finite-value checks and source validation first. A posted native FloatVar interval is not an Optimize Continuous value. | + +## Objective, output and status reconstruction + +The compiled artifact owns raw declaration/predicate records for independent +checking alongside normalized compiler input: per-type source-slot → Optimize Variable mappings; +canonical aliases; literal entries; output names/dimensions/order; actual solve +method and objective expression; full source relations for checking; and the +compiled snapshot's model ID/revision. Hidden literal/helper variables are not +source output variables. Integer and Boolean slot zero are distinct namespaces. +`bool2int` does not merge these namespaces, even when their values are equal. + +Print directly from the captured OutputPlan and a validated full assignment. +Do not construct a fake solved FlatZincSpace merely to call Printer, and do not +borrow Printer's mutable AST. Preserve old multidimensional descriptors used by +`test/flatzinc/test_flatzinc_output_anns.cpp:45` as well as modern one-dimensional +arrays. Arrays with repeated aliases must print repeated positions. Validate +all model variables, including hidden/non-output ones, before any solution is +emitted. Buffer the full solution text first so a late invalid output node cannot +leave a partial apparent solution on stdout. + +The primary interface specifies output annotations, complete satisfying +assignments, solution separators and distinct completion/unknown/unbounded +markers; modern MiniZinc output arrays are 1-based and one-dimensional, while +older arrayNd forms remain relevant to this repository's fixtures. +[FlatZinc output contract](https://docs.minizinc.dev/en/2.9.7/fzn-spec.html#output). + +For a captured discrete model, check numerical candidate rounding explicitly: +each source Integer/Binary value must be within the documented tolerance of a +representable integer, then evaluate **all original** domains, channels, rows, +reified relations and globals exactly on that rounded assignment. Recompute the +source objective, including offsets, and compare with the solver result. Do not +turn a numerically near-integer value into a valid output merely by formatting it +with no decimal digits. Keep the numerical backend's guarantee separate from the +exact feasible-point check; checking a point does not certify its bound. + +First-driver status policy: + +| Outcome | FlatZinc behavior | +|---|---| +| SAT request, valid point | Emit requested assignments and `----------`; a constant-zero optimizer reporting Optimal does **not** prove enumeration complete, so do not emit `==========` for an ordinary one-solution SAT request. | +| MIN/MAX, valid final optimal result | Emit point and separator; use `==========` only according to the configured route's completed optimization contract. Native/Exact is the first strict completion gate. Numerical mode must be explicit, use zero requested MIP gaps for this frontend and report its numerical guarantee in comments/metadata. It is not a proof certificate. | +| Proven infeasible | `=====UNSATISFIABLE=====`; distinguish source contradiction and solver outcome in diagnostics. | +| Unbounded | `=====UNBOUNDED=====`; the initial finite discrete subset should not produce this, but do not remap it to infeasible. | +| Time/node/cancel limit with checked point | Emit point/separator, no completion marker. | +| Limit with no point | `=====UNKNOWN=====`. | +| Unsupported / invalid input / unavailable selected backend / validation failure | Actionable error on stderr and nonzero exit; no fabricated solution, no UNSAT marker. | + +Initially support one satisfaction solution and final optimization output only. +Reject `-a`, multi-solution `-n`, intermediate-output `-i`, LNS/restart callbacks, +and incompatible fixed-search controls until implemented. Retaining an annotation +as text does not implement its requested search behavior. Known harmless +metadata such as `defines_var`, `is_defined_var`, `var_is_introduced`, `mzn_path` +and specifically whitelisted propagation-strength hints can be recorded without +altering the feasible set; unknown annotations are Unsupported initially; free-search permission must +be explicit when ignoring search-order annotations. Do not advertise unsupported +standard flags in a new `.msc` file. The existing +`tools/flatzinc/gecode.msc.in` describes the legacy solver and must remain intact. + +## Conformance fixtures and release gates + +Add small standalone `.fzn` files with independent witness/feasible-set oracles. +Do not derive the oracle by reading back the generated Optimize rows. Enumerate +original source variables, then existentially quantify frontend helper variables +when comparing feasible sets. Tests must verify a positive fixture count and +identify the admitted signature/route, so rejecting every file cannot pass. + +| Fixture family | Required expected behavior | +|---|---| +| Declaration aliases | Chain aliases, narrower initialized alias, equality-induced alias, alias-to-fixed value, conflicting domains; same full feasible set and output names. | +| Boolean/integer channels | Bool slot 0 and int slot 0 independent until bool2int; conflicting int domain is infeasible; arrays mixing constants and repeated aliases preserve order. | +| Sparse linear rows | Duplicate alias coefficients, cancellation, mixed literals, variable RHS bool_lin_eq, zero terms, strict boundaries, negative coefficients, overflow/unrepresentable-data rejection. | +| Reification truth tables | Enumerate x,y in −2..2 and both guard values for each admitted `_imp`/`_reif`; false guards differ. Empty linear expressions and literal guards true/false. Reject equality `_reif` rather than weakening it. | +| Objectives | Satisfy; minimize/maximize variable and alias; array element objective; literal/parameter 7 and −3; source objective represented through a defining linear equality with a nonzero constant. Constant objectives must report their real value. | +| Output mapping | A named hidden variable precedes outputs; two scalar aliases; repeated array positions; empty output array; legacy array2d indices; modern output_var/array; no output variables; model destroyed before formatting retained results. | +| Globals | AllDifferent([x,x]) infeasible; Element with repeated entries and index/result aliases, 1-based boundary indices, constant array entries. Add an AllDifferent that removes the linear relaxation's otherwise optimal solution: explicit HiGHS must reject the complete model. | +| Coverage and failures | Unknown predicate, each consumed restart family, registered custom plugin name, malformed arity, domain-only constraint, unsupported set/float/nonconvex domain. Verify no backend invocation, native poster call or subprocess creation in capture mode. | +| Lexer/parser lifecycle | Decimal/hex/octal boundaries, negative objective array index, absent symbol, oversized dimensions/input, malformed/truncated input, parse twice independently, exceptions/allocation failures and sanitizer cleanup. | +| Status/limits | Fake compiler/backend results for Unsupported, invalid full assignment, wrong owner/revision, interrupted candidate/no candidate, SAT Optimal-with-one-point, and numerical versus exact completion claims. | + +Compatibility gate: run the existing legacy FlatZinc tests unchanged, including +`output_test.cpp`, `test_flatzinc_output_anns.cpp`, `sat_cmp_reif.cpp`, +`sat_eq_reif.cpp`, empty-domain, restart and blackbox fixtures. These are legacy +compatibility tests, not a claim that capture admits those whole files. +`shared_array_element.cpp` also includes unsupported `count` at line 102, so the +first captured route should reject that complete file; create a small original +Element fixture instead of deleting its `count` constraint for benchmarking. +The current test harness supports a semantic output checker in addition to exact +text (`test/flatzinc.cpp:157`). Preserve exact legacy output where promised; +compare full assignments/objectives for cross-backend correctness instead of +requiring identical search order. + +Integration gates, in order: + +1. Parser-record tests and independent source-evaluator tests, including rejected + syntax cleanup under ASan/UBSan. Capture-only instrumentation proves zero + native variable/poster/search calls. +2. Complete capture → Optimize Native/Exact → reconstructed output for the + whitelist, with exhaustive small feasible-set equality and alias/reification + cases. A captured unsupported global must never be omitted. +3. Same complete linear files → HiGHS/Numerical, zero requested MIP gaps, original + integer point validation and known optima. Off builds return explicit + Unsupported. Retained globals reject HiGHS; ordinary native remains usable. +4. Legacy parser/search regressions pass; installed consumer exercises the new + optional bridge without making HiGHS mandatory for the legacy FlatZinc target. +5. Compile pinned MiniZinc source fixtures with a pinned, deliberately limited + mznlib, then solve/check them. Freeze generated `.fzn`, compiler/library + versions and hashes; report flattening, parsing/IR and solve costs separately. + The current 56-fixture historical panel is a compatibility seed, not evidence + of modern FlatZinc or MiniZinc Challenge coverage. +6. Only after flag/output/mznlib conformance: add a separate solver `.msc`, a small + FAST gate case, and broader MiniZinc corpus evaluation. No performance claim + before a quiet repeated comparison with fixed/free search reported separately. + +## Concrete implementation ownership and ordering + +| Slice | Exclusive files | Deliverable and dependency | +|---|---|---| +| A: capture records and parser plumbing | New `gecode/flatzinc/capture.hh/.cpp`; `parser.hh`, `parser.yxx`; generated `parser.tab.cpp/.hpp`; capture-only lexical guard in `lexer.lxx` and regenerated `lexer.yy.cpp`; new `test/flatzinc/capture.cpp` | Immutable records, checked lexical/argument boundaries, original objective, output plan and cleanup. No Optimize dependency. One owner must edit grammar and generated files together. | +| B: semantic compiler/checker | New `gecode/optimize/flatzinc.hpp/.cpp`; new `test/optimize/flatzinc.cpp` and fixtures under `test/optimize/flatzinc-fixtures/` | Whitelist, aliases/domains, linear/reified/global compilation, coverage closure and original-source witness checker. Can develop against hand-built A records while A's parser work proceeds. No changes to native registry semantics. | +| C: optional driver/distribution | New `tools/flatzinc/fzn-gecode-optimize.cpp`, later new dedicated `.msc.in`/limited mznlib; root CMake/install wiring | Route selection, limits and status/output contract. Depends on A+B. Root owns build/install files; no change to legacy driver/config by another agent. | +| D: independent review | Read-only A/B source and independent exhaustive fixture generator/checker tests | Review alias-domain losses, each reification direction, unsupported closure and source/IR identity; review generated-parser parity before enabling the tool. | + +The first accepted vertical implementation is A+B plus a narrow driver: bounded +int/bool declarations, the listed linear/channel/Boolean primitives, ≤ +reification/implication, AllDifferent/Element, constant/variable objectives and +integer/Boolean output. If that is too large for one change, land A's immutable +capture with rejection tests first, then B's linear/channel/objective slice; +keep reification/globals explicitly rejected until their own fixtures pass. Do +not weaken a semantic gate to fit an estimate. Table/Circuit/cumulative, general +finite domains, floats, full equality reification, search annotations, complete +MiniZinc packaging and automatic legacy fallback are separate increments. + +Generated parser maintenance is an implementation dependency: the existing +Makefile regenerates `parser.tab.cpp/.hpp` with Bison and the scanner with Flex +when available (`Makefile.in:1562`); otherwise it consumes checked-in generated +sources. Record tool versions and keep generated sources aligned. Parser +plumbing and ownership cleanup are the main schedule risks; claiming this is +only a few registry callbacks would omit the actual semantic work. + +Independent read-only hook review confirmed the capture-only boundary and +identified the alias/assigned precedence, BoolVar-typed synthesized domains, +pre-rewrite arity checks, objective array validation, input-size limits and +transferred-output ownership issues incorporated above. No runtime claims are +based on that review. diff --git a/docs/solver-parity/FLATZINC-DRIVER.md b/docs/solver-parity/FLATZINC-DRIVER.md new file mode 100644 index 0000000000..31142c3a93 --- /dev/null +++ b/docs/solver-parity/FLATZINC-DRIVER.md @@ -0,0 +1,65 @@ +# Explicit FlatZinc optimization frontend + +`fzn-gecode-optimize` is built and installed when both native FlatZinc and the +Optimize component are enabled. It captures the whole input before compilation, +solves only a fully admitted model, and checks every original source relation +before publishing buffered output. The existing `fzn-gecode` executable and +MiniZinc solver configuration are unchanged. + +```sh +fzn-gecode-optimize model.fzn --backend native --time-limit 10 +fzn-gecode-optimize model.fzn --backend highs --node-limit 1000 +fzn-gecode-optimize - --backend native < model.fzn +``` + +Native is the default and requests exact integer search. HiGHS is explicitly +numerical, requests zero absolute/relative MIP gaps, and prints that attribution +in a FlatZinc comment. Exact feasible-point checking does not certify a numerical +optimal bound or infeasibility claim. An unavailable selected backend fails +explicitly. There is no automatic backend or legacy-parser fallback. + +See [the compiler](FLATZINC-COMPILER.md) for the admitted signatures and +[the capture layer](FLATZINC-CAPTURE.md) for grammar and lifecycle boundaries. +Unknown predicates, search annotations, unsupported domains and output types +prevent the entire solve. All-solution, intermediate-output, fixed-search and +other unimplemented flags are rejected. No `.msc` advertises this experimental +subset as a general MiniZinc solver. + +Output and exit status: + +- A checked satisfaction point prints assignments and `----------`, with no + enumeration-completion marker. A completed optimization also prints + `==========`; an exact route requires a matching objective/bound. +- Definite infeasibility prints `=====UNSATISFIABLE=====` only when no complete + raw backend assignment independently establishes source feasibility. +- Interrupted solves may print a checked incumbent without a completion marker; + without a point they print `=====UNKNOWN=====`. Exit status is 1. +- Completed results exit 0. Invalid input, unsupported features, malformed + backend results and operational errors exit 2 with an explanation on stderr + and no solution text. A claimed unbounded result is inconsistent with this + finite discrete subset and is an error, never an UNSAT result. +- Optional bounds/gaps must be finite, ordered and internally consistent. + Every published solution must have the correct model identity, revision, + complete variable mask and original objective. Source output aliases retain + their names and repeated positions; hidden variables are checked too. + +`--time-limit` covers input reading, capture, compilation, solving and output +formatting through one outer elapsed-time calculation. Each next stage receives +only the remaining time, and a point newly returned after that deadline is +excluded. These are cooperative checks: stream reads, parser actions and some +backend calls may overrun before returning. This is not process containment or +a hard wall-clock deadline. The external FAST harness retains its own process +containment. Time 0 returns UNKNOWN before parsing. `--node-limit` is passed to +the selected solver and does not count parsing or compilation operations. + +Input defaults to the capture limit of 16 MiB; `--max-input-bytes` can lower or +raise it within the parser's signed index range. Other capture/compiler resource +limits use their documented defaults. No signal-handler cancellation or arbitrary +memory-allocation recovery guarantee is added by this CLI. + +The C++ driver test links the real capture/compiler and uses both real backends +when available. Its independent fake backend exercises contradictory status, +wrong identity/mask, invalid raw/claimed witnesses, absent or invalid bounds, +inconsistent gaps, unsupported routes, argument errors and exhausted budgets. +Subprocess tests separately check the actual file/stdin executable and output +contract. Legacy parser compatibility remains a separate regression gate. diff --git a/docs/solver-parity/FLATZINC-GLOBALS-DESIGN.md b/docs/solver-parity/FLATZINC-GLOBALS-DESIGN.md new file mode 100644 index 0000000000..abc33a6ed5 --- /dev/null +++ b/docs/solver-parity/FLATZINC-GLOBALS-DESIGN.md @@ -0,0 +1,345 @@ +# FlatZinc tables, circuits, fixed cumulative tasks and finite holey domains + +Design written 2026-09-05. Original source baseline: +`8ae59d5c1946abf47203172ba3cb89fbf5ea0a8b`. The table/finite-domain, +explicit-offset circuit and four-argument fixed cumulative slices below are now +implemented with separate independent correctness gates. No parser, native solver +or public model changes were needed for these compiler extensions. Current implemented admission +is described in [FLATZINC-COMPILER.md](FLATZINC-COMPILER.md). + +## Recommended next slice + +Reuse the existing typed `TableData`, `CircuitData` and `CumulativeData`; extend +only the owning FlatZinc compiler and independent original-source evaluator. +Keep the original raw predicates/domains and source-slot mapping intact. Publish +an artifact only when every predicate is admitted and all resource checks pass. +Do not use a broad `gecode_`/`fzn_` prefix-stripping rule. + +Implement in this order: + +1. Positive-arity integer tables and finite enumerated integer domains. A unary + typed table represents holes without new selector variables or an exponential + conversion to inequalities. Preserve intervals symbolically. +2. The explicit-offset `gecode_circuit(offset, successors)` predicate, initially + nonempty and with nonnegative literal offset. Preserve repeated source terms. +3. Four-argument fixed-data `gecode_cumulatives` and the explicitly selected + legacy spelling `cumulatives`; durations, heights and capacity must be integer + literals or original declaration/domain values already proved singleton. + Use documented half-open cumulative semantics, including zero-duration tasks. + +Keep reified tables, Boolean/optional tables, subcircuits, cost circuits, +six-/seven-argument multi-machine scheduling, optional tasks, variable scheduling +parameters, and unbounded integer variables explicitly unsupported. Table and +holey-domain admission should land and pass its independent oracle before adding +scheduling. No backend defaults or existing workflow policy changes are needed. + +## Evidence and version boundary + +The authoritative implementation vocabulary is this repository's bundled Gecode +MiniZinc library and registry at the source baseline above. Relevant local sources: + +- `gecode/flatzinc/mznlib/fzn_table_int.mzn:35`: a two-dimensional MiniZinc table + wrapper calls `gecode_table_int(x, array1d(t))`. +- `gecode/flatzinc/mznlib/fzn_circuit.mzn:35`: explicit-offset low-level circuit; + the MiniZinc wrapper supplies its actual index-set minimum, shifting values when + that minimum is negative. +- `gecode/flatzinc/mznlib/fzn_cumulative.mzn:35` and `fzn_cumulatives.mzn:1`: + distinct four-argument single-resource and six-/seven-argument multi-machine + interfaces, despite overlapping names. +- `gecode/flatzinc/registry.cpp:69`, `:1269`, `:1333`, `:1543`, `:1915`: + actual registration, shape dispatch, alias unsharing and native calls. +- `gecode/flatzinc/flatzinc.cpp:2396`: flattened table reconstruction. +- `gecode/optimize/globals.cpp:58`, `:99`: typed payload validation and independent + integer predicates; `gecode/optimize/native.cpp:165`, `:485`: native numeric + admission, protected zero/singleton cases and lowering. + +External primary references were read on 2026-09-05. The stable Handbook scheduling, +Table and Circuit pages reported **2.10.1**; the FlatZinc specification and Gecode +index still reported **2.10.0**. Stable URLs are rolling documentation, so these are +observed page versions, not a claim that every solver-specific declaration belongs +to a downloaded 2.10.1 source distribution. Release-tag raw source URLs were not +retrievable in this research session. Pin the exact MiniZinc binary, bundled solver +library path/version and generated `.fzn` fixture hash before integration tests. +Do not label a mutable `master` source as a release-pinned specification. + +- [FlatZinc specification](https://docs.minizinc.dev/en/stable/fzn-spec.html): + parameter/variable distinction, finite set literals, aliases and source-order + one-dimensional arrays. It does not turn arbitrary similarly named globals into + equivalent predicates. +- [Table semantics](https://docs.minizinc.dev/en/stable/lib-globals-extensional.html#table): + the assigned vector must match a row of the parameter relation; Boolean, + integer and optional variants are distinct. +- [Circuit semantics](https://docs.minizinc.dev/en/stable/lib-globals-graph.html#circuit): + values denote successor node indices; optional variants have different + participation semantics. +- [Scheduling semantics](https://docs.minizinc.dev/en/stable/lib-globals-scheduling.html#cumulative): + ordinary cumulative uses nonnegative durations/resources; multi-machine + cumulatives also admits production and resource lower bounds, so it is not the + same constraint. +- [Current standard cumulative decomposition](https://raw.githubusercontent.com/MiniZinc/libminizinc/master/share/minizinc/std/fzn_cumulative.mzn) + explicitly tests `start <= time < start + duration` and excludes zero-duration + activity. This mutable source corroborates the half-open convention. +- [Current high-level cumulative wrapper](https://raw.githubusercontent.com/MiniZinc/libminizinc/master/share/minizinc/std/cumulative.mzn) + guards an individual resource requirement with zero duration. It checks matching + array index sets before flattening. Do not infer original index-set identity + from array lengths when capture no longer retains those dimensions. + +## Exact admission table + +`VI` below means a flat array of integer literals or integer variable references; +`PI` means a flat parameter array of integer literals. Booleans do not become +integer literals merely because the target Model also supports Binary variables. +Captured parameter references have already been expanded by the parser. + +| Source predicate/form | Verified contract | Initial compiler response | +|---|---|---| +| `gecode_table_int(VI x, PI t)` | Two arguments; `t` is row-major flat storage, tuple arity is `len(x)` | Admit `len(x)>0`, `len(t)%len(x)==0`; materialize typed tuples after checked count admission | +| `gecode_table_int([], [])` | No tuple-count field remains after flattening | Explicit `Unsupported` initially; do not manufacture an empty tuple | +| `gecode_table_int([], nonempty)` | Cannot form a tuple of zero arity | `InvalidInput`, before division/indexing | +| `table_int`, `fzn_table_int`, `fzn_gecode_table_int`, `gecode_gecode_table_int` | Prefix aliases are not a general interface contract; MiniZinc `fzn_table_int` has a 2-D argument | Keep unsupported until an exact separate signature is documented; do not strip prefixes | +| Table Boolean, reified, implication or optional forms | Different argument types or truth/occurrence semantics | Unsupported in this slice | +| `gecode_circuit(PI scalar offset, VI successors)` | Literal offset first, successor array second | Admit nonempty array and nonnegative offset within the exact source range; check native range when solving | +| `fzn_circuit(successors)` | MiniZinc wrapper derives the original array index minimum | Unsupported as a direct low-level capture form without an explicit preserved index contract | +| Cost circuit and subcircuit names | Cost channels or permitted excluded/self-loop nodes change semantics | Unsupported | +| `gecode_cumulatives(VI s, VI d, VI r, int-or-var-int b)` | Four-argument single-resource poster | Admit equal array lengths, nonnegative fixed `d`, `r`, `b`; preserve source references used as fixed data | +| `cumulatives(s,d,r,b)` | Verified legacy alias of that same four-argument poster | Admit only exact four-argument shape under the same fixed-data contract | +| `gecode_cumulatives(s,d,r,m,PI bounds,bool upper)` | Six arguments: machine decisions and per-machine bounds, allowing different resource semantics | Unsupported, never truncate to four arguments | +| `fzn_cumulatives(s,d,r,m,b,upper,min_m)` | Bundled MiniZinc wrapper has seven arguments and shifts machine indices | Unsupported; not equivalent to the registry's synthetic `fzn_cumulatives` alias | +| `gecode_schedule_cumulative_optional` | Presence array and different five-argument order | Unsupported | +| Declared `var {v1,...,vk}` and existing `int_in(x, set)` | Exact finite-set membership | Admit bounded normalized finite membership, retaining all holes | +| `set_in(int x, parameter set)` | Standard integer membership spelling, overloaded locally with set-variable posting | Optional explicit spelling only for an integer operand and literal set; never admit set-variable membership or reification by name alone | + +`Registry::add(id,p)` registers `id`, `gecode_+id` and `fzn_+id`. For an already +prefixed name it even produces double-prefixed names. Thus `gecode_table_int` and +`gecode_circuit` registrations do **not** establish unprefixed `table_int` or +`circuit`. The scheduling registration `cumulatives` creates three spellings, but +its six-argument branch and the separate seven-argument MiniZinc wrapper still +need different contracts. A literal whitelist is safer and more reviewable. + +Malformed shape/type/arity for a specifically admitted interface is `InvalidInput`. +A known but unsupported overload or data class is `Unsupported`. Resource caps +produce `ResourceLimit`; cancellation/time limits keep their own statuses. Do not +label unsupported domains or arithmetic overflow as an infeasible model. + +## Tables and information preservation + +For arity `n>0`, evaluate a table by testing whether any **complete original row** +`tuple[j] == source_value(x[j])` holds for every column. The original evaluator must +read the original flat relation, not ask `Detail::global_satisfied` about generated +metadata. This provides an independent check on row reconstruction and mapping. + +Reject noninteger tuple entries, nested arrays, wrong namespaces, and remainder +cells before posting. Duplicated tuples are harmless. Repeated variables are +positional equality requirements: `[x,x]` with only tuple `[0,1]` is infeasible; +`[0,0]` is feasible at `x=0`. Do not deduplicate argument positions or silently +replace repeated source variables with independent decisions. Fixed literals in +`x` use the compiler's private fixed-slot cache and never appear as source outputs. + +An empty relation with positive arity is exact false; post a typed empty table or +an explicit false row. Every input still passes type and resource admission before +constant folding. Compilation `Complete` means faithfully represented, not SAT. + +Zero arity needs a deliberate representation boundary. `TableData({}, {})` is +false and `TableData({}, {{}})` is true. A flattened `[]` loses this distinction. +The current `arg2tupleset` chooses zero tuples when its flat input is empty, and +otherwise divides by arity; it also silently floors a nondivisible cell count. +Those implementation shortcuts are not a sufficient contract for reconstructing +an arbitrary MiniZinc 2-D relation. Initial rejection avoids both invented truth +and division by zero. A future counted-table predicate or retained original 2-D +shape can support both zero-arity cases; that change requires its own parser and +source-evaluator contract, not a guessed row count. + +## Finite domains with holes + +Replace the compiler's interval-only declaration accumulator with a bounded +intersection representation: optional lower/upper limits plus, when present, a +sorted unique vector of allowed integers. Do not enumerate a large interval. +Intersect listed values with intervals and other listed sets, processing every +original restriction on its declaration-alias representative. A finite member +list can establish finite bounds for an otherwise `var int` representative. +Clipping a list must not turn it into its hull unless every hull value is present. + +Validate every original listed integer with the compiler's exact representation +check before sorting/deduplicating. Normalize once per restriction, charge input +cells, sort/merge work and stored allowed values. Use a metered deterministic sort +or conservative precharged comparison budget with a checkpoint around the sort; +a library sort is not a hard cancellation-latency guarantee. Avoid multiplying +large counts before checking storage/work ceilings. + +After intersection: + +- Empty domain: keep the existing safe dummy variable plus an exact contradiction; + preserve source slots and complete the remaining input admission. +- Singleton or contiguous domain: use exact bounds alone. +- Noncontiguous finite set: create its hull variable and a unary `TableData` with + one row per allowed value. No selector/helper variables are necessary. +- Still unbounded: return `Unsupported`; no implicit native integer-limit domain. + +Declared aliases may carry restrictions through synthesized raw-domain rows; +collect those before posting. Ordinary `int_eq` rows remain original constraints, +even if normalized parser records mark an alias equality. Do not use normalized +records to discard raw membership predicates. The existing source evaluator's +literal-set membership already supports holes; retain it independently of the +lowered unary tables. Original Boolean declaration domains remain intersected with +`{0,1}`; do not generalize Boolean-to-int predicate coercion beyond the existing +captured/synthesized domain contract. + +## Circuit contract + +For `n>0` and offset `o`, legal successors lie in `[o,o+n-1]`. Starting from node +position zero, visit exactly `n` previously unvisited positions and require the +next position to be zero. Out-of-range values, a premature repeated node, multiple +cycles, or an unvisited node make the original predicate false. A singleton is +feasible exactly when its sole successor equals `o`. A self-loop for `n>1` cannot +satisfy a full circuit. This is not a subcircuit or merely AllDifferent. + +Evaluate the original successor array in source order, including aliased or +literal terms. Bound-check before subtracting offset or indexing. `o+n-1`, the +normalizing shifts and all source arithmetic use checked integer operations. +Initial `gecode_circuit` admission rejects negative offsets because its bundled +native low-level interface explicitly requires nonnegative offset. The generic +typed Model supports negative bases by safe normalization; admitting that broader +class under the low-level predicate's name should be a separate documented choice. +The high-level bundled wrapper shifts negative index sets before emitting a +nonnegative low-level offset. Do not infer a base of one from output dimensions. + +Repeated handles are retained; the native bridge has its own equality-preserving +argument preparation. Neither deduplication nor accidental independent clones may +change the solution set. An empty successor array is `InvalidInput` for the admitted low-level signature, +never vacuously a solved circuit. + +## Fixed cumulative contract and known legacy disagreement + +All `s`, `d` and `r` arrays have equal lengths. Each `d[i]`, `r[i]`, and `b` must +be a literal or resolve to a singleton from original declarations and exact domain +intersections. Do not run a solver to discover whether they happen to be fixed. +Their referenced source variables remain mapped and independently checked. Fixed +negative durations/heights violate the declared assumptions and are `InvalidInput`. +Negative capacity is `Unsupported` in this initial typed-global scope, including +empty schedules where another high-level convention might be vacuous. Nonfixed +parameters are unsupported, rather than copied from a current lower bound. + +Task `i` contributes `r[i]` precisely when `s[i] <= t < s[i]+d[i]`. +Zero duration or zero resource contributes nothing. Equal end/start times do not +overlap. Repeated start handles still describe separate tasks, so demands add; +identical tasks are not deduplicated. For the source evaluator, compute checked +integer endpoints, sort/group events at equal time, remove ending demands and add +starting demands before checking the interval following that time. An alternative +independent tiny-instance oracle checks all integer times in the bounded test +horizon; integer endpoints make that exhaustive for continuous time as well. + +The old four-argument `p_cumulatives` has a singleton shortcut imposing +`height[0] <= bound` without checking zero duration. For `d=[0], r=[2], b=1`, it +rejects an assignment that the standard half-open predicate and current typed +`CumulativeData` accept. The improved compiler should use the intended documented +predicate, record this specific legacy disagreement in tests, and avoid treating +the old executable as the sole oracle. This is a semantic bug fixture, not a +performance comparison or permission to ignore other discrepancies. + +For nonnegative capacity, an empty schedule is true. A positive-duration task +whose height exceeds capacity makes the model infeasible regardless of start. +Do not replace cumulative with AllDifferent or unary scheduling merely because +some heights are large; the native adapter already implements guarded choices. + +## Resource, backend and proof boundaries + +Keep current public compiler signatures unchanged if practical. Existing +`max_variables`, `max_constraints`, `max_nonzeros`, `max_work`, depth, deadline and +cancellation controls can cap the new representations with explicit accounting: + +| Representation | Storage/work to charge before allocation/posting | +|---|---| +| Flat table | Source arguments + every relation cell; typed row count and copied cells; one global constraint; private literal variables | +| Holey domain | Original and normalized members; intersection/sort work; unary table rows/cells; one global per noncontiguous representative | +| Circuit | Successor occurrences including repeats; one global; literal slots; source-evaluator visited array | +| Cumulative | All three arrays and scalar; fixed-value lookup; one global; start literal slots; at most two checker events per active task and bounded sorting storage | + +The current public `validate_flatzinc` has no time/cancellation option. Its original +checker allocations and work are bounded by the already admitted payload, but an +outer caller can only checkpoint before/after it. Do not claim an internally +interruptible checker or hard validation deadline without a separate interface +change. Compiler-side normalization/copying continues to use its own Meter. + +Global argument occurrences and table cells count toward `max_nonzeros` even +though they are not matrix nonzeros. This extends the existing compiler's global +payload accounting; document the meaning. No unchecked `n*tuple_count`, `2*n`, +`offset+n-1`, interval width or cumulative energy calculation may precede checks. +Caps include constants/helpers; a partial failed artifact never escapes. + +Compilation need not require a native build. Typed global constants retain the +Model's exact `[-2^53,2^53]` boundary, while actual Native solves additionally use +`Int::Limits::min/max` (`±(INT_MAX-1)` here). Native preflight already checks global +argument/tuple counts, values and index endpoints. Cumulative has stricter +endpoint, total-energy, task-count-squared and propagation-envelope admission: +for retained positive-demand tasks it guards integer sums/products and the bound +`2*capacity*time_magnitude + total_energy <= native_max*minimum_height` where +applicable. Reuse this code; do not claim that individually representable inputs +alone guarantee a supported schedule. Overflow or a failed envelope guard yields +`Unsupported`, not false infeasibility. Large literal/domain models can compile +but remain unsupported by the selected backend. + +Any remaining active Table/Circuit/Cumulative global causes explicit HiGHS solve +rejection under the existing full-model capability check. Auto chooses Native for +active typed globals. No continuous relaxation, omitted membership constraint, or +silent decomposition is allowed. A holey-domain intersection that becomes +contiguous may use only bounds and retain ordinary linear HiGHS capability; a +remaining unary table does not. Missing Native must remain explicit unsupported. +A separately folded constant contradiction may have no active globals and can be +handled by either backend, with the original source check still retained. + +The final result is accepted only after current `validate_flatzinc` checks owner, +revision, full helper-inclusive slot layout, active mask, integral source values, +all original declarations/aliases/domains and every admitted original predicate. +Generated helper values are existential witnesses, not extra user decisions or +source outputs. Source validation checks feasibility/objective only; it does not +upgrade a Numerical vendor bound into an Exact proof. Satisfy/optimal/limit markers +remain the existing driver's responsibility. + +## Conformance gates before implementation is considered complete + +1. **Signature matrix:** use owning records and real parser fixtures for every + exact admitted spelling. Wrong arities, nested arrays, Boolean tuple cells, + variable parameter tuples, foreign references, six-/seven-argument scheduling, + cost/subcircuits and double prefixes must fail explicitly. Pin the MiniZinc + binary/version/library path and generated source hash for generator fixtures. +2. **Two-way table oracle:** arities 1–3, all assignments in tiny signed domains, + arbitrary row order/duplicates, empty relations, fixed literals, repeated + aliases and impossible repeated-position rows. Compare original row membership + with existence of a satisfying compiled helper assignment in both directions. + Zero-arity tests verify explicit rejection and the existing typed API's + distinct false/true empty-tuple cases; never pass them through division by zero. +3. **Domains:** unsorted/duplicate members, negative and noncontiguous sets, + interval/list/list intersections, aliases with disjoint/overlapping domains, + singleton/empty sets, contradictory assigned values, finite sets bounding + `var int`, and very large sparse gaps without hull enumeration. An exact source + oracle must reject every hole, including a forged otherwise-valid witness. +4. **Circuits:** independently enumerate successor assignments for sizes 1–5 and + offsets 0, 1, 3; reject subtours/self-loops/out-of-range values; include repeated + handles, fixed literals, wrong argument order, empty arrays, negative offset + admission and endpoint overflow. Add min/max objectives with offsets so source + values and optimality results are tested together. +5. **Cumulative:** sizes 0–4; durations/heights/capacity including zero; endpoint + touching, coincident starts, alias starts with additive resource, over-capacity + singleton, the zero-duration legacy disagreement, negative start times, + singleton parameter aliases and unfixed/negative parameters. Enumerate every + start assignment and compare a direct integer-time resource oracle. Check + arithmetic boundaries and the native envelope guard separately. +6. **Integration:** combine each new global with existing reification, AllDifferent, + Element, source aliasing and holey domains; independently enumerate helper slots. + Keep original records immutable; destroy input/parser lifetime; verify source + output never exposes literal/helper slots. Forged owner/revision/mask/fractional + values and violated original predicates must be rejected by the source checker. +7. **Limits/configurations:** exact cap boundaries and cancellation/time tests in + normalization, tuple copying, fixed-parameter resolution and final publication; + no partial artifact or guessed infeasibility on interruption. Run backend-free, + Native+HiGHS and fully instrumented suites. Explicit HiGHS must reject every + retained global. Retest the opt-in CLI markers and unchanged legacy fixture + smoke panel; do not weaken original-predicate checks to make a differential + test pass. + +After these correctness gates, add small representative table/domain/scheduling +cases to the existing bounded fast regression panel and benchmark the new +admission against the existing native FlatZinc route. Performance measurements +must use comparable source problems/configurations and run after concurrent builds +and solver tests have stopped. This document itself makes no executed-test or +performance claim. diff --git a/docs/solver-parity/GLOBALS.md b/docs/solver-parity/GLOBALS.md new file mode 100644 index 0000000000..eb76ac720a --- /dev/null +++ b/docs/solver-parity/GLOBALS.md @@ -0,0 +1,80 @@ +# Native global constraints + +The owning model now retains typed all-different, variable element, allowed +table, cumulative-resource, circuit and sparse deterministic Regular constraints. They have stable +model-aware handles, names, revisions and tombstones like linear rows. Adding +a malformed constraint leaves the model unchanged. Removing a referenced +variable requires removing the global first. Bounds may change freely because +these records retain semantics, rather than a bound-dependent linear lowering. + +```cpp +#include +namespace O = Gecode::Optimize; +O::Model m; +auto a = m.add_integer(0, 10); +auto b = m.add_integer(0, 10); +O::add_cumulative(m, {a, b}, {3, 2}, {1, 1}, 1, "machine"); +m.minimize({{a, 1}, {b, 1}}); +auto result = O::solve(m); // Auto routes active globals to native Gecode. +``` + +| Helper | Original semantics | +| --- | --- | +| `add_all_different` | Every listed integer value differs. Empty/singleton lists are true; duplicate variable occurrences make a longer list infeasible. | +| `add_element` | `result == elements[index-index_base]`, with index constrained to the array range. Empty arrays are infeasible. Array duplicates and aliases with index/result retain their meaning. | +| `add_table` | The ordered variable tuple belongs to the listed allowed tuples. Arity is checked, duplicate tuples are harmless, and aliases must agree. No tuples is false; an allowed empty tuple is true. | +| `add_cumulative` | Fixed nonnegative durations and heights, nonnegative capacity, and integer start times. Each mandatory task uses its height on `[start,start+duration)`. Zero duration or height consumes no resource. Repeated starts describe simultaneous tasks. | +| `add_regular` | The signed integer word follows a deterministic transition table from the initial state to a final state. Missing transitions reject, repeated variables retain equality, and an empty word accepts exactly when its initial state is final. Sparse declared state IDs are compacted for native posting; see [Regular](REGULAR.md). | +| `add_circuit` | The nonempty successor array forms exactly one cycle through every node. An explicit index base supports negative or positive labels. A singleton points to itself; multiple disjoint cycles are infeasible. | + +All referenced variables must have integer, binary or semi-integer type. The +public records use signed 64-bit symbols/constants restricted to the exactly +representable range ±2^53. The original-model checker rounds values only within +the requested integrality tolerance, then applies the discrete predicates. +Values outside that exact integer range are rejected by the global checker. +`ValidationReport::violated_globals` counts violated active records. + +`Backend::Auto` selects the native bridge when any active global exists, and +HiGHS otherwise. Explicit HiGHS requests reject these models. A build without +native support reports Unsupported; it never drops a global or silently solves +only the linear relaxation. The native bridge still requires all active model +variables and linear data to fit its documented finite integer subset. Globals +do not add continuous-variable support. Persistent HiGHS sessions, the current +conflict oracle and LP/MPS export reject active globals explicitly. + +The native compiler posts Gecode's existing domain-consistent distinct, element, +table and circuit propagators and cumulative resource propagation. Equal fresh +variables preserve aliases when a native propagator requires distinct variable +objects. Shifted index variables support arbitrary allowed index bases without +requiring a negative-offset native circuit call. Zero-resource tasks are removed +before posting cumulative, preserving the documented half-open semantics. +The original payload remains available for independent checking and ordered +objective workflows. + +Native constants/array counts must fit Gecode's integer limits. Task end bounds, +individual and aggregate energy, and capacity × domain-width × task-count +products are checked before native cumulative posting. For positive-resource +tasks, let `B` be the largest absolute start/end bound, `E` total task energy, +`C` capacity, and `h` the smallest height. The conservative condition +`2*C*B + E <= Int::Limits::max*h` protects envelope sums, edge-finding +subtractions, divisions and the resulting integer casts. Task count squared +must also fit the native integer indexing range. Zero-resource tasks are ignored; +singleton tasks need only the direct height/capacity check. Pairwise-disjunctive +resource tasks use native unary propagation after an int64 comparison, avoiding +overflow in the cumulative implementation's sum of its two smallest heights. +Excessive ranges return Unsupported. These guards can reject large but otherwise +valid formulations; the model is never weakened to make posting succeed. +Every native candidate passes the separate original global +predicates with zero integrality tolerance before it can be accepted with an +Exact guarantee. Proof certificates are still unsupported. + +`test/optimize/globals.cpp` enumerates complete finite products using separate +predicates and checks both the independent validator and native min/max optima. +It covers aliases, negative labels, zero/empty cases, circuit subtours, task +boundary semantics, lifecycle/identity, malformed payloads, large arithmetic, +unsupported numerical routes and preservation through ordered objectives. +These are the first typed globals in the registry. Optional/variable-duration +scheduling, cumulative variables, counting/packing globals and general native +reification remain work in W4. The owning [FlatZinc compiler](FLATZINC-COMPILER.md) +now preserves the documented forms of these six global families. Regular has +separate signed-word enumeration and C/Python [binding checks](REGULAR-BINDINGS.md). diff --git a/docs/solver-parity/IMPLEMENTATION.md b/docs/solver-parity/IMPLEMENTATION.md new file mode 100644 index 0000000000..34149b980f --- /dev/null +++ b/docs/solver-parity/IMPLEMENTATION.md @@ -0,0 +1,134 @@ +# Implementation ledger + +Work is on `codex/solver-parity` in the independent checkout at +`implementation/gecode`. The original solver checkout, branch, uncommitted +source and benchmark binaries remain untouched. The enhanced source/test/input +snapshot is `e10562fd9`; `source-snapshot.json` records 2,963 input hashes. All +2,963 original files matched when checked after integration. + +This ledger covers the implemented slices of the ongoing W0–W14 roadmap. The +validation record identifies the exact source used for each completed gate. +They provide numerical LP/MILP modeling and workflows, persistent numerical +sessions, typed native globals, weighted feasibility repair, C/Python bindings, +an explicit bounded integer compiler to native Gecode search, ranked solution +pools, checked integer LP deductions, exact integer presolve/reconstruction, +interruption-safe native frontier bounds, bounded reliability branching, +verified root covers, continuous weighted-square QP and an owning FlatZinc +capture/compiler with a separate command-line solver. +Commercial-solver parity and the larger native search improvements remain +incomplete. The [algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md) adds bounded +native binary capacity optimization after [the ninth checkpoint](NINTH-CHECKPOINT.md). +Further roadmap implementation is on hold. Each report identifies its own +tested source, artifacts and prior-version comparison. + +## Implemented in this batch + +| Area | Delivered behavior | Where to start | +| --- | --- | --- | +| Native binary capacity optimization | Bounded exact dynamic programming supplies a checked witness preference and objective bound for one-row Binary capacity models; other search defaults are preserved | [Algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md) | +| Isolation and dependencies | Independent clone/branch, separate agent worktrees/build directories, preserved enhanced baseline, pinned HiGHS source | `source-snapshot.json`, `dependencies.json` | +| Sparse owning model | Five explicit variable domains; ranged linear rows; min/max/offsets; canonical sparse terms; stable model-aware handles, tombstones, revisions and snapshots | `gecode/optimize/model.hpp` | +| Bulk construction | Atomic variable/row batches and explicit CSR input, strong allocation-failure guarantee, geometric growth and no dense matrix allocation | [Bulk API](BULK.md) | +| Result and budget contract | Status separate from incumbent; backend/version attribution; numerical guarantee; missing-bound semantics; normalized/native gaps; shared time/cancellation and node budget primitives | `gecode/optimize/result.hpp` | +| Numerical backend | Optional HiGHS LP/MILP route, explicit unsupported classes/guarantees/scales, deadline-aware candidate capture, one worker per solve | `gecode/optimize/solve.hpp` | +| Independent checking | Structural trust boundary; original bounds, rows, integrality, objective and logical indicators; original-slot solution mapping | `gecode/optimize/validate.hpp` | +| Starts and edits | Numerical partial/complete starts; native exact complete starts with live indicator gate completion and strict improvement search; model edits and historical result ownership | `SolveOptions::primal_start`, `Model` | +| Persistent sessions | Compatible cost/bound/RHS edits retain LP bases; structural/type/owner changes reload; MIP witnesses are revalidated before reuse; fresh options, budgets and callback lifetime per solve | [Sessions](SESSIONS.md) | +| Explicit LP basis starts | Immutable original-model basis records, precise compatibility rejection and accepted/repaired submission reporting, with C/Python ownership | [Basis API](LP-BASIS.md), [Bindings](LP-BASIS-BINDINGS.md) | +| Serial scenario batches | Sparse coefficient, offset, variable-bound and row-side overrides; independent historical results, shared time/cancellation and optional private HiGHS session reuse, with C/Python ownership | [Scenarios](SCENARIOS.md), [Bindings](SCENARIO-BINDINGS.md) | +| Numerical LP evidence | Explicit private auxiliary solves recover checked original feasible bases/improving rays or signed Farkas contradictions; separate availability and raw stage history, with C/Python ownership | [LP evidence](LP-EVIDENCE.md), [Bindings](LP-EVIDENCE-BINDINGS.md) | +| Selected-basis LP sensitivity | Numerical objective-coefficient and equality-RHS intervals, private checked basis factorization without optimization runs, owning results and C/Python lifetime/cancellation behavior | [Sensitivity](LP-SENSITIVITY.md), [Bindings](LP-SENSITIVITY-BINDINGS.md) | +| Local Python wheel | Self-contained macOS arm64 C ABI, automatic package-relative loading, pinned notices and RECORD checks; isolated Python 3.12/3.14 installation tests | [Wheels](WHEELS.md) | +| Continuous LP observations | Owning original activities, two-sided slacks, duals, reduced costs and basis export with independent numerical KKT checking and C/Python access | [LP observations](LP-OBSERVATIONS.md) | +| Native integer route | Explicit `Backend::Native`, actual Space/IntVarArray and branch-and-bound, native reified indicators, exact original-integer witness checking within documented activity limits | [Native bridge](NATIVE.md) | +| Native global registry | Typed all-different, element, table, cumulative, circuit and Regular records; aliases/index bases retained; independent predicates and native compiler; automatic native dispatch for active globals | [Globals](GLOBALS.md) | +| Sparse checked integer LP | Binary and bounded-integer CSR storage, exact dual bounds and interval reductions, sibling-bound restoration and explicit native hybrid API; dense compatibility retained | [Sparse LP](SPARSE-LP.md), [Native LP](NATIVE-LP.md) | +| Native search frontier | Explicit best-bound or depth-first coordinator; exact interrupted global bounds, retained incumbents and bounded live regions, optional checked LP and opt-in bounded binary reliability probes | [Native search](NATIVE-SEARCH.md) | +| Native incumbent neighborhood | Explicit C++ BinaryHamming attempt after a checked incumbent, original-model improvement validation and shared bounded frontier accounting | [Neighborhoods](NATIVE-NEIGHBORHOODS.md) | +| Verified root covers | Budgeted binary cover separation, independent exact cut validation and explicit handoff to native LP/frontier search; separate cut and LP accounting | [Root covers](NATIVE-LP.md#optional-verified-root-covers) | +| Continuous quadratic models | Distinct owning weighted-affine-square model, bounded convex min/concave max through HiGHS QP, original primal/KKT checks and outward tangent bound; C/Python bindings | [Quadratic API](QUADRATIC.md) | +| FlatZinc pipeline | Owning capture, strict whole-model integer/Boolean compiler, supported implications/reifications, all-different/element, table/holey domains, explicit-offset circuit fixed-data cumulative and literal deterministic Regular; independent raw-source witness validation and explicit `fzn-gecode-optimize` CLI | [Compiler](FLATZINC-COMPILER.md), [Driver](FLATZINC-DRIVER.md) | +| Experimental MiniZinc route | Opt-in separate solver identity and dedicated library, explicit millisecond protocol, relocatable build/install registration and real pinned compiler/output checks | [MiniZinc](MINIZINC.md) | +| Exact presolve/postsolve | Signed interval implications, fixed substitution, redundant rows and immutable original/reduced mappings; explicit utility with exact historical witness reconstruction | [Presolve](PRESOLVE.md) | +| Solution pools | Ranked representatives over finite discrete projections, continuous recourse, original witness validation and separate RequestedLimit/Exhausted evidence | [Pools](POOLS.md) | +| Feasibility repair | Explicit weighted L1 row/bound relaxation on a distinct private model; optional ordered original-objective refinement; original residual reporting and separate proof/completion fields | [Repair](RELAXATION.md) | +| C and Python | Versioned C99 owning-handle boundary, immutable results, cancellation, sessions and model I/O; Python ctypes package; installed C consumer and backend-enabled/disabled conformance | [Bindings](BINDINGS.md) | +| Conflict diagnostics | Numerical deletion-minimal groups for rows, bounds, integrality and domains; original attribution and optional deletion witnesses; interruption cannot promote an incomplete conflict | [Diagnostics](DIAGNOSTICS.md) | +| Fast regression gate | Required native CP and numerical cases, plus sessions, diagnostics and exact native bridge; a 28-second whole-command budget and explicit incomplete-case failures | [Fast gate](FAST-REGRESSION.md) | +| Bounded indicators | Conservative domain-derived M, separate binary inactivity gate, preserved original logic, atomic posting, mutation/domain guards and checked removal | [Constraint helpers](CONSTRAINTS.md) | +| Boolean helpers | AND/OR equality, empty/single/multiple inputs, aliases and duplicates; atomic posting | [Constraint helpers](CONSTRAINTS.md) | +| Multiple objectives | Ordered linear stages, explicit degradation, one outer deadline, retained original-model feasible result, no false completion after interrupted stages | [Workflows](WORKFLOWS.md) | +| Model exchange | Strict numerical LP/free-MPS readers; 17-digit output; checked round trips; atomic replacement; explicit unsupported dialects | [I/O](IO.md) | +| Distribution and CLI | Standalone or opt-in native CMake component; installed package aliases; umbrella header; JSON file solver; isolated exact-check benchmark harness | [Build and API guide](README.md) | +| Verification and CI | Independent component tests, full-source sanitizers, cross-feature integration, native regressions, installed consumers, five existing MIPLIB models; added platform CI workflow | [Validation](VALIDATION.md) | + +The backend's search, presolve, cuts and heuristics in this new route are HiGHS +capabilities. Native Gecode CP and the checked sparse relaxation remain available through +their original interfaces. The explicit native hybrid adds certificate-checked +LP deductions to native propagation; its results identify both engines. Ordinary +numerical solves continue to use HiGHS search and ordinary native routing is unchanged. + +## Roadmap status and deferred completion gates + +These gates describe unfinished scope; they are not authorization to start a +new batch after the current integration checkpoint. + +| Work package | Status after this batch | Next completion gate | +| --- | --- | --- | +| W0 reproducible foundation | Source isolation/pin, correctness harness and bounded fast regression gate implemented; comprehensive performance baseline still outstanding | Freeze cold/warm tracks, machine/environment accounting and untouched holdout inputs; execute Windows containment CI and full timing gate before enabling that platform | +| W1 original-model IR | Linear numerical model, lifecycle, indicator metadata, six native globals and scoped owning FlatZinc capture/reconstruction implemented; broad capture admission remains | Expand native global registry and capture; measure original-model construction memory | +| W2 result/session contract | Results, budgets, capability query, persistent HiGHS sessions and owning continuous LP dual/basis observations and owning explicit basis submission implemented; cumulative backend usage remains | Interrupted-workflow accounting and action callback contracts; native persistent state | +| W3 usable LP/MILP route | First vertical slice implemented and tested; supported I/O dialect is explicit | Broader LP/numerical/general-integer panels, backend-alone comparisons and unsupported-format fixtures | +| W4 native and FlatZinc integration | Bounded integer linear/indicator native bridge and six typed globals; owning FlatZinc capture with explicit CLI and opt-in MiniZinc registration implemented; broader predicates remain | Broader preserved globals with exact raw-source checks and external CP panels | +| W5 native sparse relaxation | CSR binary and bounded-integer certificates/interval cuts, native propagation and explicit public hybrid bridge implemented and independently tested | Measure root/whole-solve benefit across families before changing defaults; expand exact arithmetic portability | +| W6 presolve/postsolve | Exact bounded-integer interval reductions and fixed substitution with owning reconstruction implemented; numerical route also uses HiGHS presolve | Expand mapped constraints and reductions, budgeted solve composition and measured default selection | +| W7 native branch-and-cut | Proof-carrying scoped pool, binary cover separator, verified root loop and explicit native LP/frontier handoff implemented; dynamic local cuts and broader separation remain | Broader separators, dynamic local-cut lifecycle and measurable root/whole-solve benefit | +| W8 native branching/global bounds | Explicit frontier/global bounds and opt-in bounded binary reliability probes implemented; broader branching and measured default selection remain | General integer/LP-informed scoring and whole-solve benefit across families with protected regressions | +| W9 primal portfolio | Numerical starts, exact complete native starts and one explicit bounded binary incumbent neighborhood implemented; partial native completion and repair/diving/RINS/LNS scheduling remain | Cold-start first-feasible gains, broader neighborhood policies and measured benefit with original-model checking | +| W10 learning/explanations | Architecture/source investigation, isolated pinned SAT protocol experiment and private uncompiled reason-contract header retained; 29,160 experiment queries pass normally and with full dependency sanitizers; no product learning runtime | Checked original-row conditional reason kernel; clone/recompute versus trailed learning pilot; representative benefit before defaults | +| W11 application workflows | Edits, starts, bounded logic, ordered objectives, numerical grouped conflicts, weighted repair, ranked pools, serial scenarios and selected-basis coefficient/equality sensitivity implemented; fine-grained indicator IIS, broader sensitivity and action callbacks remain | Workflow-by-workflow conformance and a backend/feature support matrix | +| W12 distribution/Python | C++ packaging, CLI and CI configuration implemented; versioned C ABI/Python including native globals, workflows and LP evidence; local macOS arm64 wheel implemented; other platforms and executed cross-platform CI remain | Expand typed/workflow binding surface, clean platform builds and installed consumers | +| W13 quadratic/nonlinear | Bounded weighted-square continuous QP with C/Python APIs and independent primal/KKT/bound checking implemented; general Hessians, QCP, MIQP and nonlinear support remain | Broader numerical QP panels and carefully scoped convex quadratic constraints before mixed-integer/nonconvex expansion | +| W14 native parallel hybrid | Not started | Worker-local state, sound shared bounds/cuts, race/lifecycle testing and uncontended scaling measurements | + +The seventh integrated checkpoint covers basis submission, Regular and C++ +scenario execution, including sanitizer, installed-consumer and wheel checks. +Its FAST gate passed 32 cases in 5.69 seconds external wall time. The eighth +checkpoint adds LP evidence, scenario C/Python bindings and MiniZinc registration, +with full sanitizer, installed-consumer and wheel gates. Its FAST gate passes +all 33 cases in 5.73 seconds external wall time, including analytic ray and Farkas +checks. Exact source and artifacts are listed in [the validation record](VALIDATION.md). +The ninth checkpoint integrates selected-basis LP sensitivity with C/Python +bindings and bounded native incumbent neighborhoods. It passes the enlarged +35-case FAST gate in 5.7852 seconds, all three CTest configurations, full native +sanitizers and fresh installed consumers. Its bounded old/new comparison finds +no repeated material case regression among five complete common-workload pairs; +one additional unchanged native case hits its existing deadline. Full results +and the timing limitation are in [the checkpoint report](NINTH-CHECKPOINT.md). +The separate [learning investigation](LEARNING-DESIGN.md) +has a checked external-propagation interface experiment; it is not yet a native +learning engine. Default performance +selection remains outstanding. Broad capture, cold-start primal portfolios, +LCG, quadratic constraints/nonlinear support, fine-grained application workflows +and native parallel hybrid search remain substantial unfinished work. This +ledger does not declare parity from surface API availability. + +The full research/source comparison and work-package acceptance criteria remain +in the workspace's `planning/solver-parity-plan.md`, `feature-matrix.md`, and +`research-agenda.md`. This ledger records implemented scope rather than marking +those larger packages complete on the strength of a few successful fixtures. + +## Parallel work and contention + +Model, result/budget and validation work first ran in independent worktrees. +The next independent pieces were indicators/Boolean logic, multiobjective +coordination and I/O. Each passed its own checks before cherry-picking into +this branch. Reviewers then checked one another's work; concrete defects became +regression tests before the integrated suite was rerun. + +No compilation or solver tests started until the preexisting size-scaling run +reported all 3,240 rows complete and its processes exited. Later builds used +bounded parallelism. All new outputs live under the isolated implementation +build directories; the existing benchmark suite was only read by the new +correctness harness. The five-model checks are explicitly not performance +measurements or evidence of native/commercial speed parity. diff --git a/docs/solver-parity/IO.md b/docs/solver-parity/IO.md new file mode 100644 index 0000000000..ef148de554 --- /dev/null +++ b/docs/solver-parity/IO.md @@ -0,0 +1,70 @@ +# Numerical LP/MPS I/O + +`read_model` and `write_model` implement a bounded, documented linear LP/free-MPS dialect. They do not use the HiGHS parser or writer and are available in builds without that backend. They preserve the numerical `double` model; they do not provide exact rational parsing, proof certificates, or support for every vendor extension. + +The reason for a separate implementation is semantic correctness. The pinned HiGHS 1.15.1 sources have several relevant paths: + +- `highs/io/HMPSIO.cpp` writes numerical values using `%.15g`, which can merge distinct `double` values. +- `highs/io/FilereaderLp.cpp` assigns objective coefficients by variable index; repeated LP objective terms from `filereaderlp/reader.cpp` can overwrite instead of add. +- The LP expression parser records constants on constraint left sides, while the adapter copies its constraint bounds without subtracting those constants. +- LP export can omit zero-cost, otherwise unused columns and lose semi-integer declarations. +- MPS `BV` establishes both binary bounds. The free-MPS parser ignores following `LO`/`UP` records as duplicates, so that encoding cannot portably express tighter binary domains. + +These findings motivated replacement, rather than a claim that a successful backend import proves faithful conversion. No dependency source was changed. + +## Import contract + +Only uncompressed `.lp` and `.mps` suffixes are accepted, case-insensitively. Unknown formats, unreadable files, malformed records, NaN, coefficient infinities, numeric overflow/underflow and unsupported constructs produce `ModelError`. Tiny nonzero coefficients are preserved here; the numerical solving adapter can subsequently reject unsupported magnitudes explicitly. + +Names in the supported external dialect are identifiers beginning with an ASCII letter or underscore and continuing with letters, digits or underscores. Fixed-column files using ordinary whitespace-separated identifiers are supported; names containing embedded spaces, quoted names, omitted repeated column names and SIF extensions are outside this initial dialect. The five unchanged local MIPLIB 3.0 files `p0033`, `lseu`, `p0201`, `p0282` and `p0548` pass import tests. + +LP supports: + +- One `Minimize`/`Maximize` objective, a `Subject To` section, optional `Bounds`, `Binary`, `General` and `Semi` sections, and required `End`. Common aliases such as `min`, `max`, `st`, `binaries`, `generals` and `semi-continuous` are accepted. +- Signed linear terms, decimal/scientific numbers, repeated terms combined additively, objective offsets and constants on constraint left sides. Constant accumulation retains compensation through RHS subtraction before conversion to the final `double` bound; for example, `x + 1 - 1e16 >= -1e16` becomes `x >= -1`. Numeric coefficients and variable names require separating whitespace. Bounds and expressions use the original numerical units. +- One `<=`, `>=` or `=` comparison with numeric RHS per constraint. Objective expressions can wrap across lines. Constraints can wrap before their comparison/RHS; complete constraints must start separate lines. Multi-comparison ranged expressions are rejected; export uses equivalent paired inequalities instead. +- Bounds `lower <= x <= upper`, `x <= upper`, `x >= lower`, `x = value`, `lower <= x`, and `x free`, with explicit signed infinity where appropriate. Repeated definitions of the same bound side are rejected. +- Semi-continuous variables and semi-integer variables declared in both `General` and `Semi`. Semi domains are `{0} union [lower,upper]`; the initial model requires a strictly positive finite lower bound. Default undeclared LP variables are continuous on `[0,+infinity)`. +- Backslash comments. SOS, indicators, quadratic expressions, piecewise-linear sections, strict comparisons and other unsupported syntax are rejected. + +MPS supports: + +- `NAME`, optional `OBJSENSE` on the same or next line, `ROWS`, `COLUMNS`, optional `RHS`, `RANGES`, `BOUNDS`, and required `ENDATA`. +- First `N` row as objective; later `N` rows remain free constraints. `L`, `G` and `E` rows, one or two row/value pairs per COLUMNS/RHS/RANGES record, decimal/scientific values and `D` exponent notation. +- Integer markers `INTORG`/`INTEND`. A marker-only integer column with no explicit bounds defaults to `[0,1]`; the writer always emits explicit bounds. `LO`, `UP`, `FX`, `FR`, `MI`, `PL`, `BV`, `LI`, `UI`, `SC`, and `SI` bounds are supported. Ambiguous overlapping bound definitions and conflicting type declarations are rejected. `BV` sets both bounds and cannot be combined with other bounds for that variable. `SC` on an already integral column (integer marker, `LI` or `UI`) is rejected; use `SI` to explicitly preserve integrality. `SI` accepts an integer marker or preceding `LI`, but cannot be combined with `BV`/`SC`. Ordinary `LO` plus `SC`/`SI` remains supported. +- One RHS vector, one range vector and one bound vector. Multiple vectors, unknown row/column references, duplicate RHS/range records and unsupported sections fail explicitly. Repeated COLUMNS coefficients are summed, including objective coefficients. +- Standard range signs and the objective RHS offset convention: an objective RHS value `b` represents offset `-b`. +- Asterisk comments. Quadratic/SOS/indicator sections, `OBJNAME` objective selection, multiobjective extensions, SIF, compression and ambiguous dialects are rejected. + +Import creates a new `ModelId`, fresh handles and a new revision history. Never reuse handles from the exporting model against an imported model. + +## Export and names + +The writer uses `max_digits10` (17 significant digits for `double`) for coefficients, bounds, costs and offsets. Every active variable is emitted, including otherwise unreferenced zero-cost variables. Variable types, fixed/free/infinite bounds, row relations, sense and objective constant are checked on the subsequent round trip. Deleted slots compact; no tombstone or old handle survives import. + +File identifiers are deterministic `x0`, `x1`, … and `r0`, `r1`, …, avoiding illegal names, collisions, reserved words and syntax injection. Original display names, including duplicate/empty names, Unicode, quotes and newlines, are preserved in hex-encoded `GECODE_NAME` comments and restored by this reader. Other solvers see the canonical identifiers while retaining the same mathematics. Comments are parsed as data, with unknown entity references and malformed metadata rejected. + +LP ranged rows are written as two ordinary inequalities plus a `GECODE_RANGE` comment. On reimport, both rows must have matching canonical expressions and the expected bounds before they are recombined. Other readers see the equivalent pair of inequalities. MPS uses its native RANGES section. If a range width cannot be represented and reread without changing the original bounds, MPS export fails; use LP's paired inequalities in that case. MPS semi-variable export currently requires a finite upper bound; LP can represent the abstract infinite-upper-bound semi domain. + +MPS binary export currently requires the original bounds to be exactly `[0,1]` and emits a single `BV` record without redundant `LO`/`UP` records. Tighter binary bounds, including fixed binaries, fail before any destination mutation; use LP in that case. LP exports of fractional and fixed binary bounds are checked independently with HiGHS 1.15.1. This restriction avoids a known disagreement between MPS readers rather than silently widening a domain. + +Original indicator semantics and their bound guards cannot be encoded by these linear formats. Export of a snapshot containing active indicator metadata is rejected; silently writing only the derived big-M rows would lose that contract. + +## Destination safety and verification + +Export first validates and compacts the source, serializes to a newly created exclusive temporary file in the destination directory, and closes it with checked write/flush/close results. It then imports that temporary file and compares **every** active variable type, bound and display name; row count, bounds, terms and names; and objective sense, terms and offset. Only an exact numerical match permits same-directory atomic replacement. + +An existing destination remains unchanged if structural checks, serialization, reimport, semantic comparison, writing or replacement fails. Temporary files are removed on all ordinary failure paths. Replacement uses `rename` on POSIX and `MoveFileExW(..., MOVEFILE_REPLACE_EXISTING)` on Windows. This provides atomic visibility, not a promise of power-loss durability on every filesystem. The writer does not retain the old destination's inode, permissions or ACLs. + +## Tests + +`test/optimize/io.cpp` includes: + +- Both formats: all five variable types, integer versus binary distinction, unused columns, free/fractional bounds, ranged/equality/free/constant rows, offsets, maximization, display names and tombstone compaction. LP additionally checks fixed and fractional binary bounds; MPS rejects these while preserving the existing destination. +- Precision regression `a=100000000000000.125`, `b=100000000000000.25`, with `a*x >= b` and integer `x`: exact round-trip coefficients retain minimum `2`; 15-digit rounding can incorrectly make it `1`. +- Duplicate objective terms, LHS constants and cancellation across the RHS in all three row relations, wrapped LP rows, both `General`/`Semi` declaration orders, MPS range signs, conflicting MPS type declaration orderings and tiny nonzero coefficients. +- Unsupported features, malformed files, ambiguous bounds, missing files, unsupported extensions, preexisting destinations, failed replacement, a post-write semantic rejection and temporary-file cleanup. +- Optional conventional public MPS imports and complete LP/MPS re-export checks when their directory is supplied as the first command argument. These are parsing/domain/round-trip checks; they do not claim performance or optimality. +- With `GECODE_OPTIMIZE_IO_TEST_HIGHS` defined and HiGHS linked, an independent parser compares every exported variable domain and objective coefficient, row bounds and sparse coefficients, objective sense and offset. Fixtures include all five variable types, unused columns, the precision regression, tighter binary LP bounds and both-format re-exports of the five public inputs. Private display names and the API distinction between binary and integer `[0,1]` are checked by the native round trip; HiGHS represents both as integer. HiGHS' free-MPS parser discards unconstrained `N` rows, which the cross-reader comparison permits because they do not change the feasible set or objective. Tiny coefficients outside the backend's accepted numerical range remain covered by the native I/O tests rather than this backend comparison. + +Normal and address/undefined sanitizer builds are run separately from any timing benchmark. The current test run is recorded in the implementation handoff; cross-platform behavior requires the project's platform CI before a Windows support claim. diff --git a/docs/solver-parity/LEARNING-DESIGN.md b/docs/solver-parity/LEARNING-DESIGN.md new file mode 100644 index 0000000000..59a40ff63d --- /dev/null +++ b/docs/solver-parity/LEARNING-DESIGN.md @@ -0,0 +1,211 @@ +# W10 explanation and learning architecture + +Status: source/interface investigation and an independently checked protocol +experiment. No production learning solver, Gecode explanation hook or learning +default is implemented by this slice. The eighth integrated checkpoint remains +the last completed product gate. + +## Decision and evidence + +Develop a checked, solver-independent integer-row reason kernel before selecting +the search architecture. Compare a reason-aware clone/recompute path with a +private trailed propagation engine controlled by a maintained SAT solver. Keep +existing Space, Propagator, variable and search layouts unchanged during this +comparison. The current ordinary/native solver routes remain available for +models outside the explanation pilot. + +Local code supports this separation. `gecode/kernel/core.hpp` declares +`Propagator::propagate` as an execution-status operation, without a reason +history for each domain update. `gecode/search/nogoods.hh` implements path +nogoods; `gecode/search/seq/path.hpp` manages cloned Spaces and Choices for +recomputation. These mechanisms alone do not explain arbitrary propagation. +The existing exact integer presolve arithmetic is a useful reference, but its +change records omit the antecedent box needed for reusable conditional reasons. + +The foundational CP-controlled design uses linked integer and Boolean views; +its experiments also show that encoding and search choices affect learning's +benefit. That motivates a matched comparison rather than an implicit switch of +every Gecode model. [Feydy and Stuckey, CP 2009](https://people.eng.unimelb.edu.au/pstuckey/papers/cp09-lc.pdf). + +A recent modular architecture places SAT in control and reports integer-domain +assignments/backtracks through external propagation. Its interface restriction +on introducing literals while explaining deductions favors storing complete +reasons eagerly in our first pilot. [Dekker et al., CP 2025](https://doi.org/10.4230/LIPIcs.CP.2025.42). + +Trail-only explanations, historical explanation reconstruction and proof logging +have different requirements. A learned clause is not by itself an independently +checked proof of the original CP problem. Vocabulary and explanation cost must +be measured as well as node reduction. [Ohrimenko, Stuckey and Codish, 2026](https://doi.org/10.1007/s10601-026-09390-9). + +## Pinned external-propagation experiment + +The candidate library is CaDiCaL 3.0.1, MIT, commit +`c60730422e758ef1cebe7aeddf2dda31c996bf04`. It is a separate workspace dependency, +not linked into Gecode, packaged, downloaded at build time or selected by Auto. +The public header's version macros lag its VERSION/build header; the experiment +checks the exact source commit. See `tools/research/cadical-dependency.json`. +[Pinned upstream source](https://github.com/arminbiere/cadical/tree/c60730422e758ef1cebe7aeddf2dda31c996bf04), +[IPASIR-UP paper](https://doi.org/10.4230/LIPIcs.SAT.2023.8). + +The audited paths are `src/cadical.hpp`, `src/external_propagate.cpp`, +`src/external.cpp`, `src/solver.cpp` and the upstream +`test/api/example_propagators.cpp`. The latter is explicitly a demonstration +with simplified behavior and documented pitfalls, not a performance benchmark. +The API and callback implementation establish the following obligations: + +| Contract | Pilot requirement | +| --- | --- | +| Connect one propagator, then observe its variables | Explicit ownership and destruction ordering; disconnect before releasing reason storage | +| Variables can also be introduced internally by the solver | Use explicit variable declaration and retain the returned mapping; never guess the next ID | +| Assignment notifications may be batched | Maintain a level-aware assignment trail; preserve root assignments across backtracks | +| Reasons can be requested later | Store immutable clauses while their deductions are live; no fresh literals during explanation | +| Reasons contain the propagated literal and only observed variables | Check IDs, sign, terminator and consequence before exposing a stream | +| External clauses are trusted as input by SAT | Independently validate row/domain derivations before any clause can prune | +| A rejected complete model requires a clause or new observed variables | Always provide a checked explanation; never repeatedly reject without progress | +| Empty/root-falsified clauses establish UNSAT | Missing explanation, cancellation and allocation failure must never become an empty clause | +| API contract violations can abort the process | Check all states before calls; contain C++ exceptions inside production callbacks and discard results after errors | +| Reason forgettability is configurable | Set it explicitly: comments disagree, while the implementation reads `are_reasons_forgettable` | + +`tools/research/cadical_protocol.cpp` is an independent bounded fixture for +signed at-most-k constraints plus ordinary CNF. It enumerates every assignment +of the original external constraint before emitting each lemma. An independent +enumerator checks SAT/UNSAT and returned witnesses for every query. The same +solver handles all 81 partial assignments of four variables twice, in opposite +orders, across three sign patterns, five cardinalities, three CNF sets, eager +and model-check-only propagation, and two chronological-backtracking settings. +It also interrupts and resumes a fresh eight-variable solve. + +The fixture uses fixed-capacity callback records with assertions and no callback +allocation. It is not a reusable production bridge and does not establish +exception/allocation-failure containment for such a bridge. Its counters +distinguish supplied propagations, streamed reasons, checked lemmas and rejected +complete models. A level drop greater than one includes query resets, so that +counter is not evidence that every such event is a learned conflict backjump. +The delayed-reason counter measures intervening notification/decision events, +not elapsed time or an assertion that a reason crossed a backtrack. + +Build this experiment separately after explicitly building the pinned library: + +```sh +cmake -S tools/research -B build/w10-protocol \ + -DGECODE_LCG_CADICAL_SOURCE="$(cd ../deps/CaDiCaL-3.0.1 && pwd)" \ + -DGECODE_LCG_CADICAL_LIBRARY="$(cd ../deps/CaDiCaL-3.0.1/build-optimize-spike && pwd)/libcadical.a" +cmake --build build/w10-protocol -j2 +ctest --test-dir build/w10-protocol --output-on-failure +``` + +The configure records source-header and supplied-library SHA-256 values. A +prebuilt library hash identifies the bytes but does not prove how they were +compiled; retain the dependency's configure/build logs as well. For sanitizer +validation, instrument the entire dependency and the fixture with matching +AddressSanitizer/UndefinedBehaviorSanitizer flags. + +## First implementation boundary: checked conditional row reasons + +Keep this boundary private until the architecture and budgets are reviewed. It +is an explanation utility, not a solve or a proof-certificate API. + +1. Admission owns a historical `ModelSnapshot` and validates every original + handle/reference. Admit finite Integer/Binary domains and ordinary linear + rows with integral domain endpoints, coefficients and finite row sides of + magnitude at most 2^53. Fractional bounds on Integer/Binary IR variables are + unsupported in this slice. Reject active globals, + indicators, continuous/semi domains and unsupported provenance. Unsupported + constraints cannot be silently omitted when this becomes a search engine. + Objective data has no role in this feasibility-reason utility; the eventual + SAT pilot initially requires a constant objective. +2. Compile original row sides and domains once into checked int64 data. A + successful compiled owner is immutable. Model/revision fields alone cannot + authenticate a forged public snapshot, so reason checking retains that exact + owner rather than reopening a live model with matching IDs. +3. Bound literals mean `x >= k` or `x <= k`, over original stable variable IDs. + Complement uses checked integer arithmetic: `not(x <= k)` is `x >= k+1`. + Root facts, decisions and deductions are distinct. A missing deduction reason + is an error/unsupported case, never a root fact. +4. A row reason records its source owner, original row and finite side, immutable + antecedent bound facts, and either a consequence or contradiction. Every + antecedent is conditional: the source model plus those facts entails the + consequence. Such a record does not assert that its antecedents hold globally. +5. Reconstruct the input box from original domains and explicit antecedent facts; + never use an unexplained stronger input box. Generate implications from that + unchanged box using signed row extrema + and exact floor/ceiling division. Emit only strict tightenings; retain all + relevant selected bound facts in the first implementation. Reason + minimization comes later, after correctness and size measurements. +6. Independently verify each candidate by intersecting original domains with its + antecedents and the negated consequence, then checking a contradiction with + the named original row side. The checker does not trust cached activities, + copied coefficients, an alleged deduction bound or generation intermediates. + Check antecedent consistency before adding the negated consequence. Reject + root-implied/redundant consequences whose complement alone contradicts a root + domain, rather than accidentally attributing a domain tautology to a row. + Reject malformed, inconsistent or irrelevant provenance rather than relying + on accidental vacuity. Threshold complements at int64 MIN/MAX use checked + rejection in this slice. Any later explicit RootFact tag must be checked + against the frozen original domain before it can be omitted. Exact arithmetic + overflow yields no accepted reason. +7. Bound construction, copying, traversal and output storage must be budgeted. + Return a complete bounded batch or a clearly interrupted/rejected batch; + no partially exposed unverified clauses. Counter increments, products, sums, + subtraction and division all use checked operations without signed overflow. +8. Tiny finite-grid tests independently enumerate the original domains and row + predicate. Corrupt owner, revision, side, bound, variable and antecedents; + invalid claims must be rejected, while valid weaker reasons may remain valid. + Include negative domains/coefficient signs, equality/ranged sides, constants, + fixed variables, tombstones, exact-limit arithmetic and overflow rejection. + +This kernel does not claim explanations for existing Gecode propagators. Later +constraints require their own valid reasons or a supported explained +decomposition, with an independent original-constraint predicate. + +## Competing search integration experiments + +| Question | Clone/recompute candidate | Trailed external-SAT candidate | +| --- | --- | --- | +| State | Reason-aware bounded propagators in cloned/replayed Spaces | Explicit integer domains and a reversible trail owned by one external propagator | +| Identity | Stable original IDs independent of Space/VarImp addresses | Stable original IDs mapped to explicitly declared SAT bound literals | +| Replay | Recompute consequences and check/reuse reasons under the replayed facts | Assignment/backtrack notifications restore domains and subscriptions | +| Clause handling | Requires a maintained clause engine and integration with replay/backjumping | SAT owns watched clauses, analysis, backtracking and database management | +| Coverage | Existing arbitrary propagators still lack reasons | Only explicitly supported explained constraints enter the pilot | +| Main risk | Reason ownership, clone size and replay overhead | Boolean encoding size, notification/history cost and loss of strong native globals | + +Use the same admitted row models, branch order where controllable, and original +witness checker. Measure reason generation/storage, clones/replay or trail +updates, literal count, callback traffic, learned-clause reuse, first solution, +proof time and peak memory. Compare compiled-but-disabled overhead as well as +learning enabled. Boolean templates establish protocol correctness only; +bounded general-integer rows and at least one table and one scheduling family +are required before concluding that the architecture improves Gecode. + +Fresh pilot solves own private learned state. Optimization follows satisfaction +only after cutoff literals, assumptions and clause scope are designed. Clauses +derived under an objective cutoff must be guarded; relaxing a cutoff or editing +a model cannot reuse those clauses unconditionally. Unknown/interrupted search +cannot become global UNSAT or optimality. A full proof route additionally needs +an original-constraint proof format and independent checker; the SAT library's +proof treating external lemmas as new inputs is insufficient. + +## Remaining research and acceptance + +- Pin and audit Chuffed and Huub source before describing source-level behavior. + Their papers/README are evidence for candidate architecture, not a completed + implementation audit. Huub's CP 2025 paper archives code as + `swh:1:dir:b28854946ae60e86a37051ea89465cce8b84b7ed`. +- Examine CP-SAT's integer trail, reason storage, conditional bounds and + scheduling explanations at a pinned release; record transferable contracts + separately from performance claims. +- Freeze the reason utility's resource and failure semantics after independent + review; implement it and its finite-grid checker before connecting it to SAT. +- Exercise delayed reasons, same-level and multi-level backtracking, restart, + replay, assumptions, cancellation and destruction. Fault injection must show + that a failed explanation cannot escape as a trusted clause. +- Compare the complete supported models with Chuffed/CP-SAT and unchanged native + Gecode using identical inputs and shared limits. Report unavailable competitor + binaries as missing evidence. Preserve a holdout by family and include + learning-disabled regressions. +- Add a bounded representative case to FAST once an actual pilot exists. The + standalone protocol fixture does not substitute for original-model solver + correctness or a measurable native performance improvement. + +W10 remains incomplete until the learned search, reason coverage, lifecycle, +original-model correctness and representative benefit gates are met. diff --git a/docs/solver-parity/LP-BASIS-BINDINGS.md b/docs/solver-parity/LP-BASIS-BINDINGS.md new file mode 100644 index 0000000000..6c766cc05b --- /dev/null +++ b/docs/solver-parity/LP-BASIS-BINDINGS.md @@ -0,0 +1,39 @@ +# C and Python basis submission + +This additive ABI v1 surface binds [the O2 basis contract](LP-BASIS.md). It supports ordinary continuous linear models through the numerical HiGHS route. Native, Exact, and Certified solve requests return `Unsupported`; no relaxation or solver fallback occurs. Basis construction itself needs no backend. + +`basis_from_model` copies the current model snapshot and caller status arrays. Counts include every original variable and row slot, including deleted history. Status `-1` denotes an inactive slot; every active slot needs one of the explicitly mapped `GECODE_OPT_LP_BASIS_*` values. The factory checks dimensions, domains, status applicability, and basic count. It cannot promise nonsingularity: HiGHS factorization occurs only during a budgeted submission. `basis_from_observed` requires an owning observation token whose basis group is available. A detached Python `LpObservations` value contains observations, not the full source model, and is not an input to this factory. + +`solve_lp_with_basis` and `session_solve_lp_with_basis` take the existing `gecode_opt_lp_options_v1` record. Its exact outer and nested sizes, zero reserved fields, finite tolerances, and request flags are checked. Simultaneous primal starts are invalid. The basis must match the current source owner, revision, active entities, labels, matrix, bounds, and objective. Inactive payload content is not compared. Edits, even edits to an equivalent model, require a new basis. Admission failures never submit a basis or trigger an ordinary solve. Session recovery after a backend submission failure follows the C++ clean-reload policy. + +The result keeps the solve's ordinary termination and a separate submission report. `Accepted` means the statuses returned immediately after `setBasis` matched the request. `Repaired` means HiGHS changed them during that operation. Neither is a numerical optimality certificate, a final optimal basis, or a saved search checkpoint. A later time limit may coexist with accepted submission facts. `statuses_changed` has an explicit presence flag; it is absent before a completed submission. Final observations can be unavailable independently of the requested basis and submission report. + +All tokens own their data. `basis_result_copy_basis`, `basis_result_copy_observed`, and the existing `lp_observed_result_copy_result` allocate independent registry tokens; closing a parent, model, or session leaves copied children valid. Results retain historical original entity identities. Entity lookups reject wrong kind, foreign owner, out-of-range and deleted slots. Wrong or destroyed opaque tokens return `INVALID_HANDLE`. Missing requested basis is the distinct `NO_BASIS` error (defensive handling of an empty C++ result); missing observations retain `NO_OBSERVATIONS`. A present but unavailable basis observation is a `MODEL_ERROR`, with an actionable message. C++ exceptions never cross the C boundary. + +Array and text queries use null/capacity zero to obtain the required count. Short buffers receive no partial output; text counts include the terminating NUL. Input counts are checked for address/vector overflow before traversal. Factory output handles are initialized to zero before work. Info output records require exact `sizeof` and return zero reserved fields. No accessor returns borrowed vector storage. Registry lookup retains shared ownership and releases the global registry lock before copying or solving; per-model and per-session locks preserve existing serialization. Destroy invalidates its token immediately while a lookup already in flight may complete using its retained ownership. + +Python exposes `LpBasis`, `LpBasisInfo`, `LpBasisOrigin`, `LpBasisSubmissionState`, `LpBasisSubmission`, and `LpBasisSolveResult`. Ordinary sequences work without NumPy; `None` denotes inactive statuses. Booleans, fractional values, unknown integers, and statuses outside the ABI range are rejected before C conversion. Basis information and submission reports are frozen values; status lists are immutable tuples. Owners support explicit `close()` and context managers. + +```python +from gecode_optimize import Model, LpBasis, Session, load_library + +library = load_library() +with Model(library) as model: + x = model.add_variable(lower=0, upper=10) + model.add_row([(x, 1)], lower=4) + model.set_objective([(x, 2)], offset=7) + with model.solve_lp_observed() as first: + basis = LpBasis.from_observed(first) + with basis, Session(library) as session: + with session.solve_lp_with_basis(model, basis) as submitted: + print(submitted.submission.state, submitted.termination) + observed = submitted.copy_observed() +# The independently owned historical result survives every context above. +with observed, observed.copy_result() as result: + assert result.value(x) == 4 + assert result.objective == 15 +``` + +For application code, construct and share a public `Library(path)` instance when selecting a library explicitly; using the same implicit default also shares an ABI instance. Python rejects cross-library entities and owners. Same-library foreign model identity reaches the C++ admission gate and returns `InvalidModel`, preserving its status rather than turning it into an opaque-handle error. + +`test/optimize/lp_basis_c_api.c` is an actual C99 consumer. `python/tests/test_lp_basis.py` covers accepted and repaired submission, nonoptimal requested basis versus final basis, historical child ownership, tombstones, source edits, invalid enums/counts/options, cancellation and zero-time reset, empty/zero-row models, max sense and offsets, missing backend, and unavailable export. Existing C++ O2 tests exercise the separately compiled post-real-submission failure seam; production contains no injected hook. These bindings add no claim of checkpointing, basis transfer between revisions, rays, sensitivity ranges, or exact proof. diff --git a/docs/solver-parity/LP-BASIS.md b/docs/solver-parity/LP-BASIS.md new file mode 100644 index 0000000000..2046cf3479 --- /dev/null +++ b/docs/solver-parity/LP-BASIS.md @@ -0,0 +1,150 @@ +# Owning LP basis starts: O2 + +`make_lp_basis` copies either an available O1 basis or caller-created +`LpBasisData` into an immutable owning `LpBasis`. `solve_lp_with_basis` and its +`SolveSession` overload return an ordinary observed solve plus a separate +submission report and an owning reference to the requested basis. Existing +`SolveOptions`, `LpObservationOptions`, and O1 record layouts are unchanged. + +```cpp +using namespace Gecode::Optimize; +auto first = solve_lp_observed(model); +if (first.observations && + first.observations->basis().state == LpObservationState::Available) { + LpBasisSolveOptions options; + options.basis = make_lp_basis(*first.observations); + auto next = solve_lp_with_basis(model, options); + // next.submission describes submission; next.observed.result describes solve. +} +``` + +## Initial source and status policy + +A basis source must be an ordinary Continuous linear model with no active +indicator/global records or constant rows. Each row/column status vector has +exactly the original slot count; live slots have a status, tombstones have none. +Every enum is checked explicitly. Lower/Upper require the corresponding finite +bound; Zero requires a free row/column. Fixed entities may be nonbasic on either +side. NonbasicUnspecified lets HiGHS choose its nonbasic position. Basic statuses +are permitted on any entity, but the total number of basic entities must equal +the number of active rows. These structural checks do not claim nonsingularity, +primal feasibility, dual feasibility, or optimality. A valid nonoptimal basis is +a legitimate start. + +Caller data is copied before the factory returns. Changes to its source or status +arrays cannot alter the artifact. Basis origin records whether the factory used +caller data or an O1 observation. An unavailable O1 basis cannot be converted +into an empty or fabricated start. + +The first submission policy requires the same source model owner, revision, +original variable/row slot identities and active masks. Active variable types, +bounds and names; active row bounds, names and matrix terms; and objective sense, +offset and coefficients must match exactly under ordinary scalar/string equality. +The same revision alone is insufficient: public snapshots are untrusted. Inactive +payloads do not describe the mathematical model and need not match; inactive +variable/row identities and masks still must match. Every complete input snapshot +is independently structurally validated, including original protected metadata. +Active indicators/globals remain unsupported. + +Changing a cost, bound, row side, sense, offset or active name/revision requires a +new basis artifact. More permissive compatible-matrix hint policies are deferred. +The existing internal session basis reuse policy is unchanged and is separate +from this public source-matched submission contract. Foreign source owners, +malformed dimensions/statuses and source mismatches fail before backend/session +mutation. A missing `basis` is an explicit InvalidModel input error; the API never +silently turns into an ordinary solve. Simultaneous `primal_start` is rejected +rather than assigning implicit precedence. + +Numerical HiGHS is the only supported backend/guarantee. Native, Exact and +Certified remain explicit Unsupported. A missing HiGHS build returns Unsupported +without a backend attempt. Basis factories perform structural checks without +requiring an installed numerical backend. Empty models can carry a valid empty +basis; the existing direct empty-model solve performs no basis submission and +reports NotAttempted. + +## What submission states mean + +* **NotAttempted:** admission, unsupported routing, a pre-submission limit, or an + empty model prevented a backend basis call. The ordinary result explains why. +* **Accepted:** HiGHS accepted and returned structurally valid statuses identical + to the request, before optimization. +* **Repaired:** HiGHS accepted but changed at least one status during its immediate + basis factorization/repair step. This includes completing/replacing singular + structural columns with logical row columns, and any nonbasic normalization. +* **Rejected:** backend submission or validation of its returned status data + failed. Allocation failure also prevents completing submission and has the + separate ordinary MemoryLimit termination. No fallback optimization occurs. +* **Interrupted:** the submission/checking phase crossed its cooperative budget; + complete accepted-status information is not published. + +`backend_attempted` records whether `setBasis` was entered. `statuses_changed` is +absent until the accepted returned statuses have been completely checked; false +is distinct from absent. An accepted/repaired submission can be followed by a +limited, infeasible, unbounded or failed solve. It is not evidence that the final +solve is optimal or faster. Changes to the *final optimum basis* do not retroactively +turn Accepted into Repaired. Earlier submission facts may survive a later solve +limit, while O1 follows its own conservative final-limit clearing policy. + +The result retains the requested basis and its original source independently of +the input options, model and session. Final observations and ordinary result are +separate owning historical artifacts. No checkpoint, saved search tree, exact +proof, conditioning guarantee or independent nonsingularity certificate is +provided. + +## Backend mechanics, cleanup and budget + +Pinned HiGHS 1.15.1 checks and factors nonzero-row alien bases inside `setBasis`, +which may repair singular or incomplete bases. O2 always uses that alien path for +nonzero rows, even when the source artifact came from HiGHS observations. It does +not trust a caller-provided validity flag. Returned statuses are inspected and +compared **immediately after `setBasis`, before `run`**. All compact slots are +mapped explicitly to original slots and revalidated. +[HiGHS setBasis](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L2732), +[alien basis accommodation](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsSolution.cpp#L1850). + +The pinned alien zero-row branch indexes internal column-status storage before +its general dimension check. O2 avoids that branch: zero rows require zero basic +entities and exact dimensions, so the basis matrix has dimension zero; a checked +non-alien basis uses HiGHS's consistency path. This limited exception does not +trust a potentially singular nonzero-dimensional caller basis. + +The shared monotonic budget starts before source copying and covers admission, +conversion, basis preparation, factorization/repair, optimization, O1 checks and +cleanup. Interrupt callbacks and the remaining HiGHS time limit are installed +before submission. Remaining time is reapplied before optimization without +restarting the outer clock. Factorization/scaling may contain uninterruptible +regions; checks around those regions prevent a late phase from publishing a +false completion but do not guarantee forced wall-clock preemption. + +Rejected or interrupted submission unwinds the callback scope before discarding +the dirty backend. The next session call loads a clean model. A backend rejection +does not trigger a hidden cold solve. Ordinary subsequent solves reset their +per-call options and work normally. Explicit submitted bases are not counted as +an internally retained `basis_warm_starts` statistic. Other model-load/update +statistics retain their existing meanings. + +## Verification and build integration + +`test/optimize/lp_basis.cpp` covers copied factory ownership, malformed IDs/statuses, +missing/extra slots, invalid finite-side/zero statuses, incorrect basic counts, +all active-content/revision compatibility gates, missing starts/backend, +unsupported policies, simultaneous primal starts, a nonoptimal accepted basis +whose final optimum basis differs, singular repair, safe zero-row submission, +tombstones, ordinary/observed session reuse, disabled O1 groups and pre-cancellation. + +`test/optimize/lp_basis_failure.cpp` is a **separately compiled test variant**. +Compile `solve.cpp` with `GECODE_OPTIMIZE_WITH_HIGHS=1` and +`GECODE_OPTIMIZE_TEST_LP_BASIS_FAILURE=1`, and link this test with the remaining +ordinary Optimize objects plus real HiGHS. The test supplies the private selector +`Detail::lp_basis_test_cancel()`. Immediately after a successful *real* `setBasis` +mutation, the variant injects either a backend error result or cancellation. It +checks no fallback, no stale observation publication, callback/dirty-state cleanup, +and a successful next ordinary solve with a new model load. The variant also +covers zero-row rejection. Its selector and injection code are absent from +production binaries; the normal test uses unmodified backend return values. + +Normal and fully instrumented facade/HiGHS ASan+UBSan panels are required, along +with backend-free admission tests and O1/ordinary solve/session regression tests. +`lp_basis_detail.hpp` is private and must not be installed. Root build registration +and later C/Python bindings remain separate integration work. Rays, basis solves, +sensitivity/ranging and compatible-edited-source hints remain outside O2. diff --git a/docs/solver-parity/LP-EVIDENCE-BINDINGS.md b/docs/solver-parity/LP-EVIDENCE-BINDINGS.md new file mode 100644 index 0000000000..5a3c78223f --- /dev/null +++ b/docs/solver-parity/LP-EVIDENCE-BINDINGS.md @@ -0,0 +1,162 @@ +# Numerical LP evidence in C and Python + +The additive ABI 1 and Python interface expose the explicit additional-work +[O3 workflow](LP-EVIDENCE.md). It searches private auxiliary models for a feasible +base point and improving recession direction, or an original-side Farkas +contradiction. It never changes a source model, session or historical solve result. +`Complete` describes completion of the analysis. `Available` denotes independently +checked **numerical evidence**, not an exact certificate or proof of an infinite +feasible trajectory. + +```python +from gecode_optimize import (Model, LpEvidenceOptions, LpEvidenceRequest, + LpEvidenceState) + +saved_stage = None +with Model() as model: + x = model.add_variable() # continuous, lower 0, upper +infinity + model.set_objective([(x, -1)], offset=7) + with model.analyze_lp_evidence( + LpEvidenceOptions(request=LpEvidenceRequest.BOTH)) as analysis: + print(analysis.info.completion, analysis.info.stop_reason) + group = analysis.primal_ray + if group is not None and group.state == LpEvidenceState.AVAILABLE: + print(analysis.base_value(x), analysis.direction_value(x)) + diagnostics = analysis.diagnostics # copied frozen records, or None + if analysis.info.has_evidence: + saved_stage = analysis.copy_stage(1) # owning recession-stage child +# The typed child survives model and analysis destruction. +if saved_stage is not None: + with saved_stage: + stage = saved_stage.info + print(stage.private_model_id, stage.phase, stage.candidate_examined) + print(stage.raw_result) # reported auxiliary fields, not a source Result +``` + +Use `LpEvidenceRequest.FARKAS` for only the contradiction model, `PRIMAL_RAY` +for feasible-base and recession models, `AUTOMATIC` for at most two auxiliary +solve calls, or `BOTH` for at most three. All requested private models are prepared +before any solve. Prepared but unused stages have `attempted=False`, no raw +result and no examined candidate. An automatic analysis of an infeasible source +can skip its prepared recession stage and solve its Farkas stage instead. + +## Two independent evidence groups + +`analysis.primal_ray` and `analysis.farkas` are independent copied group records +with state, typed reason and message. Either is `None` if admission produced no +artifact. A group can be NotRequested, Available, Unavailable or Rejected; these +are different from the outer analysis completion and stop reason. The original +source ID/revision, stage count, attempted call count and work count remain in +`analysis.info`, including on interrupted analysis. The outer message is available +on every owning result, including rejected admission. + +`analysis.diagnostics` contains the captured tolerances, primal/Farkas diagnostic +summaries, and complete original column/row slot arrays. The arrays preserve +source handles and inactive tombstones. Absent values are `None`; a computed +zero is `0.0`. A base check is `None` when no original base check was published. +A valid base point alone does not make a primal direction Available. A zero +Farkas multiplier has no selected side or bound and contributes a present zero. +Nonzero signed multipliers select original finite lower sides when positive and +upper sides when negative. Contributions and their positive contradiction margin +are computed from those original sides, not auxiliary bound multipliers. + +Raw diagnostic values can remain populated after rejection or a whole-operation +limit. Read the group state before treating them as accepted evidence. +`analysis.slot(original_handle)` deliberately exposes those diagnostics. +`direction_value`, `base_value` and `multiplier` are stricter typed getters: +the former two require an effectively Available primal-ray group, and the latter +requires an effectively Available Farkas group. All validate the captured source +owner, slot and active status. Thus `base_value` is deliberately narrower than +the C++ base-only accessor; a base-only point remains inspectable in diagnostics. +A final C-binding cleanup timeout/cancellation revokes every accepted getter as +well as effective group availability. Diagnostic records can still be copied. + +## Private stages and ownership + +`analysis.copy_stage(index)` returns an independently owning `LpEvidenceStage` +child token. It retains shared immutable evidence and its checked stage index; +closing either the model or parent analysis does not close this child. A child +contains no ordinary Result conversion or `has_solution` convenience property. +Closing the child releases only its own ownership. + +Its copied `info` records the phase, private model owner/revision, dimensions, +nonzeros, attempted flag, examined-candidate flag and optional independent +auxiliary check. `columns` maps each private auxiliary Variable to an original +source Variable or Row and, when applicable, its original finite side. The +private variable ID is never rewritten to the original source ID. Original +source IDs on mappings remain stable after model edits and destruction. + +`info.raw_result` is explicitly reported backend diagnostic data. Its +`termination_code`, `guarantee_code`, `reported_solution_validated`, scalars and +bounds are **not assertions by the binding** that a rejected stage result is +valid. Integer codes are retained even if an injected backend supplied an unknown +value. The same is true of `raw_values`: each slot separately reports value +presence and mask presence, and preserves malformed values/mask codes for +diagnosis. A value-vector/mask length mismatch is not silently truncated or +reinterpreted as a valid original assignment. `raw_backend`, version and message +are copied strings. No stage getter reruns a solve or checker. + +This distinction matters because O3 keeps raw auxiliary data when its independent +checker rejects an owner, objective, mask, status or bound. Turning such data into +an ordinary Result would falsely transfer that Result's validation semantics. +The typed stage preserves provenance without doing that. An auxiliary objective, +bound or gap belongs only to its private model. It is never a source-model +objective, optimization bound or source-model Result. C++ auxiliary snapshots +remain C++-only in this first binding; no private Model import is offered. + +## Budgets and explicit scope + +`LpEvidenceOptions` carries an embedded ordinary `Options`, the request, +finite nonnegative check tolerances and resource caps. Python marshalling time +is deducted from a copied time allowance. C snapshot/copy preparation is deducted +before one call to the C++ analyzer; its auxiliary stages receive only the +remaining time and shared cancellation token. A final binding check runs after +temporary input cleanup. If it expires, the owning wrapper overrides effective +availability to Unavailable/Stopped while preserving immutable diagnostic data. +It never exposes the artifact's earlier availability as current acceptance. + +Time is cooperative around indivisible copies, factorization and destruction. +C `elapsed_seconds` includes the C call's input preparation, analysis and cleanup; +Python-only marshalling is charged against the allowance but is not added to that +C timing field. Node zero stops immediately. Positive node quotas are passed to +these LP solves, which consume no branch-and-bound nodes. The +`max_auxiliary_solves` limit and `attempted_calls` count **public auxiliary solve +invocations**, including local constant/empty decisions; they are not raw vendor +run telemetry. The separate coordinator work and logical retained-slot caps +retain the C++ definitions. No performance improvement is inferred from counts. + +Only continuous linear sources with Numerical policy and Auto/HiGHS are admitted. +Fixed integers, semis, active globals/indicators, Native, Exact/Certified and +caller starts are explicitly Unsupported. Inactive source metadata remains +owned and structurally checked. No source is silently relaxed or stripped. +Unavailable backend support remains an explicit status. The API does not accept +QuadraticModel handles and does not modify a caller Session. There is no implicit +analysis while reading existing O1 observations or ordinary Results. + +## ABI records and tests + +Use `gecode_opt_v1_evidence_options_default`, then +`gecode_opt_v1_analyze_lp_evidence`. The options and embedded SolveOptions require +the exact version-1 sizes; all reserved fields must be zero. Request enums and +numeric limits are checked. Every output record and typed array has an explicit +size argument. Optional values have a presence flag; absent outputs and reserved +fields are zero-initialized. Text/arrays use NULL plus capacity 0 to query the +required size; text counts include NUL. Short arrays remain unchanged and return +BUFFER_TOO_SMALL. Wrong-kind/destroyed opaque tokens, foreign/deleted source IDs, +and invalid stage indices fail explicitly. NO_EVIDENCE is the additive error +code 10 for missing artifacts or unavailable accepted-evidence getters. + +Normal library builds contain no injected callbacks. The separately compiled +`GECODE_OPTIMIZE_TEST_EVIDENCE_BINDING` fixture cancels at the C cleanup boundary +after real accepted ray and Farkas analyses. It checks effective group revocation, +all typed accepted getters, preservation of NotRequested, and raw child history +after parent/model/token destruction. It links its own C API object against only +the C++ facade, avoiding duplicate registries or wrapper exports. + +The C99 tests retain assertions under Release `NDEBUG`. Python and C panels cover +analytic ray/Farkas signs, objective sense/offset, free/fixed/ranged and zero-row +cases, both original coordinate systems, tombstones, copied frozen records, +private child lifetime, absent checks/values, requested/unused phases, scope, +limits/cancellation and all version/buffer/type boundaries. The C++ O3 coordinator +suite separately supplies malformed backend evidence and verifies that it is +rejected before group acceptance. diff --git a/docs/solver-parity/LP-EVIDENCE-DESIGN.md b/docs/solver-parity/LP-EVIDENCE-DESIGN.md new file mode 100644 index 0000000000..8662a80050 --- /dev/null +++ b/docs/solver-parity/LP-EVIDENCE-DESIGN.md @@ -0,0 +1,267 @@ +# O3: explicit recovery of numerical LP evidence + +Original design, 2026-09-05. The bounded O3 auxiliary-model implementation is +documented in [LP-EVIDENCE.md](LP-EVIDENCE.md). O1 and O2 remain independent; +this operation adds no vendor ray getter, new default routing, or exact certificate. + +## Recommendation: explicit auxiliary models + +Use a new `analyze_lp_evidence(Model/Snapshot, options)` operation, owning the +original source and using fresh private numerical LP backends. Do not accept a +mutable Session or change an existing SolveResult. First recover evidence through +explicit normalized auxiliary LPs rather than calling the vendor ray getters. +The caller is authorizing actual additional work with a new whole-operation +budget; passive accessors never trigger recovery. + +Pinned HiGHS 1.15.1 `getDualRay` can zero costs, change integrality/Hessian handling, +disable presolve, call `run`, and invalidate primal/dual info while restoring +objective data. `getPrimalRay` can also change options and run again. Even a known +ray may need a basis solve. Recovery paths assert the existence of an invertible +representation after the internal solve, complicating interrupted recovery. The +no-row path returns no ray even for a simple unbounded bound-only LP. These are +reasons to avoid treating retrieval as a harmless query. +[HiGHS recovery source](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsInterface.cpp#L1571), +[public declarations](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/Highs.h#L596). + +Explicit auxiliary LPs allow exact accounting of requested backend calls and +independent model construction/checking. The first implementation can call the +existing one-shot linear solver on private `Model` instances with remaining time +and the shared cancellation token. It needs no solve.cpp/session changes or +backend getters. Its costs are extra solves and larger auxiliary matrices; +reusing a vendor ray as a checked fast path remains a later, separately tested +optimization. + +## Supported source and candidate API + +Admit original Continuous linear models only, with no active indicators/globals, +through Auto/HiGHS and Numerical guarantees. Fixed Integer/Binary variables are +still unsupported. Native, Exact, Certified, semis, QP and active logical/global +models fail explicitly; no relaxation or silent metadata erasure is allowed. +Own and structurally validate the complete source snapshot, including original +IDs, revision, tombstones and protected metadata. Check existing adapter numerical +ranges and the expanded auxiliary dimensions/nonzeros before allocating or +solving. Inactive metadata remains owned and must pass structural validation. + +Proposed names, not frozen declarations: + +```cpp +enum class LpEvidenceRequest { Automatic, PrimalRay, Farkas, Both }; +struct LpEvidenceOptions { + SolveOptions solve; // Numerical LP policy and total time/cancel + LpEvidenceRequest request = LpEvidenceRequest::Automatic; + LpEvidenceTolerances checks; // finite nonnegative absolute tolerances + LpEvidenceLimits limits; // finite dimensions/nonzeros/work/storage caps +}; +enum class LpEvidenceCompletion { Complete, Interrupted, Rejected }; +struct LpEvidenceResult { + LpEvidenceCompletion completion; + std::optional stop_reason; + std::string message; + std::shared_ptr evidence; +}; +LpEvidenceResult analyze_lp_evidence(const ModelSnapshot&, const LpEvidenceOptions& = {}); +LpEvidenceResult analyze_lp_evidence(const Model&, const LpEvidenceOptions& = {}); +``` + +Finalize typed reasons for resource/unsupported/invalid-evidence boundaries before +header approval. `Complete` means the requested analysis completed; it is not an +original-model optimality or feasibility status. An analysis can complete with +no accepted evidence. Do not create an ordinary original-model SolveResult, +original best bound, or original gap from the auxiliary outcomes. + +`LpEvidence` will have a private constructor and immutable owned fields: + +* Exact original source snapshot and source identity/revision; original active + masks and slot counts. Checked Variable/Constraint accessors reject foreign, + deleted, and out-of-range IDs. +* Separate typed primal-ray and Farkas groups: NotRequested, Available, + Unavailable, or Rejected, with reason and message. Available always means + accepted **numerical evidence**, never an exact proof. +* Primal evidence: an original-slot feasible base point and normalized direction, + independently computed original row-direction activities, base validation, + recession residuals, and normalized objective slope. Publish the pair only + after both checks pass; direction alone cannot imply unboundedness. +* Farkas evidence: signed original row multipliers, derived original column-bound + multipliers, each selected finite side and its contribution, signed contradiction + margin and stationarity residuals. Zero multiplier is distinct from unavailable; + its selected side is absent and contribution zero. +* Ordered owning auxiliary-stage records with phase kind, private model identity, + dimensions, attempted flag, actual backend/version/termination, independent + candidate validation and an explicitly named `auxiliary_result` if a full + SolveResult is retained. Its objective/bound/gap belongs exclusively to that + private auxiliary model. No source identity rewriting is permitted. +* Attempted phase/backend-call counts and elapsed time. No hidden fallback calls. + +The artifact and its vectors remain usable after caller models, snapshots, +options and private backend instances are destroyed. Stage identities and explicit +phase names must prevent interpreting a feasibility objective of zero as an +original objective value. Store only needed stage models/mappings; avoid retaining +multiple full matrices unless justified by the provenance contract and storage cap. + +## Auxiliary LPs and original checks + +Write the source as `L <= A*x <= U`, `l <= x <= u`, objective `c*x+c0`; let +`s=+1` for min and `s=-1` for max. All transformations use original finite-side +semantics and preserve explicit maps to original slots. + +### Feasible base point + +Copy the source feasible set to a private owner with objective zero and offset +zero. A candidate must pass independent original bound/row validation, exact +source-slot mapping and finite active-value checks. An Infeasible claim accompanied +by a correctly sized independently feasible assignment is inconsistent backend +evidence, even if its `solution_validated` flag is false. + +This phase does not optimize the original objective. Its Unbounded status is +impossible because its objective is identically zero; treat that as a backend +error. A source feasibility claim is recorded as stage evidence, not promoted +into an exact original proof. + +### Improving direction + +Build a bounded direction LP minimizing `s*c*d`, with no objective offset. +Every active direction component is in `[-1,1]`, additionally restricted by the +original variable bounds: + +| Source sides | Direction bounds | +|---|---| +| Both finite | `d=0` | +| Only finite lower | `0<=d<=1` | +| Only finite upper | `-1<=d<=0` | +| Both infinite | `-1<=d<=1` | + +For each original row, both finite sides require `A*d=0`; lower-only requires +`A*d>=0`; upper-only requires `A*d<=0`; a free row imposes no recession restriction. +The zero direction is always feasible and the objective is bounded by the box. +Thus auxiliary Infeasible/Unbounded statuses are backend errors, not ordinary +"no ray" results. The no-row case works through the same bounded auxiliary LP. + +Independently normalize a finite nonzero candidate by positive infinity norm, +retaining orientation. Reject nonfinite arithmetic or normalization that erases +nonzero entries through underflow. Recompute source variable and row recession +conditions and strict improvement `s*c*d < -minimum_improvement`. A validated +source feasible base point is mandatory before publication. An infeasible source +can have an improving recession direction; that is not unboundedness evidence. + +### Farkas contradiction + +Introduce one nonnegative multiplier for each finite side of every active source +row and column. Missing infinite sides have no multiplier column. Let row lower/ +upper multipliers be `p,q` and variable lower/upper multipliers `a,b`. Solve: + +```text +maximize L*p - U*q + l*a - u*b +subject to A^T*(p-q) + a-b = 0 + sum(p)+sum(q)+sum(a)+sum(b) <= 1 + p,q,a,b >= 0 +``` + +The zero point is always feasible, and the normalization bounds this objective. +An Infeasible/Unbounded auxiliary status is inconsistent backend output. Equality +or fixed sides may both have multipliers; their algebraic signs stay explicit. +Constant source rows are supported: their multiplier contributes only to the +normalization row and contradiction objective, so a contradictory constant row +can produce evidence without any source column. + +Recover signed original row multipliers `y=p-q` with checked compensated +arithmetic. Normalize by a positive deterministic scale, initially +`max(abs(y))=1`, and independently derive `z=-A^T*y` in original coordinates. +The returned auxiliary bound multipliers are not trusted as a substitute for +this original computation. Recheck stationarity using the published normalized +values, and compute: + +```text +margin = sum(y_i>0 ? y_i*L_i : y_i*U_i) + + sum(z_j>0 ? z_j*l_j : z_j*u_j). +``` + +Skip exactly zero multipliers before selecting/touching an infinite side. Any +nonzero multiplier requiring an infinite endpoint rejects finite contradiction +publication. Require a strictly positive signed margin above the explicit +minimum; never flip a failed sign to manufacture acceptance. Original objective +sense and offset play no role in this evidence. + +All original accumulations use checked compensated arithmetic, preserving sum +and correction until relevant differences are taken. Tolerances and normalization +must be recorded, and signed residuals/margins must not be clipped. Finite-precision +recession/stationarity checks cannot certify an infinite trajectory or an exact +contradiction. These values remain numerical diagnostics under all statuses. + +### Cross-evidence consistency + +A source point accepted by the declared primal tolerances and a positive Farkas +contradiction accepted by its declared tolerances may overlap near a numerical +boundary. If both occur, return explicit inconsistent-evidence rejection and +retain the diagnostic residuals/margins; do not publish mutually incompatible +accepted conclusions. Never resolve this conflict by upgrading one to Exact, +changing tolerances silently, discarding a inconvenient point, or overwriting an +existing result. Tests must deliberately create this overlap with different +primal and contradiction tolerances. + +## Phase selection, budgets and failure publication + +Automatic runs source feasibility, then direction recovery when a feasible point +is available or Farkas recovery after an infeasible stage (at most two calls). +Explicit PrimalRay requires feasibility plus direction; explicit Farkas can run +its normalized contradiction LP directly. Both requests may require three calls. +A phase rendered unnecessary/impossible by an earlier result remains explicitly +NotAttempted; counts must not fabricate a solve. A bounded source can complete +with no strict improving direction and no Farkas contradiction. + +Construct one outer monotonic SolveBudget before copying or admission. Every +phase receives only remaining time and the same cancellation token. Check before +starting, after backend return and destruction, during transformation/checking, +and after temporary cleanup before publication. Never grant each auxiliary solve +the original full time limit. All models are LPs, so branch-and-bound node usage +is zero; structural work and backend-call caps are separate quantities, not +invented solver nodes. Reject simultaneous primal_start initially rather than +applying it to unrelated auxiliary variables. + +Every requested stage and candidate is treated as untrusted: exact private +identity/revision, masks and dimensions; finite primal objectives; valid signed +infinite or finite bounds where applicable; no NaNs; independently validated +auxiliary and original values. Optimal normalized auxiliary status requires a +valid finite candidate. Candidate feasibility alone may yield numerical evidence +without requiring its auxiliary objective to be proven optimal, but any limited +status must remain visible and publication must still be timely. A stage limit +or budget exhaustion stops further work; no hidden retry or recovery LP follows. + +Initial publication should be conservative: a final budget overrun clears accepted +evidence groups, retains explicit stage/diagnostic information, and reports the +limit. Backend factorization/cleanup is cooperative and can overshoot; it cannot +be advertised as forcibly preempted. Resource caps need deterministic checked +counts for expanded variables, rows, nonzeros, retained slots and element visits. +Malformed late input must not consume backend work before admission is complete. + +## Test matrix before runtime integration + +1. Hand-derived/rational small primal witnesses: `min -x`, `x>=0`, base 0 and + direction 1; upper-only/max variants; mixed rows, fixed/free variables, + equality and ranged rows. Check slope independently and offset invariance. +2. Farkas row/bound witness: row `x>=1`, bound `x<=0`, `y=1`, `z=-1`, margin 1. + Add multirow contradictions, upper/lower sign variants, fixed/ranged sides, + free entities, constant rows, and objective sense/offset independence. +3. Infeasible source with an improving recession direction: missing/invalid + base point prevents primal publication. Feasible point plus tolerance-qualified + positive Farkas margin must trigger cross-evidence inconsistency diagnostics. +4. Tiny rational enumeration/linear algebra checks of the auxiliary transforms, + independent of generated private rows and the vendor's own ray checker. + Normalized direction/Farkas zero points must always validate. +5. Original tombstones, duplicate names, mapped private owners/revisions, + mutation/destruction of all caller containers and existing session/history + invariance. Old results and options must remain unchanged by analysis. +6. Fake zero, nonfinite, wrong orientation, wrong dimension/mask/owner/revision, + bad selected infinite side, stationarity and strict-margin failures; large + cancellation and normalization underflow. No vectors published from bad data. +7. Impossible auxiliary statuses, forged infeasibility beside a feasible point, + absent optimal candidates, wrong auxiliary objective/bound/gap semantics, + valid infinite bounds and ordinary unavailable evidence. +8. Deterministic cancellation/limits at copy, admission, phase boundaries, + validation, publication and cleanup; exact attempted counts; no subsequent + solve after stop; bounded storage/work overflow checks and allocation failure. +9. Core missing-backend/unsupported admission, normal real HiGHS and fully + instrumented facade/backend sanitizer panels, existing O1/O2 regressions and + installed consumers. No performance claim from concurrent test execution. + +C/Python bindings, FAST registration, vendor-ray fast paths and exact certificate +verification follow only after the C++ algorithm, ownership and publication gates. diff --git a/docs/solver-parity/LP-EVIDENCE.md b/docs/solver-parity/LP-EVIDENCE.md new file mode 100644 index 0000000000..d4c95a1008 --- /dev/null +++ b/docs/solver-parity/LP-EVIDENCE.md @@ -0,0 +1,40 @@ +# Explicit numerical LP evidence recovery (O3) + +`analyze_lp_evidence` performs additional solves in private models and returns an immutable historical `LpEvidence`. It does not change a model, persistent session, or earlier result. `Complete` describes completion of the requested analysis; it is not an original optimization result. `Available` means independently checked **numerical evidence**, never an exact certificate or proof of an infinite feasible trajectory. + +This implements the auxiliary-model approach in [the O3 design](LP-EVIDENCE-DESIGN.md). It calls the public linear `solve` primitive with an explicit HiGHS route; it never invokes vendor ray getters or changes a live backend. Original Continuous linear models and Numerical guarantees are admitted. Fixed integer variables, semis, active indicators/globals, Native, Exact/Certified policies, and caller primal starts are rejected without relaxation. Inactive metadata is preserved and structurally validated. Source matrix values and bounds must fit the existing numerical adapter's admitted ranges. + +## Models and checks + +The feasible-base model copies the source feasible set to a distinct owner, with zero objective and offset. A candidate is checked in its private model and again against the original source. Original slots are mapped explicitly, including deleted slots, and all active values must be finite. A source feasibility solve with a zero objective cannot be unbounded. A purported infeasible outcome accompanied by an independently feasible assignment is rejected, regardless of the backend's solution flag. + +The recession model minimizes the original objective's normalized improving slope: `c*d` for minimization, `-c*d` for maximization. Each direction component lies in `[-1,1]`; finite lower bounds require nonnegative direction, finite upper bounds require nonpositive direction. Two finite sides force zero. Row recession bounds are derived similarly, with zero replacing each finite endpoint. This LP is bounded and always has the zero direction. Infeasible or unbounded outcomes are inconsistent backend evidence. A nonzero candidate is normalized by its positive infinity norm, then rechecked against original variable and row directions. Publication requires a checked source base point and slope strictly below `-minimum_improvement`. Original objective offsets play no role in the direction objective. + +The Farkas model introduces one nonnegative variable for every finite row and variable bound side. Lower-side variables have positive sign and upper-side variables negative sign. They satisfy `A^T*(p-q)+a-b=0` and a total multiplier sum at most one. Every multiplier is also bounded above by one, a redundant bound that makes the normalized box explicit. The objective maximizes `L*p-U*q+l*a-u*b`. Zero is feasible and the objective is bounded; impossible statuses are rejected. Constant contradictory rows work even when the source has no variables. + +The original checker derives signed row multipliers `y=p-q`, normalizes them by their maximum absolute value, and independently recomputes `z=-A^T*y`. The auxiliary bound multipliers are not trusted for original attribution. Positive `y` or `z` selects a finite lower side; negative selects a finite upper side. Exactly zero selects no side and contributes zero. A nonzero multiplier requiring an infinite endpoint fails validation. The checker recomputes stationarity from the published double multipliers and requires a strictly positive total finite-side contribution above `minimum_contradiction`. Source objective sense and offset are irrelevant to this contradiction. + +Compensated long-double accumulation retains cancellation terms through row sums, transpose products, and total contradiction contributions. Nonfinite results and conversions that erase nonzero values are rejected. Reported margins and slopes retain their signs. The checks have explicit, finite nonnegative tolerances; finite-precision stationarity/recession remains numerical evidence even when a residual prints as zero. + +If an original point passes the declared primal tolerance while a positive Farkas margin passes its declared contradiction tolerance, both groups become `Rejected/InconsistentEvidence`. Diagnostic residuals, margins, and the original point remain inspectable, but neither conclusion remains available. The deterministic regression deliberately exercises this overlap. + +## Ownership, phases, and budgets + +`PrimalRay` prepares feasible-base and recession phases. `Farkas` prepares only its multiplier LP. `Both` and `Automatic` prepare all three possible phases, before any backend call; this ensures late malformed or oversized transformations cannot consume partial backend work. Automatic runs feasibility then either recession or Farkas, at most two calls. Both normally uses three, or two when infeasibility makes a primal direction unnecessary. Every prepared but unused stage is explicitly not attempted. + +The artifact owns the complete original snapshot, tolerances, original-coordinate diagnostic vectors, and each prepared private auxiliary snapshot. A stage records the exact private model, source-column/finite-side map, attempted flag, owning `auxiliary_result`, and independent auxiliary validation. Every auxiliary objective, bound, and gap belongs to that private model. None is relabeled as a source objective/bound/gap. Passive accessors perform no solver work. Checked source access rejects foreign, deleted, absent, or out-of-range handles. Accepted-direction and Farkas accessors require available evidence. Raw diagnostic records remain inspectable after rejection and may contain information that was examined but not accepted. + +One monotonic allowance starts before snapshot copying. Every solve receives only remaining time and the shared cancellation token. Checks run before and after transformations, backend return, candidate checks, publication, and temporary source cleanup. Node limit zero stops immediately; positive node limits are passed to LP solves, which consume no branch-and-bound nodes. The `max_auxiliary_solves` cap and `attempted_calls` count public auxiliary solve invocations, including local empty/constant decisions; they do not measure hidden vendor runs. This quota and deterministic coordinator work limits are separate. A backend phase limit stops later phases. A timely checked direction or contradiction from that limited phase may remain available alongside `Interrupted` and its exact stop status. A whole-operation time/cancel/work/resource failure conservatively removes all group availability and retains only diagnostics/provenance. Allocation/error handling clears availability before allocating error messages. + +Auxiliary variable, row, and nonzero caps are checked with overflow-safe arithmetic before constructing their models. The retained-slot cap counts logical source/private entities, terms, maps, result slots, and evidence entries, plus original string/metadata elements. It is an aggregate storage guard, not a byte-accurate peak-memory limit. Temporary model canonicalization and backend internals have their own allocation behavior. The work cap counts coordinator element visits, excluding backend internals; it is not a solver-node count or a CPU-time surrogate. Source copy, canonicalization, propagation, factorization, and destruction are cooperative operations that may overshoot a deadline. Final availability is checked after temporary cleanup; forced process preemption is not promised. + +## Validation + +`test/optimize/lp_evidence.cpp` checks real HiGHS rays and contradictions with lower/upper/free/fixed/ranged entities, both objective senses, offset invariance, zero-variable contradictory rows, feasible bounded models without evidence, infeasible models with improving directions but no base point, tombstones, source destruction, resource/option admission, and missing backend. + +`test/optimize/lp_evidence_coordinator.cpp` uses a separately compiled `GECODE_OPTIMIZE_TEST_LP_EVIDENCE` object and a deterministic finite-grid oracle. Production contains no injected callbacks. It rejects bad owners/revisions/masks/dimensions, nonfinite or mismatched scalars, unknown statuses, impossible normalized statuses, and false infeasibility beside a valid point. It checks original recession failure after normalization, an incorrectly selected infinite bound, preservation of a `1+1e16-1e16` contradiction margin, tolerance overlap, phase/cleanup cancellation, and allocation failure after otherwise accepted evidence. Both new test sources explicitly undefine `NDEBUG` so Release test consumers retain their checks. + +The additive [C/Python bindings](LP-EVIDENCE-BINDINGS.md) preserve separate evidence +groups and owning raw auxiliary-stage children. Rays from vendor getters, exact +certificates, sensitivity/ranging, and basis reuse between sources remain separate +extensions. diff --git a/docs/solver-parity/LP-OBSERVATIONS-DESIGN.md b/docs/solver-parity/LP-OBSERVATIONS-DESIGN.md new file mode 100644 index 0000000000..6a7c7f88d8 --- /dev/null +++ b/docs/solver-parity/LP-OBSERVATIONS-DESIGN.md @@ -0,0 +1,450 @@ +# Continuous LP observations, bases, rays and sensitivity + +Design baseline, audited 2026-09-05 against the integration source at `8ae59d5c1` +and local HiGHS **1.15.1**, commit +`04024d701f79feb8e2f18bc3df0dffc04ef05088`. No builds, solver runs or timing +experiments were performed for this design. O1 has subsequently been implemented; +the [API guide](LP-OBSERVATIONS.md) and [validation record](VALIDATION.md) describe +its delivered scope and completed checks. O2–O4 remain separate work, and this +design does not establish commercial-solver parity. + +The first implementation should expose **owning observations of a completed +ordinary continuous LP solve**: original row activities, two-sided slacks, +row dual values, reduced costs, a numerical KKT report, and a basis when one +already exists. Default `solve` behavior should remain unchanged. Public basis +submission, ray recovery and sensitivity calculations should follow in separate +gated slices because they require different validation and can perform work. + +## Commercial API target and scope + +| Capability | Parity target | Proposed delivery | +|---|---|---| +| Row duals and reduced costs | Gurobi `Pi`/`RC`; CPLEX `getpi`/`getdj` | First slice, original model coordinates, explicit availability and numerical checks | +| Row activities/slacks | Gurobi `Slack`; CPLEX activity/slack queries | First slice, separate lower and upper slack for ranged rows | +| Basis status | Gurobi `VBasis`/`CBasis`; CPLEX basis queries | First slice export, later checked submission | +| Advanced simplex data | Basis inverse, basis solves, reduced rows/columns | Later explicit operation; not stored densely in every result | +| Infeasibility/unboundedness evidence | Farkas multipliers and primal improving direction | Separate budgeted recovery plus original-model checking | +| Objective/RHS/bound sensitivity | Gurobi `SAObj*`, `SARHS*`, `SALB*`, `SAUB*`; CPLEX `objsa`/`rhssa` | Start with objective coefficients and equality RHS; general bound changes need an explicit perturbation definition | + +Dual values are solution observations. Basis-dependent allowable perturbation +intervals are a separate calculation. Gurobi defines these intervals relative +to the current optimal basis, and CPLEX sensitivity routines require an optimal +basis. Neither is a simultaneous-parameter guarantee. +[Gurobi row attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/constraintlinear.html#sarhslow), +[Gurobi variable attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/variable.html#saobjlow), +[CPLEX objective sensitivity](https://www.ibm.com/docs/en/icos/22.1.1?topic=o-cpxxobjsa-cpxobjsa), +[CPLEX RHS sensitivity](https://www.ibm.com/docs/en/icos/22.1.0?topic=r-cpxxrhssa-cpxrhssa). + +The initial observation entry point accepts only active `Continuous` variables, +ordinary linear rows and one linear objective. It rejects every active Integer, +Binary, SemiContinuous or SemiInteger variable, including fixed discrete +variables; every active original indicator; and every active native global. +Checking only `Compiled::discrete` is insufficient for semantic metadata. +Quadratic models stay in their distinct API. No automatic LP relaxation, fixed +MIP, indicator lowering, private repair/pool model, or Native fallback is +permitted. A future explicit relaxation artifact can have its own identity and +observations. HiGHS-only numerical support is sufficient for the first slice; +missing backend, Native, Exact and Certified requests remain explicit +`Unsupported` results. Keep the existing numerical adapter's coefficient/bound +admission limits; this API does not silently rescale or weaken rejected input. + +## Audited source hooks and prerequisites + +Line references below refer to the audited source, not a generated listing. + +| Existing hook | Consequence for implementation | +|---|---| +| `gecode/optimize/solve.cpp:47–124`, `Compiled`/`compile` | `slots` maps compact backend columns to original variable slots. Preserve this mapping and the full original active mask. | +| `solve.cpp:94–106`, row conversion | **`row_slots` is not currently a backend-row map.** It records every active row before empty rows are elided. Keep its topology-signature role or rename it, and add an independently checked `backend_row_slots` map populated only when a row is emitted. A constant row between two nonconstant rows must not shift later duals. | +| `solve.cpp:100–106, 384–413` | Constant rows and a model with no active variables can return before HiGHS runs. Their original activities can be computed, but there is no vendor basis or vendor dual vector to retrieve. | +| `solve.cpp:246–291`, `compatible`/`prepare` | Bounds, objective coefficients, row sides, sense and offset are updated in place. Owner, matrix, types and slot changes reload. Observations must describe the new solve, never the previously retained basis/duals. | +| `solve.cpp:437–483`, callback scope/run | Capture after `run()` returns, while the same session is serialized and its callback/budget lifetime is valid. No result accessor may later call the live HiGHS instance. | +| `solve.cpp:483–530`, candidate checking | Use the already validated original assignment. Copy/check duals and basis before returning or invalidating the session. Preserve the existing exclusion of late candidates. | +| `gecode/optimize/result.hpp:117`, `SolveResult` | Existing results own variable values/masks but no row metadata. New observations need independent owning row masks, source identity and snapshot provenance. | +| `gecode/optimize/session.hpp:22–35` | Content is checked even if a manually supplied snapshot reuses a revision. Public observation/basis compatibility must not depend on revision alone. | + +HiGHS supplies `HighsSolution::{value_valid,dual_valid,col_value,col_dual, +row_value,row_dual}` and a separate `HighsBasis`. Flags, vector lengths, +finite values and mathematical checks are separate gates. A nonempty vector +does not establish availability. Its `basis.valid` means the basis has been +factored by HiGHS; it does not by itself establish primal or dual feasibility. +[Pinned structures](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HStruct.h#L20). + +After nontrivial presolve, HiGHS reconstructs `solution_` and the available basis +in the **passed LP's** coordinates, then may clean up with simplex. Read only the +final public `getSolution()`/`getBasis()` results; do not read reduced-problem or +internal `ekk` arrays. The passed LP still excludes our tombstones and constant +rows, so Gecode's mapping step remains necessary. An interior-point solution +without crossover can have valid duals but no basis. +[Pinned postsolve path](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L1800). + +HiGHS's simplex extraction already converts its internal minimization and +negated row-activity conventions back to the model's objective sense and row +activity. **Do not flip maximization duals a second time.** Row basis statuses +are also translated back to row lower/upper activity bounds. +[Pinned solution/basis extraction](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/simplex/HEkk.cpp#L1344). + +## First C++ contract + +Use an additive result wrapper and entry point so ordinary results need not +retain another snapshot or change memory cost. Names below are proposed, not +frozen symbols: + +```cpp +struct LpObservationOptions { + SolveOptions solve; + bool duals = true; + bool basis = true; + LpCheckTolerances checks; // finite, nonnegative, independently documented +}; + +struct LpObservedResult { + SolveResult result; + std::shared_ptr observations; +}; + +LpObservedResult solve_lp_observed(const ModelSnapshot&, + const LpObservationOptions& = {}); +// Matching Model overload and SolveSession::solve_lp_observed overload. +``` + +Add an LP-specific capability record for compiled support of dual observations, +basis export/submission, evidence recovery and sensitivity. Build capability +does not imply that a particular solve produced a dual point or a basis; those +remain per-result availability states. + +`LpObservations` is immutable, with a privately owned original snapshot or +equivalent complete immutable data required for validation. It records owner, +revision, objective sense/offset, backend/version, requested tolerance values, +effective backend settings, and a content fingerprint for diagnosis. Correctness +comparisons use checked contents, not a hash as an authorization token. Expose +original `Variable`/`Constraint` lookups and bulk arrays indexed by original +slots. Names are labels, never identifiers. + +Each group has `NotRequested`, `Available`, `Unavailable` or `Rejected` plus a +reason/message; zero-length data is distinct from unavailable data. Reasons +include unsupported model, no backend solve, interrupted before capture, no +primal point, no dual point, no basis, elided constant rows, invalid dimensions, +nonfinite data, failed numerical checks and allocation budget. Retain original +active masks even when a group is unavailable. Deleted slots have no value and +must reject scalar lookup; foreign IDs and wrong kinds are errors. Zero must +never serve as an unavailable scalar sentinel. + +Proposed groups: + +* **Primal rows:** independently accumulated `activity`, `lower_slack = + activity-lower`, `upper_slack = upper-activity`. An absent finite side has no + corresponding slack, rather than a magic infinity. Use compensated sums; + report conversion overflow explicitly. Do not clamp a small negative slack. +* **Dual point:** complete mapped `row_dual` and `reduced_cost` vectors, plus + vendor feasibility metadata and the independent check report below. Publish + ordinary-objective duals initially only for a timely, validated primal point + with final Optimal status and `dual_valid`/valid info. Interrupted Phase I + data is deliberately unavailable until a later phase-aware contract exists. + CPLEX likewise warns that an infeasible primal-simplex iterate can expose + Phase I duals rather than the original objective's duals. + [CPLEX dual query](https://www.ibm.com/docs/en/icos/22.1.2?topic=g-cpxxgetpi-cpxgetpi). +* **Basis:** explicit mapped enums `Lower`, `Basic`, `Upper`, `Zero`, + `NonbasicUnspecified`, never C++/HiGHS ordinal casts. Require valid flags, + exact dimensions, recognized statuses and a consistent basic count. `Basic` + does not mean nonzero and a fixed entity may be nonbasic on either side. + Initially make the full basis unavailable when our conversion elides an + active constant row; do not fabricate an original basis by padding zeros. +* **Checks:** original primal validity, dual sign/stationarity/complementarity + residuals, objective estimates and separately measured gap. Basis validity, + primal validity and numerical KKT acceptance remain distinct booleans. + +For a feasible elided constant row in an otherwise solved LP, use activity zero +and reconstruct row dual zero with provenance `DerivedConstantRow`, not +`BackendObserved`. Check its original sides under the same numerical convention. +All other backend row duals must map through `backend_row_slots`. If no backend +solve occurs, initially publish only independently computed primal observations; +dual and basis groups say `NoBackendSolve`. + +Failure to obtain an optional basis does not invalidate a valid primal result. +Rejected observation data stays absent and never manufactures a dual bound or +an optimality claim. Memory/cancellation during collection must leave already +completed owning results coherent. Capture/check allocations and work count +against the same monotonic whole-call budget. Late observation groups are +absent with a reason; accessors are passive bounded copies. Preserve the +existing solve deadline convention rather than upgrading a late backend status. + +## Dual signs, offset handling and independent numerical checks + +For the original problem, write + +```text +f(x) = c^T x + c0, L <= A x <= U, l <= x <= u. +s = +1 for minimization and -1 for maximization. +pi = public row dual; r = public reduced cost. +A^T pi + r = c. +alpha = s*pi; beta = s*r; d = s*c. +``` + +In minimization a lower-active row has nonnegative `pi`, an upper-active row +nonpositive `pi`; signs reverse in maximization. Equality row duals are free. +These are the same public conventions described for Gurobi, and match the +pinned HiGHS extraction above. +[Gurobi Pi](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/constraintlinear.html#pi). + +Check against the original matrix and validated original values, independently +of the adapter's packed matrix: + +1. `d - A^T alpha - beta` stationarity residual for every active column. +2. Normal-cone signs and complementarity for each original row and variable. + Equivalently split `alpha = alpha_plus-alpha_minus` and + `beta = beta_plus-beta_minus`, using positive and negative parts. Positive + multipliers require a lower side; negative multipliers require an upper + side. Complementarity products use the corresponding slack. Fixed variables + and equality rows allow either sign. Free entities require zero multiplier. +3. The normalized dual objective estimate is + + ```text + s*c0 + alpha_plus^T L - alpha_minus^T U + + beta_plus^T l - beta_minus^T u. + ``` + + Skip exactly zero terms before touching an infinite endpoint. A nonzero + multiplier requiring an infinite endpoint prevents a finite dual estimate; + do not silently truncate the multiplier or multiply zero by infinity. +4. Accumulate the normalized primal-minus-dual gap directly with the common + objective offset cancelled **before** accumulation and narrowing. Report + the original-sense dual estimate separately; max reverses lower/upper-bound + interpretation. Do not derive a tiny gap by subtracting two rounded large + objective scalars. + +Use checked compensated `long double` accumulation, but do not assume it is +wider than `double` on Windows, overflow-proof, or an exact certificate. +Preserve raw residuals; no clipping of failed sign tests, negative gaps or large +rounding discrepancies. Expose absolute metrics in original units with explicit +stationarity/dual-feasibility, complementarity and objective-gap tolerances. +Complementarity/gap have objective units; primal row and variable violations +retain their own units. Relative metrics may be informative but must not allow +an unrelated large offset or redundant bound to relax an absolute gate. + +The dual objective is an **estimate** when stationarity holds only numerically; +with unbounded variable domains, a small residual does not automatically imply +a finite rigorous bound. Never overwrite `SolveResult::best_bound` from this +observation group. Exact/Certified results require a separate exact or outward +verified certificate pipeline. Iterative refinement and rational reconstruction +are useful later research paths, not properties obtained by merely returning +HiGHS doubles. [Gleixner, Steffy and Wolter, iterative refinement](https://optimization-online.org/wp-content/uploads/2015/06/4948.pdf), +[Gleixner and Steffy, limited-precision LP oracles](https://arxiv.org/abs/1912.12820). + +The current adapter configures primal feasibility tolerance but not an explicit +LP dual tolerance. An observation request should record both effective backend +tolerances and its own check tolerances. If the new API sets dual tolerance, +set/reset it on **every** reused solve, including subsequent ordinary solves; +reject unsupported backend option ranges before mutating the session. + +## Basis submission and edited sessions + +First export basis status only; a basis is an optional warm-start artifact, +not a complete solver checkpoint or proof. Later add immutable `LpBasis` tokens +and an explicit `basis_start` option. Initial submission should require the +same owner, revision, checked original contents and compact mappings. Reject +foreign/deleted identities, invalid enums, missing/extra slots and invalid +lower/upper/zero statuses before calling HiGHS. Check zero-row cases ourselves: +the pinned alien-basis zero-row branch reads column statuses before its general +size check. [Pinned setBasis](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L2732). + +A later explicit `CompatibleMatrixHint` policy may allow cost/bound/row-side, +sense or offset edits with stable owner, types, matrix and maps. Revalidate +statuses against new bounds. Passing an external basis as `alien` can cause +factorization/repair; expose submission and repair/rejection separately from +whether the final solve was optimal or faster. Never take a caller's +`valid=true` as proof of nonsingularity. Initial tests should include singular +and wrong-basic-count inputs. A failed submission should leave the session +usable through a clean reload, with no stale evidence available. + +Internal retained-basis reuse can continue using the existing content-based +compatibility policy. It does not permit publishing old duals after a new edit. +Each result keeps its own historical owner/revision/content and remains readable +after model edits, model destruction, session reset/destruction and another +solve. A zero-time or failed second solve must not inherit the first result's +observations, even if HiGHS still retains a useful basis internally. + +Do not expose factorization pointers. Ordered basic entities, basis solves and +tableau queries need a separate serialized, budgeted operation or an owning +factorization artifact. `getBasicVariables` encodes columns as nonnegative +indices and rows as `-(row+1)`; convert to a checked tagged entity instead of +exposing this signed index convention. Basis matrix row/slack orientation must +be frozen before exposing `B^{-1}` or reduced rows. [Pinned advanced API](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/Highs.h#L679). + +## Rays: explicit work and separately checked evidence + +`getDualRay` and `getPrimalRay` are **not passive getters** when supplied an +output buffer. The pinned implementation may disable presolve, change costs or +relax integrality and call `run()` to recover evidence. A presence-only query +does not guarantee that materializing the ray needs no work; an invertible +representation may be missing. Even a known ray can require a basis solve. +No-row models may return no vendor ray despite simple unboundedness. +[Pinned declaration](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/Highs.h#L596), +[pinned recovery](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsInterface.cpp#L1571). + +Implement a later `analyze_lp_evidence(snapshot, options)` using a **private** +HiGHS instance and its own explicit whole-operation budget. Record the source +owner/revision/content, analysis termination, evidence availability, and any +additional solve counts separately from the original solve. Never alter an +existing result or persistent session's final status/options/basis. Leave +ordinary `InfeasibleOrUnbounded` ambiguous until actual checked evidence exists. + +Independent checks must cover more than backend flags: + +* A primal improving direction requires finite nonzero `d`, original recession + conditions, and `s*c^T d < 0`. A finite lower bound requires `d_j >= 0`; a + finite upper bound requires `d_j <= 0`; both require zero. Apply the same rule + to `A*d` for row sides. An unboundedness claim additionally needs an original + feasible base point. Direction-only evidence is not a feasibility proof. +* For a dual/Farkas direction `y`, form `z = -A^T y`. Require compatible finite + sides for each signed row/variable multiplier, and a strictly positive + contradiction margin + + ```text + sum(y_i>0 ? y_i*L_i : y_i*U_i) + + sum(z_j>0 ? z_j*l_j : z_j*u_j) > 0, + ``` + + with zero terms omitted. This expresses that every feasible point would + imply `0 >= positive_margin`. Objective sense and objective offset play no + part in infeasibility evidence. Normalize scale deterministically, reject + zero/nonfinite vectors, recompute all activities/margins and do not assume a + Gurobi Farkas vector has HiGHS's sign convention. + +Numerically small recession/stationarity errors still cannot certify an +infinite trajectory or exact contradiction. Label accepted doubles numerical +evidence and retain residuals/margin. Exact proof is deferred. Original bound +contributions are essential: a row vector alone can miss the contradiction. +Hand-derived feasible points/directions and exact rational test arithmetic must +be independent of the upstream ray checker. + +## Sensitivity: define the perturbation before naming an endpoint + +HiGHS `getRanging` requires an optimal result and an initialized simplex +instance, and unscales internal simplex data. Its `HighsRangingRecord` contains +value/objective endpoints and entering/leaving internal variables. The cost +records contain `num_col + num_row` entries in this pinned version; publish only +the checked original column portion. Entering/leaving indices use a combined +column/row space with sentinel `-1`, unlike `getBasicVariables`' negative row +encoding. Validate each field before mapping it. +[Pinned ranging implementation](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L70). + +The pinned code already handles max cost signs, reverses internal row-bound +directions and includes the objective offset through the objective value. +Map its public result once. Test min/max/offset cases rather than reproducing +these transforms in the wrapper. +[Pinned output conversion](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L528). + +Critically, `col_bound_up` is not automatically “allowable increase of the +column's upper bound.” Upstream tests change the currently active bound of a +nonbasic entity, move both bounds of a fixed entity, and for a basic entity +use the lower bound in the upward test and upper bound in the downward test. +Rows use the analogous rules. Thus directly renaming these arrays `SALB*`, +`SAUB*` or separate ranged-row RHS intervals would be incorrect. +[Pinned bound perturbation tests](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/check/TestRanging.cpp#L266). + +Implement sensitivity after basis export/submission has passed conformance: + +1. Start with one objective coefficient at a time and an equality row's common + RHS, in original absolute parameter values. Require a validated optimal + basis; degenerate endpoints may equal the current value. +2. An explicit analysis owns a source snapshot and chosen basis, and uses a + private backend under a budget. If backend repair changes the selected + basis, report that identity/change or reject the requested-basis analysis. + Do not advertise ranges for an unspecified replacement basis. +3. Extend to a typed `Perturbation {entity, LowerOnly|UpperOnly|MoveEquality| + TranslateRange}` only after each semantics has its own algorithm/tests. + Keep the other bound fixed for one-side perturbations and intersect with + domain consistency. Translating a ranged interval preserves its width; + changing one side does not. Fixed variable bounds are a separate case. +4. Return finite endpoints, unbounded endpoints and unavailable endpoints as + distinct tagged values, with the selected basis/provenance, numerical + guarantee, optional predicted objective and optional limiting entity. + No claim about simultaneous changes, uniqueness, or how far another + optimal basis might extend the interval. A dual “shadow price” is only a + local marginal under the stated perturbation and may be nonunique. + +## C and Python extension + +Preserve ABI v1 record sizes. Add versioned LP observation option/info records +and new symbols rather than append fields to `gecode_opt_options_v1` or existing +result-info layouts. Reuse ordinary Model and Session handles, but return a +distinct owning observed-result token. `lp_observed_result_copy_result` returns +a new owning ordinary Result handle; observation access returns copied data or +a separate immutable token. Neither may borrow live session vectors. + +Use exact record sizes, zero reserved fields, explicit enum maps, checked +owner/kind/deleted IDs, `uint64_t` size-to-native checks before allocation and +bounded output buffers with required counts. Scalar queries return an explicit +presence flag or typed unavailable error. Bulk values have active/present masks; +infinite range endpoints have their own kind. API failures remain distinct from +solve termination and unavailable optional groups. Keep exception boundaries +and registry-lock discipline identical to the existing C ABI. + +Python adds `LpObservationOptions`, `LpObservedResult`, immutable check records +and owning `LpBasis`/`LpAnalysis` classes as later slices land. Use the same C ABI, +explicit `close`/context managers, library-aware entities and tuple/list copies. +Results and bases outlive source objects. New two-pass read queries may not +perform analysis or mutate a session; analysis is an explicit call. No NumPy +dependency is needed for the first API. + +## Independent tests and implementation gates + +| Gate | Required meaningful evidence | +|---|---| +| O1: original observations | Analytic LP panel below, fake backend corruption tests, lifecycle tests, missing-backend build, normal/ASan/UBSan and installed C/Python consumers. No basis, ray or sensitivity availability is inferred from optimal status alone. | +| O2: basis submission | Exact dimensions and full enum matrix, wrong owner/kind/revision/content, tombstones, zero rows/columns, invalid basic count, singularity, rejected submission then successful fresh solve, edited-session warm/cold objective agreement. No timing claim from reuse counters. | +| O3: evidence recovery | Analytic primal/dual rays with independent rational witnesses, mixed row/bound contradiction, unknown/limited and no-row cases, extra-work budgets, cancellation, no change to source session/result, fake zero/nonfinite/wrong-direction/missing-base-point data. | +| O4: sensitivity | Exact small-basis parameter intervals, interior/end/outside perturbations solved independently, min/max and offsets, degenerate/redundant rows, free/fixed/basic/nonbasic statuses, endpoint infinity/sentinels, changed-basis provenance and strict one-parameter semantics. | + +Analytic LP fixtures should include: + +* `min 2*x + 3*y + 7`, `x+y >= 4`, `x,y >= 0`: optimum `(4,0)`, + objective 15, row dual 2, reduced costs `(0,1)`. Change the cost of `x` alone: + the selected solution remains optimal for coefficient in `[0,3]`; beyond + 3 the optimizer switches to `y`, and below 0 the model is unbounded. +* `max 2*x + 7`, `x <= 4`, `x >= 0`: objective 15 and row dual 2. The + corresponding `min -2*x + 7` has objective -1 and row dual -2. Bounds must not + duplicate the active row in these sign fixtures, avoiding ambiguous duals. +* A ranged row `1 <= x <= 3` with a free variable: `min x` tests the lower + side, `min -x` the upper side. Add equality, free/redundant row, fixed variable + and bound-only LP fixtures; accept valid nonunique duals by KKT rather than + asserting one arbitrary basis or dual vector. +* Deleted columns/rows and a feasible constant row between two nonconstant + rows. Nonconsecutive original slots, duplicate names and later additions + must map correctly. Constant-row basis unavailability is explicit. +* Presolve off/on including reduction to empty, scaling-sensitive coefficients, + and large cancelling products/objective offsets. Check original values and + signs, not reduced arrays. A no-crossover fixture must demonstrate duals + without a basis once an algorithm selector/test seam is available. +* Farkas fixture `x >= 1` as a row and `x <= 0` as a variable bound: row + multiplier 1, bound multiplier -1, contradiction margin 1. Primal-ray fixture + `min -x`, `x >= 0`: base point 0 and direction 1, including the no-row path. + An infeasible model with an improving recession direction must not be + mislabeled unbounded merely because the direction check passes. +* Equality sensitivity fixture `min 2*x+5`, `x=b`, `0<=x<=10`: selected-basis + RHS interval `[0,10]` and value `2*b+5`; just outside is infeasible. Add a + degenerate endpoint case where the numerical optimizer can choose a + different valid basis without violating the source solution semantics. + +Fake backend fixtures must independently corrupt dual flags, info flags, +dimensions, row maps, enums, NaN/Inf, max signs, objective offsets, stationarity, +normal-cone signs and complementarity. Also return an old plausible dual vector +after a cost/bound edit and after a zero-time solve. No old observations may +appear in the new result. Keep copied historical observations readable after +destruction and concurrent independent solves. C/Python tests exercise query +sizes, undersized/null buffers, wrong-kind/stale tokens and repeated closes. + +The existing FAST gate should add at most one small analytic observation case +after O1 integrates, with asserted case counts and the same whole-command +budget. Full observation/sensitivity correctness panels belong in CTest; +research accuracy/performance sweeps remain separate. Do not make timing +claims from this design or from builds running concurrently with root gates. + +Suggested ownership: one agent owns new `lp_observations.hpp/.cpp` and the +independent checker/tests; root owns the small `solve.cpp` collector hook, +`session.hpp` wiring and build/install changes; a binding agent owns only +`c_api.*`/Python/conformance additions after the C++ records freeze. Add rays +and sensitivity in later separate files so passive result collection remains +auditable. Review source mappings and numerical equations before accepting O1; +do not count O2–O4 as complete because HiGHS already has similarly named methods. diff --git a/docs/solver-parity/LP-OBSERVATIONS.md b/docs/solver-parity/LP-OBSERVATIONS.md new file mode 100644 index 0000000000..1c75e9e2a3 --- /dev/null +++ b/docs/solver-parity/LP-OBSERVATIONS.md @@ -0,0 +1,156 @@ +# Continuous LP observations: O1 + +`solve_lp_observed` returns an ordinary owning `SolveResult` plus an immutable +`shared_ptr`. `SolveSession` has the same overloads. The +observation artifact owns the exact historical `ModelSnapshot`; source handles, +revision, names and tombstones survive edits, reset, and model/session destruction. +No `SolveResult` layout or ordinary solve API changed. + +This first implementation accepts **original Continuous linear models** through +HiGHS with `Guarantee::Numerical`. Auto selects that same backend. Native, Exact, +Certified, any active integer/binary/semi variable (including fixed integers), +indicators, and native globals return explicit Unsupported; no relaxation, +conversion of variable types, or automatic fallback occurs. The model is validated +and admitted before a persistent backend is mutated. Missing HiGHS is also +explicit Unsupported. A malformed model or observation tolerance is InvalidModel. + +```cpp +#include +#include +using namespace Gecode::Optimize; +Model model; +auto x = model.add_continuous(); +auto y = model.add_continuous(); +auto demand = model.add_row({{x, 1}, {y, 1}}, 4, + std::numeric_limits::infinity()); +model.minimize({{x, 2}, {y, 3}}, 7); +auto observed = solve_lp_observed(model); +// Check the solve status and each group's state before using optional fields. +if (observed.observations && + observed.observations->dual_point().state == LpObservationState::Available) { + double demand_dual = *observed.observations->row(demand).dual; // 2 + double y_reduced_cost = *observed.observations->column(y).reduced_cost; // 1 + (void)demand_dual; (void)y_reduced_cost; +} +``` + +## Groups and original coordinates + +The primal row, dual point, and basis groups independently report NotRequested, +Available, Unavailable, or Rejected with a typed reason and message. Missing data +is never represented by zero. Raw vector length/identity errors and failed +numerical checks are distinguished from absent backend data. Invalid input or +allocation failure can prevent creating an artifact altogether. + +* `rows()` and `columns()` retain original slot counts, including inactive + tombstones. Handle accessors reject foreign IDs, tombstones, and out-of-range + slots. Backend row/column maps are checked against the exact active source. +* Original row activities and signed lower/upper slacks are recomputed from the + source matrix and validated primal values. An infinite bound side has no slack. + Tiny negative slacks remain signed; they are not silently clipped. +* Duals and reduced costs satisfy the original objective convention + `A^T pi + r = c`, for both minimization and maximization. HiGHS already restores + its public solution to the passed model after presolve and objective-sense + conversion. The adapter scatters those coordinates back to original slots. +* A feasible constant row omitted by backend conversion still receives an + independently recomputed activity/slacks and a zero dual marked + `DerivedConstantRow`. The other row duals are marked `Backend`. +* Basis status is a typed copy, with original-bound position, dimension, and + basic-count checks. It requires both backend basis and info validity flags. + The entire basis group is unavailable if an active constant row was elided; + the implementation does not invent a full original basis. No independent + nonsingularity or numerical conditioning claim is made. + +Primal row observations require an independently validated finite source point. +Duals and basis initially require a timely final Optimal primal point and valid +backend info/primal flags; duals additionally require valid feasible dual flags. +An infeasible or unbounded solve does not produce an O1 ray or dual certificate. +An empty model solved without a backend call can have an available empty primal +row group, while its dual and basis groups are unavailable (`NoBackendSolve`). +`duals=false` and `basis=false` suppress their respective requests/publication. + +## Independent numerical KKT checks + +The checker uses original rows, costs, bounds and source values, rather than the +backend's presolved/packed matrix or its reported residuals. It checks: + +1. Original primal feasibility and objective consistency. +2. Dual normal-cone signs at finite row/column bounds. +3. Stationarity `s*c - A^T(s*pi) - s*r`, where `s` is +1 for min and -1 for max. +4. Complementarity against the endpoint selected by each signed multiplier. +5. The signed normalized primal-minus-dual gap, with the common objective offset + cancelled **before** accumulation. + +Accumulation uses checked compensated `long double` arithmetic. Uncollapsed sum +and correction components flow into slack, stationarity, complementarity and +basis checks, including platforms where `long double` has double precision. +A nonzero multiplier requiring an infinite endpoint prevents a finite dual +objective/gap; the checker never treats that product as zero. Overflow, +nonfinite entries, malformed dimensions or coordinate maps reject publication. + +Check tolerances are explicit, finite, nonnegative absolute quantities in +original units. Defaults are `1e-7` for dual feasibility and stationarity, +`1e-6` for complementarity and objective gap. The primal check uses the solve's +feasibility tolerance. Effective backend primal/dual tolerances are recorded +when obtained; they do not replace the independently requested check tolerances. +Residuals and signed gap are retained without clipping, including a small +negative gap accepted within absolute tolerance. Large objective offsets cannot +hide a meaningful gap by rounding both reported objective scalars together. + +These are **numerical observations**, not exact certificates. An accepted KKT +report and its `dual_objective_estimate` do not strengthen the ordinary result's +guarantee or overwrite its backend best bound. A rejected dual or basis group +also does not erase an otherwise valid ordinary primal solve result. + +## Budgets and repeated sessions + +One shared monotonic budget starts before source snapshot copying and covers +conversion, backend execution, passive collection, independent checks, and raw +capture destruction. Public getters do no solver work. The collector uses only +current `getSolution`, `getInfo`, `getBasis`, and option values; it does not call +ray, ranging, basis factorization or extra optimization routines. + +O1 chooses a conservative whole-call publication policy: if the final budget +checkpoint detects cancellation/time/node exhaustion, **all observation groups +are cleared**, with requested groups Unavailable/Interrupted and NotRequested +groups unchanged. This also clears groups that completed earlier. The timely +independently validated ordinary primal incumbent is retained, and the solve's +termination reflects the limit. The final gate runs after raw capture vectors +have been destroyed. A private deterministic test cancels at this boundary, +without sleeps or production hooks. Budget enforcement is cooperative; memory +allocation/destruction and solver calls are not forcibly preempted. + +Every call creates a new artifact and new raw vectors. Limited/error solves +cannot expose the prior call's duals or basis. Session edits compare source +content and compact mappings, not only revision numbers; updated costs, bounds, +rows, sense or offset are reflected in the new artifact. Session basis reuse +remains internal and does not imply that the new result has an exportable basis. + +## Verification and remaining scope + +`test/optimize/lp_observations.cpp` checks real HiGHS analytic min/max/ranged-row +solutions, constant-row scattering, tombstones and duplicate names, historical +ownership, same-revision snapshot edits, repeated observed/ordinary session +calls, disabled groups, missing backend/admission, infeasible and unbounded +models, cancellation and malformed input. + +`test/optimize/lp_observations_checks.cpp` exercises the pure private checker with +known primal/dual data and corrupted flags, IDs, revisions, masks, vector lengths, +NaNs, infinities, basis statuses, stationarity/sign/complementarity/gap failures, +large-offset and `1e16 + 1 - 1e16` cancellation, and post-collection cancellation. +It never substitutes fake data into a production solve. The private detail +header is not installed. + +The separate [basis submission API](LP-BASIS.md) now provides owning basis starts; +the observation operation itself remains passive. Rays, sensitivity/ranging, +MIP relaxation observations, QP observations and exact dual proofs remain outside +O1. The subsequent research and +implementation boundaries are in [LP-OBSERVATIONS-DESIGN.md](LP-OBSERVATIONS-DESIGN.md). +Bindings use separate owning observed-result handles and copied ordinary results; +the public C++ artifact contains no borrowed backend memory. + +The [C/Python guide](BINDINGS.md#original-coordinate-lp-observations) documents +the installed binding surface. One [FAST](FAST-REGRESSION.md) case checks +analytic min/max objectives, original duals, reduced costs, slacks and basis/KKT +availability. Completed integrated and installed-consumer checks are recorded +in [validation](VALIDATION.md). diff --git a/docs/solver-parity/LP-SENSITIVITY-BINDINGS-DESIGN.md b/docs/solver-parity/LP-SENSITIVITY-BINDINGS-DESIGN.md new file mode 100644 index 0000000000..1efc064ad7 --- /dev/null +++ b/docs/solver-parity/LP-SENSITIVITY-BINDINGS-DESIGN.md @@ -0,0 +1,309 @@ +# O4: owning C and Python sensitivity bindings + +Design only, 2026-09-05. This proposal targets the frozen +[`lp_sensitivity.hpp`](../../gecode/optimize/lp_sensitivity.hpp) contract at +`ee8964ea9132995fb0c9aa304817b4fc2c162687`, integrated at `db2076651`. +The [algorithm and source research](LP-SENSITIVITY-DESIGN.md) define the +mathematical scope. This document proposes additive bindings; it claims no +binding implementation, execution, or performance result. + +## Operation and scope + +Expose one explicit operation on an owning **O1 observed result**: + +```c +int32_t gecode_opt_v1_analyze_lp_sensitivity( + gecode_opt_handle observed, + const gecode_opt_sensitivity_options_v1* options, + gecode_opt_handle* analysis); +``` + +```python +with observed.analyze_sensitivity(LpSensitivityOptions(parameters=( + LpObjectiveParameter(x), LpEqualityRhsParameter(balance), +))) as analysis: + entry = analysis.objective(x) + if entry is not None and entry.group.state is LpSensitivityState.AVAILABLE: + interval = entry.interval +``` + +The first scope remains one original objective coefficient or the common RHS +of an equality, varied alone while retaining the selected basis/status +assignment. Values, slopes and limiting entities are in original coordinates +and objective sense. Every accepted interval is qualified **Numerical**. +The analysis performs private factorization and linear-system work, with zero +optimization runs; property access performs neither operation. + +There is no Model or Session overload, automatic observation solve, replacement +basis, arbitrary supplied basis, ordinary Result input, or conversion from a +quadratic result. O2 callers explicitly obtain its owning observed child first. +Native, MIP/semis, active indicators/globals, non-optimal source, unavailable +duals/basis, active elided constant rows and unsupported parameter kinds retain +the C++ rejection reasons. Unvaried infinite sides remain supported as allowed +by C++. This layer introduces no feature-dropping fallback. + +## Registry ownership and immutable history + +Add a distinct `SensitivityResult` registry kind. Its box owns: + +1. A shared reference to the exact input O1 registry object, captured before + analysis. It survives even when C++ cannot create a sensitivity artifact. +2. The returned `LpSensitivityResult`, which owns any immutable sensitivity + artifact and its selected basis, source result, checks and intervals. +3. An optional final binding-cleanup stop override, described below. + +No raw solver, model, session, factorization buffer or borrowed child pointer +crosses the C boundary. Registry locks cover token lookup/publication only; +they are never held during analysis. Wrong-kind and destroyed tokens fail +before use. In-flight calls retain shared ownership if another caller closes +the input token. Closing the analysis releases only its ownership. + +Two explicit child-copy operations are useful: + +| Operation | Meaning and lifetime | +|---|---| +| `copy_source_observed` | Creates an independent O1 token from the exact saved input. The copied SolveResult and shared O1 observations remain unchanged even if O4 rejects or stops. It survives source/analysis/model/session close. | +| `copy_basis` | Creates an independent existing Basis token from the selected immutable `LpBasis`, when present. Otherwise return the existing `NO_BASIS` API error. Do not reconstruct a basis from statuses or transplant it to another revision. | + +Do not offer a new O4 `copy_result`, `has_solution`, or solver-termination field. +The copied O1 child's existing `copy_result()` exposes original solve history, +not an optimum established by sensitivity analysis. A basis child is historical +selected input; its presence does not establish that factorization or any +requested interval succeeded. + +The runtime owner confirmed that `LpSensitivity::original()` preserves the exact +input SolveResult and the same immutable O1 observations; analysis modifies +only separate diagnostics/ranges. Retaining the source registry object permits +that same guarantee even on an early O4 rejection without an artifact. + +## Additive C ABI records + +Keep ABI version 1 and every existing record layout and symbol unchanged. Add +explicit enum mappings for completion, reason, group state, parameter kind, +range-end kind and limiter side. Do not depend on C++ enum ordinals. All new +records use an exact `struct_size`, zero reserved fields, fixed-width scalars, +counted arrays, and copied text. No C++ `bool`, `size_t`, union layout or pointer +to retained output storage is public ABI. + +The following is the proposed record inventory; final field ordering belongs +to the reviewed implementation, without changing the listed meanings. + +| Record | Required content | +|---|---| +| `gecode_opt_sensitivity_request_v1` | Tagged `ObjectiveCoefficient` or `EqualityRhs`; original `gecode_opt_id` of the required Variable or Row kind. | +| `gecode_opt_sensitivity_checks_options_v1` | Original-unit primal tolerance; the four O1 KKT tolerances; absolute and relative original-system residual tolerances. | +| `gecode_opt_sensitivity_limits_v1` | All eight C++ limits: rows, columns, nonzeros, requests, basis solves, factor entries, retained slots and work. | +| `gecode_opt_sensitivity_options_v1` | Backend, time limit, cancellation token; nested checks/limits; request pointer and count. | +| `gecode_opt_sensitivity_info_v1` | Original owner/revision, completion/reason, present stop reason, artifact/basis presence, entry/factor-order/row-slot/column-slot counts, elapsed time, numerical qualification. | +| `gecode_opt_sensitivity_work_v1` | `factor_setup_attempted`, `basis_solves`, `coordinator_visits`, `retained_slots` copied from C++; separate binding `preparation_visits`. None is interpreted as iterations or bytes. | +| `gecode_opt_sensitivity_group_v1` | State and reason, with message through counted text access. | +| `gecode_opt_sensitivity_end_v1` | Finite/NegativeInfinity/PositiveInfinity tag and an explicitly present finite value exactly for Finite. | +| `gecode_opt_sensitivity_limiter_v1` | Original typed entity, Lower/Upper/Fixed/Free side, and `dual_condition`. Presence is separate from its zero-filled inactive storage. | +| `gecode_opt_sensitivity_interval_checks_v1` | Accepted flag, inequality count, optional maximum endpoint violation, lower/upper direction-checked flags, message through counted text. | +| `gecode_opt_sensitivity_entry_v1` | Request, group, explicit interval presence; anchor, endpoints, optional objective slope, optional limiters, and interval checks when present. | +| `gecode_opt_sensitivity_reference_checks_v1` | Copied primal ValidationReport, O1-shaped KKT diagnostics, basis-point-match flag, optional point/system/scaled-system residuals. Messages remain individually addressable. | + +The limits record has eight quota fields, exactly matching the frozen C++ +header. Every input nesting level, including every request element, is validated +before reading its remaining fields. A defaults function initializes exact +sizes/reserved fields for the options and nested records. Defaults contain an +empty request list, so the caller must supply an explicit nonempty list; NULL +options must not silently mean “all coefficients.” + +Use the existing optional-number convention for genuinely optional finite +metrics. A finite endpoint value must be finite; an infinite endpoint has no +numeric value. The infinite direction, absent endpoint number, missing interval, +zero coefficient, and singleton interval are five different states. Never use +`1e20`, zero, or a missing value as an infinity substitute. + +Scalar ABI/count/enum validation errors return the ordinary API error with the +output handle zero. Empty/duplicate requests, incompatible source, foreign or +deleted source IDs, and unsupported perturbations are passed to the C++ admission +path after safe marshalling, retaining its structured rejection and no-factor +preflight. A request whose C ID has the wrong entity kind is an ABI argument +error. Do not add a second semantic admission policy in the wrapper. + +Before allocation, check pointer/count relationships, uint64-to-size_t and +ptrdiff conversions, container maxima and multiplication overflow. Request +copying must honor `max_requests` and `max_work` rather than allocate an +arbitrarily oversized input only for the runtime to reject it. A bounded +marshaller may return an owning ResourceLimit rejection with saved source +identity and zero backend work; it must not fabricate an attempted factorization. +Document exactly which copied request visits are charged and debit them once +from the runtime's remaining coordinator-work quota. + +Every C entry point is exception-safe. Allocate and fill an owning box before +publishing its token. Catch conversion, allocation and runtime exceptions using +the existing boundary policy. Output structures are initialized before filling; +all reserved/output absence storage stays zero. Bulk/text calls first check the +entire output contract: NULL with capacity zero queries the count; a short +buffer returns `BUFFER_TOO_SMALL` and writes no elements. UTF-8 text counts +include the terminating NUL. + +## Passive accessors and original identity + +Use the `gecode_opt_v1_sensitivity_` prefix for: + +```text +destroy, info, work, checks_options, reference_checks, +copy_source_observed, copy_basis, +entry(index), entries, objective(original_variable), equality_rhs(original_row), +factor_order, active_slots(entity_kind), text(field,index) +``` + +`text` addresses outer message, backend version, each entry group message, +present interval-check message, and the distinct reference primal/KKT messages. +No output refers to temporary text storage. Missing artifacts return a new +`NO_SENSITIVITY` API error for artifact-only getters; info/work/outer message and +source copy remain available. Assign its numeric error code after O3's additive +codes are integrated, without renumbering existing errors. + +Entries retain request order. An original-ID lookup must distinguish: + +| Input/status | Result | +|---|---| +| Correct historical owner, live Variable/Row, requested parameter | Copy the entry and its effective group/optional interval. | +| Correct historical owner and live entity, that parameter not requested | Explicit `requested=false`; Python returns `None`. This is not a failed analysis or an empty interval. | +| Foreign owner, wrong kind, deleted/out-of-range historical slot | Error; no lookup by name, current live model, or unchecked vector offset. | + +`factor_order` returns an ordered array of existing typed original IDs. It is +the checked backend factor ordering, not original slot order. Logical entities +retain their original Row IDs. The binding never encodes negative backend +indices, swaps row sides, or negates maximization sensitivities a second time. +The runtime publishes this vector only after the full count, uniqueness, +owner/mask and basic-status comparison succeeds. It may still be retained as +history when a later request/check/limit fails; it is not interval availability. + +Original active masks include tombstones. Bulk mask access includes inactive +slots; individual sensitivity lookup rejects them. A source edit/destruction +cannot change mappings, copied entries, selected basis or factor order. Limiter +IDs follow the same original mapping; tied limiting conditions need not select +a unique representative. No extra basis algebra belongs in the binding. + +Reference checks are **copied diagnostics**, separate from source O1 checks and +from interval availability. Preserve every optional residual's presence. +`ValidationReport.model_valid` reports a structurally valid source; +`valid` reports accepted primal validation. It is not a separate O4 completion +flag. A default false `basis_point_matches` or KKT `accepted` does not establish +that that check ran. Do not invent a KKT-examined bit absent from the C++ contract +or turn default zero maxima into an available accepted check. Expose the raw +flags, optional metrics and messages with these meanings; consumers establish +interval acceptance from the effective entry state and interval checks. + +## Shared time, limits and final cleanup + +Options are purpose-built analysis options, not SolveOptions. There are no +ignored node limits, threads, primal starts, search gaps, optimization methods +or Exact/Certified flags. Requesting explicit Native remains Unsupported. +The time limit is cooperative; factorization/triangular solves may finish after +it and are checked before publication. No binding silently retries. + +Start one monotonic enclosing clock before retaining/copying source inputs and +marshalling requests. Retain the same cancellation state. Python takes an independent registry owner +through additive `cancellation_copy` before the call, so explicit close of the +caller's owner cannot break its final `cancellation_is_cancelled` check. The +private owner is released before publication. Debit elapsed +marshalling time from the C++ time allowance once, with checked nonnegative +remaining time. Python keeps all marshalled arrays/token owners alive through +the C call. Its request-array preparation also consumes the user's specified +time: begin the Python clock before building the native request buffer and pass +the remainder to C. The C result reports its enclosing elapsed time; Python +retains its preparation duration and includes it once in its owning result's +elapsed-time view. Preserve that accounting after close/copy rather than reading +a clock during passive access. Avoid subtracting the same elapsed portion twice. + +The C++ whole-limit policy clears all intervals even if some were computed +earlier. A binding cleanup checkpoint is needed after releasing its temporary +request/copy buffers and before publishing the result. On a late cancellation +or time limit, preserve source/check/basis/order history but override effective +completion to Interrupted, reason to Stopped, and stop reason to the actual +limit. At that point **every requested entry** becomes Unavailable/Stopped and +has no interval. The following access paths must all apply the override: + +- index, bulk and original-ID entry getters; +- interval/check message access and any Python convenience interval property; +- per-entry groups, outer completion and outer message. + +Unrequested live-ID lookup stays explicitly unrequested. There is no raw +pre-override interval getter. Historical source, selected basis and completed +reference diagnostics may remain readable, without implying accepted O4 +evidence. Exceptions during publication must not leak a token or partially +published accepted entry. A private compile-only cleanup checkpoint fixture, +following O3, can test this without timing sleeps or production callbacks. + +`basis_solves` counts attempted private factor-system calls, not optimization +calls or mathematical requests. A failure can precede the underlying HiGHS +FTRAN/BTRAN accessor; successful private calls reach one such accessor each. `factor_setup_attempted` is separate. Work/retention +and factor-entry quotas are logical guardrails, not exact RSS or instruction +bounds. Binding marshalling counters must be accounted explicitly without +renaming them backend work; the implementation should preserve the C++ counted +work and separately report preparation visits if it adds those visits to totals. + +## Python surface and lifetime + +Use frozen copied records for parameter descriptors, options/limits/tolerances, +range ends, limiters, interval/reference diagnostics, entries, work and info. +Entities retain the existing library-associated Variable/Row types. The owning +`LpSensitivityResult` supports close/context management and passive properties; +copied tuples/dataclasses survive close. `copy_source_observed()` and +`copy_basis()` return independent context-managed owners. Closing a parent must +never close a previously returned child. + +`LpRangeEnd(kind, value)` retains the finite/infinite tag. Do not flatten an +unavailable interval and an unbounded interval into the same `None` pair. +Objective slopes and endpoints are copied directly in original sense; offsets +are not added to slopes. Source optimum, analysis Complete, available basis, +available interval and accepted reference KKT remain distinct fields. + +Validate Python entity type and library association before marshalling; +historical owner/revision/tombstone checks remain in the C++ contract. Require +an explicit parameter sequence; reject unknown Python options rather than +dropping them. Never construct an ordinary Result from O4 fields. + +## Implementation and conformance gates after approval + +Proposed owned files: additive `c_api.h/.cpp`, Python binding/init, new +`test/optimize/lp_sensitivity_c.c`, new Python sensitivity tests, and a concise +binding reference. Add a separate private cleanup fixture if the runtime panel +cannot exercise binding-only cleanup. The integrator owns CMake, installation, +consumer registration and the shared performance gate. Freeze the runtime +source before final evidence; do not link an O4-absent facade archive. + +1. **ABI admission and output safety.** Outer/nested/request sizes and reserved + fields, unknown enums, NULL/count mismatches, count overflow and quota + preflight, required-count queries, short buffers, optional flags, UTF-8 text, + and zero output handle after API failure. Keep assertions enabled in Release + by undefining NDEBUG in each standalone C fixture. +2. **Analytic signs/endpoints.** For `min 2*x+y`, `x+y=3`, `x,y>=0`, select the + y basis: objective-x `[1,+infinity]`, objective-y `[-infinity,2]`, equality + RHS `[0,+infinity]`. Check anchors/slopes and mirrored maximization/offset + cases against independent arithmetic. Cover finite, singleton and infinite + ends, zero objective coefficients and a logical-basic equality singleton. +3. **Provenance and factor order.** Mixed structural/logical basis, source + tombstones, reordered factors, foreign/deleted/unrequested IDs, source edits, + and source/session/analysis close. Copied O1 result/observations must match + the input even after rejected O4. Copied basis retains its source and its + usual compatibility checks. +4. **Truthful availability.** Not-optimal/no-basis/failed source checks, + unsupported Native/MIP/global/parameter, missing backend and zero-row or + elided-row source. Distinguish no artifact, no selected basis, unavailable + request, numerical rejection, singleton and accepted interval. Expose absent + KKT/point/system metrics as absent, never accepted zeros. +5. **Partial and stopped analyses.** A mixed per-request result copies every + reason without promoting Partial to Complete. Whole time/cancel/resource + limits erase all intervals. A deterministic post-runtime binding cancellation + must revoke index/bulk/lookup intervals and messages, retain raw diagnostic + history, and leave independently copied source/basis children usable. +6. **No hidden solving.** Getter and copy operations preserve work counters and + do no backend work. Report factor-setup attempts and attempted factor-system calls from + the runtime. Do not use a source Optimal status to synthesize analysis success + or infer zero optimization work from a vendor iteration count. +7. **Build matrix.** C99 and Python on core/backend-off, normal pinned HiGHS, + and fully instrumented matching HiGHS plus facade, then installed consumers. + Re-run existing binding conformance after additive symbols land. No timing + or throughput claim belongs to this correctness panel. + +The runtime owner has confirmed unchanged source history, fully validated +factor-order publication and whole-limit interval clearing. The integrator +approved this contract and the separate preparation-work debit; implementation +evidence will be recorded separately from this design after runtime alignment. diff --git a/docs/solver-parity/LP-SENSITIVITY-BINDINGS.md b/docs/solver-parity/LP-SENSITIVITY-BINDINGS.md new file mode 100644 index 0000000000..2d881568b5 --- /dev/null +++ b/docs/solver-parity/LP-SENSITIVITY-BINDINGS.md @@ -0,0 +1,163 @@ +# Numerical LP sensitivity from C and Python + +The additive version-1 bindings expose +[`analyze_lp_sensitivity`](../../gecode/optimize/lp_sensitivity.hpp) on an owning +O1 observed result. They retain original IDs, selected basis, check diagnostics, +and per-request availability. They perform no optimization solve and never +turn an analysis into an ordinary solver Result. See the +[C++ sensitivity scope](LP-SENSITIVITY.md) for the algorithm and numerical limits. + +```python +from gecode_optimize import ( + Model, LpSensitivityOptions, LpObjectiveParameter, LpEqualityRhsParameter, + LpSensitivityState, +) + +with Model() as model: + x = model.add_variable() + y = model.add_variable() + balance = model.add_row([(x, 1), (y, 1)], lower=3, upper=3) + model.set_objective([(x, 2), (y, 1)], offset=7) + with model.solve_lp_observed() as observed: + with observed.analyze_sensitivity(LpSensitivityOptions(parameters=( + LpObjectiveParameter(x), LpObjectiveParameter(y), + LpEqualityRhsParameter(balance), + ))) as analysis: + for entry in analysis.entries or (): + if entry.group.state is LpSensitivityState.AVAILABLE: + print(entry.parameter, entry.interval.lower, + entry.interval.upper) +``` + +For the selected y basis, the example's objective-x coefficient range is +`[1,+infinity]`, objective-y is `[-infinity,2]`, and common equality RHS is +`[0,+infinity]`. These are absolute parameter values, varied **one at a time** +for this selected basis/status assignment. They are not simultaneous-change +ranges or ranges over all optimal bases. Objective slopes and limiter IDs use +original coordinates and original objective sense; the objective offset is +absent from the slope. + +## Owning results and truthful states + +`LpSensitivityResult.info` separates Complete, Partial, Interrupted and Rejected +analysis completion from each entry's group state/reason. A Partial result may +contain accepted intervals and rejected requests. Every accepted interval is +Numerical. No exact/certified option is offered. Original source termination +and original O1 check results remain unchanged. + +- `entry(index)`, `entries`, `objective(variable)`, and `equality_rhs(row)` return + copied immutable entries. A valid historical entity that was not requested + returns `None` from the two ID lookups. Foreign or deleted IDs raise an error. +- `LpRangeEnd` distinguishes a finite value from negative or positive infinity. + Its value is present exactly for a finite endpoint. An unavailable interval + is `None`; a finite singleton remains a present interval with equal endpoints. +- An interval includes its anchor, optional original-objective slope, optional + original limiting entities/sides, and independent interval-check diagnostics. + Limiting conditions need not have a unique representative under ties. +- `reference_checks` retains copied primal/KKT/system diagnostics. Missing + residuals remain `None`. Default false flags do not prove a check ran; default + zero maxima do not establish acceptance. Consult the entry state and interval + checks for accepted sensitivity evidence. +- `factor_order` contains typed original Variable/Row IDs in the validated + factor order. It need not be slot order. `active_slots(Variable)` and + `active_slots(Row)` include historical tombstones. +- `copy_source_observed()` returns an independent O1 owner even after rejection + without a sensitivity artifact. Its `copy_result()` is unchanged source-solve + history. `copy_basis()` returns an independent selected Basis owner when + available; it does not establish factorization or interval success. + +Copied dataclasses, source children and basis children survive closing the +analysis, source, model or session. A selected basis still obeys the existing +O2 source/revision compatibility checks. The analysis does not consult a live +model after capture. Accessors do no solver, factorization or analysis work. + +The initial supported source is an original continuous linear LP with timely +Optimal O1 primal/dual checks and complete basis, analyzed through HiGHS/Auto. +Native, MIP/semis, active indicators/globals, quadratic input, elided constant +rows, unavailable basis, arbitrary replacement basis and inequality/range-side +perturbations remain explicit rejections. To use an O2 result, first obtain its +owning observed child. There is no implicit source solve or fallback. + +## Time, cancellation and resource quotas + +`LpSensitivityOptions` contains purpose-built backend/time/cancellation, +`LpSensitivityTolerances`, `LpSensitivityLimits`, and an explicit nonempty +parameter tuple/list. It accepts no ignored SolveOptions fields. All eight C++ +quotas are exposed. Limits are logical guardrails, not exact RSS/instruction +bounds; time limits are cooperative across non-preemptive backend work. + +One enclosing time allowance includes Python/C request preparation, C++ work, +and input cleanup. Each layer deducts only its own preparation time. A whole +operation limit clears every requested interval, even if completed earlier; +source/basis/reference history remains available as diagnostics. The C and +Python final cleanup checks apply to every index/bulk/ID interval view and its +message, so a late result cannot retain stale accepted ranges. + +`work.preparation_visits` counts C marshalling visits separately. One visit is +charged per copied request and deducted once from runtime `max_work`. +`coordinator_visits` retains the C++ count. Oversized request/work admission +rejects before allocating/copying its array. Python uses a bounded sentinel +only for this guaranteed C count-rejection path; it does not partially marshal +or analyze an oversized request list. + +`basis_solves` and `max_basis_solves` use **attempted private factor-system +calls**. An allocation/argument failure may precede the underlying HiGHS +FTRAN/BTRAN accessor. Factor setup has its separate attempted flag. These +counts are not optimization runs or iterations. + +`Cancellation.copy()` and C `cancellation_copy` produce independent owners of +the same cancellation state. Closing one owner leaves the others usable; +cancellation through any owner reaches all of them. `cancelled` / +`cancellation_is_cancelled` reads the state. O4 Python retains a private owner +through the call and final cleanup check, so explicitly closing the caller's +token after admission cannot discard a returned analysis. Invalid options keep +their original rejection precedence even with a stopped token or negative time. + +## C ABI details and verification + +The new records/symbols are in [`c_api.h`](../../gecode/optimize/c_api.h), under +`sensitivity_*` and `analyze_lp_sensitivity`. Existing ABI-1 record layouts are +unchanged. The input is an observed-result token of the correct registry kind; +ordinary Result, Model, Session, evidence, and quadratic tokens are rejected. + +All new outer/nested/request record sizes must match exactly and reserved input +fields must be zero. Numeric optional values have explicit presence. Outputs +initialize sizes and reserved fields; counted text includes NUL. NULL with zero +capacity queries a bulk/text size; a short buffer writes no elements. Default +options leave the request list empty, requiring an explicit list. Invalid ABI +shape returns the usual error and a zero output token. Safe semantic admission +returns structured analysis rejection. `NO_SENSITIVITY` distinguishes a missing +artifact; source copy and outer info/work/message remain usable. + +The independent binding panel covers analytic min/max endpoints and offsets, +logical-basis singletons, real numerical Partial results, typed IDs/tombstones, +source/basis ownership, malformed records, counted buffers, quota accounting, +invalid-option precedence and final cleanup. The private C++ cleanup fixture +compiles its own C API object with +`GECODE_OPTIMIZE_TEST_SENSITIVITY_BINDING` and `GECODE_OPT_C_API_EXPORTS`, then +links **only the C++ facade**; it must not also link the ordinary C wrapper. +The hook is absent from production. Python uses deterministic post-call +cancellation/clock hooks to check its separate cleanup and token-close boundary. +All standalone C/cleanup fixtures undefine NDEBUG to keep assertions active in +Release. Build results and exact frozen dependency hashes are recorded with the +binding evidence separately; this panel makes no performance claim. + +The final isolated binding panel passed on macOS arm64: C99 against normal +HiGHS/native, backend-off core, and fully instrumented standalone HiGHS; +the private cleanup fixture against normal and instrumented HiGHS; and all +83 Python tests in each of those three variants. Backend-off cases verify +explicit rejection and ownership rather than executing supported intervals. +The instrumented Python run used the Framework Python 3.14 executable with +Clang's ASan runtime preloaded, `ASAN_OPTIONS=detect_leaks=0:halt_on_error=1` +and `UBSAN_OPTIONS=halt_on_error=1`. It completed all 83 tests in 2.389 seconds +without a sanitizer finding. Leak detection was disabled, and this run does +not instrument the Python interpreter itself. + +The saved evidence directory is +`implementation/agents/results/build/lp-sensitivity-bindings` in this workspace. +It retains per-command JSON, compile/link/run logs and +`completion-artifacts.json` with SHA-256 hashes of the final source, frozen +facade inputs and instrumented outputs. Its instrumented C wrapper hash is +`30f0e3ddfa1c4f57d51a8b18fe5f12e22303077a16fb908219bc42839661d01f`. +These are isolated binding checks; the combined branch regression and +performance comparison are separate integration gates. diff --git a/docs/solver-parity/LP-SENSITIVITY-DESIGN.md b/docs/solver-parity/LP-SENSITIVITY-DESIGN.md new file mode 100644 index 0000000000..cda62f6a83 --- /dev/null +++ b/docs/solver-parity/LP-SENSITIVITY-DESIGN.md @@ -0,0 +1,501 @@ +# O4: numerical sensitivity of a specified optimal LP basis + +Design record, 2026-09-05. This proposal is preserved separately from the +[implemented first slice and its verification](LP-SENSITIVITY.md); planned gates +below must not be read as completed test evidence. Source inspection uses Optimize at `069a66c7c` plus the completed +O3 files, and HiGHS 1.15.1 at +`04024d701f79feb8e2f18bc3df0dffc04ef05088`. O1 observations, O2 basis submission, +and O3 evidence recovery remain separate operations. + +## Recommended first slice + +Add `analyze_lp_sensitivity(const LpObservedResult&, options)`. It owns the +historical source, selected original-coordinate basis, and checked reference +point. It computes one-parameter **fixed-basis numerical intervals** using a +fresh private HiGHS factorization. Its first two parameter kinds are an original +objective coefficient and the common RHS of an original equality row. + +This is additional linear algebra, with its own time/cancellation and work +limits. It performs **zero optimization runs**, never changes a Session or the +input result, and never silently chooses another basis. It requires a timely +optimal continuous LP result with available O1 primal, dual/KKT, and basis +groups. An ordinary primal optimum without a basis is insufficient. The caller +can explicitly obtain suitable observations or submit a basis using O1/O2 first. + +Use the existing sparse factorization, not a new dense linear algebra package. +Derive perturbation inequalities from original coefficients and bounds, and +check every returned linear-system solution against that matrix. Do not expose +HiGHS bound-ranging arrays as commercial-solver lower/upper sensitivity fields. +Use `getRanging` only as a test comparator where its perturbation is demonstrably +the same. This is a refinement of the O4 direction in +[LP-OBSERVATIONS-DESIGN.md](LP-OBSERVATIONS-DESIGN.md). + +Variable lower/upper bounds, separate sides of inequality/ranged rows, fixed +variable movement, range translation, matrix coefficients, simultaneous +perturbations, and ranges across multiple optimal bases remain explicit future +work. Ranged/inequality rows may occur in the source LP and restrict supported +coefficient/equality intervals; only *requests to vary their bounds* are outside +the first slice. A degenerate basis is not automatically unsupported. + +## Commercial semantics and the actual difference to close + +| Capability | Documented commercial meaning | Proposed O4 treatment | +|---|---|---| +| Objective coefficient | Gurobi `SAObjLow/Up`, CPLEX `CPXobjsa`: absolute coefficient endpoints associated with an optimal basis | First slice, original coefficient and objective sense | +| Equality RHS | Gurobi `SARHSLow/Up`; CPLEX RHS sensitivity moves both equality bounds together | First slice, explicitly `a*x = t` | +| Variable LB and UB | Gurobi `SALBLow/Up`, `SAUBLow/Up`; CPLEX `CPXboundsa` has four outputs | Separate future one-side requests; opposite side stays fixed | +| Ranged-row sides | CPLEX `getRangeSA` treats lower and upper sides independently | Future typed lower-only/upper-only requests | +| Translating a range | CPLEX Concert RHS sensitivity describes simultaneous motion of both bounds | Future explicit translation, with width preserved | +| Fixed variable bounds | Gurobi bound sensitivity reports the fixed value and says no sensitivity information is available | Explicit unavailable reason for independent-bound requests; moving both fixed bounds would be a different parameter | +| No basic solution | Gurobi sensitivity attributes require a basic solution; CPLEX objective/RHS routines require an optimal basis | Reject admission without an available, checked basis | + +These are basis-dependent intervals, not a guarantee that a particular primal +point, the entire optimal face, or the solution is unique. A basis can stop being +optimal while another basis represents the same optimum. Changing multiple +parameters within their individual intervals need not preserve optimality. +[Gurobi variable attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/variable.html#saobjlow), +[Gurobi RHS attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/constraintlinear.html#sarhslow), +[Gurobi basis availability](https://docs.gurobi.com/projects/optimizer/en/current/concepts/attributes/types.html), +[CPLEX objective sensitivity](https://www.ibm.com/docs/en/icos/22.1.1?topic=o-cpxxobjsa-cpxobjsa), +[CPLEX variable-bound sensitivity](https://www.ibm.com/docs/en/cofz/22.1.2?topic=b-cpxxboundsa-cpxboundsa). + +Do not treat the two vendors' ranged-row `RHS` fields as an interchangeable +original lower bound. Gurobi documents `addRange` as an equality with an added +bounded slack: changing only that equality RHS at fixed slack width translates +the original interval. CPLEX distinguishes independent `getRangeSA` sides from +simultaneous `getRHSSA` motion. Our model already stores original lower and upper +bounds, so expose the perturbation itself, without importing an ambiguous vendor +representation. [Gurobi addRange](https://docs.gurobi.com/projects/optimizer/en/current/reference/python/model.html#Model.addRange), +[CPLEX range-side API](https://www.ibm.com/docs/en/icos/22.1.0?topic=c-ilocplex-2), +[CPLEX simultaneous RHS motion](https://www.ibm.com/docs/en/icos/22.1.0?topic=gm-getrhssa-method-double-double-irange-int32-int32). + +Infinity is an endpoint direction, not unavailable data or a large finite +number. CPLEX examples use `CPX_INFBOUND` to encode it; our public representation +must tag it explicitly. Sensitivity also depends on numerical quality. A small +linear-system residual does not alone bound forward error for an ill-conditioned +basis. [CPLEX infinity convention](https://www.ibm.com/docs/en/icos/22.1.2?topic=clt-performing-sensitivity-analysis), +[CPLEX numerical quality guidance](https://www.ibm.com/docs/en/icos/22.1.2?topic=problems-numeric-difficulties). + +## What pinned HiGHS getRanging actually does + +The following are source-derived findings, not executed reproductions. + +* `Highs::getRanging` calls `getRangingInterface`, which constructs a solver + object from the **original** `model_.lp_`, then invokes `getRangingData`. + There is no `run`, `solveLp`, or optimization fallback in this chain. +* `getRangingData` rejects non-optimal status and an uninitialized simplex + instance. It calls `unscaleSimplex`, modifying internal working arrays, and + performs FTRAN for every nonbasic structural/logical entity. It is not a + passive vector getter; its main loop contains no time/cancellation polling. +* It clips basic values to bounds and nonbasic reduced costs to feasible signs, + filters tableau coefficients at `1e-9`, and rounds endpoint magnitudes below + `1e-13` to zero. These decisions are not exact endpoint certification or the + caller's original-unit checker tolerances. +* Objective arrays have `n + m` entries in this version, although only the first + `n` represent source objective coefficients. Column bound arrays have `n` + entries, row bound arrays `m`. Every record has value, predicted objective, + entering-index, and leaving-index arrays. Combined indices use structural + columns followed by logical rows, with `-1` as absence. +* Max objective-cost endpoints are already swapped/negated on output. Original + row-bound directions are also swapped/negated. Endpoint objective values + start from the backend objective, including its offset. A wrapper applying + these transformations again would be wrong. + +Sources: [public wrapper](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L2191), +[interface](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsInterface.cpp#L1825), +[preconditions and unscaling](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L70), +[numerical thresholds and FTRAN loop](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L133), +[output conversion](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L516). + +Most importantly, bound-up/down describe status-dependent experiments. Upstream +tests move the active side of a nonbasic entity, both sides of a fixed entity, +the lower bound for a basic entity's upward test, and its upper bound for the +downward test. The basic branch can compute a moved basic value after a pivot or +bound flip. The test then **reoptimizes** and compares the endpoint objective; +it does not assert that the original basis/status assignment remains optimal. +[Basic-bound algorithm](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsRanging.cpp#L459), +[column experiments](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/check/TestRanging.cpp#L261), +[row experiments](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/check/TestRanging.cpp#L399). + +A symbolic discriminator, independently reviewed by the model/solver agent: + +```text +minimize y +x - y = 1 +0 <= x <= 3; 0 <= y <= 2 +selected basis: x basic, y at its lower bound, equality logical nonbasic +reference point: x=1, y=0 +``` + +For this fixed basis/status assignment, the largest possible lower bound on +`x` is `1`. The pinned basic-bound-up branch can instead reach `x=3, y=2`, with +objective `2`, by moving/pivoting the entering variable. That endpoint cannot be +renamed `SALBUp(x)`. This exact model must become a regression before any bound +sensitivity implementation. No live HiGHS output for it was produced during +this design-only task. + +## Source proof of factorization without an optimization run + +Use the following precise chain on a fresh private `Highs`. This deliberately +differs from O2's alien-basis submission, where reporting repair is useful. + +1. Validate complete original source, slot masks, all statuses, finite-bound + compatibility, and exactly `m` basic entities. Reject + `NonbasicUnspecified`, wrong dimensions, foreign IDs, and unsupported model + data before touching the backend. Pass an unchanged ordinary continuous LP. +2. Construct a complete `HighsBasis` with `alien=false`, `valid=true`, + `useful=true`, explicit statuses, and a nonempty origin. The non-alien + `setBasis` path checks consistency and copies statuses; it does not optimize + or repair. `newHighsBasis` invalidates the internal EKK basis/invert. +3. Call `getBasicVariables` with an allocated `m`-entry buffer. When no invert + exists, it calls `formSimplexLpBasisAndFactor(..., true)`. That routine + initializes EKK through `moveLp`, sets the supplied basis, and calls + `initialiseSimplexLpBasisAndFactor(true)`. +4. The `true` flag forbids rank-deficiency repair: singularity returns an error, + rather than introducing logical columns. A successful result has an invert; + check `hasInvert()` explicitly. Recheck the public statuses and decoded basic + entity set against the requested basis. An unexpected change rejects the + analysis. Permutation of the same basic entities is allowed and recorded. +5. Only then use dense-buffer `getBasisSolve` / `getBasisTransposeSolve`. + Both require an existing invert. Their implementations perform FTRAN/BTRAN + and contain no optimization call. Pass null sparse-output arguments: avoid + unnecessary sparse count/index paths and validate all dense output values. + +This is a source proof of the intended call path, **not runtime evidence**. +Before shipping, a direct fresh-instance regression must exercise this exact +sequence without `run`, on ordinary/scaled/mixed-logical/singular bases. Keep +production optimization entrypoints absent from the factorization helper. + +Sources: [non-alien setBasis and invalidation](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L2732), +[getBasicVariables](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsInterface.cpp#L1438), +[factor setup](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsSolution.cpp#L1850), +[no-repair branch](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/simplex/HEkk.cpp#L1441), +[basis solve accessors](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L2344), +[upstream singular-basis test](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/check/TestAlienBasis.cpp#L684). + +Do not substitute alien `setBasis` and assume its temporary factor survives: +the alien path can complete/repair the basis, and `newHighsBasis` still invalidates +EKK afterward. Do not call `getRanging` after this sequence: an invert alone does +not establish its optimal-model-status and initialized-solve prerequisites. + +## Original coordinates, signs, scaling, and presolve + +Use original finite lower/upper bounds and objective coefficients. Let `s=+1` +for minimization, `s=-1` for maximization. In the private basis algebra define + +```text +u = (x, z), z = -A*x +M = [A, I], M*u = 0 +h = (s*c, 0) +structural bounds: col_lower <= x <= col_upper +logical row bounds: -row_upper <= z <= -row_lower +``` + +An original row's `Lower` status becomes logical `Upper`, +and original `Upper` becomes logical `Lower`. Basic stays Basic; fixed logicals +have both bounds equal. `getBasicVariables` uses nonnegative structural indices +and `-(row_index+1)` for logicals, **not** ranging's `n+i` convention. Decode +negative indices with checked arithmetic, avoiding signed-min negation. Save the +ordered `B` entities; do not assume basic order is original slot order. +[Public encoding](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/Highs.h#L681), +[row status conversion](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/simplex/HEkk.cpp#L1226), +[logical column sign](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/util/HighsSparseMatrix.cpp#L1618). + +The basis-solve interface refreshes its original-LP/scaling pointers. FTRAN +applies row scaling before the factor solve and basis-column scaling after it; +BTRAN uses the reverse order. Thus pass original-unit RHS/cost vectors and check +the answers against original `B`; do not rescale the public answers again. +Logical columns use reciprocal row scaling within the basis-column conversion. +[Interface scaling path](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsInterface.cpp#L1480), +[FTRAN/BTRAN scaling](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/simplex/HSimplexNla.cpp#L96), +[scale factors](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/simplex/HSimplexNla.cpp#L245). + +O1 observations already own the original model and mapped postsolve basis. A +source solve may have used presolve; the new analysis imports the *original* +matrix, has no presolve/optimization call, and refactors that selected original +basis. HiGHS's normal solve path reconstructs original basis statuses and may run +original-LP simplex cleanup after postsolve; that work belongs to the original +solve, not this analysis. IPM without crossover/PDLP may yield no basis. Return +NoBasis rather than running crossover implicitly. +[Postsolve and original cleanup](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L1837). + +Local mapping hooks, at the inspected Optimize revision: + +| File/location | Required reuse or preservation | +|---|---| +| `gecode/optimize/solve.cpp:78` `Compiled` | `slots` and `backend_row_slots` map backend indices to original slots | +| `solve.cpp:89` `compile` | Exact structure/range admission and lossless matrix conversion; constant rows are elided | +| `solve.cpp:163` `prepare_basis` | Existing public status conversion; O4 uses its own fully checked non-alien path | +| `solve.cpp:606` observation collector | Remains passive; do not add sensitivity computation here | +| `solve.cpp:745` `observed_solve` | Existing whole-budget and post-cleanup policy is the lifecycle precedent | +| `lp_observations.hpp:100` `LpObservations` | Immutable source/metadata/groups; retain shared ownership | +| `lp_basis.cpp` factories and compatibility | Reuse complete masks/status/entity checks; do not weaken same-source semantics | + +O1 basis export is unavailable when an active constant row was elided. Preserve +that boundary; do not invent an inverse mapping. Tombstones retain slots in the +new result, with inactive data absent. Historical observations remain usable +after model edits/destruction; analysis does not consult the live model. A +different revision is a different analysis input, even if its numerical data +happen to match. No automatic stale-basis transplant is offered. + +## Interval algorithm and independent checks + +First reconstruct the selected basic solution, not just a feasible point: +assign every nonbasic `u_N` to its selected bound, fixed value, or zero for a +genuinely free `Zero` status, then solve `B*u_B = -N*u_N`. Solve +`B^T*pi = h_B` and form `d = h - M^T*pi`. Recompute original activities and +objective with compensated wide accumulation. Check basis-point agreement with +the source result, finite data, original primal feasibility, reduced-cost signs, +stationarity, complementarity, and offset-free primal/dual gap. This prevents a +feasible O1 primal/dual point and an unrelated feasible-looking basis from being +combined into invented ranges. Original duals are `s*pi`; original structural +reduced costs are `s*d_x`. + +For every solve check `B*v-rhs` or `B^T*v-rhs` using the independent original +matrix. Record absolute and scaled residuals, with the exact tolerances used. +Reject nonfinite values and lossy nonzero underflow, and handle cancellation +while traversing matrix data. Do not label residual acceptance a condition-number +or exactness guarantee. A later condition estimator can be added explicitly. + +For an objective coefficient `c_j = c_j0 + delta`, let `q` have `s` in structural +position `j` and zero elsewhere. Solve `B^T*v=q_B` when `j` is basic; otherwise +`v=0`. Then + +```text +d(delta) = d(0) + (q - M^T*v)*delta +``` + +Intersect all nonbasic dual-feasibility inequalities: `d>=0` at a lower bound, +`d<=0` at an upper bound, `d=0` for a free nonbasic entity. A fixed entity has +no reduced-cost sign restriction. Primal values/bounds are unchanged. Original +objective change is `x_j*delta`, independent of objective sense; `s` is used only +in normalized optimality inequalities. The coefficient anchor is zero when that +active original variable has no explicit objective term. + +For equality `a_i*x = b_i0 + delta`, the logical variable is fixed to +`-b_i0-delta`. If it is nonbasic, its derivative is `-1` and +`u_B' = B^-1*e_i`; all other nonbasic derivatives are zero. Intersect every +original/logical primal-bound inequality along `u(delta)`; costs and nonbasic +dual signs are unchanged. Also check the original direction equations and +finite-side derivative conditions. Original objective change is +`c^T*x'*delta`, agreeing with the selected original row dual times `delta`. + +If an equality logical is basic, nonbasic values stay fixed and this basis +forces its old activity. Moving its common bound therefore gives a singleton +interval at the reference RHS. Check the baseline fixed activity and report the +singleton explicitly; do not use HiGHS's basic-bound pivot range. Redundant +equalities and degeneracy are covered by this case. + +Intersect linear scalar inequalities in `long double` with checked arithmetic. +Both finite endpoints are absolute parameter values, not allowable deltas. +Retain anchor, derivative, and limiting original entity/side where determinable. +The final interval must contain its anchor; reversed, NaN, unrepresentable finite, +or numerically inconsistent results are Rejected for that request. Do not widen +a range by the primal tolerance or snap a tiny slope to zero and declare an +infinite range. If numeric uncertainty prevents reliable classification, report +it. A zero-width interval is valid and distinct from unavailable data. + +The checker independently re-evaluates the complete affine inequality family at +finite endpoints. A finite endpoint needs at least one matching limiting +inequality; an infinite endpoint needs sign compatibility of every derivative +in that direction. These are tolerance-qualified numerical checks, not a proof +covering arbitrarily large perturbations. Testing interior samples alone is +insufficient to validate endpoint maximality or infinity. + +## Proposed owning API + +Names below are a design sketch, not a released header. Avoid modifying +`SolveResult`, O1 records, `SolveOptions`, or existing C ABI structs. + +```cpp +struct LpObjectiveParameter { Variable variable; }; +struct LpEqualityRhsParameter { Constraint row; }; +using LpSensitivityParameter = + std::variant; + +struct LpSensitivityOptions { + Backend backend = Backend::Auto; // Auto resolves to HiGHS + double time_limit_seconds = infinity; + std::shared_ptr cancellation; + std::vector parameters; + LpSensitivityTolerances checks; + LpSensitivityLimits limits; +}; + +enum class LpRangeEndKind { Finite, NegativeInfinity, PositiveInfinity }; +struct LpRangeEnd { LpRangeEndKind kind; std::optional value; }; +struct LpParameterInterval { + LpRangeEnd lower, upper; + double anchor; + std::optional objective_slope; // original sense, no offset + // Optional limiting original entity/side; tied limiters are not unique. + LpIntervalCheckReport checks; +}; +struct LpSensitivityEntry { + LpSensitivityParameter parameter; + LpSensitivityGroup group; // state, typed reason, message + std::optional interval; +}; + +class LpSensitivity; // immutable, owning +struct LpSensitivityResult { + ModelId model_id; + Revision revision; + LpSensitivityCompletion completion; // Complete/Partial/Interrupted/Rejected + std::optional stop_reason; + std::shared_ptr sensitivity; + LpSensitivityWork work; + double elapsed_seconds; +}; +LpSensitivityResult analyze_lp_sensitivity( + const LpObservedResult&, const LpSensitivityOptions&); +``` + +`LpSensitivity` owns a copy of the ordinary source result, a shared immutable O1 +observation, an owning selected `LpBasis`, backend/version metadata, reference +basis/KKT checks, original row/column masks, ordered factor-basis identities, and +entries in request order. Original-slot lookup returns objective/equality entry +or explicit NotRequested; foreign and historical tombstone handles throw +`ModelError`. Copies of public results/arrays never borrow backend vectors. +`LpRangeEnd::value` is present exactly for Finite; the whole interval is absent +unless its group is Available. Infinity endpoints cannot be substituted as +finite parameter values. + +Require a nonempty explicit parameter list, reject duplicates and invalid kinds, +and preflight all IDs and request shapes before factorization. A one-sided/ranged +row passed as `LpEqualityRhsParameter` is Unsupported, not approximated as an +equality. Requested group failure is separate from an unchanged source Optimal +termination. Never infer Infeasible/Unbounded from an interval or factorization +failure. The guarantee is always Numerical; no exact/certified setting is +offered, and no MIP node/gap or primal-start options are silently ignored. + +Whole-input failures reject all groups. Per-parameter numeric failure may coexist +with other complete entries: use Partial when some requested intervals are +available, Rejected when none are; Complete requires every request to be +available. On any whole-operation +deadline/cancellation/work/resource failure, clear **all** availability, retaining +only completed diagnostics and historical source data. This matches the +conservative O1/O3 cleanup policy. Accessors do no work after publication. + +## Budgets, resource limits, and failure boundaries + +Start the monotonic budget before copying the mutable outer result or scanning +the source. The immutable observations may be shared; complete result values +still need an owning copy. Check all size arithmetic against `size_t`, +`ptrdiff_t`, container limits, and pinned `HighsInt` before allocating/traversing. + +Initial configurable guards should bound active rows/columns, matrix nonzeros, +requests, retained logical slots, coordinator element visits, and the number of +basis linear-system calls. Choose conservative defaults after the first +conformance panel; do not claim timings from design. Guard possible dense +factor fill using checked row-count-square admission if needed, but label it a +logical resource guard, not a precise bound on HiGHS allocator overhead or RSS. +Stream one requested derivative and its matrix scan at a time; do not allocate a +full `m*n` tableau or explicit inverse. Count only actual FTRAN/BTRAN accessor +invocations as `basis_solves`; use a separate `factor_setup_attempted` flag. +Optimization runs are structurally zero, not inferred from an iteration counter. + +Set a single-threaded private backend and remaining time where supported, but +document that factorization and triangular solves contain uninterruptible +regions. No callback promises a hard kill deadline there. Poll before/after +each backend call and during our loops; after private backend/raw buffer release, +check the still-live budget again before publishing. An overrun is Interrupted +and publishes no intervals. No automatic retry with presolve, another basis, a +different tolerance, or a cold solve is allowed. Allocation/backend exceptions +must clear states before constructing error strings and must not escape future +C boundaries. + +First-slice non-admissible cases: non-Continuous variables including semis; +active indicators/globals; quadratic/nonlinear models; missing HiGHS; explicit +Native; non-optimal or malformed source result; missing O1 groups or failed KKT; +unknown/incomplete statuses; mismatched owner/revision/masks; active constant +rows elided by O1; invalid finite coefficients/bounds or adapter threshold +violations; singular/changed basis; unsupported perturbation; exceeded caps. +Empty/zero-row sources without a backend basis remain NoBasis in the first +slice. A later checked local bound-only analysis can support them explicitly. +Infinite unvaried bounds are valid and simply omit their inequality side. + +## Conformance gates before release + +1. **Prove the factor-only path at runtime.** Fresh private instances, no `run`, + complete non-alien basis, `getBasicVariables`, invert, FTRAN/BTRAN. Test + singular same-size bases, zero rows, unknown/free/fixed statuses, mixed + structural/logical columns, nontrivial scaling, and original residuals. + Compare requested/returned identities, not just the count of Basic statuses. +2. **Independent exact small-basis oracle.** Test-only rational elimination on + integer/rational matrices derives the entire affine inequalities and endpoint + ratios independently. Do not copy production interval code into the oracle. + Enumerate small bases to show basis dependence under degeneracy. +3. **Analytic parameter panel.** `min 2*x+y`, `x+y=b`, `x,y>=0`, at `b=3` + gives objective-x range `[1,+inf]`, objective-y `[-inf,2]`, equality RHS + `[0,+inf]` for the `y` basis. Verify sign-reversed maximization and offsets. + Add finite two-sided bounds, negative/free variables, fixed variables, + duplicate/redundant equalities, logical-basic singleton RHS, zero costs, + zero-width intervals, and one-sided/ranged source rows that restrict ranges. +4. **Endpoint/interior/outside checks.** Independently re-solve selected finite + perturbations only in tests. Inside, the selected basis affine point/dual + must satisfy original KKT. At finite endpoints, verify the exact oracle's + limiting condition. Outside, verify fixed-basis failure; do not demand that + the solver's new optimum or objective must differ. Test infinite directions + by the analytic inequalities, not a handful of large samples. +5. **HiGHS/commercial differential checks.** Compare getRanging costs and + compatible nonbasic equality-RHS endpoints on well-scaled nondegenerate + cases. Include the basic-bound counterexample and prohibit its renaming. + Optional CPLEX/Gurobi tests require existing licensed installations and + matched source basis/parameter semantics; absence must not be reported as + vendor conformance. No vendor installation is required for the core oracle. +6. **Numerical adversaries.** Scaled rows/columns, nearly singular bases, + tiny nonzero derivatives, NaN/infinite/overflowed outputs, finite-versus- + infinite endpoint confusion, interval excluding anchor, incompatible slopes, + cancellation such as `1 + 1e16 - 1e16`, and offsets dominating objective + changes. Test residual acceptance without overstating forward accuracy. +7. **Ownership and edits.** Tombstones, wrong entity kind/owner, deleted requested + slot, mutable outer result with bad status/identity/masks/scalars, model/session + destruction, session edits after observation, and reanalysis of both old and + new observations. Old analysis must remain unchanged and addressable only by + its original historical handles. +8. **Fault and budget seams.** Private separately compiled test access layer + supplies corrupted factor order/vector/status and deterministic phase/final- + cleanup cancellation; production has no callbacks/hooks beyond the real + backend. Fail before snapshot copy, during setup, between requests, and after + otherwise available intervals. Allocation faults and prior successful + analysis must not leak stale groups. Assert no optimization operation is + requested by the coordinator. +9. **Build gates.** Backend-free admission, numerical normal, fully instrumented + ASan/UBSan including HiGHS, installed C++ consumer, then owning C99/Python + tests after bindings land. Standalone tests explicitly keep assertions active + under Release/NDEBUG. Later add one analytic min/max O4 case to FAST without + weakening its whole-run deadline; build time stays separate. + +## File ownership and subsequent slices + +First vertical implementation: new `gecode/optimize/lp_sensitivity.hpp/.cpp`, +private factor/checker interface, `test/optimize/lp_sensitivity.cpp`, a separate +coordinator/fault test, and delivery documentation. Root owns CMake, install, +umbrella header, and FAST wiring. If sharing the existing numerical conversion +requires extracting a private helper from `solve.cpp`, agree that small ownership +change first; leave its passive observation and session behavior unchanged. +Do not duplicate a weaker coefficient admission path in the new analyzer. + +The first C/Python binding should take an owning O1 observed-result token and +checked versioned request records, return a distinct immutable sensitivity token, +and offer bounded per-entry/bulk retrieval. Extended endpoint kind and group +availability have separate explicit enums. Copied source observations/results +outlive all model/session/input handles. Use existing registry ownership and +exception boundaries, exact struct/element sizes, zero reserved fields, and +preflighted buffers; no getter may trigger factorization or solving. + +Then extend the same algebra to explicit finite lower-only/upper-only bound +changes, equality/fixed movement, and fixed-width range translation, each with +its own affine definition and independent oracle. For a basic entity, changing +one bound keeps the selected basic value until it becomes infeasible; for an +inactive nonbasic side, keep its selected active value unchanged. Include bound +consistency and fixed/free special cases. This closes the four-output commercial +API gap without relying on HiGHS's differently defined movement arrays. + +Optimal-face ranges, degeneracy graph traversal, simultaneous parametric regions, +matrix-coefficient sensitivity, condition estimation, and exact interval +certificates need separate designs. The distinction between one selected basis +and multiple optimal bases is also a research topic in sensitivity/parametric +programming; the bounded implementation need not solve that broader problem. +[Research overview: Gal and Greenberg, Advances in Sensitivity Analysis and Parametric Programming](https://link.springer.com/book/10.1007/978-1-4615-6103-3). diff --git a/docs/solver-parity/LP-SENSITIVITY.md b/docs/solver-parity/LP-SENSITIVITY.md new file mode 100644 index 0000000000..d7c8bfd444 --- /dev/null +++ b/docs/solver-parity/LP-SENSITIVITY.md @@ -0,0 +1,185 @@ +# O4: continuous LP coefficient and equality sensitivity + +`analyze_lp_sensitivity` computes owning, original-coordinate intervals for one +specified optimal LP basis. The implemented parameters are a single objective +coefficient and the common RHS of an equality. Each interval varies that +parameter alone while retaining the selected basic entities and nonbasic bound +statuses. Every accepted interval is numerical data, not an exact certificate. + +```cpp +#include + +using namespace Gecode::Optimize; +Model model; +auto x = model.add_continuous(); +auto y = model.add_continuous(); +auto balance = model.add_row({{x, 1}, {y, 1}}, 3, 3); +model.minimize({{x, 2}, {y, 1}}, 7); +auto observed = solve_lp_observed(model); +LpSensitivityOptions options; +options.parameters = {LpObjectiveParameter{x}, LpEqualityRhsParameter{balance}}; +auto analysis = analyze_lp_sensitivity(observed, options); +if (analysis.sensitivity) { + const auto* entry = analysis.sensitivity->objective(x); + if (entry && entry->group.state == LpSensitivityState::Available) { + // For the y basis: coefficient x in [1, +infinity]. + // entry->interval has tagged endpoints, slope and numerical checks. + } +} +``` + +The source operation is explicit. Analysis does not solve for missing +observations, submit or repair a basis, mutate an existing session, or choose a +different backend. An O2 basis solve can supply its observed child to select a +different source basis. Basis dependence matters even at an identical degenerate +optimum: with `x+y=0`, nonnegative variables and zero objective, the x-basic +basis permits coefficient x in `[-infinity,0]`; the y-basic basis permits +`[0,+infinity]`. + +## Admission and scope + +The input must be a numerical Optimal O1 result with immutable source data, +accepted primal/dual/KKT observations and an available complete basis. The +mutable outer result's status, owner, revision, masks, finite assignment and +objective are checked independently before factorization. The reference basis +point is then reconstructed and checked against the source assignment. Unknown +statuses, foreign/deleted request IDs, duplicate requests, invalid tolerances, +empty requests and unsupported backend selections fail explicitly. + +All active source variables must be Continuous. Active indicators/globals, +quadratic/nonlinear data, MIP/semis, elided constant rows, zero-row/column sources, +singular or changed bases, and missing HiGHS are not admitted. Auto uses the +HiGHS numerical factorization route; Native is Unsupported. The existing HiGHS +conversion admission is reused, including its finite coefficient/bound limits; +this operation does not introduce a weaker model conversion. + +Ranged, one-sided and free source rows and infinite unvaried bounds may restrict +supported intervals. Requests to vary inequality/ranged-row sides, variable +bounds, matrix entries or multiple parameters simultaneously are not in this +slice. An equality request moves both finite equal bounds together. Fixed +columns, free nonbasic columns, and redundant equalities are handled explicitly; +a basic equality logical yields a singleton RHS interval. A singleton is valid +data, distinct from unavailable data. + +## Private factorization and original checks + +The implementation uses pinned HiGHS 1.15.1 at +`04024d701f79feb8e2f18bc3df0dffc04ef05088` in a new private instance. It loads the +original admitted LP, sets a complete **non-alien** basis, and calls +`getBasicVariables` to form an inverse from that known basis. It requires an +invert, the exact original requested statuses and a fully checked original +entity ordering. Singular factorization is rejected without repair. The private +instance must retain Notset model status and invalid solve information. + +The backend interface exposes only factor-system solves. Production uses +`getBasisSolve` and `getBasisTransposeSolve`; it never calls optimization +`run`, `solve_lp_observed` or `getRanging`. The original solve result and its O1 +observations remain unchanged. A factor order is published only after all +count, index, owner, uniqueness, mask and basic-status checks succeed. + +The combined matrix is `[A,I]`, with logical coordinates `z=-A*x`. Original row +lower/upper statuses swap for the logical variable, and logical bounds are +`[-row.upper,-row.lower]`. Objective sense is normalized during algebra and +mapped back once. Each returned FTRAN/BTRAN vector is independently checked +against the original, unscaled basis matrix. No second scaling or public-row +sign correction is applied to HiGHS's original-coordinate linear-system output. + +The reconstructed reference point must pass original rows/bounds, agree with +the source assignment, and pass independent numerical stationarity, dual-sign, +complementarity and offset-free gap checks. Compensated accumulation includes +the objective or reduced-cost anchor in the same sum as all contributing terms; +large objective offsets and `10^16 - 1 - 10^16` do not erase a residual by +prematurely collapsing an intermediate dot product. Long double is used where +the platform provides extra precision; correctness does not assume it does. + +For a coefficient, the unchanged primal basis point and the derivative of +nonbasic reduced costs define the interval. Fixed nonbasic variables impose no +dual-sign condition; free nonbasic variables impose both signs. For an equality +RHS, original finite sides constrain the affine basis point; the derivative of +the selected moving logical bound is subtracted from its own inequality. + +No small derivative is silently clipped to zero. Finite endpoints are absolute +parameter values and are rechecked after conversion to double. Overflow of a +finite endpoint is rejected, never reported as infinity. An infinite endpoint +is tagged and accepted only when every affine inequality permits that direction. +Numerical tolerances qualify residual/endpoint checks; they do not deliberately +widen the computed interval. Numerical errors can make a particular request +Unavailable/Rejected even when other requests pass. A residual test is not a +condition estimate or a forward-error certificate. + +The source investigation and commercial API comparisons are retained in +[LP-SENSITIVITY-DESIGN.md](LP-SENSITIVITY-DESIGN.md). In particular, raw HiGHS +basic-variable bound movement is not renamed as a Gurobi/CPLEX bound sensitivity +attribute; those operations have different semantics. + +## Ownership, availability and budgets + +The artifact owns a copy of the exact original outer result, shares its immutable +O1 observations, and owns its selected basis. Original slot masks include +tombstones. Lookups reject foreign/deleted historical handles and return null +for a live historical entity that was not requested. Model or session edits, +reset and destruction never update an existing artifact. Accessors do no +factorization, optimization or other backend work. + +Complete means every requested interval passed; Partial means some per-request +checks failed. Neither status upgrades the numerical qualification. Whole-call +time/cancellation, resource, allocation and cleanup failure clear **every** +interval and every Available state, including ranges computed before a Partial +outcome. Original solve history, a previously validated factor order and +completed check diagnostics may remain present. Their presence does not imply +interval availability. Optional residuals remain absent until calculated; +default false diagnostic flags do not establish that a check ran. + +A single monotonic allowance starts before option validation and source copying. +It includes admission, private factorization, system solves, checking and final +backend/vector-capacity release. Cancellation uses the same shared token. +Factorization and triangular solves have cooperative uninterruptible regions: +the operation checks before/after calls and clears availability if the final +allowance expired, rather than claiming a hard process-kill deadline. Invalid +options retain their input rejection even if an invalid negative deadline or an +already-cancelled token is also supplied. + +Caps cover active rows, columns, nonzeros, request count, `m*m` factor admission, +logical retained slots, coordinator visits and attempted factor-system calls. +They are not an exact RSS, CPU instruction or hidden backend-iteration count. +`basis_solves` is charged once immediately before a call to the private factor +interface; a failing call can stop before the HiGHS accessor is reached. +`factor_setup_attempted` is separate. `max_work=0` on a nonempty input stops +before factorization with ResourceLimit/IterationLimit. Remaining stop reasons +and preflight rejections are reported explicitly; no limit triggers a retry, +relaxation or different basis. + +## Verification of this slice + +Local correctness runs use Apple Clang 17, C++17, assertions enabled, and the +matching frozen Regular/O1/O2 facade dependencies in +`build/regular-bindings/{normal,off,sanitize}`. The private conversion bridge and +new sources were freshly compiled; no older facade was substituted for the new +implementation. Normal and full ASan/UBSan runs use the pinned matching HiGHS +foundation. Sanitizer runs set `detect_leaks=0` and `halt_on_error=1`; no leak +detection claim is made. Build time and these runs are not performance evidence. + +| Test | Independent coverage | +|---|---| +| `lp_sensitivity_factor.cpp` | Actual factor-only accessors, mixed structural/logical order and signs, scaled rows, original residuals, singular rejection, unchanged basis and no optimization status | +| `lp_sensitivity.cpp` and `lp_sensitivity_oracle.hpp` | Analytic min/max/offset intervals; 16 exact rational boxed two-variable cases using vertex objective comparisons rather than production tableau algebra; endpoint/interior/outside comparisons; original-unit scaling; fixed/free/zero-cost variables; degeneracy, redundant equality singleton, ranged source rows, ownership/session edits/tombstones, large-cancellation residual and an actual-backend Partial caused by an unrepresentable limiting endpoint | +| Same main test in backend-free build | Missing source observations and a valid synthetic O1 artifact with an explicitly missing factor backend; no false available intervals | +| `lp_sensitivity_coordinator.cpp` | Separately compiled fake factor interface with bad counts/order/owners/vectors/NaN/residuals; per-request Partial; tiny finite derivatives and finite overflow; quota and malformed-option admission; allocation/backend exception; deterministic phase, partial and final-destructor cancellation; subsequent clean reuse | + +The rational oracle enumerates the original feasible vertices and compares +objectives using checked small rational arithmetic. It is deliberately not a +copy of the production basis equations. Fixed-basis RHS endpoints have separate +closed-form rational witnesses. Broader random rational matrices, condition +estimates, commercial differential tests and simultaneous perturbations remain +future coverage; no CPLEX/Gurobi execution or full sensitivity parity is claimed. + +The integrator owns CMake/install/umbrella and installed-consumer registration. +The main facade needs `lp_sensitivity.cpp` and `lp_sensitivity_backend.cpp`; only +the backend needs the existing HiGHS definition/includes. The normal test links +the facade. The coordinator separately compiles `lp_sensitivity.cpp` with +`GECODE_OPTIMIZE_TEST_LP_SENSITIVITY=1` and supplies the test factor/checkpoint +symbols; production contains neither test symbol. The factor experiment links +HiGHS directly and is enabled only with that backend. Private backend/detail +headers are excluded from installation. Owning [C/Python bindings](LP-SENSITIVITY-BINDINGS.md), +installed consumers and FAST registration are integrated and validated in the +[ninth checkpoint](NINTH-CHECKPOINT.md). diff --git a/docs/solver-parity/MINIZINC.md b/docs/solver-parity/MINIZINC.md new file mode 100644 index 0000000000..6e85f44cc6 --- /dev/null +++ b/docs/solver-parity/MINIZINC.md @@ -0,0 +1,225 @@ +# Experimental MiniZinc registration + +This opt-in solver identity connects MiniZinc 2.10.1 to the explicit +`fzn-gecode-optimize` frontend and Native/Exact search. It does not replace the +existing `org.gecode.gecode` registration, change solver preferences, or select +itself as the default. The small compatibility suite establishes correctness for +the tested subset; it makes no performance claim or general MiniZinc/FlatZinc +coverage claim. + +The compiler and matching standard library are external trusted translation +components. The optimization frontend independently checks the complete emitted +FlatZinc model and every published assignment against its retained source records. +It does not independently prove that the MiniZinc compiler preserves an arbitrary +original `.mzn` model. Tests therefore also check source-level answers and the +actual emitted predicates. + +## Registration and invocation + +`tools/flatzinc/gecode-optimize.msc.in` defines +`org.gecode.optimize.experimental`, displayed as **Gecode Optimize (experimental)**. +Its executable is a JSON argument array containing the driver and `--minizinc`; +its solver library is `tools/flatzinc/mznlib-optimize`. The only advertised solver +standard flag is `-t`. Tags are `cp`, `int`, and `experimental`; there are no float, +set, restart, MIP, or default tags. + +A configured registration can be selected by its explicit path: + +```sh +minizinc --solver /path/to/gecode-optimize.msc model.mzn data.dzn +minizinc --solver /path/to/gecode-optimize.msc --solver-time-limit 1000 model.mzn +``` + +Enable `GECODE_OPTIMIZE_MINIZINC_REGISTRATION=ON` in a top-level build with the +optimization FlatZinc driver and native backend enabled. The option defaults to +OFF. Optionally set `GECODE_OPTIMIZE_MINIZINC_EXECUTABLE` to an existing pinned +compiler to enable the real compiler CTest; configuration never downloads one. + +```sh +cmake -S . -B build/native-compat \\ + -DGECODE_OPTIMIZE_MINIZINC_REGISTRATION=ON \\ + -DGECODE_OPTIMIZE_MINIZINC_EXECUTABLE=/path/to/minizinc +cmake --build build/native-compat --target gecode-optimize-minizinc-config +ctest --test-dir build/native-compat --output-on-failure -R '^optimize-minizinc-' +``` + +The `gecode-optimize-minizinc-config` target is part of the default build and +depends on the actual driver. It generates +`build/native-compat/minizinc//gecode-optimize.msc`, with absolute +build-tree executable/library paths and the Gecode version. For a Release build, +`` is `Release`; an empty single-configuration build type omits it. + +With `GECODE_INSTALL=ON`, normal CMake installation also installs the dedicated +library at `share/minizinc/gecode-optimize-experimental` and the registration at +`share/minizinc/solvers/gecode-optimize.msc`. The installed JSON uses paths relative +to its own directory, so `cmake --install ... --prefix /chosen/prefix` works. +Customized relative GNU install bindir/datadir values are supported; absolute +values are rejected for this relocatable registration. The existing Gecode +registration and library remain unchanged. + +The pure CMake script escapes JSON paths after target-file expansion; it can also +be invoked independently: + +```sh +cmake -DTEMPLATE=/source/tools/flatzinc/gecode-optimize.msc.in \ + -DVERSION=6.4.0 -DDRIVER=../../../bin/fzn-gecode-optimize \ + -DMZNLIB=../gecode-optimize-experimental -DOUTPUT=/install/solvers/gecode-optimize.msc \ + -P /source/tools/flatzinc/configure-optimize-msc.cmake +``` + +It takes the maintained JSON template, escapes quotes/backslashes and all non-NUL +ASCII controls in the three substituted strings, preserves relative paths and +UTF-8, and replaces the output only after writing a separate temporary file. +NUL cannot occur in an OS command-line argument/CMake string. The script does not +build targets, download dependencies, inspect solvers, or change preferences. +The template itself must be valid JSON with the maintained placeholders. +`test/optimize/minizinc_configure.py --cmake /path/to/cmake` independently decodes +encoded JSON and tests failure publication; it requires no MiniZinc or driver. + +For temporary discovery by ID, a caller may set `MZN_SOLVER_PATH` to the directory +containing this `.msc`. The tests scope that environment change to their own +process. Neither the driver nor the registration writes `Preferences.json` or +`tagDefaults`. + +## Solver protocol + +The explicit mode accepts: + +```text +fzn-gecode-optimize --minizinc [-t MILLISECONDS] MODEL.fzn|- +``` + +`-t` can precede or follow the filename. `--` ends option parsing, allowing a +filename beginning with a hyphen. Exactly one filename and at most one `-t` are +required; unsupported flags, missing values, fractions, negative values, duplicate +options, and unsigned-count overflow are errors. This mode always uses Native +with the exact guarantee and zero requested gaps. No backend override is accepted. + +`-t` is an unsigned decimal count of milliseconds. Zero means unlimited, matching +MiniZinc 2.10.1's convention: its external-solver adapter only forwards a time flag +and creates a solver watchdog when the limit is nonzero. Positive values become +the shared frontend seconds budget; argument/file opening precedes that budget, +and capture, compilation, solve, output validation, and rendering share it. +Capture has cooperative stage boundaries, so the surrounding MiniZinc process +may enforce its own watchdog after its cleanup allowance. No late assignment is +published after the driver's overall deadline. + +An ordinary interruption prints `=====UNKNOWN=====` or a validated incomplete +solution stream and returns **0** in this protocol. Errors remain nonzero and +never print a success/proof marker. This matters because MiniZinc treats nonzero +child exit as `ERROR`, including when the child printed `UNKNOWN`. + +The direct driver interface remains separate: `MODEL.fzn --time-limit SECONDS` +retains its existing filename-first syntax, immediate zero deadline, optional +explicit HiGHS route, and exit **1** for an ordinary incomplete solve. + +The `.msc` does not advertise enumeration, intermediate incumbents, parallel +search, randomness, or solver statistics. The driver rejects such flags if +forwarded. MiniZinc itself may consume `--statistics` for compilation/output +statistics or consume `--parallel` without forwarding it to an unsupported solver; +absence from `stdFlags` is not a promise that MiniZinc rejects every such outer +option. Actual 2.10.1 tests reject `--all-solutions` and +`--intermediate-solutions`, and force `-s`/`-p` forwarding to check the driver +boundary. + +## Library lowering and rejection + +The dedicated library overrides only these native global entry points: + +| Standard library entry | Emitted predicate | Preserved boundary | +|---|---|---| +| `fzn_all_different_int` | `all_different_int` | Original positions and aliases; no legacy registry alias inference | +| `fzn_table_int` | `gecode_table_int` | Row-major tuple flattening, positive arity; zero arity rejected because flat cells lose tuple count | +| `fzn_regular` | `gecode_regular` | Literal `Q/S/d/q0/F`, row-major transitions, one-based source states and failure state zero | +| `fzn_circuit` | `gecode_circuit` | Nonempty arrays; nonnegative original index bases retained, negative bases translated by subtracting the original minimum index from every successor | +| `fzn_cumulative` | four-argument `gecode_cumulatives` | Original starts, durations, demands and capacity; no substitution from `lb`/`ub`; fixed data required by the frontend | + +Cumulative durations/demands/capacity must be literals or singleton domains in the +emitted original FlatZinc declarations. The wrapper does not infer them from +propagation. Fixed zero-duration tasks consume no resource, and intervals are +half-open. Native scheduling arithmetic limits still apply. MiniZinc's standard +library may first simplify high-level cumulative models into other equivalent +constraints; the tests deliberately force the native wrapper as well as exercise +standard simplification. + +Remaining standard-library decompositions are accepted only when their *complete* +emitted model passes frontend admission. For example, the pinned library can +lower reified Regular to a larger ordinary Regular and exact Boolean/linear +constraints; positive and complement witnesses are tested. This is not a new +native reified-Regular API. There is no direct registry alias fallback. + +The narrow `redefinitions.mzn` declares only supported integer implications and +provides explicit compiler errors for variable multiplication/division/modulo and +unsupported reified integer/linear equalities. It deliberately does not copy +Gecode's broad redefinitions. Unsupported float/set variables, search annotations, +nonlinear or unknown predicates, malformed records, unbounded/native-out-of-range +domains, and unsupported global shapes remain explicit frontend errors whenever +they survive compilation. Constant simplification or a supported exact standard +library decomposition can eliminate a higher-level unsupported construct; no +claim is made that all such source syntax is categorically rejected. + +MiniZinc's atom-only `ctx_pos`, `ctx_neg`, and `ctx_mix` context annotations are +admitted explicitly. Calls with these names and unknown annotations remain +rejected. Their presence does not weaken the relation or original checker. + +The default tested MiniZinc pipeline is its ordinary single pass. Options such as +`--use-gecode`/`-O3`, shaving, and SAC invoke another solver during compilation and +are outside this registration's verified route; in particular they have not been +audited against the documented legacy zero-duration cumulative discrepancy. + +## Reproduction and acceptance gates + +Provision a compiler manually from the **official** pinned release; CMake and the +test never fetch dependencies. `tools/flatzinc/minizinc-release.json` records the +2.10.1 macOS ARM64 package source and its official SHA256. Verify the downloaded +archive before extraction, and keep the compiler and its bundled standard library +together. Local installation was entirely under `implementation/deps`. + +Run the committed gate against a prebuilt driver: + +```sh +python3 -B test/optimize/minizinc_registration.py \ + --minizinc /workspace/implementation/deps/MiniZinc-2.10.1-aarch64-apple-darwin/bin/minizinc \ + --binary /path/to/fzn-gecode-optimize +``` + +Add `--registration /path/to/gecode-optimize.msc` to exercise an actual configured +build/install artifact **in place**. The runner does not rewrite that file or +substitute its library. It resolves relative paths against the registration's +directory, requires the executable plus `--minizinc` to match `--binary`, and +rejects a `-G` library alias. Reports include the actual configuration SHA256, +every dedicated library file's SHA256 and a deterministic aggregate library hash. +Both configuration and library must remain unchanged throughout the gate. + +The gate requires version 2.10.1, otherwise creates a temporary `.msc`, checks discovery, +compiles every supported fixture, audits emitted predicate names, and sends each +model through the real compiler/driver/`.ozn` output pipeline. Independent tiny +integer oracles cover signed objectives and offsets, aliases/holey domains, +all-different, table aliases, Regular including compiler-generated reification, +negative/nonunit circuit bases, Element index shifts, cumulative half-open and +zero-duration semantics, and fixed parameters. It also checks explicit errors, +filename ordering, count overflow, zero-time conventions, and actual finite parser +workloads under a 1ms timeout. These timeout checks are conformance tests, not +solver-performance measurements. A machine completing the entire parser workload +within 1ms will fail the fixture rather than silently omit the timeout gate. + +There are per-child and aggregate deadlines. On POSIX the test starts a new process +group and terminates it during cleanup, including MiniZinc's driver child. On +Windows it uses the existing creation-time Job Object containment helper and +fails closed if containment cannot be established. The release gate must exercise +this path on a real Windows host before claiming Windows runtime verification. +JSON reports contain all required cases plus driver/compiler and fixture hashes. +The existing direct CLI suite must also continue to pass. + +Local results and exact commands are reported with the feature commit; remote CI +and non-macOS execution are not implied by the local gate. + +## Primary references + +- [MiniZinc 2.10.1 official release](https://github.com/MiniZinc/libminizinc/releases/tag/2.10.1) +- [Solver configuration format](https://docs.minizinc.dev/en/2.10.1/fzn-spec.html#solver-configuration-files) +- [FlatZinc standard flags](https://docs.minizinc.dev/en/2.10.1/fzn-spec.html#command-line-interface-and-standard-options) +- [FlatZinc error and warning output](https://docs.minizinc.dev/en/2.10.1/fzn-spec.html#error-and-warning-output) +- [Pinned MiniZinc external-solver implementation](https://github.com/MiniZinc/libminizinc/blob/2.10.1/solvers/fzn/fzn_solverinstance.cpp) (`solve`: nonzero-only time flag/watchdog, exit-status mapping) +- [Pinned context annotation declarations](https://github.com/MiniZinc/libminizinc/blob/2.10.1/share/minizinc/std/stdlib/stdlib_ann.mzn) +- [Pinned high-level cumulative simplifications](https://github.com/MiniZinc/libminizinc/blob/2.10.1/share/minizinc/std/cumulative.mzn) diff --git a/docs/solver-parity/NATIVE-LP.md b/docs/solver-parity/NATIVE-LP.md new file mode 100644 index 0000000000..c5454ba0f6 --- /dev/null +++ b/docs/solver-parity/NATIVE-LP.md @@ -0,0 +1,217 @@ +# Native Gecode with checked sparse LP deductions + +`solve_native_lp` is an explicit C++17 entry point joining the bounded-integer +sparse relaxation to the owning optimization model API. `solve()`, `Auto`, and +ordinary `solve_native()` retain their existing behavior. A performance default +has not been selected from the correctness measurements below. + +```cpp +#include +namespace O = Gecode::Optimize; +O::Model model; +auto x = model.add_integer(-2, 10); +auto y = model.add_integer(0, 10); +model.add_row({{x, 2}, {y, 3}}, 7, + std::numeric_limits::infinity()); +model.minimize({{x, 1}, {y, 1}}, 8); +O::NativeLpOptions options; +options.solve.guarantee = O::Guarantee::Exact; +options.solve.time_limit_seconds = 10; +auto outcome = O::solve_native_lp(model, options); +const auto& result = outcome.result; +if (result.has_solution()) { + // Historical original-model values; inspect termination separately. + const auto value = result.value(x); +} +const auto lp_calls = outcome.relaxation.lp_calls; +``` + +Both `Model` and owning `ModelSnapshot` overloads are available, including in a +backend-free build. Check `native_lp_capabilities().available`; a missing native +engine, HiGHS library, or compiler with the checked 128-bit implementation gives +`Unsupported`. In particular, the current MSVC certificate implementation is not +available; the facade does not silently run a different solver on that platform. +Consumers need only the optimization headers and exported library target, not +HiGHS headers. A combined top-level native build with +`GECODE_ENABLE_OPTIMIZE=ON`, `GECODE_OPTIMIZE_WITH_NATIVE=ON` and +`GECODE_OPTIMIZE_WITH_HIGHS=ON` enables the implementation on supported compilers. +The optional legacy MiniModel component itself need not be enabled. + +## Original semantics and derived relaxation + +The existing native compiler owns enforcement of all original rows, reified +indicators, inactive-gate identities and native globals. It supports finite +Integer/Binary/SemiInteger variables, integral bounds/coefficients/offsets, and +the conservative arithmetic limits in [NATIVE.md](NATIVE.md). Unsupported +continuous or fractional data is rejected without rounding. + +The LP projection contains only ordinary active linear rows. It excludes +indicator-generated big-M rows and their original conditional rows, and excludes +global constraints. Those remain fully enforced by native propagation. Each +ranged row becomes up to two canonical sparse `A*x >= b` rows. Tombstones are +removed only from the private column representation, and every reported value +maps back to its original slot. SemiInteger variables keep their native domain +holes; the LP uses the enclosing `[0, upper]` box. Omitting constraints and holes +makes a valid relaxation, not a substitute definition of feasibility. + +Minimization costs enter directly. Maximization negates the linear costs and +links an auxiliary LP cost to the negative of the native objective variable. +The original offset stays outside the relaxation and is restored exactly in +reported results. In addition to the native guards, LP coefficients, row bounds +and objective coefficients must have magnitude at most `1e9`; objective absolute +activity is limited to half the native integer range. A model accepted by the +plain native bridge can therefore be Unsupported in the hybrid entry point. + +Numerical HiGHS row multipliers only propose deductions. The separate checked +integer certificate implementation verifies the weak-duality bound and any +objective-cutoff interval reductions before native domains change. Numerical LP +infeasibility is counted as a diagnostic and never suffices to prune a space. +Every returned witness is independently checked against all original integer +constraints and the original objective. `Guarantee::Exact` is supported for this +bounded discrete subset; `Guarantee::Certified` is still Unsupported because +the solver does not export a full independently checkable search proof. + +## Scheduling, ownership and budgets + +Default `NativeLpFrequency::Root` attempts an LP at root propagation, and +`bound_tightening=true` retains the resulting affine certificate for cheap exact +reevaluation in descendant boxes. `AfterBoundChanges` requests reoptimization +after `bound_change_interval` observed variable interval changes; the interval +must be positive. These are propagator scheduling policies, not promises of +exactly one LP call per search node. Fully assigned spaces need no LP call. + +Each solve owns a separate backend workspace. Cloned spaces share it through +owning references; access is serialized and every call resets all column bounds, +including bounds widened when visiting a sibling. A previous basis is a hint. +It is never a certificate for another box. The workspace is destroyed after +search finishes, while copied results and statistics remain available. + +The shared solve budget includes snapshotting, native/LP compilation, search and +original-witness validation. Cancellation, zero time and zero node limits are +checked before LP construction. Cancellation/time limits remain **cooperative**: +native propagation and an in-progress LP call cannot be preempted. Each LP +attempt has its own HiGHS limit of 0.2 seconds and 10,000 simplex iterations; +that backend time limit also is cooperative and is not a strict latency bound. +Candidates arriving after the shared deadline are not newly published. + +Only one deterministic worker and seed zero are supported. Complete exact +starts use `options.solve.primal_start`, including the live indicator gate +completion and exact input checks in [NATIVE.md](NATIVE.md#complete-native-starts). +A validated start is published before expensive LP/root-cover preparation; the +unfixed native root then receives its strict objective cutoff. Root covers +still use original global rows/domains, and cutoff-dependent filtering is not +promoted to globally reusable cuts. Unresolved partial starts are unsupported. +Interrupted results may retain a previously validated incumbent but +have no global bound or gap: a checked bound at one search node is not a bound +over the unresolved search frontier. Full exhaustion has the existing native +Optimal/Infeasible semantics. These limitations are explicit in capability +metadata, not hidden fallback rules. + +The separate `relaxation` record reports LP calls/time, accepted/rejected +certificates, ignored numerical infeasibility reports, filtering evaluations, +conditional checks, variable fixings and interval tightenings. Counts describe +the entire solve, including cloned/recomputed spaces; they are not unique-node +counts. `result.backend` and `backend_version` identify both engines. +Empty or zero matrices can obtain a checked box bound without calling HiGHS; +the accepted-bound count can therefore exceed the LP-call count. + +## Optional verified root covers + +```cpp +options.root_cover_cuts = O::NativeRootCoverSettings{}; // absent by default +options.root_cover_cuts->max_rounds = 4; +options.root_cover_cuts->max_work = 4000000; +auto strengthened = O::solve_native_lp(model,options); +const auto& cuts = strengthened.relaxation.root_cover; +// cuts.requested, cuts.completion, cuts.cuts, cuts.work, cuts.lp_calls +``` + +This setting runs the [root cover loop](CUT-LOOP.md) before creating native +search spaces. Its immutable source contains the original normalized ordinary +linear rows, original objective coefficients and original LP domain hulls. +Every cover is independently proved globally valid for that source. Neither +indicator-generated rows nor constraints discovered at a search node become +proof premises. General integer terms can participate only when the cover +transformation supports their original domain; other rows are skipped and +counted. The original native indicators, globals, domain holes and witness +checker remain active throughout search. + +Each successful round produces a fresh immutable augmented sparse backend. +The existing integer LP posting helper posts its implied cover rows natively +as well as using them in LP solves. Full native coefficient/activity preflight +precedes that publication. Every model column and reported original identity +keeps its previous meaning. Maximization remains normalized by negating costs; +the original objective offset stays outside both the root loop and its cuts. + +The solve retains the root loop's original source, exact cut records, current +model and earlier checked-bound evidence for the entire search lifetime. +Cloned native actors own the augmented backend and their own checked +certificates. Root-loop certificates are **not seeded** into actors or the +frontier: a last-round augmentation may not have been solved yet, while an older +retained bound belongs to a different augmented matrix. The normal actor +re-evaluates the backend it actually owns. The older BAB API still has no +interrupted global bound, even if the root loop obtained a checked bound. + +`NativeRootCoverSettings` exposes total root rounds/work, cut count/nonzeros, +augmented model columns/rows/nonzeros, separator row/term caps and the rational +selection denominator. Defaults match the experimental loop. Zero caps are +valid and stop that optional preprocessing. Other separation heuristics retain +their bounded experimental defaults. The denominator must be a power of two +from 1 through 1,048,576; validation also runs in builds without LP capability. +Public callers do not need experimental or HiGHS headers. + +The root loop shares the outer solve's cancellation/node predicate and remaining +absolute deadline. After it returns, the bridge rechecks the outer budget to +report its precise time/cancellation/node reason. Root LP attempts do not count +as native node admissions. Time remains cooperative around LP, separation and +native work. No source is pruned using floating infeasibility or a raw LP primal. + +Root round/work/storage/separation limits preserve the verified augmentation +already completed. `NoPrimalSuggestion` and `InvalidSuggestion` also preserve +the original solve: numerical suggestions select cuts only. If no backend was +created, the bridge constructs the original backend when the outer budget +allows. Consequently these cut limits are not limits on total native search +storage or work. `CallbackError`/`BackendError` stop with solve `BackendError`; +`AllocationFailure` stops with `MemoryLimit`. No operational error is presented +as successful separation or as original infeasibility. + +The nested `relaxation.root_cover` record reports requested/not-started state, +explicit cut completion, rounds/augmentations, accepted cuts/nonzeros, work, +projection/skipped-row diagnostics, and all root-loop LP calls/time and checked +or rejected bounds. Its LP counters are already included in the enclosing +`relaxation` totals. Those totals combine every intermediate root backend with +only the retained backend's **post-handoff delta**, so root calls are not counted +twice. A skipped row or `NoNewCuts` does not establish complete cover separation. + +## Validation and remaining work + +`optimize-native_lp` checks finite-model configurations using an independent +integer enumeration oracle: signed coefficients and domains, ranged/one-sided +rows, both senses and offsets, original-slot tombstones, SemiInteger holes, +reified indicators/gates and all-different semantics. Each model runs with root +and repeated LP schedules, filtering on/off and intervals 1/3. Additional tests +cover independent concurrent solves, historical result ownership, changed bounds, +malformed options/snapshots, unsupported scale/types/guarantees/partial starts/workers, +zero budgets/cancellation, and absent interrupted frontier bounds. Both native +and HiGHS source libraries are instrumented in the combined ASan/UBSan check. + +The same product oracle now runs with root covers off/on, including a combined +binary cover, all-different, reified indicator, semi-integer and offset fixture. +Targeted root-limit tests verify unchanged optima through every exposed cap, +including the last-round unsolved-backend handoff and empty models without LP +suggestions. A coordinator build with `GECODE_NATIVE_ROOT_CUT_TEST_HOOKS` injects +missing/invalid suggestions, operational errors and cancellation at preparation +boundaries. It verifies that hints never decide feasibility, failures cannot +publish incumbents or seed bounds, and requested Exact classification survives +interruption. Existing frontier fault hooks remain independently available. + +The normal and fully instrumented native+HiGHS checks pass 759 native LP +oracle/root-cover configurations. The frontier companion passes 2,723 +configurations with both preparation and search-lifecycle fault hooks enabled. +Backend-free and native-only builds also pass the explicit unavailable-LP +boundary checks. These are correctness checks; no timing benchmark was run. + +This delivers the W5 public bridge and a bounded W7 global-root-cover option. +Dynamic local cuts, presolve/postsolve composition, stronger branching, and a measured automatic +hybrid policy remain separate roadmap work. The API currently has no C/Python +binding and does not capture arbitrary pre-existing Spaces or FlatZinc models. diff --git a/docs/solver-parity/NATIVE-NEIGHBORHOODS-DESIGN.md b/docs/solver-parity/NATIVE-NEIGHBORHOODS-DESIGN.md new file mode 100644 index 0000000000..42847adc5e --- /dev/null +++ b/docs/solver-parity/NATIVE-NEIGHBORHOODS-DESIGN.md @@ -0,0 +1,488 @@ +# W9b: bounded native primal neighborhoods + +Design and implementation boundary, 2026-09-05. The first bounded BinaryHamming +slice is implemented; see [the current API and limits](NATIVE-NEIGHBORHOODS.md). +No performance benefit is claimed. W9a complete starts are implemented; see +[the start contract](NATIVE-PRIMALS-DESIGN.md). This extends roadmap **W9, primal +portfolio**. W10 remains the separate explanation/LCG project. + +The first slice should be one explicitly requested, LP-free **BinaryHamming** +improvement attempt inside the native frontier coordinator. It searches the +original model plus a distance restriction and a strict incumbent cutoff, +retains every native global constraint, and shares only a completely checked +better incumbent with the main search. All existing solve routes and defaults +remain unchanged. This does not yet provide a first feasible solution, general +integer neighborhoods, RINS, RENS, partial-start repair, or an adaptive portfolio. + +## Source audit and research basis + +The audit includes the current `NativeSpace`, `compile`, `prepare_start`, +`check_exact`, `BinaryReliability`, and `native_frontier_impl` in +[`native.cpp`](../../gecode/optimize/native.cpp), the public +[`native_search.hpp`](../../gecode/optimize/native_search.hpp) counters, and +[`SolveBudget`](../../gecode/optimize/result.hpp). Symbol references are used +because integration moves line numbers. + +| Existing mechanism | Consequence for the first neighborhood | +|---|---| +| `compile` checks finite integral domains, coefficients, activity, objective, and native global limits; `Compiled` holds original slot mapping and pointers into the input's global payloads. | Reuse that validated compilation within the same synchronous solve. Retain the input and compilation until all local Spaces are destroyed. Do not change, reindex, or make a partially relaxed `ModelSnapshot`. | +| `NativeSpace` posts original rows, semis, reified indicators, globals, objective equality, and the ordinary binary-alternative brancher. It optionally attaches a checked LP actor. | Construct a fresh original Space with a narrow private “do not attach LP” option. Keep all other posting identical. Cloning a current node carries its local domains and potentially an LP actor; cloning a solved incumbent fixes every decision. Neither is the proposed global neighborhood. | +| A frontend start passes exact original checking, then publishes original-slot values and a scalar normalized incumbent. | Reuse exact arithmetic and the staged witness representation, but not `publish_start`: a heuristic candidate must not set `start_submitted`. Complete-start acceptance and its gate completion keep their existing semantics. | +| The frontier keeps an active parent until all alternatives are evaluated/enqueued, and aggregates queued plus active bounds. | Run optional search only at a stable parent boundary, before a `Choice` or reliability probe exists. The main parent remains alive and represented throughout the call. | +| Shared `SolveBudget` counts ordinary admissions and reliability probe attempts. `frontier_checkpoint` checks time/cancellation, allowing a final admitted node to finish at the node quota. | Add a third disjoint category for neighborhood status attempts. Do not start a nested public solve with a new clock or zeroed counters. | +| A checked LP backend can copy a primal suggestion, but its propagator does not publish an owning current-node observation. Siblings reuse numerical workspace state. | The root-cover suggestion or last workspace solution cannot supply current-node RINS/RENS data. Defer that interface instead of treating stale observations as node data. | + +Primary research supports four distinct candidates. The accessible publisher +abstracts were inspected; detailed implementation observations below come from +the pinned open source files, not a claim to have read paywalled full papers. + +| Candidate | Required data and useful behavior | Decision | +|---|---|---| +| Local branching, Fischetti and Lodi (2003) | Distance constraints define subproblems around an incumbent. Their full method is an exact strategic branching scheme, including treatment of other regions. [Paper](https://doi.org/10.1007/s10107-003-0395-5) | Use the simple binary distance neighborhood as an optional heuristic. Retain the existing global frontier; do not claim to implement the paper's complete branching scheme. | +| RINS, Danna, Rothberg and Le Pape (2005; online 2004) | Incumbent and relaxation information select an improvement neighborhood. [Paper](https://doi.org/10.1007/s10107-004-0518-7) | Later: requires an owning, attributed relaxation observation and a precisely mapped original subproblem. Cannot address absence of an incumbent. | +| RENS, Timo Berthold (2014; online 2013) | Fix integral relaxation variables and restrict fractional integer variables to floor/ceiling choices. No incumbent is required. [Paper](https://doi.org/10.1007/s12532-013-0060-9) | A later first-feasible comparison after numerical point-to-native-domain conversion is explicit. It is not the same task as incumbent improvement. | +| CP LNS, Shaw (1998) | Remove selected decisions and repair by constraint search; the original paper uses related vehicle visits and limited discrepancy search. [Paper](https://doi.org/10.1007/3-540-49481-2_30) | Later LP-free general-integer comparison: release a deterministic subset and fix its complement. Easier arithmetic than integer distances, but requires a justified release policy. | + +SCIP source was inspected at immutable revision +`44fcc87317ed9f3c3b265649b3ef8263ed2bc6ce` (2026-09-03), obtained from the +official repository. No code or tuning constants are copied. + +- [`heur_localbranching.c`](https://github.com/scipopt/scip/blob/44fcc87317ed9f3c3b265649b3ef8263ed2bc6ce/src/scip/heur_localbranching.c): + `addLocalbranchingConstraintAndObjcutoff` constructs the binary distance row; + `setupAndSolveSubscipLocalbranching` copies the problem, bounds subproblem + effort, and translates/checks solutions. `heurExecLocalbranching` charges + prior effort and checks copy limits. This supports explicit setup accounting + and mapped original validation; its evolving neighborhood/radius schedule is + beyond this slice. +- [`heur_rins.c`](https://github.com/scipopt/scip/blob/44fcc87317ed9f3c3b265649b3ef8263ed2bc6ce/src/scip/heur_rins.c): + `determineFixings` compares incumbent and current LP values; the execution + path requires an optimal current LP and incumbent, checks the fixing rate, + and bounds the subproblem. Its wrapper disables recursive subsolvers and + expensive extra work. Our corresponding boundary is no recursive heuristic, + no reliability probes, and no local LP actor in W9b. +- [`heur_rens.c`](https://github.com/scipopt/scip/blob/44fcc87317ed9f3c3b265649b3ef8263ed2bc6ce/src/scip/heur_rens.c): + setup copies/mappings and limits are separate from execution; solution + translation is followed by `SCIPtrySolFree` checks. It also disables recursive + subsolvers and, in the reduced configuration, expensive dual-bound work. + A local solver's candidate or status is therefore not sufficient provenance + for our original-model result. + +## Proposed additive API and exact scope + +The implementation uses a new wrapper over existing option/result layouts. +The public header contains the complete statistics and completion enum: + +```cpp +enum class NativeNeighborhoodPolicy { BinaryHamming }; + +struct NativeNeighborhoodSettings { + NativeNeighborhoodPolicy policy = NativeNeighborhoodPolicy::BinaryHamming; + std::size_t radius = 1; + std::uint64_t max_status_calls = 128; + std::size_t max_distance_variables = 4096; + std::size_t max_source_entries = 100000; + std::size_t max_coordinator_work = 100000; + std::size_t max_local_spaces = 64; + double time_limit_seconds = 0.05; + void validate() const; +}; + +struct NativeNeighborhoodOptions { + NativeSearchOptions search; + NativeNeighborhoodSettings neighborhood; +}; + +struct NativeNeighborhoodResult { + NativeSearchResult search; + NativeNeighborhoodStatistics neighborhood; +}; + +NativeNeighborhoodResult solve_native_neighborhoods( + const ModelSnapshot&, const NativeNeighborhoodOptions& = {}); +NativeNeighborhoodResult solve_native_neighborhoods( + const Model&, const NativeNeighborhoodOptions& = {}); +``` + +These small finite values are provisional limits for an explicit experimental +entry point, not evidence of good automatic defaults. Keep them fixed during +initial correctness checks; revisit using the benefit gate below. Zero resource +caps skip optional work. Reject unknown enums, NaN, infinity and negative local +times as option errors. Native backend availability, whole snapshot validation, +native subset support, guarantee, single-worker/seed and complete-start checks +keep the existing public ordering and behavior. `Certified` remains unsupported. +The Model overload must catch moved-from `snapshot()` errors consistently with +the other public native routes. + +Only the new entry point enables the helper. Its inner `search` still supports +the current optional checked LP and BinaryReliability, but those are features +of the ordinary proof search. The neighborhood uses native propagation alone. +No `ModelSnapshot`, `GlobalPayload`, kernel/search class, C or Python ABI change +is required. C/Python exposure can follow a separately reviewed stable C++ slice. + +Let B contain every active original IR slot satisfying all of: + +1. Its declared type is `Binary`, and its already compiled original domain is + exactly `{0,1}`. Fixed binaries contribute no distance and are omitted. +2. Its `indicator_origin` is absent. Exclude both live generated inactivity + gates and retained origin-tagged gates after removal. The latter stay free + original variables; exclusion is just a distance-selection policy, never + permission to derive or fix their value. +3. It appears once, in increasing original slot order. Tombstones are excluded; + owner/slot mappings come from the validated original compilation. + +This is **distance over IR slots**, not a claim to discover independent semantic +decisions. Two different binary slots constrained equal count twice when both +change. A repeated argument in a global adds no slot. Frontend aliases interned +to one handle count once. Other private frontend slots have no universal origin +tag; ordinary Binary slots among them count by the same explicit rule. + +Do not truncate B to meet a cap: that would silently change the neighborhood. +No eligible slots, too many slots, or a radius at least `|B|` produces a named +skip outcome. The last case would duplicate the whole original improvement +search. Pure general-integer models therefore solve normally and record +`NoEligibleBinary`; they do not become unsupported. Integer and SemiInteger +slots remain free under their original domains in a mixed model. Radius zero +is meaningful: it fixes B to the reference binary assignment while allowing +other original slots to improve. + +For the frozen checked incumbent x*, post + +``` +d_B(x,x*) = sum(x_i : i in B, x*_i=0) + + sum(1-x_i : i in B, x*_i=1) <= radius. +``` + +Equivalently, native coefficients are +1 or -1 and the upper bound is +`radius - number_of_ones`. Check all size additions, casts, coefficient-array +lengths, RHS subtraction, and worst absolute activity before native allocation +or posting. Since each participating variable is binary, the activity envelope +is at most `|B|`; use the same conservative native linear limit as ordinary +compiled rows. A representability failure skips this optional formulation with +`FormulationLimit`; it never reports original infeasibility. A malformed source +model remains a whole-solve input error even if the eventual neighborhood is +empty or skipped. + +The reference objective is exact compiled integer cost c*, excluding the exact +original offset. Post native `cost < c*` for minimization or `cost > c*` for +maximization using `IRT_LE` / `IRT_GR`, matching W9a. Avoid unchecked `c*-1`, +`c*+1`, floating cutoff tolerances, or offset subtraction in double. A constant +objective or empty improvement set may immediately fail this local search; +that is only `NoImprovement`. A well-formed generated candidate that does not +strictly improve the frozen reference exposes an implementation error. + +## Scheduling, ownership and candidate publication + +Attempt at most once per solve. Wait for a validated incumbent, supplied by W9a +or the ordinary frontier. Select the first surviving stable parent after the +usual incumbent-bound prune, before reliability probing or `parent->choice()`. +If an incumbent is first found while expanding an ordinary parent, complete +that expansion normally and wait until the next such boundary. If all regions +are already discharged, return the ordinary completion and record +`ProofCompletedBeforeAttempt`. Never delay established global completion to +run a duplicate heuristic. + +Freeze the reference incumbent vector and normalized cost for the entire +attempt. The synchronous coordinator need not duplicate the already owning +result vector just for reference access: it must refrain from mutating it until +the attempt's candidate is fully staged. Run no callbacks that permit concurrent +model/result mutation. Concurrent solves have independent coordinators, +incumbents, counters and local Spaces; no shared heuristic history is introduced. + +Compile the original model once, as today, under the solve's clock/token. Reuse +that exact `Compiled` data for the optional fresh native construction. A private +constructor mode suppresses only LP actor attachment, with its current default +preserved. It must not copy/clear the shared backend, mutate its counters, or +change original rows. Native globals, indicators, SemiInteger holes, objective +equality and brancher are all posted unchanged. This avoids a second IR +compilation and stale current-node observations; it does not avoid the real +cost of reposting the native model. + +Start the local clock and source/work accounting **before** eligibility scans, +source preflight, allocation, native posting and cutoff posting. Thread a narrow +private stop context through this construction path so the existing checks at +variables, rows, globals and long conversion loops also see its local deadline. +The ordinary path can use the existing budget unchanged. Check immediately +before and after each potentially long native posting call. Original compilation +already checks the shared budget across its conversion loops; test cancellation +there too. Allocation, structure validation, a global posting operation and a +native propagation fixpoint remain cooperative operations: a call may overrun +its deadline before the next check. Do not describe the time cap as a hard +preemptive limit. + +Use a small coordinator-owned DFS with RAII frames containing stable local +Spaces, their owning `Choice`, and the next alternative. Obtain `choice()` only +after `status()==SS_BRANCH`. Clone the stable parent, commit the corresponding +choice on the clone, then admit/status the child. Retain parent and Choice until +all alternatives finish, or dispose of the entire local stack on a local/global +stop. Never commit a choice from a different state, retain raw Space pointers +past destruction, or call the main frontier's witness-publishing evaluator. +There is no local reliability history, second heuristic, or recursive BAB call. + +At `SS_SOLVED`, stage original-slot values/mask and the exact objective, including +tombstone convention and offset. Run the existing independent exact original +checker and the public numerical validator as an additional consistency gate. +Verify the local Hamming restriction and strict reference improvement separately. +All original indicator relations and every current global payload are checked; +the numerical validator alone is not sufficient for an Exact native result. + +After checking the first improvement, stop local expansion. Destroy local +Choices/Spaces, then check global time/cancellation and the local deadline once +more. Only then publish prepared values, mask and objective through nonthrowing +moves and install the main normalized scalar incumbent. Preserve +`start_submitted` as historical input-start provenance. No partially checked +candidate or late candidate is published. A fault/stop after publication retains +the new timely incumbent, just as W9a retains a timely start. + +Do not route candidate validation through `prepare_start` or its full node-limit +checkpoint. An already admitted final local node may finish its exact validation +at a node quota, subject to time/cancellation; it must not be rejected as an +unadmitted start. Neighborhood witnesses increment their own accepted counter, +not ordinary `feasible_leaves` or probe counters. + +## Budget contract and separate statistics + +All time is part of the original solve, including common compilation, optional +native reconstruction, scans, posting, local status, validation and release. +Local `elapsed_seconds` covers the attempt from first preflight to cleanup. +Its effective deadline is the earlier of local start plus local cap and the +solve deadline. No new SolveBudget clock or cancellation token is created. + +The exact node accounting identity becomes + +``` +shared budget nodes = frontier.admitted_nodes + + branching.probe_status_calls + + neighborhood.status_attempts. +``` + +Keep `branching.budget_nodes` as the existing solve-wide total for compatibility, +and document the third component for this new wrapper; expose the same total +in neighborhood statistics without inviting callers to add it twice. A status +attempt is charged before the final pre-status time/cancellation check. Thus an +admitted attempt may not execute propagation, as already happens in frontier +and reliability accounting. Report `completed_status_calls` separately. No +charge for direct exact vector checking, native construction or cutoff posting +is invented as a search node. + +Optional local admissions must leave **two ordinary child admissions** available +under a finite global node quota. Before each local admission, compute remaining +with checked subtraction and require `remaining >= 3` (one local plus reserve +two). The current default brancher and BinaryReliability both use two +alternatives; assert/test that contract. A future multi-alternative brancher +must revise the reservation rather than reuse the constant. If optional work +cannot preserve the reserve, end it as `SharedNodeReserve`, then continue the +ordinary parent. Existing reliability pairs still require their own two probes +plus two ordinary children. This reservation protects admissions, not time or +the existence of two feasible children. + +At actual global cancellation/time expiry, stop the whole solve with the usual +precedence (cancellation, time, then node limit). A local cap or reservation +boundary ends only the heuristic. Before every status admission check all caps, +guard counters against overflow, then increment the shared and local counters +together. After admission, status and candidate checking use time/cancellation +checks, not a fresh full node admission check. A local status cap can therefore +be reached by a final candidate-producing attempt without losing that candidate. + +`max_source_entries` bounds the optional preflight/posting/validation input size. +Define entries explicitly as active variable slots, row/objective terms, +indicator terms and relation fields, and each primitive global argument/payload +cell, with checked sums. Empty structures and scalar fields still cost an entry. +Scan with checkpoints and no unbounded intermediate `global_variables()` copy. +Reject optional setup before allocating native arrays if the cap is exceeded. +Report this count as `source_entries`; it is not elapsed work or a byte estimate. + +`max_coordinator_work` bounds a specified deterministic counter: charge each +eligibility/source-entry visit, distance-entry construction/check, local frame +admission/choice/alternative, and original-slot candidate extraction visit. +Check before each charged action and record the exact consumed units. Bulk +reservations must use checked arithmetic and precede the action. Native +propagator internals and whole checker algorithms are opaque to this counter; +their work is covered by elapsed time, source-size admission and status limits. +Do not claim a global instruction budget. Existing branching work and local +coordinator work remain separate; SolveBudget currently has no generic shared +work counter. + +`max_local_spaces` limits resident local ancestors plus in-flight child. In +addition, queued main nodes + active main parent + every local resident Space +must fit the existing `search.max_open_nodes`. Count reservations before cloning +or construction, including the fresh local root. A local reservation refusal +produces `LocalStorageLimit` and resumes main search; an actual allocation/native +memory failure stops the solve as `MemoryLimit`. Space counts are not bytes: +global payloads/propagator state vary in size. Do not retain an extra uncounted +root template. Report local peak and total main-plus-local peak separately; +existing frontier peak retains its original main-search meaning. + +Statistics include `requested`, `attempts` (at most one), +`eligible_variables`, `source_entries`, `coordinator_work`, `status_attempts`, +`completed_status_calls`, `failed_nodes`, `feasible_candidates`, +`accepted_improvements` (at most one), `peak_local_spaces`, `peak_total_spaces`, +`budget_nodes`, `elapsed_seconds`, and a completion enum. A local root +construction admission counts as an attempt even if stopped before construction +or its first status. +Eligibility scans before construction are still charged and timed. Local LP +calls are exactly zero; ordinary LP totals and probe LP subsets keep their +existing meaning. + +Local completions are `NotStarted`, `NoIncumbent`, +`ProofCompletedBeforeAttempt`, `NoEligibleBinary`, `NonrestrictingRadius`, +`FormulationLimit`, `SourceLimit`, `WorkLimit`, `StatusLimit`, +`SharedNodeReserve`, `LocalStorageLimit`, `LocalTimeLimit`, `NoImprovement`, +`Improved`, and `GlobalStop`/`Error` with the outer termination reason. A zero cap +must have a deterministic applicable limit outcome, with zero solver attempts. +Set completion after cleanup and the last stop check, so a late cancellation +cannot be hidden behind `NoImprovement`. Keep operational failures distinct +from an ordinary unsuccessful neighborhood. + +## Proof boundary and interruption results + +Let z be original cost normalized to minimization, without offset. Before the +attempt, unresolved original regions have bounds b_1,...,b_m (including active +parent b_A) and an original feasible incumbent has value U. During local work, +retain exactly that main frontier and active-parent coverage. The neighborhood +is a subset of the original feasible set and need not lie in the current node. +Its root/child bounds, failures, exhaustion, and Hamming row never enter global +bound storage or the global cut pool. + +A newly checked local witness with U' < U can replace U. The conservative global +bound remains `min(U', b_1, ..., b_m, b_A)`, with missing terms omitted only when +their original regions have actually been discharged. Its validity follows from +the old region bounds plus the feasible witness; it does not follow from a local +dual bound. Map to original sense with the original exact offset as the current +frontier does. No original region is removed because a neighborhood is exhausted. + +After a successful attempt, recheck the main active bound against the new +incumbent before selecting a branch. Existing exact bound pruning may now +discharge the parent. Otherwise apply normal incumbent cutoffs to ordinary +children. A neighborhood point outside the active parent is still a valid +global incumbent and must not be rejected merely for that fact. + +If a local cap is reached, discard its unresolved local stack, preserve the +main active parent, and continue proof search. If a global limit or memory +failure stops the solve, return its real termination, the last timely validated +incumbent, and the conservative bound over unchanged queued/active original +regions. A backend/checker exception uses the existing semantic-error fallback +to the initial whole-model objective box; it must not convert a local exception +into original infeasibility. No successful witness is removed merely because a +later cleanup checkpoint stops the solve. + +Only ordinary frontier exhaustion/pruning may set original `Optimal` or +`Infeasible`. Local `NoImprovement`, even after exhaustive search, is never +original optimality. Keep optional search out of the ordinary success/failure +message when it never ran; add explicit requested-policy provenance for this +new API and local stats when it did. + +## First implementation and correctness gates + +Proposed files: new `gecode/optimize/native_neighborhoods.hpp`, private helpers +inside `native.cpp` (or one private header if that improves lifetime review), +new `test/optimize/native_neighborhoods.cpp`, and this design plus the native +search documentation. Factor only the shared witness-staging and private stop +context needed by this slice; avoid refactoring the working frontier while +adding a heuristic. The parent integration owns CMake/umbrella/install/CI and +later bindings. Register a coordinator test variant for deterministic allocation, +stop and candidate-corruption hooks; production exposes no test callback. + +The acceptance oracle must enumerate the original tiny model independently, +without reading a local Space or trusting the production validator's answer. +Enumerate all feasible assignments, original objectives, exact Hamming distances, +and the restricted improvement set. For every limited run assert a reported +incumbent belongs to the original set; for minimization `best_bound <= optimum +<= incumbent`, reversing inequalities for maximization. If no incumbent exists, +still check the correct global-bound side. Absence of a bound must follow the +established compile/setup rules, not erase evidence after a local failure. + +Required fixtures and fault gates: + +1. Min/max, positive/negative costs, nonzero and extreme exact offsets, constant + objective, poor and already optimal external starts, first ordinary incumbent, + and no-incumbent/no-surviving-frontier paths. An improvement outside the + active main node is mandatory: freeze a node whose binary restriction + excludes the unique global improvement, and verify its acceptance without + dropping that node or any sibling. +2. Radius 0, 1, `|B|-1`, `|B|`, no B, fixed binaries, mixed general integers, + SemiInteger zero/hole, negative integer values, tombstones, foreign handles, + moved Models and publicly corrupted snapshots. Two equality-linked Binary + slots require distance two; repeated handles in globals count once. Live + gates are excluded from distance but checked, and a removed retained gate + stays an unconstrained/user-constrained original variable, never inferred. +3. Native indicators for both activation values, ranged/constant rows and every + global payload: AllDifferent, Element, Circuit (offset/singleton), Table + (including hole encodings), Cumulative (aliases/zero durations/half-open), + Regular (empty/aliased words and dead transitions). Use source-level truth + tables/event/transition oracles. Include cases where a linear relaxation + suggests a better assignment that the original global rejects. +4. Exact distance coefficient/activity limits and checked size counter overflow, + including pure arithmetic boundary tests without billion-element allocations. + Optional representation caps skip safely; unsupported original fractional or + overflow models remain Unsupported before any early neighborhood shortcut. +5. Local status caps 0/1/2 and final-admitted witness, global quotas around the + two-slot reserve, with/without BinaryReliability and checked LP/root covers. + Assert the disjoint node identity at every fault hook, no LP calls from the + local Space, and independent work/space peaks. Local cap exhaustion must + resume ordinary proof; global exhaustion must stop it honestly. +6. Deterministic cancellation/time and allocation faults before/during common + compilation, preflight, fresh native construction, distance/cutoff posting, + root status, choice/clone/commit, extraction, original checking, local cleanup, + immediately before publication and after publication. Inject a bad candidate + and assert BackendError plus conservative original bound, not an accepted + rounded witness. A validation or cleanup finishing after stop must not publish + a staged improvement; an earlier accepted one survives. +7. Enumerate quota/fault positions for both frontier orders, multiple pending + siblings and a partially expanded parent. Compare every interrupted bound to + the independent full optimum. Repeat concurrent independent solves and + check that source snapshots, previously returned results and optional shared + LP evidence have not changed. +8. Existing ordinary Native/BAB, NativeLP, complete starts, frontier, branching, + original globals and disabled-backend tests remain green. With the new route + disabled, compare the existing deterministic admission trace and outcomes. + Run native-only, combined Native+HiGHS, and full-source ASan/UBSan variants + with matching generated headers/libraries; no mixed instrumented ABI inputs. + +No broad timing run belongs to this implementation gate. First prove a fixture +where the attempt improves a feasible incumbent within a known small admission +cap, and one where it adds overhead without improving. These establish behavior, +not an out-of-box speedup. + +## Benefit gate and later W9 work + +After correctness, compare baseline frontier to the explicit wrapper under the +same external wall budget and shared status budget, with all compilation, +reposting, validation and release included. Use paired repeats with a frozen +configuration and separate held-out families: binary covering/packing, +assignment/network, mixed bounded-integer and native global scheduling models. +Report attempted/skipped/failed neighborhoods, full setup cost, validated +improvements, time to fixed target quality, objective trajectory, proof +completions, valid global-bound trajectory, memory/space peak and per-family +regressions. Use a defined normalized primal integral only where references +support it; never average unrelated raw objectives. + +Separate cold runs from runs given the same external incumbent. This first +heuristic waits for an incumbent, so it cannot improve time to first feasible +solution in a cold run; any additional scan/setup overhead before that event +must be negligible and measured. Its cold-run claim can only concern subsequent +incumbent quality. Preserve the roadmap's first-feasible requirement as unfinished +W9 work. Automatic enabling needs held-out, end-to-end benefit without material +tail regressions; a few hand-picked successful neighborhoods do not establish +that condition. No performance threshold or automatic default is asserted here. + +Next compare LP-free variable-release LNS on bounded general integers. Choose +and report a deterministic released set, fix only its complement to a checked +incumbent on a fresh original Space, and reuse this same isolation/publication +controller. Treat each alternative release rule as an explicit experiment. + +Before RINS/RENS or LP-guided diving, add an owning observation containing +original/compiled model identity, node identity, exact domain snapshot, column +mapping, relaxation provenance/status, copied finite primal values and the +objective/cutoff state that produced them. Never read “the last LP solution” +from a sibling-shared backend. Numerical equality/rounding may select a +restricted search, but supplies no primal witness or global proof. RENS must +intersect floor/ceiling proposals with exact original/current domains, including +SemiInteger holes; RINS must state whether it restricts a current node or the +whole original model. Only exact original checking can publish a candidate. + +Keep repair of partial starts, controlled dives, several neighborhoods/radii, +adaptive rewards and restart schedules as separate later slices. Measure a +deterministic baseline first; then consider cost-aware scheduling with explicit +reset per solve and fixed held-out evaluation. None of these neighborhoods may +promote restricted infeasibility, a numerical bound, or a local cut into a +global proof. The W10 explanation/LCG requirement is unaffected. diff --git a/docs/solver-parity/NATIVE-NEIGHBORHOODS.md b/docs/solver-parity/NATIVE-NEIGHBORHOODS.md new file mode 100644 index 0000000000..e6eda137ec --- /dev/null +++ b/docs/solver-parity/NATIVE-NEIGHBORHOODS.md @@ -0,0 +1,226 @@ +# Explicit native primal neighborhoods + +`solve_native_neighborhoods()` adds one optional BinaryHamming improvement +attempt to the existing native frontier. It retains native constraints and +shares only an independently checked better original-model assignment. Existing +`solve()`, Native/BAB, NativeLP and `solve_native_search()` behavior and defaults +are unchanged. The API is experimental; no automatic speedup or commercial +primal-portfolio parity is claimed. + +Include [`native_neighborhoods.hpp`](../../gecode/optimize/native_neighborhoods.hpp): + +```cpp +using namespace Gecode::Optimize; +Model model; +auto x = model.add_binary(); +auto y = model.add_binary(); +auto z = model.add_binary(); +model.add_row({{z, 1}, {y, -1}}, -std::numeric_limits::infinity(), 0); +model.minimize({{x, 100}, {y, -20}, {z, 1}}); + +NativeNeighborhoodOptions options; +options.search.solve.backend = Backend::Native; +options.search.solve.guarantee = Guarantee::Exact; +options.search.solve.node_limit = 2000; +options.search.solve.time_limit_seconds = 1.0; +options.search.order = NativeSearchOrder::DepthFirst; +options.neighborhood.radius = 1; +options.neighborhood.max_status_calls = 128; +options.neighborhood.time_limit_seconds = 0.05; + +const auto answer = solve_native_neighborhoods(model, options); +const auto& result = answer.search.result; +if (result.has_solution()) { + const double value = result.value(x); + (void)value; +} +``` + +The outer result contains the normal `NativeSearchResult` and separate +`NativeNeighborhoodStatistics`. It preserves original model identity/revision, +slot masks, objective sense/offset and historical result ownership. The Model +overload charges snapshot creation to the solve deadline and translates +moved-from Model errors consistently with other native routes. + +## Supported search and neighborhood + +All current bounded exact native integer, Binary, SemiInteger, indicator and +global preconditions apply to the entire original model. Full structural and +native arithmetic admission happens before search. Unsupported original +fractional/continuous/overflow models are not silently relaxed. Numerical +requests still use the native exact integer witness checker; Certified proof +export, parallel workers, nonzero random seeds and gap stopping remain outside +the native frontier contract. [Native semantics](NATIVE.md), +[frontier semantics](NATIVE-SEARCH.md) + +The attempt waits for a validated incumbent, either from a supported complete +start or ordinary search. It runs at the first surviving stable main parent, +before that parent's Choice or reliability probes. If an incumbent first appears +during ordinary child expansion, that expansion finishes before the attempt. +If global proof is already complete, no attempt runs. This heuristic cannot +create a cold run's first feasible point. [Complete starts](NATIVE-PRIMALS-DESIGN.md) + +Distance includes every active, originally nonfixed Binary slot whose +`indicator_origin` is absent. It excludes tombstones and generated inactivity +gates, including retained origin-tagged gates after indicator removal. A removed +gate remains an ordinary free/user-constrained original variable; exclusion +from distance never derives its value. Other untagged private frontend Binary +slots count normally. The metric counts IR slots: distinct equality-linked +variables count separately, while a handle repeated in a global counts once. + +For the frozen incumbent x*, the isolated native model contains + +``` +sum(x_i for selected slots with x*_i=0) ++ sum(1-x_i for selected slots with x*_i=1) <= radius +``` + +and the strict original objective improvement condition. Native +1/-1 row +coefficients, array dimensions, total absolute activity and RHS are checked +before posting. The strict cutoff uses the exact compiled cost without offset +and native strict relations, including maximization; it does not subtract one +from an arbitrary endpoint or use a floating tolerance cutoff. + +All other integer/semis remain free within their original domains. Radius zero +can improve those variables while keeping selected binaries fixed. An empty +selection, excessive selection size or radius at least its size produces an +explicit skip. The selection is never truncated to fit a cap. Pure general +integer models continue normal proof search with no BinaryHamming attempt. + +The original model is compiled once under the shared budget. A fresh native +Space is posted from that compilation for the optional attempt, without an LP +actor. Rows, indicator semantics, globals and objective equality stay intact. +The original snapshot and main numerical backend/cut evidence are unchanged. +Local DFS uses the ordinary native brancher, without reliability probes or +recursive heuristics. Main search may independently use its existing checked +LP, root covers and BinaryReliability settings. + +## Proof and publication + +Main queued nodes and the active parent remain represented throughout the +attempt. Local infeasibility/exhaustion, bounds and distance rows never enter +global proof storage. The fresh neighborhood is global, so an improvement may +be outside the active main node. Only the original model, the frozen incumbent +cutoff and the specified distance restrict its candidates. + +A candidate passes exact original domains, rows, indicator/gate relations, +all global payloads and objective checks, followed by the public numerical +validator as an extra consistency check. Its exact Hamming distance and strict +improvement are checked independently of propagation. Local Spaces/Choices are +released before the final deadline and publication gate. A late or partially +checked candidate is discarded; the earlier incumbent remains. A timely +published improvement survives a later global stop/error. Heuristic publication +never sets or clears the historical `start_submitted` flag. + +For normalized minimization, the interrupted global bound is the minimum of +the incumbent and all ordinary queued/active region bounds, with the normal +conservative initial-box fallback on semantic failure. A local bound is never +included. After improvement, ordinary exact incumbent pruning may discharge +the active parent or later children. Only ordinary frontier completion can +return original Optimal or Infeasible. + +## Limits and counters + +All limits are cooperative around native posting, propagation and whole checker +calls; a call itself can run beyond a time limit before the next checkpoint. +The complete solve clock includes original snapshot/compilation, native +reposting, scans, validation and cleanup. The local clock begins before its +first eligibility/preflight scan and ends at cleanup/publication. Global +cancellation takes precedence over global time and node limits. + +| Setting | Meaning | +|---|---| +| `radius` | Exact maximum number of changed eligible Binary slots. | +| `max_status_calls` | Local admitted status attempts, including the root. The last admitted attempt may finish validation at this cap. | +| `max_distance_variables` | Maximum complete Binary selection size; exceeding it skips the formulation. | +| `max_source_entries` | Logical original model fields admitted for optional posting/checking; not bytes. | +| `max_coordinator_work` | Deterministic charged source/eligibility/distance visits and DFS/candidate actions; not propagator instructions. | +| `max_local_spaces` | Resident local ancestors plus an in-flight child, including the fresh local root. | +| `time_limit_seconds` | Finite nonnegative local elapsed cap, also constrained by the remaining whole-solve time. | + +Finite provisional defaults are defined in the header. Zero caps skip/end +optional work. Unknown policies or invalid time values are option errors. A +local cap ends only the heuristic; an actual allocation/native memory failure +or whole-solve stop ends the solve honestly. + +Before each optional status admission, the implementation preserves two ordinary +child admissions under a finite shared node quota. A local attempt requires +at least three remaining slots. Reliability probes retain their own existing +two-probe-plus-two-child reserve. The current ordinary brancher has two +alternatives; this policy must be revisited before allowing another arity. + +The disjoint accounting identity is + +``` +answer.neighborhood.budget_nodes + == answer.search.branching.budget_nodes + == answer.search.frontier.admitted_nodes + + answer.search.branching.probe_status_calls + + answer.neighborhood.status_attempts +``` + +The two `budget_nodes` fields are the same total, not additive. A status attempt +is charged before its final pre-status stop check, so it may consume a slot +without running propagation. `completed_status_calls` counts returned status +calls. `attempts` counts admitted fresh root constructions (at most one), not +nodes; a stop immediately before construction can still consume that attempt. +`accepted_improvements` is at most one and is separate from ordinary +`feasible_leaves`. Local LP work is absent. + +Local Spaces must also fit `search.max_open_nodes` together with queued main +nodes and the active parent. Refusing an optional reservation yields +LocalStorageLimit and resumes main search; the ordinary frontier's own storage +limit can still terminate it. `peak_local_spaces` records local reservations; +`peak_total_spaces` includes ordinary and local peaks. Neither measures bytes. + +Source entries count one per active variable, objective marker/offset/sense +(three), active row marker/bounds (three) and each term. Active indicators use +eight relation fields, one per term/generated row, and three per saved domain. +Globals count their marker and every argument/payload scalar, with a marker per +Table tuple and three scalars per Regular transition. Strings and tombstones +are not source payload entries. Scanning a tombstone still consumes coordinator +work. No flattened global argument copy is allocated during admission. + +Each source-entry charge is also coordinator work; do not add those two counts +to estimate total work. Coordinator work also charges outer container/eligibility +visits, each constructed/checked distance element, DFS frame/alternative actions, +and candidate slot extraction. Native posting/propagation and whole checker +algorithms are governed by source-size/time/status limits, not a fictitious +instruction counter. A cap can leave `eligible_variables` or `source_entries` +as an observed prefix; a partial selection is never solved. + +Completion distinguishes skipped/not-started, Improved/NoImprovement, each local +resource cap, GlobalStop and Error. `stop_reason` carries an outer termination +when it interrupts/rejects the attempt. A successful earlier attempt remains +historical if ordinary proof search later stops. Zero-cap priority follows +global time/cancel, local time, explicit status-zero, shared admission reserve, +then encountered scan/storage/formulation limits. + +## Validation and remaining scope + +[`native_neighborhoods.cpp`](../../test/optimize/native_neighborhoods.cpp) uses an +independent finite-product oracle for original feasibility and objectives, plus +original global truth tables/event/transition walkers. It checks complete and +interrupted results, both objective senses, offsets, semis, aliases, tombstones, +all globals, indicators/gate removal, local caps, shared quotas, LP/reliability +composition and concurrent independent solves. The coordinator variant injects +stops/errors through compilation, posting, DFS, validation, release and +publication. The outside-parent fixture retains a better global optimum outside +the searched neighborhood, so local improvement cannot masquerade as global +optimality. Sanitizer/provenance evidence is recorded with the implementation +commit report; this document does not claim remote CI or benchmark speedups. + +The implementation gate uses this source list for an independent coordinator +executable: `model.cpp`, `result.cpp`, `validate.cpp`, `constraints.cpp`, +`globals.cpp`, `native.cpp`, and the test above. Compile native.cpp and the test +with `GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS=1` for fault checks. The normal test +needs no hook macro. Native+HiGHS builds must use matching generated native and +HiGHS configuration headers; sanitizer tests instrument every linked foundation. +The backend-disabled test verifies an explicit Unsupported result. + +Future general-integer release neighborhoods, node-attributed RINS/RENS, +partial-start repair, repeated/adaptive schedules and automatic defaults remain +separate gates. The research and held-out benefit plan is in +[the W9b design](NATIVE-NEIGHBORHOODS-DESIGN.md). This slice improves an existing +incumbent when successful; the roadmap's cold first-feasible improvement and +W10 explanation/LCG work remain unfinished. diff --git a/docs/solver-parity/NATIVE-PRIMALS-DESIGN.md b/docs/solver-parity/NATIVE-PRIMALS-DESIGN.md new file mode 100644 index 0000000000..817fa50ada --- /dev/null +++ b/docs/solver-parity/NATIVE-PRIMALS-DESIGN.md @@ -0,0 +1,468 @@ +# W9: native starts and a bounded primal portfolio + +Status: W9a complete exact starts are implemented; later partial completion and +portfolio sections remain research/design. The design inspected integration +head `a067cebe9878a6cd9ef25c9982e814851dd25642` on 2026-09-05; implementation is +based on `8ae59d5c1`. See [NATIVE.md](NATIVE.md#complete-native-starts) for the +implemented contract. No cold-start or performance improvement is claimed. + +The first slice should accept **one complete, exactly feasible original-model +start**, retain it as an incumbent, and search the unchanged native problem for +strict improvements. Use the existing `SolveOptions::primal_start` on ordinary +Native/BAB, NativeLP and the explicit frontier. It needs no new search engine, +LP solve, brancher, model mutation, or feasibility subsearch. Keep partial +completion and a bounded heuristic portfolio as separate subsequent slices. + +This provides immediate practical value for repeat solves and application +solutions. It does not establish cold-start improvement: supplied solutions +must not be counted as solutions found by a new heuristic. Automatic heuristic +work should remain absent until its development and held-out benefit gates pass. + +## Baseline before W9a and the missing seam + +| Current source | Relevant behavior | Consequence for W9 | +|---|---|---| +| [`result.hpp`](../../gecode/optimize/result.hpp), `StartValue`, `SolveOptions`, `SolveResult` | A sparse owning list of handles/values; complete starts must be feasible; partial values are hints. `start_submitted` means acceptance, while `solution_validated` establishes an incumbent. Results retain model identity/revision and original slots. | Reuse this input and result contract. No second native start API or shared result ABI extension is needed for W9a. | +| [`native.cpp`](../../gecode/optimize/native.cpp), `compile`, `check_exact` | Full mutable-snapshot structure validation, conservative integral/activity/range preflight, exact original rows/indicators/globals/objective checking. Candidate checks also call the public numerical validator. | Run full compile preflight before invoking arithmetic whose safety depends on it. Reuse the exact checker for starts, with an explicit input-error category. | +| `NativeSpace`, `solve_native_impl` in the same file | Original native constraints, objective equality, optional checked LP actor and built-in brancher. BAB returns improving leaves; `constrain()` posts strict original-sense cost improvement. Every nonempty start returned `Unsupported` before W9a. | Add one staged incumbent before search and a strict cost restriction on the otherwise unfixed root. BAB/NativeLP share this implementation. | +| `native_frontier_impl` | Exact propagated bounds; active parent retained while all children are processed; normalized min/max bound aggregation; original witness publication. Nonempty starts returned `Unsupported` before W9a. | Seed its existing scalar incumbent and owning result, preserving the whole original region through setup and interruption. | +| [`search.hh`](../../gecode/search.hh), `Search::Base`; [`seq/bab.hpp`](../../gecode/search/seq/bab.hpp) | Low-level `Engine::constrain()` exists, but the typed `BAB`/`Base` wrapper does not expose it. Sequential BAB can retain an external best Space internally. | Do not add kernel/search API merely to insert a start. Root cost restriction plus an externally owned incumbent is simpler. | +| [`lp-relaxation.hpp`](../../gecode/minimodel/lp-relaxation.hpp), `IntegerBoundPropagator`; [`lp-backend.hpp`](../../gecode/minimodel/lp-backend.hpp) | Actors retain checked residual certificates. A backend call can optionally copy a numerical primal suggestion, but the actor currently does not request/expose a node observation. Shared workspace bounds/basis change between siblings. | Complete starts need no LP observation. Diving/RINS requires a new owning, node-attributed observation seam; reading the workspace's last solution is insufficient. | +| [`solve.cpp`](../../gecode/optimize/solve.cpp), `prepare_start`, `SolveSession` | HiGHS validates/submits sparse starts; numerical tolerance policy differs. Persistent Native sessions are explicitly unsupported. | Do not quietly reuse tolerance-rounded HiGHS preprocessing or claim that native start support adds tree/basis/session persistence. | + +Compile currently makes exact sums safe by bounding integral coefficient, +domain, activity and objective ranges. The native start checker must not be +called as an unrestricted public validator on arbitrary doubles or uncompiled +snapshots. Native `status()`/BAB recomputation remains cooperative work that +cannot be interrupted internally. W9 must preserve this limitation honestly. + +## Research and the choices it supports + +Commercial APIs distinguish candidate starts, completion/repair effort and +search preferences. Gurobi exposes partial `Start` and separate `VarHintVal` / +`VarHintPri`; CPLEX distinguishes feasibility checking, solving a fixed problem, +sub-MIP completion and repair. Our W9a corresponds to a checked complete start, +with exact native semantics; it does not duplicate all these policies. Do not +introduce a no-check mode. [Gurobi variable attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/variable.html#start), +[CPLEX 22.1.2 start effort](https://www.ibm.com/docs/en/cofz/22.1.2?topic=mip-starting-from-solution-starts) + +Danna, Rothberg and Le Pape's RINS uses relaxation information to construct an +incumbent neighborhood, then searches a subproblem. The paper also distinguishes +guided dives. This motivates separate construction and improvement phases; +RINS cannot supply the first feasible point without an incumbent. The accessible +publisher abstract was inspected; detailed engineering below is grounded in +SCIP source and our own contracts, not a claim to have read the paywalled full +paper. [Paper, Mathematical Programming 102 (2005)](https://link.springer.com/article/10.1007/s10107-004-0518-7) + +SCIP's `heur_rins.c` checks for a current optimal LP and an incumbent, computes +fixings, creates a separate mapped problem, copies limits and imposes a bounded +subproblem node allowance. Its setup-cost and success accounting is a useful +engineering checklist, not a source of constants to copy. Inspect +`determineFixings`, `wrapperRins` and `heurExecRins`. The current documentation +source was readable through search; versioned 7.0.2 source gives a stable +historical comparison. No SCIP code is copied by this design. +[Current implementation](https://www.scipopt.org/doc/html/heur__rins_8c_source.php), +[versioned implementation](https://scipopt.org/doc-7.0.2/html/heur__rins_8c_source.php) + +SCIP's generic diving separates candidate scoring from a controller that owns +an auxiliary search path and controls LP resolve frequency. Reuse that +separation of responsibilities with native clones; do not embed a nested solve +inside a value-selection callback. [SCIP diving design](https://www.scipopt.org/doc-3.2.0/html/DIVINGHEUR.php), +[current controller API](https://www.scipopt.org/doc/html/group__PublicSpecialHeuristicMethods.php) + +Shaw's CP neighborhood search removes decisions and repairs the remaining +subproblem using constraint search. Fischetti and Lodi's local branching controls +neighborhoods with distance constraints. Both fit Gecode's ability to preserve +native global constraints on clones. The neighborhood restriction itself is +not globally valid; retaining the complement is required if it is used for +proof search. Our initial heuristic design retains the ordinary frontier +instead. [Shaw, CP98](https://doi.org/10.1007/3-540-49481-2_30), +[Local branching (2003)](https://link.springer.com/article/10.1007/s10107-003-0395-5) + +Berthold's RENS constructs a rounding neighborhood without requiring an +incumbent, so it is a relevant cold-start comparison. Feasibility pump alternates +relaxation projection and rounding, introducing objective/basis/cycling +machinery that is unnecessary for W9a and premature before node observations. +Evaluate these after a simple bounded native dive and repair baseline. +[RENS, author thesis Chapter 7](https://www.zib.de/userpage/berthold/Berthold2014.pdf), +[Feasibility pump, original publication](https://cris.unibo.it/handle/11585/17405) + +Hendel's ALNS framework selects neighborhoods with bandit methods and accounts +for expensive unsuccessful calls. The current SCIP ALNS implementation separates +neighborhood construction, effort limits and reward. This supports a later +cost-aware scheduler; a deterministic fixed schedule is the auditable starting +point. Learn only after per-heuristic measurements exist, with reset per solve +and frozen held-out evaluation. [Author report](https://www.zib.de/userpage/hendel/publication/adaptive-large-neighborhood-search-for-mixed-integer-programming/), +[SCIP ALNS implementation](https://www.scipopt.org/doc/html/heur__alns_8c.php) + +## W9a: exact complete-start contract + +Use `options.primal_start = {{x, 2}, {y, 0}, ...}` with the existing Native +backend selection, or the nested `solve` member of NativeLP/NativeSearch options. +Absence preserves the exact current route. No automatic native start is inferred +from a previous result or an unrelated session. + +A complete start must determine exactly one value for **every active +ModelSnapshot variable slot**. Callers supply the ordinary variables; the +native adapter may fill a missing **live indicator inactivity gate** from its +validated logical definition. Fixed/private variables with no such definition +still need an entry. Inactive tombstones need none and cannot be supplied. + +For active indicator metadata, its exact relation is +`gate = (activator == active_value ? 0 : 1)`. Once the activator is known, +fill a missing gate or check that an explicitly supplied gate agrees. Only a +validated, active indicator can authorize this derivation. A retained gate +from a removed indicator may now be free or user-constrained: its historical +`indicator_origin` tag does not authorize any value. It needs an explicit entry +like any other active variable. + +Use a bounded forward queue keyed by known variable slots so gate-as-activator +chains work regardless of metadata order. Visit each dependency once; the +unique gate ownership established by structural validation bounds storage and +work. Do not solve equations backward to infer a user activator or choose a +value in an unseeded cycle. Unresolved slots make the start incomplete. This is +deterministic semantic completion, not a search/repair heuristic. + +The C indicator call returns `has_gate`/`gate`, and Python returns an +`Indicator` carrying `inactive_gate`; callers can supply those handles explicitly, +but ordinary complete starts need not know live derived gates. Derived values +still occupy the owning result's original model slots and pass all original +checks. A list of FlatZinc source outputs can remain incomplete because of +other private variables: a future source helper needs the owned compiler +mapping, rather than guessing them. + +Processing order and outcomes: + +1. Validate options, full snapshot structure, backend/guarantee support and + native subset preconditions. Unsupported fractional models, continuous + variables, overflow or `Certified` remain unsupported even if a submitted + assignment happens to satisfy some rows. Keep unavailable-backend precedence. +2. Under the same solve clock/token, map entries by original owner-aware handle. + Reject foreign/deleted/out-of-range handles, duplicates, nonfinite values, + nonintegral values and exact domain violations as `InvalidModel` input errors. + A valid SemiInteger zero alternative is allowed; its forbidden hole is not. + A value such as `1 - 1e-12` is not one, even for a `Numerical` native request. +3. Complete/check only the live indicator gates as above. If nonempty input + still leaves an active slot unresolved, return `Unsupported` with an + actionable complete-start requirement. Do not silently discard it, fix it, + or perform completion in W9a. Malformed supplied entries remain input errors. +4. Independently check original ordinary/ranged rows, original indicator + activation and its gate relation, every global payload, domains and original + objective. Skip lowered indicator rows only in the exact original checker; + retain the existing second public validator as an additional consistency + gate. Any disagreement with a well-formed complete input is reported, + never rounded away. Report which start condition failed where practical. +5. Stage owning original-slot values, active mask, exact original objective and + native cost in temporaries. Compute cost by checked subtraction of the exact + offset; require it within compiled cost limits. Check cancellation/deadline + after all checks and allocating work. Publish all incumbent fields and + `start_submitted=true` together with nonthrowing moves/scalar assignments. +6. Retain this witness through later setup, LP preparation, search and cleanup. + A later limit or operational error changes termination, not its historical + exact feasibility. Never replace it with a worse/tied candidate merely + because the candidate arrived later. Any improvement is validated afresh. + +`check_exact` currently throws generic runtime errors for bad solver witnesses. +Refactor its failure reporting narrowly so an invalid user assignment becomes +`InvalidModel`, while a bad solver-produced candidate remains `BackendError`. +Do not catch all exceptions around validation and relabel allocation, indexing +bugs or backend failures as user errors. No changes to the proven arithmetic +range preconditions are required. + +An empty `primal_start` means absent, including zero-active-variable models. +There is no new explicit empty-start representation. Such models follow the +existing ordinary constant/empty-model solve behavior. + +### Strict cutoff and ownership for all three routes + +Let `c(x)` be the compiled integer cost without the original offset `o`; let +`u` be the start's compiled cost. Post `c < u` for minimization or `c > u` for +maximization on the **unfixed original root**, after incumbent publication and +before its first search propagation. Use native `IRT_LE` / `IRT_GR`, matching +`NativeSpace::constrain()`. Avoid unchecked `u-1`, `u+1`, subtracting an offset +in double, or posting a floating objective cutoff. Native limit endpoints and +constant objectives need explicit tests. + +For BAB, retain the validated start outside the engine. A fresh root already +restricted to strict improvement is sufficient: its clones/recomputation retain +the restriction, and subsequent engine incumbents tighten it normally. An +exhausted improvement tree with a retained start returns `Optimal`, the retained +objective as `best_bound`, and zero gaps. It never returns original-model +`Infeasible`. If interrupted, return the retained witness with the actual limit; +ordinary BAB still has no finite interrupted global bound. An accepted start +alone is never a lower bound or a proof of optimality. + +Do not build a completely fixed candidate Space simply to feed the low-level +BAB `constrain()` entry point. That would add propagation/node-accounting and +ownership complexity and could invoke LP work just to verify an already exact +assignment. The direct original checker plus cost-only root restriction is the +first implementation choice. No `search.hh` or native kernel changes are needed. + +For NativeLP, perform pure option/capability checks first, then validate/publish +the start before expensive optional root-cover/backend preparation. The checked +LP actor sees the strict objective domain on the native root and can use its +existing exact residual filtering. Root covers remain derived solely from the +original global rows/domains. Do not put the incumbent restriction into a cut's +global source model, cache cutoff-dependent reductions across looser solves, +or promote any floating LP infeasibility report. Root LP setup failure after +publication may leave a valid start alongside the honest failure status. + +For the frontier, set its normalized incumbent to `u` for minimization and `-u` +for maximization, while keeping `initial_bound`/`active_bound` for the entire +original region alive through all setup and root-evaluation failure points. +The start does not count as a feasible search leaf, admitted node or reliability +probe. Child incumbent cutoffs and bound pruning then use the existing route. +No queued region is removed merely because the start is present. + +Write normalized objective `z=c` for minimization or `z=-c` for maximization and +normalized incumbent `U`. Search region `R` satisfies `z=U`. Therefore a bound for the original problem is +`min(U, bounds of all unresolved regions in R)`. When R is exhausted it is U. +Map this back using `o+z` for minimization and `o-z` for maximization. The start +is a primal witness in this formula; it does not authorize replacing a missing +active-region bound with U. On semantic failure retain the existing conservative +initial-bound fallback. Model/revision and original values remain unchanged. + +### Budget and publication boundaries + +Keep the current early checkpoint: zero time, pre-cancelled token or zero node +quota returns that limit without processing/publishing a start. W9a does not +introduce a special free-validation mode under an already expired solve. With +a positive remaining node quota, exact vector checking consumes elapsed time +and memory but **no search node**, because it performs no `status()` call. + +Checkpoint entry scans and row/global boundaries, and recheck after a potentially +expensive whole-global validation. Exact and numerical validation, allocations, +LP setup, native construction, propagation and release all use one solve budget. +There is no hard instruction limit inside a global checker or native propagation. +A late candidate is not published; an earlier timely incumbent survives. Check +again after resource release before return, preserving cancellation-over-time +precedence. Applying a cutoff is not a proof-producing free search admission. + +Preserve each engine's existing node-limit contract. Frontier admits/charges +nodes and allows the final admitted propagation to finish under time/cancel; +BAB uses its existing statistics/stop observer and may conservatively report a +limit even if a final call found evidence. Do not accidentally homogenize these +contracts or add an uncounted validation search as part of start support. + +All start state is solve-local and owning. No mutable user vector, raw Space, +reference to a transient compiled column map, or workspace pointer is retained. +Reusing a result after edits requires a new complete start and full validation +against the new snapshot, including its changed objective. Concurrent independent +solves may consume the same immutable snapshot/start data; cloning a single +Space concurrently remains forbidden. + +## Subsequent partial starts and primal construction + +Partial-start **preferences** choose where to search first; they do not shrink +the main feasible set. A later explicit completion mode can impose supplied +values on an isolated completion clone under a small shared subbudget. Failure +of that clone says nothing about original infeasibility and must return to +ordinary search. Repair is different again: it may release or change supplied +values, so successful repair need not respect every hint. Report submitted, +completed, repaired, accepted and rejected separately when those modes exist. + +Do not overload W9a's error policy: a complete infeasible start is an input error +there. A future request for repair must explicitly select a repair policy with +its own nonfatal `NoCandidate` outcome. If preference-based branching is added, +its alternatives must still cover the actual native domain, including holes. +A hint disappearing after propagation is simply unavailable guidance. + +### Required node LP observation seam + +Add this only in a later reviewed slice. A retained observation should own: + +- source model identity/revision, sparse column-to-original-slot mapping and + the exact immutable augmented LP model/cut attribution; +- a node/region identity plus the actual variable intervals supplied to the LP, + objective sense/offset mapping, and observation sequence; +- copied finite primal suggestions, shape/status diagnostics and work counters; +- the cutoff context and whether the point predates further domain changes. + +The shared serialized backend's last point may belong to a sibling, probe or +previous solve. Request/copy values in the call that owns the complete input +box; never fetch them later from a mutable global `Highs` solution. A node's +interval box can include SemiInteger holes or other CP-forbidden values. The +point is only guidance. Check chosen values against current native domains; +intersect restrictions with those domains. Stale/missing/NaN data means skip or +refresh within budget, never pruning. A root-cover selection vector is not a +current-node observation. Numerical LP success is not an exact integer witness. + +Initially prefer a coordinator-requested bounded observation at a stable node +on a separate heuristic backend/workspace. This may duplicate one LP solve but +makes model/region and accounting explicit. Only optimize to actor-published +immutable observations after clone ownership, invalidation and no-default-cost +tests pass. Existing proof certificates and main workspace need no mutation. + +### Bounded portfolio order + +| Phase | First scoped experiment | Preconditions and termination | What may cross back | +|---|---|---|---| +| Construction | Deterministic native dive, prefer valid rounded current-LP values or a simple objective/domain rule | Stable node clone; cap depth, candidate scans, status attempts, optional LP calls and one backtrack. Preserve every native global. | Only a newly exact-checked complete original witness. | +| Repair/completion | Bounded DFS on an isolated clone with a selected subset fixed or preferred | Owning requested subset; shrink/release fixings explicitly; stop at subbudget. No recursive portfolio. | Validated witness, never a restricted-problem bound. | +| Cold-start alternative | RENS-style neighborhood around current LP: intersect domains with floor/ceil interval | No incumbent needed; checked floor/ceil conversion, domain-hole intersections and whole original checker. Empty neighborhood is harmless failure. | Validated witness. | +| Improvement | RINS-style agreement neighborhood | Requires incumbent and fresh current-node LP. Fix selected integer variables that numerically agree, using exact incumbent integers; restrict an isolated clone only. | Strictly improved exact witness; agreement is heuristic, not proof. | +| Improvement | Binary local branching / CP LNS | Incumbent required. Binary Hamming ball or selected domain fixings; general integer distances deferred unless arithmetic/modeling is proved. | Improved witness; no local restriction or failure promoted globally. | +| Later scheduling | Adaptive selection among measured successful operators | Deterministic baseline first, isolated per-solve statistics, bounded setup cost and stalled-call limits. | Scheduling preferences, never proof strength. | + +For binary incumbent `x*`, a local-branching neighborhood is +`sum(x[j] for x*[j]=0) + sum(1-x[j] for x*[j]=1) <= k` over explicitly selected +original binary variables. Validate k and checked activity/count arithmetic; +exclude generated gates from selection. If k=0 it may contain only the incumbent +on selected variables; exhaustion under strict improvement is only a failed +neighborhood. Nonbinary variables are not silently treated as binary distances. + +A node-local clone contains original constraints plus node restrictions. A +global neighborhood rebuilt from the immutable original snapshot contains +original constraints plus declared neighborhood restrictions; it must not +inherit local proof cuts or stale objective-dependent deductions. Choose and +record one scope. An incumbent can lie outside a current node, so incompatible +RINS fixings on a node clone merely make that neighborhood empty. Do not relax +node domains secretly to include it. Never delete globals, indicators or gates +to make a heuristic subproblem easier. + +While a heuristic executes, the ordinary active parent remains represented in +the frontier; the heuristic never discharges it or its siblings. A returned +solution can improve the global incumbent even if produced in another owned +original-model neighborhood, after complete validation. Freeze the reference +incumbent during each call for reproducible construction/reward; publish an +improvement only after it finishes. Later ordinary children receive the latest +strict cutoff. Probe-only BinaryReliability remains probe-only; do not start +publishing its solved clones as an incidental shortcut. + +### Portfolio budgets and provenance + +Use a shared `SolveBudget` with nested **caps**, not restarted independent solve +clocks or recursive public solve calls. Separate total heuristic status attempts, +per-call node/status caps, depth, candidate/term scans, LP calls/iterations, +resident clone/storage limits and stalled-call limits. Before optional work, +reserve room for ordinary search progress as BinaryReliability does. Charge +all actual/admitted propagation attempts once, alongside ordinary admissions +and reliability probes. Report the disjoint accounting identity explicitly; +LP heuristic calls are subsets of the solve total, never added a second time. + +Outer time/cancellation stops end the solve. A local heuristic quota, missing +observation or an empty neighborhood ends that heuristic with a distinct outcome +and resumes ordinary search. Allocation/backend/checker faults retain earlier +incumbents and conservative frontier coverage but return the honest operational +failure; they must not masquerade as a successful heuristic or completed solve. +Destroy clones and owned subproblem state within the same deadline. Bound +construction/storage before allocation where possible; a work counter cannot +claim to bound arbitrary native propagation or LP internals. + +Initial scheduling should be explicit opt-in with zero overhead when absent: +one bounded construction attempt near the root, then ordinary search; only +with an incumbent and after a measured stall, try a bounded improvement +neighborhood. Caps/frequencies are experimental settings selected on development +instances and frozen before held-out testing. Do not copy SCIP's default node +percentages into Gecode or advertise adaptive learning before enough comparable +per-call data exist. Normalize reward by real effort, include failed calls, +and never use unavailable/invalid gaps as zero loss. + +## First implementation slice and acceptance gates + +W9a source scope: `gecode/optimize/native.cpp`, a new +`test/optimize/native_starts.cpp`, and the Native/NativeLP/NativeSearch documentation. +Update capability limitations and existing start-unsupported assertions. A small +private prepared-incumbent helper can serve BAB and frontier. Root registration +adds standard/coordinator tests; no model, LP, C API, search/kernel or public +result layout changes should be needed. C/Python ordinary Native calls already +carry the common start vector, so add thin integration cases to their existing +tests when the component is integrated. NativeLP/frontier bindings are a separate +capability, not implied by the common C API. + +The same independent finite-product original-semantics oracle used for native +branching should enumerate every feasible start on small models and test poor, +best and tied starts. It must not compute expected feasibility with the production +validator. Require all three routes (LP where available), both senses, signed +coefficients/offsets, empty/constant objectives, feasible/infeasible models, +Integer/Binary/SemiInteger holes, sparse/tombstone slots, aliases, reified +indicators and every native global. Test implicit and explicit live gates, +wrong explicit gates, reversed metadata ordering, chained gates, unresolved +cycles, and removal followed by reuse of the retained gate with a different +value. Missing retained gates or unrelated private slots must remain incomplete. +Include C/Python starts containing ordinary user variables but omitting their +live generated gate; they must be accepted after deterministic completion. + +Every returned witness must equal a feasible original assignment and have the +exact original objective; every `Optimal` must equal the oracle optimum. At +every node quota and resident cap, compare finite frontier bounds with that +optimum and the retained incumbent; ordinary BAB must not invent interrupted +bounds. Specifically test strict-root failure with a feasible start (optimal, +never infeasible), better solutions outside the start assignment, max negation, +integer limit endpoints, and objective-only edits invalidating old scalar costs. + +Fault hooks should cover entry mapping, each validation phase, after staged +validation but before publication, after publication, before/after cutoff, +LP/root-cover preparation, root allocation/status, first candidate, child +admission/enqueue and final release. Inject cancellation/time and allocation/ +backend errors; late inputs never publish, timely incumbents survive, identity +and active-parent coverage remain correct. Include zero limits, pre-cancel, +invalid handles/duplicates/fractional near-integers, out-of-domain zero/holes, +mutated snapshots, disabled backends, unsupported guarantees and concurrent +independent solves. No-start cases must retain previous answers, admission +counts and LP-call behavior. + +Run assertion-enabled core, Native-only, combined Native+HiGHS and complete +matching-source ASan/UBSan configurations. Keep generated config, native archives, +modified adapter and HiGHS instrumented consistently. Use production and +coordinator-hook variants; fault-hook code is excluded from production. Then +run existing native/global/LP/frontier/branching regressions and installed consumer +checks. These are proposed checks, not results of this documentation task. + +## Benefit evaluation and decisions about defaults + +Separate the following experiments and include all setup/validation time: + +1. **Explicit complete-start utility:** same models with no start, a modest + independently generated feasible start, and a high-quality start. Measure + start validation cost, time/node work to strict improvement, optimality proof, + and interrupted retained quality. Include failed starts as API error cases, + not as performance wins. Record how each external start was obtained. +2. **Cold-start construction:** no external incumbent, previous session or hidden + benchmark solution. Compare native baseline, a simple bounded dive, repair, + then RENS/other operators separately. Measure feasible-solution rate and time + to first exact-validated solution, time to target objective, objective + trajectory, total time/memory and ordinary proof progress displaced. +3. **Warm improvement:** fixed independently obtained incumbent, matched total + budgets; compare each RINS/LNS operator and the fixed schedule before an + adaptive scheduler. Account for neighborhood setup, failed calls and LP + refreshes. No bound or optimum from a neighborhood counts as a global result. + +Use exhaustive synthetic fixtures for semantic gates, the existing FAST suite +for regression/integration, and isolated broader family benchmarks for benefit. +Report compatible-subset exclusions rather than silently dropping hard models. +Keep warm-start experiments distinct from the earlier completed benchmark +ledger. Build and benchmark phases must not overlap; freeze executable/config/ +seed and development-selected settings before paired held-out runs. Report +per-family results and timeout/unknown handling, not averages of unrelated raw +objectives. Use primal integrals only with an explicit normalized definition +and reference-quality data; missing first solutions remain failures/censored +observations, never zero time or zero gap. + +Before the held-out run, preregister family weights, time caps, exclusions and +an allowed regression margin. Use paired instances with several deterministic +seed/configuration replications where applicable. Report first-feasible success +separately from a capped time metric (for example PAR-2: a run without a timely +validated solution costs twice its time cap), so dropping failures cannot make +an operator look fast. Require a positive held-out improvement with a paired +uncertainty interval, no increase in invalid outputs, and no family/proof-progress +regression beyond that preregistered margin. A speedup on successful runs alone +or a pooled average hiding a family failure does not pass. Do not pick the +margin or family weights after seeing held-out outcomes. + +W9a can become the ordinary behavior for an explicitly provided supported +complete start after correctness gates pass; it adds no automatic work for +users who provide none. An automatic portfolio requires repeatable cold-start +benefits across held-out compatible families, no invalid witness/bound, bounded +worst-case overhead and an acceptable per-family regression profile. If those +gates fail, keep it explicit or remove the unhelpful operator. W9 remains partial +until cold-start and improvement scheduling, partial completion, ownership and +budget contracts are implemented and measured; start acceptance alone does not +close the commercial primal-heuristic capability gap. + +Independent design review found no mathematical or lifecycle blocker in the +live-gate completion, publication/cutoff, frontier-bound or neighborhood-scope +contracts. The subsequent implementation received an independent read-only +review with no concrete blocker. Validation results are recorded in the +implemented Native documentation. diff --git a/docs/solver-parity/NATIVE-SEARCH.md b/docs/solver-parity/NATIVE-SEARCH.md new file mode 100644 index 0000000000..ba8b1c0e47 --- /dev/null +++ b/docs/solver-parity/NATIVE-SEARCH.md @@ -0,0 +1,334 @@ +# Explicit native frontier search + +`solve_native_search` provides depth-first or best-bound search with a bounded +owning frontier and conservative interrupted global objective bounds. It is an +explicit opt-in API. `solve`, Auto routing, `solve_native` and `solve_native_lp` +keep their existing defaults and behavior. + +```cpp +#include +using namespace Gecode::Optimize; + +Model model; +auto x = model.add_integer(0, 5); +auto y = model.add_integer(-1, 5); +model.add_row({{x, 2}, {y, 3}}, 7, + std::numeric_limits::infinity()); +model.minimize({{x, 1}, {y, 1}}, -6); + +NativeSearchOptions options; +options.solve.guarantee = Guarantee::Exact; +options.solve.time_limit_seconds = 10; +options.solve.node_limit = 10000; +options.order = NativeSearchOrder::BestBound; +options.max_open_nodes = 1000; +// Optional, requiring native checked-LP capability: +// options.relaxation = NativeLpSettings{}; +// options.relaxation->frequency = NativeLpFrequency::AfterBoundChanges; +// options.relaxation->root_cover_cuts = NativeRootCoverSettings{}; + +auto answer = solve_native_search(model, options); +if (answer.result.has_solution()) { + const auto original_x = answer.result.value(x); + (void)original_x; +} +// best_bound may be available even after NodeLimit/MemoryLimit/Cancelled. +// Inspect termination separately from incumbent presence and gap values. +``` + +## Supported models and evidence + +The same compiled native model, propagators and independent original-model +checks used by `solve_native` are reused. Supported variables are finite +Integer, Binary and SemiInteger, with integral bounds, linear coefficients, +row sides and objective offset. Native reified indicators and all-different, +element, table, cumulative and circuit constraints retain their original +semantics. Inactive variable/row/global/indicator records remain historical +original slots; the original model and revision are never mutated. + +The conservative native integer activity limits and exact double objective +range in [NATIVE.md](NATIVE.md) apply. Continuous variables, nonintegral data, +unresolved partial starts, multiple workers, nonzero random seeds and exported proof +certificates are explicitly unsupported. Options must select Auto or Native; +this entry point never routes to a numerical solver to handle a different class. +Missing native support also returns `Unsupported` with no solution or bound. + +Numerical/Exact requests retain their requested result classification. Search +uses exact discrete propagation and checked original integer witnesses; this +is not an exported independent proof certificate. The completed finite search +can establish `Optimal` or `Infeasible`. Nonzero gap settings do not enable early +termination: all pruning requires an exact incumbent comparison. Other tied +optima may be pruned; this is optimization, not a solution-enumeration API. + +## Stable frontier and global-bound invariant + +Each queued entry owns a stable propagated native `Space`. Its key is an exact +lower bound on the objective without the constant offset, normalized to +minimization. Maximization uses the negative cost variable bound. A child +inherits its parent's bound and may strengthen it after successful propagation. +The queue never substitutes the current node's bound for the global bound. + +The narrow [binary knapsack DP](NATIVE.md#bounded-binary-knapsack-strengthening) +can strengthen the original root objective bound when no relaxation is requested. +It preserves every original feasible assignment and supplies an owning witness +preference. For DepthFirst, only this DP preference is complemented so the +existing last-enqueued-child descent follows the witness's inequality arm. +BestBound retains the objective bound as its primary key and, on equal bounds, +prefers the unique queued region that still contains the verified DP witness. +This flag is computed once on a stable space before enqueue; the comparator +does not scan domains. Other ties retain creation order. Ordinary models retain +their existing value and child order. Node admissions, active-parent coverage +and original-model witness validation remain unchanged. + +`BestBound` selects the smallest normalized bound, with creation sequence as a +deterministic tie-breaker after the narrowly scoped DP preference above. +`DepthFirst` selects the newest queued stable node. +Alternatives are evaluated in native choice order before their parent leaves +the frontier; the most recently enqueued child is therefore expanded next in +DepthFirst mode. This is a frontier implementation, not the existing BAB +engine's clone/recomputation order. Children are propagated when admitted, so +best-bound priorities reflect deductions available before queue selection. + +During expansion, the parent remains owned and its bound remains active while +each alternative is cloned, committed, propagated and independently validated. +A child is either safely enqueued or fully discharged. Only after every +alternative has been accounted for is the parent removed. The `Choice` remains +alive throughout all commits. New children receive any strict incumbent cutoff +before propagation; stable queued parents need not be modified to use a newly +found incumbent. A queued region whose bound cannot improve the incumbent is +safely pruned. + +For normalized minimization, the interrupted global bound is the minimum of: + +- the independently validated incumbent, if present; +- every queued region's inherited/propagated bound; +- the active root or expanding parent's bound, if its region is unresolved. + +The parent deliberately overlaps already-created children during partial +expansion. This may weaken the bound, but preserves coverage of every unvisited +alternative. Maximization reverses the normalized bound, then the original +objective offset is added. Exact compilation bounds ensure these conversions +stay representable. A semantic implementation error falls back to the initial +compiled objective-box bound instead of authorizing propagated evidence. + +For example, minimize `2*x+y-17` with binary `x,y`. DepthFirst can find `-15` in +the `x=1` region while the `x=0` sibling still contains the optimum `-17`. Stopping +after four admitted nodes returns incumbent `-15` and global bound `-17`; it must +not report the current region's bound `-15` as a global optimum. + +## Node, storage and time budgets + +One `SolveBudget` covers snapshot creation, structural validation, compilation, +root construction, propagation, candidate checking, frontier operations and +cleanup. Cancellation and deadlines are cooperative; native propagation, LP +calls and individual allocations are not preemptible. Candidates are published +only after exact and independent numerical original-model checks and a final +time/cancellation check. A candidate whose validation finishes after an observed +stop is excluded; the active region remains represented. + +The node quota counts admitted root/child propagation attempts. Admission checks +the complete budget, then charges one node. That admitted node may finish and +publish a validated incumbent if time/cancellation permits, even when it uses +the final allowed node. The next admission is blocked. A root solved with a +quota of one may therefore finish optimally. This differs deliberately from the +older BAB stop-adapter timing; the older APIs are unchanged. A quota of zero +stops before compilation and consequently has no objective-box bound. + +`max_open_nodes` counts storage reservations for queued spaces, the active +parent, and an in-flight child. It is a node-count limit, not a byte or operating +system memory guarantee. Zero rejects root storage with `MemoryLimit`; one can +process a root but cannot expand a branch because its parent must remain owned +while a child is created. Actual allocation or native clone failures also +return `MemoryLimit`. The parent bound remains available when expansion fails. + +An interrupted result keeps any earlier timely validated incumbent. Its finite +bound may be absent when compilation never established an initial objective +box. A zero gap does not override an interruption status. Completion is reported +only after every region is discharged. `Infeasible` has no incumbent or finite +best bound. An interruption after all regions were discharged still has its +interruption status; no late completion status is manufactured. + +`NativeFrontierStatistics` reports admitted nodes, expanded parents, failed +nodes, bound-pruned nodes, accepted feasible leaves, peak storage reservations, +and unresolved represented regions at termination. The unresolved count may +include an overlapping parent and its already-enqueued children; it is not a +count of disjoint search regions or bytes. Each solve owns its frontier and, +when enabled, its relaxation workspace independently. + +## Complete starts and the frontier + +`options.solve.primal_start` accepts complete exact starts using the same +[original-model and live-gate completion contract](NATIVE.md#complete-native-starts) +as ordinary Native. No arbitrary partial completion or fixing is performed. +The owning incumbent and its normalized integer cost are installed before LP +setup, root allocation and propagation. Its check consumes shared time/memory +but no admitted node, feasible search leaf or reliability probe. + +The original root is left unfixed and receives a strict cost cutoff. The initial +whole-model bound remains active through setup/faults; subsequently every +unresolved improvement region remains represented. The original global bound +is the minimum of the normalized incumbent and these unresolved region bounds, +with maximization/offset restored at the public boundary. An incumbent alone +never replaces missing region evidence. Exhausting all improving regions proves +the retained solution optimal, even if the root fails under the strict cutoff. +A timely start survives later limits or failures, while late validation publishes +nothing. Zero time/cancel/node budgets preserve the existing early-stop policy. + +## Optional checked LP + +`NativeLpSettings` contains the existing frequency, bound-tightening and bound +change interval controls. `NativeLpOptions` inherits those controls, preserving +normal `.frequency`, `.bound_tightening`, `.bound_change_interval` and `.solve` +member usage for `solve_native_lp`. `NativeSearchOptions.relaxation` is absent +by default; no LP model, workspace or solve is created in that case. + +An explicit relaxation uses the same sparse bounded-integer LP actor and +independently checked integer bounds/cuts as [NATIVE-LP.md](NATIVE-LP.md). Numerical +infeasibility alone cannot prune a native region. Globals and indicators remain +native constraints and are omitted from the ordinary linear relaxation. +`native_lp_capabilities().available` identifies the extra build requirement: +native Gecode, HiGHS and checked wide-integer compiler support. Missing support +returns `Unsupported`, not a fallback to an unrequested method. The inherited +per-attempt LP time/iteration limits are cooperative. `answer.relaxation` holds +the existing LP statistics separately from frontier statistics. + +`options.relaxation->root_cover_cuts` optionally uses the same bounded original- +source global cover preparation as `solve_native_lp`; it is absent by default. +See [root cover semantics and counters](NATIVE-LP.md#optional-verified-root-covers). +Only original ordinary rows and original LP boxes prove cuts. The native +compiler still enforces all original globals, indicators and semi-integer holes. +The new immutable augmented backend and its exact cut attribution remain owned +through the search, and the existing posting helper also posts its implied rows +natively. No certificate from an earlier root-loop matrix seeds a frontier key. + +If preparation stops on a root-only cap or lacks a usable numerical selection +hint, search proceeds with its verified partial augmentation (or the original +backend). Shared time/cancellation/node stops prevent search from starting. +Operational root-loop errors remain explicit solve errors. An interrupted +frontier before native root propagation retains only its initial compiled +objective-box bound; it cannot replace that with a raw LP objective or an +unassociated historical certificate. Later keys use the existing propagated +integer bound invariant. Root LP attempts do not consume native node admissions. +`answer.relaxation.root_cover` records the separate root completion and counts; +its LP counters are already included in total `answer.relaxation` counters. + +## Optional binary reliability + +```cpp +Gecode::Optimize::NativeSearchOptions options; +options.solve.guarantee = Gecode::Optimize::Guarantee::Exact; +options.branching = Gecode::Optimize::NativeBranchingSettings{}; +options.branching->max_probe_status_calls = 128; +auto answer = Gecode::Optimize::solve_native_search(model, options); +// answer.branching contains separate probe, history, selection and work counts. +``` + +`BinaryReliability` ranks original Binary variables using directional native +propagation gains. It is absent by default. General integers, semi-integers and +generated indicator gates use the existing brancher when no eligible binary +split is selected. A removed indicator's retained gate remains excluded by its +original metadata. Candidate enumeration uses a deterministic bounded prefix; +this initial policy does not claim complete candidate exploration. + +The coordinator probes one fully constrained clone at a time. Native globals, +original indicators, semi-integer holes and any checked LP/root-cover actor +remain active. Both finite directions must complete before their history pair +is published. Two finite pairs make a variable reliable by default; completed +failed directions have a separate categorical rank and never enter a mean as +infinity. Ties favor the original variable slot. Zero/invalid ranking scores +fall back to the built-in brancher. + +These are binary unit-step propagation-gain estimates, not classical LP +fractional-displacement pseudocosts. Every probe is discarded. It cannot publish +an incumbent, tighten the parent, seed a child bound or eliminate a sibling. +After selection, both real children follow the existing admission, propagation +and original-witness checks. The active parent's old bound covers interruption +throughout probing and partial child transfer. + +All probe status attempts charge the shared node budget. This counts admitted +attempts: cancellation/time expiry at the final pre-status check can consume +a slot without executing propagation, just as for ordinary admissions. Thus +`answer.branching.budget_nodes` equals `answer.frontier.admitted_nodes` plus +`answer.branching.probe_status_calls`; `admitted_nodes` continues to describe +only real search regions. A pair starts only when the remaining node quota can +hold its two attempts and two ordinary child admissions. The last admitted +attempt may finish, subject to shared time/cancellation checks. The absent +branching option preserves the prior node accounting and search path. + +Settings bound candidates per decision, total/per-decision probe status calls, +history entries, coordinator work and consecutive nonimproving pairs. Zero +resource caps skip optional work; `reliability_samples` must be positive. A +probe also needs one spare slot under `max_open_nodes`. Optional cap exhaustion +preserves completed ranking observations and falls back when necessary; actual +allocation failures remain MemoryLimit. Shared stops and operational errors +preserve the existing interruption/error classification and bound safeguards. + +The work counter meters candidate storage, scans, history comparisons and a +fixed allowance per planned probe pair. It is not a propagator-instruction or +byte limit. `status()` runs to fixpoint/failure, with cooperative checks around +it; observed propagator executions are reported separately. Probe LP calls and +seconds are subsets already included in the solve-wide relaxation totals. +Neither an LP floating infeasibility report nor a raw LP point decides a native +prune. The design and later LP-pseudocost requirements are in +[BRANCHING-DESIGN.md](BRANCHING-DESIGN.md). + +`test/optimize/native_branching.cpp` is an independent original-box oracle for +the enabled policy. Its coordinator build uses +`GECODE_NATIVE_BRANCHING_TEST_HOOKS` plus `GECODE_NATIVE_SEARCH_TEST_HOOKS` to +inject failures in probe preparation/publication and manual child transfer. +The hooks are not a production callback API. Coverage includes every small +node quota, caps, native globals/indicators, min/max, offsets, tombstones, +history reuse, failed pairs, a real deadline expiry, adversarial scores, +clone-then-fallback lifecycle, and concurrent independent solves. + +The normal and fully instrumented native+HiGHS coordinator runs pass 2,397 +original-oracle/budget/fault configurations. Native-only passes 2,381; the core +build verifies explicit unavailable and malformed-option behavior. The unchanged +frontier coordinator also passes all 2,723 default-policy configurations. Native, +adapter and HiGHS code were instrumented together; no timing benchmark was run. + +Build integration adds `native_branching` to the ordinary test list and a +separate native coordinator executable compiling the test and native adapter +with both hook macros above. Link native int/search/kernel/support plus the +normal Optimize foundation, and HiGHS only for the enabled LP variant. A +120-second CTest timeout accommodates the injected one-second deadline test +and instrumented native propagation. Production libraries must omit the hooks. + +## Correctness coverage + +`test/optimize/native_search.cpp` computes complete original-box integer optima +with an independent oracle. Both search orders are tested across every node +quota through exhaustion and a range of storage caps. Fixtures include signed +coefficients, both objective senses and offsets, ties, infeasibility, empty and +fixed models, tombstones, semi-integer domains, original indicators and all five +native global constraint families. Every returned incumbent is checked against +the original model, and every finite interrupted bound is compared to the exact +oracle optimum. Dedicated sibling-better examples require a nonzero incumbent +gap at interruption. + +A coordinator build with `GECODE_NATIVE_SEARCH_TEST_HOOKS` injects cancellation +and allocation failure at root construction, cloning, commitment, propagation, +validation, enqueue and parent discharge. It checks late-candidate exclusion and +parent coverage during partial expansion. This macro is a test-only source hook; +there is no production callback surface. Backend-free tests verify unavailable +capabilities and malformed options. Combined native/HiGHS tests exercise the +optional actor and its limits. Native and vendor libraries used in sanitizer +checks must be instrumented and match the compiled native kernel headers. + +Additional cover tests combine both search orders, min/max and offsets, +semivariables, tombstones, original indicators and all-different constraints. +They compare every finite interrupted bound and incumbent to the original +finite-product oracle across node/storage quotas and zero/one/four root rounds. +Root-only caps preserve the same optimum. A separate +`GECODE_NATIVE_ROOT_CUT_TEST_HOOKS` coordinator checks root preparation errors, +hint-only failure handling and cancellation; existing frontier lifecycle fault +tests continue to run independently of those preparation hooks. + +The normal and fully instrumented native+HiGHS builds pass 2,723 frontier +configurations with both hook sets enabled. A native-only build passes 2,217 +configurations and explicitly rejects the unavailable LP route; the backend-free +build also verifies unavailable capability and invalid-option behavior. + +These are correctness gates. The API is not automatically enabled, and no +performance advantage over BAB, HiGHS or commercial solvers is claimed without +separate benchmark evidence. diff --git a/docs/solver-parity/NATIVE.md b/docs/solver-parity/NATIVE.md new file mode 100644 index 0000000000..9522f430fa --- /dev/null +++ b/docs/solver-parity/NATIVE.md @@ -0,0 +1,382 @@ +# Native finite integer bridge + +`gecode/optimize/native.hpp` provides an optional compiler from the sparse +optimization model to actual native Gecode `Space`, `IntVarArray`, integer +propagators and branch-and-bound search. It is an additive route: existing +native Gecode modeling, globals, search classes and FlatZinc behavior are not +changed. The typed [global registry](GLOBALS.md) retains six native constraint +families. The [owning FlatZinc capture/compiler](FLATZINC-COMPILER.md) and +separate [command-line route](FLATZINC-DRIVER.md) support a documented subset; +broader global and FlatZinc predicate coverage remain future work. + +```cpp +#include + +using namespace Gecode::Optimize; +Model model; +auto x = model.add_integer(-3, 5, "x"); +auto enabled = model.add_binary("enabled"); +model.add_row({{x, 2}, {enabled, 1}}, 1, 7); +model.minimize({{x, -3}, {enabled, 2}}, 4); + +SolveOptions options; +options.backend = Backend::Native; +options.guarantee = Guarantee::Exact; +auto result = solve(model, options); // automatic native algorithm selection +``` + +`solve_native(ModelSnapshot, options)` and `solve_native(Model, options)` accept +backend `Auto` or `Native`; explicitly requesting `Highs` is a mismatch and +returns `Unsupported`. The entry point itself always selects native search. +`native_capabilities()` reports whether this bridge was compiled in and its +supported subset. The common dispatcher controls its own `Auto` policy. + +The common `solve(model, options)` routes `Backend::Native` here, and +`capabilities(Backend::Native)` exposes the same capability report. Common +`Auto` selects native Gecode for active native globals and HiGHS for other +models. The result always identifies the actual backend; explicit selections +are never substituted. + +## Automatic native algorithm policy + +The common `solve(model, options)` now uses `solve_native_auto` when it selects +Native. Applications select the native backend once; they do not need to label +problem families or set individual algorithm flags. `Backend::Auto` continues +to choose Native for active globals and HiGHS otherwise. Direct `solve_native` +retains ordinary BAB for callers requiring the preceding behavior. + +The initial policy inspects model structure under the existing solve budget: + +- Preserve eligible exact knapsack DP using the same admission routine as DP. +- Keep ordinary propagation for globals, indicators, nonbinary variables, + tiny models (at most four active variables), unavailable checked LP, or + optional-route option/numeric incompatibilities. +- Use root checked LP for nonnegative unit-coefficient rows, updated checked LP + every four observed bound changes for signed unit rows, and updated LP with + verified covers and bounded reliability for general binary rows. +- Reliability uses at most 128 probe status calls and DFS with the existing + frontier storage cap. Nonzero gap options use the compatible LP/BAB route. +- Limit extra inspection to 4096 variable/row slots and 65536 row/objective + nonzeros; larger inputs retain ordinary native solving. + +The actual backend and an `Automatic native policy:` explanation appear in each +result. Snapshotting, selection, compilation and solving share time/cancellation +and node accounting. No oracle, inferred starting solution, benchmark family +label or neighborhood is used. Eligible ordinary integer models additionally +use the exact preprocessing pipeline described below. + +The default remains a conservative structural heuristic. The thresholds are +provisional resource limits, not predictions of a speedup. Opt-in online strategy +selection is available separately through the native racing API below; neither +policy implies broad gains on unseen models. + +## Optional automatic strategy racing + +`solve_native_race` is an opt-in C++ entry point for native Gecode, accepting a +`Model` or `ModelSnapshot`. It is not yet surfaced as a MiniZinc/FlatZinc option. +It integrates the automatic presolve, independent components, identical-column +symmetry, compact knapsack DP and suitable checked-LP/branching choices above. +It compares that automatic route against ordinary native BAB (which also keeps +eligible exact knapsack DP), without problem-family labels or known objectives. + +```cpp +NativeRaceOptions race; +race.solve.backend = Backend::Native; +race.solve.guarantee = Guarantee::Exact; +race.solve.time_limit_seconds = 120; +race.exploration_seconds = 8; // total nominal exploration, not per candidate +race.probe_node_limit = 50000; // per candidate; global node limit still applies +auto result = solve_native_race(model, race); +``` + +Two sequential probes receive equal local time/node allowances. A full proof +ends the solve immediately. Otherwise, selection prefers the better validated +original-model incumbent, then the stronger valid global bound, with the +automatic route winning ties. The selected strategy restarts with the remaining +global budget. Its search tree is not resumed, and probe incumbents are retained +for the result rather than injected as starts that would disable preprocessing. +Original-model incumbents/bounds survive an unproductive restart. No result from +an unfinished independent component is treated as a complete-model proof. + +**Racing can increase total CPU work and solve time.** Both exploration and +restarting repeat work; early progress can select the wrong eventual winner. +Conversely, several seconds or longer of exploration may quickly identify a +substantially more effective path and pay off during a longer solve. This is a +heuristic with no speedup guarantee. Probes run sequentially on one worker, not +in parallel. Defaults allow two seconds total exploration and 4096 nodes per +probe; a finite solve deadline caps nominal exploration at 25% of the remaining +time. Zero exploration selects the ordinary automatic policy. Raising exploration +time and node allowances permits longer trials; it does not extend the global +deadline. Cooperative propagation/LP calls may overrun local deadlines. + +Every probe, restart, snapshot, reconstruction and final validation shares one +monotonic deadline, cancellation token and cumulative node count. Local probe +exhaustion does not cancel subsequent work. Results include the probe count, +selected route, cumulative nodes and an overhead notice. Supplied starts, +globals, indicators and incompatible options retain the direct automatic path. +`solve_native_auto` and the common `solve(..., Backend::Native)` do not silently +enable racing. Existing explicit native/LP/frontier APIs are unchanged. + +Racing validation: all 75 tests pass after a full isolated Release rebuild. +The race fixture checks exhaustive min/max optima, actual two-probe/restart +execution, cumulative node caps, starts, cancellation and invalid input; it also +passes with native checked LP disabled. Race and shared-budget tests pass in a +backend-free build. Nested budget-slice tests verify that local exhaustion leaves +the parent usable and cannot relax an inherited cap. + +Before racing was added, the isolated Release build passed all 74 CTest entries, +including the original FAST suite and the new automatic/presolve/component/symmetry +tests. Five focused tests pass with checked LP disabled, and four pass in a +backend-free build. All four changed mechanisms pass AddressSanitizer and +UndefinedBehaviorSanitizer checks; leak detection is unavailable on this macOS +runtime. Knapsack tests exercise 1568 independent-oracle and budget configurations. +The original measured benchmark library remains byte-identical. These are +correctness/resource checks, not a new performance comparison. + +## Exact automatic preprocessing + +Within the automatic native route, bounded ordinary Integer/Binary linear models +can use three additional transformations. The original model first passes native +structural and arithmetic admission; reductions cannot turn an unsupported input +into a silently accepted one. Supplied starts retain the established direct path. +Globals, indicators, semivariables and inspection-cap misses retain that path too. + +1. **Presolve:** at most four passes and 65536 propagation row visits. Fixed + variables and redundant rows are removed, and bound deductions are retained. + Finalized partial reductions are also equivalent. The reduced continuation + requests Exact, original witnesses are reconstructed and checked at tolerance + zero, and only the actual reduced solve can establish optimality or + infeasibility. Full objective values, including fixed-variable offsets, agree; + certified reduced bounds transfer without another offset adjustment. The + standalone `postsolve` utility still returns only a feasible historical point. +2. **Independent components:** the active variable/ordinary-row incidence graph + must be disconnected. At most 64 components are solved sequentially under one + time/node budget. Their objectives exclude the original offset; original + evaluation adds it once. Every component must prove optimality before an + original optimum is published. A proven infeasible component establishes + original infeasibility. Partial assembly returns no original incumbent/bound. +3. **Interchangeable columns:** equal types, domains, objective coefficients and + coefficients in every active row establish exact permutation symmetry. + Ordering adjacent members retains an optimum from every equivalence class. + Returned witnesses are checked on the original model. This first implementation + does not detect permutations of entire bin/machine blocks or general graph + symmetries. Domains with magnitude above 500 million skip ordering, keeping + generated row activity within conservative native arithmetic limits. + +The same 4096 variable/row slots and 65536 nonzero inspection caps apply. +Eligible knapsack DP is checked before transformations and again for reduced +components, preserving its specialized route. New original results must be +validated and published within the cancellation/deadline budget, including +preprocessing cleanup; hitting a node quota does not invalidate the final +admitted node's completed proof. No conflict learning is added. + +Build the bridge from the repository root with `GECODE_ENABLE_OPTIMIZE=ON`, +the integer/search components enabled, and `GECODE_OPTIMIZE_WITH_NATIVE=ON`. +The last option defaults to ON when those native components exist. A standalone +`-S gecode/optimize` build supports the numerical or backend-free component; +explicitly requesting native support there fails with top-level build instructions. +HiGHS can be disabled in a combined native-only optimization build with +`GECODE_OPTIMIZE_WITH_HIGHS=OFF`. Its explicit native route still works. + +## Supported mathematical subset + +- Every active variable has type `Integer`, `Binary` or `SemiInteger`, with + finite integral bounds inside `Gecode::Int::Limits::min` through `max`. + Semi-integer domains are exactly `{0} union [lower, upper]`, represented by a + native `IntSet`; their zero alternative is retained. +- Original linear coefficients and finite row bounds are integral and inside + the same native limits. Infinite row sides are allowed. Equality, lower-only, + upper-only, ranged, empty and redundant rows are supported. +- Each original row and each original indicator expression must satisfy + `sum_i max(abs(a_i*effective_lower_i), abs(a_i*upper_i)) <= Int::Limits::max`. + Effective lower bounds include zero for semi-integer variables. This + conservative condition bounds all products and partial activities without + relying on cancellation or on other constraints to tighten domains. +- Both objective senses are supported. The objective expression obeys the + same activity condition with `Int::Limits::max / 2`, reserving space for the + native cost equality. The offset is integral, and its magnitude plus the + largest absolute attainable expression bound must not exceed `2^53`. Thus + all objective values can also be represented exactly by the result's double + fields. + +Unsupported continuous domains, fractional numbers, missing finite variable +bounds, and excessive activity/objective ranges return `Unsupported` before +search. Bounds are never silently rounded and an unsupported formulation is +never reported as infeasible. Even a fixed continuous variable is outside this +initial integer compiler. A caller may construct an explicitly equivalent +integer model, but the bridge does not infer or rewrite that intent. + +## Bounded binary knapsack strengthening + +Ordinary native search recognizes one narrow exact subproblem at the root: +every active variable must be an original `Binary` with domain exactly `[0,1]`, +and one capacity row must cover every active column with strictly positive +integer weights. The row may be written as `weights*x <= capacity` or its +sign-reversed lower-bound form. An opposite side is allowed only when it is +nonrestrictive for nonnegative weights. Active indicators, globals, additional +rows, uncovered variables, fixed binaries and binary-valued `Integer` variables +use the existing native path. + +An exact dynamic program minimizes the signed objective over this capacity +row. Maximization negates the coefficients internally; the offset is kept +separate. Capacity remains capped at 65,536. Two rolling `int64_t` rows store +values, and one decision bit per item/capacity pair preserves exact traceback. +Work is capped at 32 million transitions and the accounted DP payload at 8 MiB, +including rows, decisions, weights, costs and witness. Larger instances fall back +before allocation. A cooperative 250 ms local preprocessing limit can abandon +DP without publishing partial evidence; native search keeps the global budget. An objective for which all-zero is already optimal +also keeps the ordinary minimum-first path. The recurrence uses work proportional +to the admitted table size; it is pseudo-polynomial in numeric capacity. + +The reconstructed binary witness is checked against the capacity and objective +before use. The native space receives only the proven objective-side bound +(`cost >= optimum` for minimization, reversed for maximization), which preserves +all original feasible assignments. The owning witness orders native choices; +it never fixes the model or directly publishes a result. Ordinary native search, +strict incumbent cutoffs and independent original-model candidate checking still +establish the returned status and solution. + +This work runs once during root construction and shares cancellation and time +limits, with checks every 256 recurrence cells, each row, and during reconstruction. It consumes no +search-node admissions. Allocation failure follows the existing `MemoryLimit` +contract; time or cancellation does not publish an unfinished artifact. Explicit +NativeLP, frontier relaxation and restricted local neighborhoods bypass the DP. +No generic objective-sign value ordering or generic DFS traversal change is +enabled. Benefits apply to this admitted subproblem, not general CP or MIP. + +## Original indicators and exact validation + +Active typed indicators use their original row and activation value. The +compiler validates the entire mutable snapshot, including generated-row +origins, captured domains and guarded numerical lowerings, then replaces those +generated rows with native reified integer constraints. For a ranged indicator +both sides are implications from the same activation literal. The numerical +helper's optional inactive gate retains its exact equality with the activator, +so objectives and other rows that reference that exposed gate keep their +meaning. Nonintegral, outward-rounded M values in the discarded lowering do +not make an otherwise supported original integer indicator unsupported. + +Every candidate is mapped back to the original variable slots, including +tombstones. A separate integer checker reads the original snapshot, checks +variable domains, original rows, original indicators and gate equalities, and +recomputes the objective using `int64_t`. Its arithmetic is protected by the +compiler's product and absolute-activity limits. The native cost variable must +match that recomputed objective. The candidate must additionally pass the +existing original-model numerical checker, including its retained numerical +lowerings, before `solution_validated` can become true. + +`Guarantee::Exact` therefore refers to preserved integer arithmetic and native +finite-domain search on this explicit subset. It is not just numerical +feasibility relabeled as exact. Completed branch-and-bound establishes optimality +or infeasibility through native propagation and exhaustive search with sound +strict objective cuts. The bridge does not emit an independently checkable +proof artifact; `Guarantee::Certified` returns `Unsupported`. + +`Guarantee::Numerical` accepts the same supported subset and runs the same +integer search and checks. Feasibility and integrality tolerances never relax +the integer checker. Relative/absolute gap options do not enable early stopping +in this route; it attempts full optimality even when positive gaps are allowed. + +## Complete native starts + +`SolveOptions::primal_start` accepts one complete exact assignment through +`solve(..., Backend::Native)` and `solve_native`. Values use owner-aware original +variable handles; duplicate, foreign/deleted, nonfinite, nonintegral, +out-of-domain or infeasible complete input returns `InvalidModel`. No rounding +is performed, including for a `Numerical` guarantee or near-integral values. +The zero alternative of a SemiInteger domain remains valid. + +Supply every active ordinary variable. A missing live indicator `inactive_gate` +is derived from its exact activation relation; chains are completed forward +without guessing, and an explicit inconsistent gate is rejected. A retained +gate after `remove_indicator()` has no such live meaning and must be supplied. +Other private/fixed slots are not inferred. Any unresolved active slot returns +`Unsupported`; values are never fixed in the original search as partial hints. + +```cpp +SolveOptions options; +options.backend = Backend::Native; +options.guarantee = Guarantee::Exact; +options.primal_start = {{x, 2}, {enabled, 0}}; // all ordinary active variables +const auto answer = solve_native(model, options); +// start_submitted reports accepted input; solution_validated checks the witness. +``` + +Full native preflight and exact original row/indicator/global/objective checks +precede publication. A second independent public validator must also pass. +A timely accepted start is stored as an owning incumbent (`start_submitted` and +`solution_validated` true), then the unfixed original root receives a strict +integer objective cutoff. Exhausting this improvement problem proves the +retained incumbent optimal; it never makes the original model infeasible. +Later limits or operational failures preserve an earlier timely validated +incumbent, while invalid/late starts publish nothing. The original snapshot, +revision, constraints and variable bounds are unchanged. + +Start checking uses the shared clock/cancellation token and no search node or +extra native propagation. Zero time, pre-cancellation and zero node quota stop +before start processing. Model edits require full revalidation and objective +recomputation on the next solve; there is no persistent native session or +implicit previous-result reuse. This slice does not add repair, partial +completion search or an automatic cold-start heuristic. See +[NATIVE-PRIMALS-DESIGN.md](NATIVE-PRIMALS-DESIGN.md) for the later portfolio scope. + +## Search, limits, and results + +The first implementation uses one deterministic worker, smallest-domain-first +variable branching and minimum-value-first alternatives. `threads != 1`, a +nonzero random seed, or an unresolved partial primal start returns +`Unsupported`. Complete exact starts are accepted as described above. + +One shared `SolveBudget` covers structural validation, compilation, native +search and candidate checking. The `Model` overload also deducts the time used +to create its owning snapshot; moved-from model errors become `InvalidModel` +results instead of escaping that overload. Native search statistics contribute +newly visited nodes to the budget. A native stop object checks cancellation, +deadline and node limits, in that priority order. + +Stopping is cooperative. Individual native propagation and recomputation calls +cannot be interrupted, so the wall time may exceed the requested deadline. +Budget checks after backend calls and after original-model checking exclude +late candidates; an earlier validated incumbent may still be returned. At an +exact node-limit boundary the bridge conservatively reports `NodeLimit`, even +if a candidate or exhaustion was observed in the same call. + +Interrupted results have no `best_bound`, absolute gap or relative gap: this +bridge does not yet maintain a global bound over the unfinished search +frontier. Only proven optimal completion sets `best_bound == objective` and +zero gaps. Proven infeasibility has no incumbent or objective. An exact +interrupted incumbent remains an exactly checked feasible witness; its status +does not claim optimality. Historical results retain original identity, revision, +values and tombstone layout after subsequent model edits. + +## Build and verification + +`native.cpp` has a backend-disabled stub when `GECODE_OPTIMIZE_WITH_NATIVE` is +absent. Enabling it requires native Gecode integer, search, kernel and support +libraries, their matching generated configuration header, and the thread +library. It does not require the minimodel library or HiGHS. The build +integration owns native dependency discovery and links; the source itself +never fetches anything. The native test target must use the same enable macro. + +`test/optimize/native.cpp` compares tiny problems to a separate exhaustive +integer oracle for both senses, negative coefficients/offsets, ranged rows, +semi-integers and both indicator activation values. It also covers gate +references, redundant/constant/empty models, generated fractional M values, +model history, tombstones, foreign handles, hostile snapshots, node-limited +incumbents, zero deadlines, cancellation, backend mismatch, disabled builds, +unresolved partial starts and deliberate integer/floating range failures. + +`test/optimize/native_starts.cpp` independently enumerates the original finite +domains and predicates, including globals, semi-integer holes, live and removed +gates, and both objective senses. It checks every accepted start against this +oracle, then verifies that the original unfixed problem is still optimized. +Separate test-hook builds inject cancellation, allocation errors and operational +failures around validation, publication, LP preparation, cutoff posting, frontier +transfer and cleanup; interrupted bounds are checked against the oracle. + +Local complete-start checks passed 2,636 configurations with native Gecode and +HiGHS, both normally and with the bridge, test, native libraries and HiGHS built +using address/undefined sanitizers. The native-only hook build passed 1,350 +configurations. Existing native, LP, frontier, reliability-branching and global +regressions also passed. These are correctness checks, not performance +benchmarks or a claim of native MILP parity with commercial solvers. diff --git a/docs/solver-parity/NINTH-CHECKPOINT.md b/docs/solver-parity/NINTH-CHECKPOINT.md new file mode 100644 index 0000000000..d7bbf32ab3 --- /dev/null +++ b/docs/solver-parity/NINTH-CHECKPOINT.md @@ -0,0 +1,147 @@ +# Ninth integrated checkpoint — 2026-09-05 + +The work recorded at this historical checkpoint is integrated on `codex/solver-parity` in +`implementation/gecode`. This checkpoint finishes selected-basis LP sensitivity +and bounded native incumbent improvement, validates their integration, and +compares existing workloads with the preceding working checkpoint. Further +roadmap implementation is on hold. The later bounded algorithm work is recorded +separately in the [algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md). + +Compiled product source is `c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60`. +The final FAST runner and performance measurement use +`db7eb0b85b2970e20e8a3d965559fd31a94c73b4`; that follow-up changes only the +runner's expected BinaryHamming backend identity. Later checkpoint documentation +does not change the tested product. The original checkout remains on +`experiment/llm-search` at `3e0e8ee76fb4ba01c53616dce02c0bb1a53f159e`, with +all 2,963 recorded source/test/input hashes unchanged. + +## Completed scope + +- [LP sensitivity](LP-SENSITIVITY.md) computes original-coordinate objective + coefficient and equality-RHS intervals for a selected optimal continuous LP + basis. The numerical analyzer checks the basis and source observations, + factors a private system without running another optimization, and retains + owning history and explicit incomplete/unavailable outcomes. + [C and Python bindings](LP-SENSITIVITY-BINDINGS.md) include lifetime, + cancellation and cleanup behavior. +- [Native neighborhoods](NATIVE-NEIGHBORHOODS.md) adds an explicit C++ API for + one bounded binary Hamming-distance improvement attempt after a checked + incumbent. It checks a proposed improvement against the original model and + shares the outer search budget without promoting a local proof to a global + one. Existing default solve routes remain unchanged. This experimental + slice does not include a C/Python neighborhood wrapper or a full heuristic + portfolio. +- Both features are integrated into normal/backend-disabled/sanitizer builds, + installed consumers, and the expanded 35-case FAST gate. Sensitivity's private + factorization headers are excluded from installed headers. +- Previously started learning research is retained as an isolated experiment + and private reason-contract header. The header is excluded from installation; + no CaDiCaL dependency or learning runtime was added to Gecode. + +## Correctness and installation + +All results below are from the local Apple M1 Pro, macOS 15.7.4, AppleClang host, +with pinned HiGHS 1.15.1 and MiniZinc 2.10.1 where applicable. These are different +configurations of overlapping tests; their counts should not be added as unique +test coverage. + +| Gate | Result | Evidence relative to repository root | +| --- | --- | --- | +| Combined native/numerical and FlatZinc boundary CTest selection | 67/67 pass | `build/native-compat/ninth-ctest.log` | +| Numerical Release | 54/54 pass | `build/optimize/ninth-ctest.log` | +| Backend-disabled Debug | 52/52 pass | `build/optimize-core/ninth-final-ctest.log` | +| Full native/HiGHS/facade ASan+UBSan configuration | 66/66 pass | `build/native-sanitize/ninth-ctest.log` | +| Python with the sanitizer runtime preloaded | 83/83 pass | `build/native-sanitize/ninth-python-preloaded-sanitizer.log` | +| Installed C/C++ consumers | 8/8 each: numerical, core, combined; native-only 1/1 | `build/optimize/ninth-installed-consumers.json`; `build/native-compat/ninth-native-only-test.log` | +| Python against installed libraries | 83/83 in each of those three configurations | `build/optimize/ninth-installed-consumers.json` | +| Actual FlatZinc CLI | 106/106 in normal and sanitizer configurations | `build/{native-compat,native-sanitize}/ninth-cli.json` | +| Actual MiniZinc build registration | 72/72 in normal and sanitizer configurations | `build/{native-compat,native-sanitize}/ninth-minizinc.json` | +| Actual installed MiniZinc registration | 72/72 pass | `build/native-compat/ninth-installed-minizinc.log` | +| Legacy FlatZinc including optional blackbox fixtures | 140 fixture instances, five repetitions each, seed 1701 | `build/native-compat/ninth-legacy-summary.json` | +| Regression-runner/containment unit tests | 24 pass; 9 actual-Windows tests skipped | `build/native-compat/ninth-harness-tests.log` | +| Expanded FAST gate | **35/35 pass; 5.7852 s external wall** within its unchanged 28 s outer budget | `build/optimize/ninth-fast.json`, `ninth-fast-wall.json` | +| Original checkout isolation | 2,963 hashes plus branch and HEAD unchanged | `build/optimize/ninth-original-isolation.json` | + +The new FAST sensitivity case checks 63 analytic/lifecycle conditions for both +objective senses. The neighborhood case checks 14 conditions, including an +actual incumbent improvement and the independent eight-assignment optimum +of −29. Private coordinator tests cover interruptions, accounting and cleanup; +installed consumers exercise the public APIs. The original full native test +corpus was not rerun: the retained CP gate and the selected legacy FlatZinc +fixtures provide the bounded original-code regression coverage. + +The first legacy selection omitted the log environment variable, selecting 136 +fixture instances. A follow-up with the proper blackbox environment ran the +four missing fixtures and repeated seven shared controls. Two distinct legacy +fixtures both register as `tenpenki::1`, so there are 139 distinct display names +among the 140 fixture instances. This matches the preceding checkpoint's fixture +set. An initial new FAST fixture compile used the wrong LP observation options +type; that test setup was corrected before the final rebuild. The runner's +expected neighborhood backend identity was also corrected before the final FAST +run. Those preliminary failures are retained in local logs. + +## Existing-workload performance comparison + +The prior checkpoint is compiled source `bda86186d`, with source/report head +`158dc0b66f02929c9be957cdcad651581dd7be3f`. Both cohorts use the same preserved +eighth-checkpoint test executables and the same frozen 33-case runner and 70 +fingerprinted source/fixture files. Only explicitly selected solver libraries +change. Dynamic-loader probes verified all 11 loaded Gecode libraries came +from the intended cohort, and artifact hashes were checked again afterward. +All task builds/tests stopped before timing; ordinary desktop processes remained. + +| Panel | Complete pairs | Prior median external wall | Current median external wall | Median paired current/prior ratio | Geometric mean of per-case paired median ratios | +| --- | ---: | ---: | ---: | ---: | ---: | +| 33 common FAST cases | 5 | 5.6303 s | 5.7401 s | 1.0195 | 1.0024 | +| Five existing MIPLIB inputs | 3 | 1.7816 s | 1.5935 s | 0.9421 | 0.9608 | + +The ten complete FAST panels passed 330/330 case executions. The six MIPLIB +panels passed 30/30 solves with independent exact witness and known-optimum +checks on p0033, p0201, p0282, p0548 and lseu. No case triggered the predeclared +diagnostic threshold: its median must slow by both more than 20% and more than +1 ms, and the joint condition must recur in at least half its paired runs. +This is a diagnostic rule, not a statistical significance test. + +**One additional attempted panel failed its deadline.** Six FAST pairs were +planned; the current-library panel starting pair six timed out in `cp_distinct` +at 4.0046 s under the existing four-second cap. Its other 32 cases passed. +The failure is preserved, was not retried, and is excluded from the five +complete paired medians. The final comparison explicitly records +`all_attempted_fast_panels_passed: false`. Successful runs of that case ranged +from 3.29 to 3.55 s. Its executable and all nine native-library instruction +sections are byte-identical between cohorts. This shows a deadline-margin and +repeatability limitation in unchanged code; it does not identify the cause of +the timing variability. No limit was relaxed to obtain a pass. + +The common FAST results suggest little change on these workloads. The MIP +panel's lower measured times do not establish a general speedup. This short +comparison includes process startup, loading, polling and desktop noise; it has +no large-instance holdout, confidence intervals or memory analysis. It compares +with the preceding integrated checkpoint, not CPLEX/Gurobi or the entire original +benchmark corpus. New-feature correctness is covered by the separate 35-case +gate; this comparison does not measure new-feature performance benefits. + +Full raw measurements, per-case times, provenance and the failed sixth panel +are in `build/comparison-eighth/results-final/`. The interpretation is +`interpretation.md`; the full machine-readable record is `comparison.json`. +The preserved comparison script and preparation manifest are in its parent +directory. A committed compact record is [checkpoints/ninth.json](checkpoints/ninth.json). + +## Usable artifacts and boundaries + +The combined executable is `build/native-compat/bin/fzn-gecode-optimize` and +the combined facade is under `build/native-compat/gecode/optimize/`. Fresh +tested installation prefixes are `build/stage/combined-ninth`, +`build/stage/standalone-ninth` and `build/stage/core-ninth`. The +[build/API guide](README.md), [MiniZinc guide](MINIZINC.md) and +[FAST command](FAST-REGRESSION.md) describe their use. Exact executed FAST +arguments and library hashes are in `build/optimize/ninth-fast-wall.json` and +`ninth-fast.json`. Existing eighth-checkpoint stages and binaries were preserved. + +This batch did not rebuild the Python wheel; the existing eighth-checkpoint +wheel does not contain these additions. No package publication, remote CI, +actual Windows/Linux runtime validation or oldest-macOS execution is claimed. +The full native sanitizer configuration instruments the native libraries, +HiGHS and facade; leak detection is disabled, with ASan/UBSan halt-on-error +enabled. No further branching, learning, nonlinear or parallel-search work is +started by this checkpoint. The broader parity roadmap remains incomplete. diff --git a/docs/solver-parity/POOLS.md b/docs/solver-parity/POOLS.md new file mode 100644 index 0000000000..f29762e709 --- /dev/null +++ b/docs/solver-parity/POOLS.md @@ -0,0 +1,166 @@ +# Solution pools over finite discrete projections + +`solve_pool` returns distinct assignments to a specified finite Integer/Binary +projection. Each completed optimization selects the best remaining projection +class under the original scalar objective. Variables outside the projection may +have many feasible completions; the pool returns one optimal completion per +selected class, not all of those assignments. Continuous recourse is supported +by HiGHS. Tied classes have unspecified order. + +```cpp +#include +using namespace Gecode::Optimize; + +Model model; +auto open = model.add_binary("open"); +auto production = model.add_continuous(0, 10, "production"); +model.add_row({{open, -10}, {production, 1}}, + -std::numeric_limits::infinity(), 0); +model.maximize({{production, 2}, {open, -3}}); +PoolOptions options; +options.projection = std::vector{open}; +options.max_solutions = 3; +options.solve.time_limit_seconds = 10; +auto pool = solve_pool(model, options); +// Two classes: open=1, production=10, objective=17; +// open=0, production=0, objective=0. +// A subsequent infeasibility solve establishes that no other class remains. +for (const auto& entry : pool.entries) { + const double quantity = entry.solution.value(production); + const bool ranked = entry.rank_established; + (void)quantity; (void)ranked; +} +``` + +## Identity, ranking, and completion + +`PoolOptions.projection` defaults to every active Integer/Binary variable in +original slot order. Explicit projections retain caller order, must have unique +live original handles, and may leave other discrete variables outside the +projection. Every projected domain must have finite bounds. Non-projected +Continuous and Integer recourse may be unbounded; the selected backend must be +able to solve the resulting subproblem. Unbounded or ambiguous objective results +do not establish a ranked representative or pool exhaustion. + +An empty projection is rejected for a model with active variables. In particular, +a continuous-only model is not called an enumerable pool. A model with no active +variables has one possible empty tuple; it contributes one representative if +feasible, or none if infeasible. + +Each entry contains: + +- An independently validated historical `SolveResult` using the original model + identity, revision, variable slots and objective, including its offset and + sense. Original model edits after the call do not change these stored values. +- Its canonical integer `projection_values` tuple in projection order. +- `rank_established`, indicating that this remaining-model solve completed with + an independently checked objective and closed global-bound gap. + +Historical entry `termination` is `Unknown`, and scalar global bounds and gaps +are cleared. A later-ranked representative is not an optimum of the unrestricted +original model. Its rank evidence lives in the pool result, not in an invented +original-model optimality claim. `attempts` retain each remaining solve's status, +objective, bound and guarantee, including failed or interrupted attempts. + +`ranked_prefix` counts the established ordered prefix. An interrupted timely +candidate can be stored as one final **unranked** entry, after which enumeration +stops. A later independently feasible point that improves an earlier claimed +rank beyond the declared numerical allowance contradicts that evidence. This +returns `NumericalFailure`, clears rank flags, and retains historical feasible +values only. Other later interruptions or unsupported solver operations do not +revoke already established ranks. + +| `completion` | Meaning | Pool `termination` | +| --- | --- | --- | +| `RequestedLimit` | `max_solutions` ranked representatives found; no extra exhaustion solve was performed | `SolutionLimit` | +| `Exhausted` | A definite infeasible remaining-model solve established that no further projection class exists | `Optimal`, meaning this pool workflow completed; the final attempt is `Infeasible` | +| `Incomplete` | Budget, ambiguity, unsupported class, numerical failure or other error stopped the workflow | The explicit stopping reason | + +Even if the requested count happens to equal the total number of feasible +classes, reaching that count is not labeled exhaustion. Request a larger count +to allow the final infeasibility check. This is not a promise of commercial +solver solution-pool completeness over arbitrary mixed or real-valued models, +nor a heuristic diversity pool. The finite projection defines exactly what is +being distinguished and exhausted. + +## Numerical and exact evidence + +Each ranked solve requests zero backend absolute and relative MIP gaps. The +workflow checks original/remaining model feasibility, stable identity and active +slot masks, recomputes the original objective, and independently recomputes the +gap from the returned global bound. Cached gap fields cannot establish ranking. +All active integer values, including private binary witnesses, are rounded and +rechecked; canonical integers must lie inside their original interval without a +bound tolerance. Every canonical integer value and every projected domain endpoint must be exactly +representable with magnitude at most `2^53`, and projected width must not +exceed `2^53`. + +`Guarantee::Numerical` with HiGHS is the default. Original row feasibility and +continuous values remain tolerance-qualified. Objective/gap and rank comparisons +use the greater of the requested absolute feasibility tolerance and 64 double +machine epsilons times objective/bound scale. Finite domain size does not turn +numerical backend infeasibility or optimality into an exact proof. + +`Guarantee::Exact` requires explicit `Backend::Native`, and every resulting model +must fit that backend's exact finite-integer subset and arithmetic limits. Its +rank comparisons and closed-gap requirement allow no numerical discrepancy. +Native rejects continuous recourse and unsupported ranges or coefficients. +`Certified` is unsupported; no proof certificate is generated. Infeasibility and +rank evidence are obtained from the actual solver, with original-model witness +checks, rather than inferred from a search timeout or a requested entry count. + +## Safe projection exclusions + +After accepting a ranked tuple `v`, the private model adds a disjunction saying +that at least one projected variable differs. For an integer `x` with effective +bounds `L=ceil(lower)` and `U=floor(upper)`, possible witnesses are: + +- If `v > L`: binary `b` and `x + (U-v+1)*b <= U`. Setting `b=1` requires `x<=v-1`. +- If `v < U`: binary `b` and `x - (v+1-L)*b >= L`. Setting `b=1` requires `x>=v+1`. + +The sum of all witnesses is constrained to be at least one. Every differing +integer tuple admits a witness; the excluded tuple admits none. Non-projected +variables never enter these exclusions, so all completions of a tuple are +excluded together. A tuple whose projected domains are all singletons produces +a constant contradiction, allowing a subsequent infeasibility solve to establish +exhaustion. Coefficients are derived from actual finite bounds, checked for exact +integer representation, and never replaced with guessed large constants. + +The original snapshot is copied, preserving slot identities and metadata. +Private witness variables and rows are appended only to that copy. They are +removed from historical entry values by original slot mapping before independent +original-model validation. The original `Model` revision and contents remain +unchanged. Structural validation treats public snapshots as untrusted. + +Active indicators, active typed globals, SemiContinuous and SemiInteger variables +are explicitly unsupported in this initial pool workflow. Inactive metadata is +preserved. Existing linear Boolean rows and ordinary ranged rows remain hard. +Foreign, duplicate or deleted projection handles and zero `max_solutions` are +invalid input. Infinite, overly wide or continuous projected domains return +`Unsupported`. + +## Budgets, starts, and checks + +One monotonic deadline and cancellation token cover copying, all solves, +exclusions, validation and result construction. A candidate returned after the +shared budget stops is not promoted. Earlier accepted entries remain historical +results. Multiple-solve node limits are unsupported until the backend reports +cumulative consumed nodes; a requested pool of one can use a node limit. + +An original primal start may be used for the first solve under the common start +contract. Subsequent starts are cleared because earlier assignments have been +excluded. Thread, seed and solver capability restrictions remain those of the +chosen backend. + +`test/optimize/pool.cpp` compares min/max pools with exhaustive integer arithmetic, +checks partial projections and ties, verifies analytical continuous recourse, +exercises original history after edits, and covers constants, tombstones, +unsupported metadata/domains, exact Native when available, and missing-HiGHS +behavior. A fake solve mode, `GECODE_POOL_TEST_FAKE_SOLVER`, enumerates all private +integer/binary variables independently and checks the no-good formulations +without using the implementation's validator as its oracle. It also exercises +interruption, late cancellation, forged identity/masks/objectives/bounds, repeated +projections, ambiguous or witness-contradicted infeasibility, wrong guarantees, +large-offset cancellation and contradictory ranks. +Compile that mode with model/result/validate/constraints/globals/pool sources and +omit the real solve/native sources. diff --git a/docs/solver-parity/PRESOLVE.md b/docs/solver-parity/PRESOLVE.md new file mode 100644 index 0000000000..129b78c0c9 --- /dev/null +++ b/docs/solver-parity/PRESOLVE.md @@ -0,0 +1,181 @@ +# Explicit exact integer presolve and reconstruction + +`gecode/optimize/presolve.hpp` provides `presolve_integer`. It applies sound +integer interval propagation, removes proven redundant rows, substitutes fixed +variables, and returns an owning reconstruction map. The utility itself invokes +no solver, and its `postsolve` does not transfer optimization status or bounds. +The common Native automatic route now uses a separate bounded exact composition, +as described in [NATIVE.md](NATIVE.md): it solves the reduced model exactly and +restores original proof status and bounds under the artifact's equivalence +contract. General performance gains require subsequent benchmarks. + +```cpp +#include +#include +using namespace Gecode::Optimize; + +Model original; +auto fixed = original.add_integer(2, 2, "fixed"); +auto free = original.add_integer(-2, 2, "free"); +original.add_row({{fixed, 3}, {free, -2}}, 4, 8, "range"); +original.maximize({{fixed, -3}, {free, 2}}, 11); + +PresolveOptions options; +options.time_limit_seconds = 1; +auto presolved = presolve_integer(original, options); +if (presolved.model) { + // The private model has free in [-1,1], objective 5+2*free, and a fresh ID. + auto reduced_solution = solve(presolved.model->reduced()); + if (reduced_solution.has_solution()) { + auto recovered = presolved.model->postsolve(reduced_solution); + if (recovered.exact_witness_validated) { + const double original_fixed = recovered.solution.value(fixed); + (void)original_fixed; + } + } +} +``` + +## Scope and guarantees + +The initial active model class is finite Integer/Binary domains with integral +linear coefficients, finite row sides, and objective coefficients/offset. Row +sides may be infinite. Input integers must have magnitude at most `2^53`, as +represented by the model's double fields. Nonintegral data is rejected rather +than rounded or silently scaled. + +Active Continuous, SemiContinuous, SemiInteger, indicator, and global constraints +are `Unsupported`. Inactive tombstones remain in the owned original model and +its mappings; their inactive metadata has no reduced-model semantics. Public +snapshots receive structural validation before any transformation. Invalid +identities, references, ranges or expression structure return `InvalidModel`. + +All transformations use checked signed 64-bit arithmetic, including every +product, intermediate sum, subtraction and directed integer division. Division +by zero and signed minimum divided by minus one fail closed. Integer values +exported into the reduced double model, including substituted bounds and the +objective offset, must remain within `[-2^53,2^53]`. Unsupported arithmetic returns +`Unsupported` with no model artifact and cannot establish infeasibility. This +portable implementation has the same arithmetic boundary on platforms without +compiler-specific 128-bit integers. It may conservatively reject an otherwise +valid model whose expressions require wider intermediates or exports. + +`PresolveResult.guarantee` is `Exact` for the transformation arithmetic, not a +claim that an optimization problem has been solved or that a proof certificate +has been exported. `Infeasible` is returned only for a checked contradiction in +an original row under bounds logically implied by the original model, or for a +contradictory constant row after exact fixed-variable substitution. + +## Reductions and invariants + +For a row `L <= sum(a_j*x_j) <= U`, each term has a minimum and maximum over the +current integer box. Their exact sums detect contradictions and rows implied +entirely by the current box. For each variable, subtract its contribution to +obtain the minimum and maximum activity of the other terms. + +The lower side implies `a_j*x_j >= L - maximum_other`. The upper side implies +`a_j*x_j <= U - minimum_other`. Positive and negative coefficients select the +appropriate upper/lower bound and mathematical floor/ceiling division. Every +proposal for a row uses the same unchanged row-entry box; only after all +proposals are checked are they intersected into the current bounds. Each bound +change records its original row and variable, side, old/new integer bound and +pass index. + +Every tightened bound is an implication of the original model. Therefore no +original feasible integer assignment is removed. A dropped redundant row is +true over the tightened box, so its removal introduces no new feasible point. +Further tightening only shrinks that box and preserves the redundancy argument. +The objective is not used as an implicit cutoff or deduction assumption. + +After propagation stops, all fixed variables are substituted into retained rows +and the objective using exact arithmetic. The objective sense remains unchanged; +its offset incorporates all fixed contributions. Empty rows are either exact +tautologies and removed, or exact contradictions. Retained variable/row slots +are compacted into a new `Model`, with new model identity and ordinary stable +handles. Every reduced assignment maps to exactly one original assignment by +restoring fixed values, and every original feasible assignment has its reduced +projection. This feasible-set equivalence preserves the original objective. + +## Owning mappings and historical solutions + +`PresolvedModel` owns the immutable original snapshot, reduced snapshot and +slot-indexed mappings. Its public accessors expose const views: + +- `variables()` contains one record per original variable slot. An active record + holds either a reduced handle or a fixed integer value, plus its tightened + bounds. Inactive tombstones have neither. +- `rows()` contains one record per original row slot. Active retained rows have a + reduced handle and exact substituted constant; removed active rows are marked + redundant. For rows proved redundant before substitution, no fixed constant + needs to be computed. Names remain available in the original snapshot, and + retained private names are copied. +- `original()` and `reduced()` retain independent identities. The original model + and revision are never mutated. Later user edits or destruction of the input + model do not invalidate the owning artifact or historical reconstructed values. + +`postsolve` checks the candidate's reduced identity, revision, slot count and +active mask. It does not trust a candidate objective, cached gap, status, or +`solution_validated` flag as evidence of feasibility. Values must be finite and +within the requested distance of an integer; tolerance is in `[0,0.5)` and +zero requires already integral values. After rounding, all reduced bounds and +rows are checked with exact integer arithmetic. Fixed values are restored and +all active original bounds, rows and the original objective are checked again. +The two exact objectives must agree. Deleted original slots contain NaN and +remain inactive. + +On success, `exact_witness_validated` is true and `solution` is a validated +original historical feasible point. Its scalar termination is `Unknown`, and +its global bound and gap fields are absent. Input Numerical/Exact guarantee and +backend identity are preserved for context; certificate guarantees are not +transferred. No optimality, rank or global-bound claim is manufactured from +reconstruction. Keep the reduced solver result separately if its completion +status is needed. Automatic transfer of optimization proof/status is a separate +future workflow contract. + +## Work limits and statuses + +All source validation/copying, propagation, finalization and artifact creation +share one monotonic time budget and cancellation token. Checks are cooperative, +including a final check before returning: an observed deadline or cancellation +prevents publication of a new artifact or infeasibility result. Structural +validation and individual allocations are not interruptible operations. +Postsolve is a separate explicitly invoked validation operation. + +`max_passes` limits full propagation passes. `max_row_visits` limits visits to +active non-redundant rows during propagation; structural checks and algebraic +finalization are not counted as propagation visits. Both limits may be zero. +Finalization still substitutes declared/deduced fixed variables and checks +constant rows. All of that work remains charged to the time budget. + +| Status | Meaning | +| --- | --- | +| `Fixpoint`, termination `Optimal` | A full propagation pass made no bound changes; the artifact is exactly equivalent. This does not establish original feasibility or an objective optimum. | +| `Incomplete`, termination `IterationLimit`, with artifact | Work limit reached; all published reductions are sound and the finalized partial model remains exactly equivalent. It is not claimed to be a propagation fixpoint. | +| `Incomplete`, `TimeLimit` or `Cancelled`, without artifact | The total budget stopped before publication. | +| `Infeasible` | Checked exact contradiction, attributed to an original row and, when applicable, variable. No reduced artifact is returned. | +| `Unsupported` / `InvalidModel` / `Error` | Explicit capability, input or processing failure; no artifact or inferred infeasibility. | + +`passes` counts completed passes; `row_visits` counts propagation visits even in +an unfinished pass. `fixed_variables` and `removed_rows` describe finalized +reductions when an artifact is available. The change trace is attribution, not a +standalone proof-certificate format. + +## Correctness gate + +`test/optimize/presolve.cpp` independently enumerates complete feasible sets and +objectives. It checks all signed two-variable rows with coefficients from -3 to +3 and bounds from -5 to 5, and 600 generated three-variable models under complete, +pass-limited and row-visit-limited propagation. Reduced assignments reconstruct +bijectively to the full original feasible set, with matching objective values. + +Additional checks cover signed floor/ceiling cases, chain propagation, equality +fixing, constant contradictions, all-fixed models, objective cancellation, +tombstones, fresh identities and history after edits, malformed/stale postsolve +candidates, explicit unsupported metadata/classes, multiplication/sum/export +overflow, and signed-minimum/-1 division. An integer parity model demonstrates +that a propagation fixpoint can still be infeasible, preventing a false solved +status. Interruption regressions cover a zero deadline and a pre-cancelled +token; they do not inject cancellation at every internal propagation or +finalization checkpoint. The utility is not automatically enabled; backend +integration and performance evaluation remain separately gated by the +solver-parity plan. diff --git a/docs/solver-parity/PROGRESS-ASSESSMENT-2026-09-05.md b/docs/solver-parity/PROGRESS-ASSESSMENT-2026-09-05.md new file mode 100644 index 0000000000..884a3c24d5 --- /dev/null +++ b/docs/solver-parity/PROGRESS-ASSESSMENT-2026-09-05.md @@ -0,0 +1,195 @@ +# Progress assessment — 5 September 2026 + +Assessed at approximately 19:09 UTC against the original 63-row capability matrix, +current implementation checkout and saved independent-agent test artifacts. +This is an engineering assessment, not a commercial-solver conformance claim. + +The modeling/API foundation and a useful delegated LP/MILP product are largely +implemented. The larger goal remains substantially unfinished: most of the +hard native-search expansion, learning, nonlinear breadth, parallel integration +and performance/default-quality validation are still ahead. A single percentage +would hide both unequal feature sizes and the difference between an exposed API, +a supported subset and a competitively performing solver. + +## What is safe to count as delivered + +The last complete integration gate is the eighth checkpoint: functional source +`bda86186d`, documentation/package source `158dc0b66`. It includes sparse modeling, +HiGHS LP/MILP, bounded exact native solving, six typed native globals, checked +sparse native LP, frontier bounds, binary reliability branching, verified root +covers, exact integer presolve/postsolve, starts, numerical sessions, LP +observations/bases/evidence, scenarios, ordered objectives, repair, ranked pools, +scoped quadratic solving, C/Python APIs, FlatZinc/MiniZinc and a local wheel. + +- Combined CTest: 60/60; numerical Release: 48/48; backend-disabled: 47/47. +- Full native/HiGHS/facade sanitizer tests: 59/59; Python: 75/75. +- Direct FlatZinc: 106/106; actual MiniZinc pipeline: 72/72; legacy FlatZinc: + 140/140 over five repetitions. +- Installed consumers pass; self-contained macOS arm64 wheel passes 75 Python + tests on each of Python 3.12 and 3.14. +- FAST: **33/33 in 5.7267 seconds external wall time**, within its 28-second + allowance and the requested under-30-second limit. +- The last isolation verification matched all 2,963 recorded original source + hashes and the original branch/commit. New work remains on isolated branches. + +These suites overlap. Their counts must not be summed into a number of distinct +industrial benchmark instances. The existing MIPLIB check contains five models; +that is useful correctness evidence, not a comprehensive performance panel. +See [validation](VALIDATION.md) and [the implementation ledger](IMPLEMENTATION.md). + +## New work beyond that checkpoint + +| Slice | Exact current state | Work before calling it integrated | +| --- | --- | --- | +| LP sensitivity C++ | Runtime committed as `d2fb6153a`; focused root tests pass 3/3 numerical, 3/3 combined, 2/2 backend-disabled | Commit build/umbrella/consumer wiring; full combined/sanitizer/install/FAST gates | +| LP sensitivity C/Python | Source/tests saved, uncommitted in results worktree; logs show 83/83 normal/core Python and C99/cleanup sanitizer checks | Resume interrupted owner, review final source-to-test provenance, finish sanitizer Python/lifetime checks, commit and integrate | +| Native BinaryHamming neighborhood | Independently committed `305020c31`, not yet cherry-picked; 3,640 combined/sanitizer configurations and 3,506 production configurations pass | Integrate source/build/API, add representative FAST coverage, cross-feature/installed checks | +| Learning infrastructure | `2505db942` standalone SAT protocol experiment passes 29,160 enumerated queries normally and with full dependency sanitizers | This is not a Gecode learning solver; implement checked reasons, state/replay, literal channeling and learned search | +| Private integer-row reason API | Header-only commit `51f90c62c` in validation worktree | Runtime, independent reason checker, exhaustive tests and architecture comparison | +| Next general-integer branching | Proposed next assignment; no completed runtime | Design, implementation and original-model bound/partition tests | + +The root integration wiring is deliberately still uncommitted at this audit; +this report does not upgrade preliminary changes into the eighth tested release. +The goal service currently reports `usageLimited`; one agent explicitly stopped +on the account usage limit. Its work remains saved. This is an execution blocker, +not a repository correctness failure or a completed goal. + +## Remaining effort and realistic endpoints + +The estimates below are **experienced-engineer effort**, including design, +implementation, independent review, representative testing and integration. +They are broad planning allowances, not measured agent throughput or promised +elapsed times. Additional subagents do not remove the shared `native.cpp`, +C/Python ABI, integration or uncontended-benchmark dependencies. + +| Remaining stream | Planning allowance | +| --- | --- | +| Finish current sensitivity/neighborhood integration and bindings | 1–2 engineer-weeks | +| Broad cold/warm performance baseline, holdouts, direct-backend comparisons and default selection | 4–7 | +| Broader model/front-end coverage and capability contracts | 3–6 | +| Native presolve, dynamic cuts and general-integer/LP-informed branching | 6–10 | +| Native partial starts, repair/diving and broader neighborhood portfolio | 3–6 | +| Explanation/LCG pilot with meaningful nonbinary coverage | 8–16 | +| Remaining modeling/workflows: SOS/PWL, public callbacks, finer diagnostics and composition | 5–9 | +| Linux/Windows/macOS packaging, clean installs and executed platform gates | 3–6 | +| Broader quadratic support and a carefully scoped QCP/MIQP adapter | 6–12 | +| Native hybrid parallel ownership, bounds/cuts and scaling gates | 6–12 | +| **Total for these bounded remaining streams** | **45–86 engineer-weeks** | + +Some activities overlap. With three experienced engineers and adequate testing +infrastructure, roughly **6–10 months** is a planning range for that bounded +expanded program; dependency discoveries can extend it. This is not an estimate +that literal complete commercial parity will be reached in that time. + +A useful, explicitly scoped LP/MILP release is much closer: approximately **3–6 +engineer-weeks** to stabilize the current batch, verify target-platform installs, +exercise representative external LP/MIP/CP cohorts and publish tested scope. +That is a subset of the table above, not additional effort. If broad platform +execution or representative benchmarks are unavailable, this milestone remains +blocked regardless of how quickly more APIs are written. + +The literal full goal includes arbitrary nonlinear/global optimization, +production-strength learning, automatic decomposition, robust parallel search, +remote/distributed operation, tuning and commercial-scale numerical robustness. +Several of these exceed the bounded adapter/pilot estimates above. Broad +capability parity is a **multi-year program** unless much more is delegated to +mature engines. Competitive native performance has no defensible completion date +without comparative measurements; implementation effort alone cannot establish it. + +## What should change in the next phase + +The work has advanced API breadth and careful local correctness faster than +representative performance evidence. The highest-value next step is a release +and benchmark gate, not another broad round of API expansion. + +1. Finish the two nearly complete slices and produce one ninth integration gate. + Keep new experimental implementation in separate worktrees meanwhile. +2. Establish uncontended native-versus-native and wrapper-versus-direct-HiGHS + comparisons, then CP-SAT/Chuffed and commercial baselines where available. + Separate feasibility, optimization, proof, infeasible and numerical cases; + preserve unseen family holdouts. Include memory, first solution, time/gap and + time-to-proof rather than a solved-count-only score. +3. Ship the conservative supported route once its install and external-cohort + gates pass. Keep native heuristics experimental until they show a measured + benefit without protected regressions. +4. Focus algorithm work on general-integer branching/cuts and one bounded + learning pilot. Reuse a mature nonlinear backend for breadth when appropriate; + building an entire nonlinear global engine is a different scale of project. +5. Make roadmap completion conditional on accepted workload and workflow gates. + A frozen final scope is essential: matching the union of two evolving solver + products is not a finite acceptance test by itself. + +## Updated disposition of all 63 original comparison rows + +“Delivered subset” means useful implemented behavior with the stated boundary, +not complete equivalence to either commercial product. “Preserved” credits +existing Gecode functionality, not newly implemented work. “Missing natively” +does not imply the delegated HiGHS engine lacks that algorithm. This table +updates the implementation side of the original dated comparison; it does not +claim a fresh audit of vendor releases. + +| # | Original capability | Current disposition | Evidence boundary / remaining work | +| --- | --- | --- | --- | +| 1 | Binary linear optimization | Delivered subset | Numerical MILP through HiGHS; exact bounded native integer route. Commercial speed comparison outstanding. | +| 2 | General bounded integer optimization | Delivered subset | General integers in numerical MILP and finite integral native subset; hybrid arithmetic admission remains bounded. | +| 3 | Continuous LP and mixed continuous/integer models | Delivered subset | Continuous LP and mixed continuous/integer models through HiGHS, with original-model checks. | +| 4 | Free variables, infinite bounds and unbounded-model status | Delivered subset | Numerical free/infinite domains and distinct unbounded statuses; native route remains finite. | +| 5 | Sparse ranged linear rows and bulk matrix construction | Delivered subset | Canonical sparse ranged rows, CSR batches and stable original mappings. Large-model memory study remains. | +| 6 | Objective sense, offset and coefficient domains | Delivered subset | Min/max, offsets and floating coefficients numerically; explicitly bounded integral native guarantees. | +| 7 | Set variables and CP globals: distinct, table, regular, circuit, cumulative | Partial | Six typed globals and original Gecode facilities preserved. Set domains and full global catalog are not in the additive API. | +| 8 | Scheduling intervals, optional tasks, sequences and calendars | Mostly missing | Fixed-data cumulative exists; interval/optional-task/sequence/calendar facade remains. These are primarily CP Optimizer comparisons. | +| 9 | Reification, indicators, min/max/abs and Boolean logic | Partial | Indicators, AND/OR and scoped FlatZinc reification exist; complete retained min/max/abs/general-constraint surface remains. | +| 10 | SOS1 and SOS2 | Missing | No retained SOS1/SOS2 API or tested backend lowering. | +| 11 | Semi-continuous and semi-integer variables | Delivered subset | Explicit semi-continuous/semi-integer numerical types; bounded SemiInteger native support. | +| 12 | Piecewise-linear functions/objectives | Missing | No retained PWL model/objective API or breakpoint/extrapolation contract. | +| 13 | Continuous convex QP | Partial | Bounded continuous weighted-affine-square QP only; arbitrary Hessians, unbounded domains and workflow composition remain. | +| 14 | Mixed-integer quadratic objective (MIQP) | Missing | MIQP adapter/model class not implemented. | +| 15 | Convex QCP/MIQCP and SOCP | Missing | QCP/MIQCP/SOCP model and solve routes not implemented. | +| 16 | Global nonconvex quadratic objective | Missing | No global nonconvex quadratic solve route. | +| 17 | General nonconvex quadratic constraints | Missing | No general nonconvex quadratic-constraint route. | +| 18 | General multivariate nonlinear optimization | Missing | No nonlinear expression graph/domain/global solver route. | +| 19 | Specialized finite-domain propagation | Preserved/partial | Existing native propagation retained; six typed globals exposed. Explained propagators remain future work. | +| 20 | Sparse LP relaxation, simplex/barrier and hot starts | Partial | HiGHS numerical LP and basis reuse; native sparse checked relaxation. User algorithm selection and broad LP performance panel remain. | +| 21 | Certified LP-derived objective bounds | Delivered subset | Exact checked LP-derived native bounds under bounded integer arithmetic assumptions; not general continuous certification. | +| 22 | Farkas infeasibility and unbounded rays | Partial | Numerical checked original rays/Farkas evidence delivered. Exact Farkas-driven native pruning and full proof chain remain. | +| 23 | Reduced-cost/conditional fixing | Partial | Checked native interval/conditional reductions exist in bounded subset; broader reduced-cost fixing and performance evidence remain. | +| 24 | Presolve and postsolve | Partial | Exact interval/fixed-substitution/postsolve utility plus delegated HiGHS presolve. Probing, aggregation and broader native reductions remain. | +| 25 | Static root strengthening | Delivered subset | Verified binary root covers with explicit budgets and handoff; broader strengthening and measured benefit remain. | +| 26 | Dynamic cut separation, selection and aging | Mostly missing natively | Scoped cut infrastructure exists; dynamic local separation, selection/aging and MIR/GMI/clique breadth remain. HiGHS owns its own cuts. | +| 27 | LP-informed reliability/strong branching | Partial | Bounded binary reliability probing exists. General-integer/LP-informed branching and calibrated policies remain. | +| 28 | Global frontier bounds and best-bound/hybrid node selection | Delivered subset | Explicit native best-bound/depth-first frontier with honest interrupted bounds; broader policies/performance work remains. | +| 29 | Restarts, portfolio search and branch-path nogoods | Preserved/partial | Legacy restart/portfolio/path-nogood mechanisms remain. Full integration with new hybrid coordinator remains. | +| 30 | Propagation explanations, CDCL/LCG and backjumping | Research/header only | 29,160-query external-SAT protocol experiment and private reason header; no product LCG, conflict analysis integration or learned search. | +| 31 | Primal rounding, repair, diving and feasibility heuristics | Mostly missing natively | Checked complete starts exist; native partial completion, repair, rounding/diving and cold-start portfolio remain. HiGHS has its own heuristics. | +| 32 | Large neighborhood search and incumbent improvement | Ready to integrate subset | One bounded BinaryHamming incumbent-improvement attempt passes isolated tests; general LNS/RINS/adaptive scheduling remains. | +| 33 | Symmetry handling | Preserved/mostly missing automation | Legacy explicit symmetry facilities retained; automatic detection and new-API integration remain. | +| 34 | Network simplex/flow structure | Missing specialized route | Generic LP exists; no dedicated network extraction/solve API. | +| 35 | Automatic decomposition, Benders and column-generation infrastructure | Missing | No automatic Benders or column-generation infrastructure. | +| 36 | Retained named model, stable handles, introspection | Delivered subset | Owning named models, stable owner-aware handles, revisions, tombstones and introspection. | +| 37 | Edit/remove/change coefficients and reoptimize | Delivered subset | Safe model edits; numerical sessions reuse compatible bases and checked hints. Native persistent state remains. | +| 38 | Automatic use from ordinary native/FlatZinc clients | Partial | Explicit native/FlatZinc compiler and optional MiniZinc registration. Broad ordinary-client capture and unsupported predicates remain. | +| 39 | Bulk C++/Python model building | Delivered subset | Bulk C++ and Python construction through C ABI; full matrix-shaped modeling conveniences remain workload-driven. | +| 40 | Single and multiple objective workflows | Partial | Ordered linear objectives implemented. Full weighted/prioritized combinations and quadratic workflow composition remain. | +| 41 | Structured status, incumbent, global bound, gap and quality | Delivered subset | Structured statuses, incumbent/bound/gap/quality and provenance; some cumulative backend telemetry remains. | +| 42 | Shared deadlines and cancellation | Delivered subset | Shared monotonic deadlines/cancellation and bounded workflow accounting. Cooperative backend regions are not hard-preemptible. | +| 43 | Starts, hints, priorities and repair | Partial | Numerical partial hints and exact native complete starts; priorities, native partial completion and repair remain. | +| 44 | Basis/primal/dual warm starts | Partial | Owning selected bases and compatible session reuse implemented; broader primal/dual starts and native state remain. | +| 45 | Dual values, reduced costs and sensitivity ranges | Partial/new slice | Duals/reduced costs integrated. Coefficient/equality selected-basis sensitivity C++ integrated with focused tests; bindings/full gate pending. Bound/ranged-side sensitivity remains. | +| 46 | Named IIS/conflict diagnosis | Partial | Grouped numerical deletion-minimal conflicts implemented; fine-grained indicators/globals, assumptions/cores and broader diagnosis remain. | +| 47 | Feasibility relaxation/soft-constraint repair | Partial | Weighted L1 repair with protected constraints and original-objective refinement; full penalty/model-class breadth remains. | +| 48 | Solution pools, diversity and k-best guarantees | Partial | Ranked finite projection pools and recourse/exhaustion semantics implemented; diversity and more efficient pool search remain. | +| 49 | Progress/log/solution callbacks | Missing public API | Internal backend callbacks capture candidates/cancellation; public progress/log/incumbent event contract is not exposed. | +| 50 | Lazy constraints, user cuts and candidate submission | Missing public API | No public lazy-constraint, user-cut or candidate-submission action callbacks. | +| 51 | Scenario analysis/batched modified models | Delivered subset | Serial sparse scenario batches with owning results and optional session reuse; no native multi-scenario tree sharing. | +| 52 | Model/solution/basis import, export and replay | Partial | Strict LP/free-MPS model I/O and FlatZinc capture. Broader dialects and portable solution/basis/replay serialization remain. | +| 53 | Backend/model/workflow capability negotiation | Partial | Backend queries and explicit rejection exist; comprehensive model/workflow-combination negotiation remains. | +| 54 | Robust automatic solver/search defaults | Validation pending | Conservative Auto routing exists; no broad external evidence supporting newly tuned out-of-box native defaults. | +| 55 | Parallel search and worker ownership | Not started for new hybrid | Legacy parallel search retained; new adapter uses one worker and hybrid parallel ownership/bounds/cuts remain. | +| 56 | Reproducibility and deterministic modes | Partial | Deterministic supported one-worker settings; reproducible parallel scheduling and cross-platform gates remain. | +| 57 | Exact versus numerical correctness contract | Partial | Numerical/exact guarantees kept distinct with checked bounded deductions. No end-to-end general proof-certificate route. | +| 58 | Installable API package and dependency isolation | Delivered local subset | CMake installed consumers, independent dependencies and self-contained macOS arm64 wheel pass. Broader clean-machine distribution remains. | +| 59 | Platform/compiler portability | Validation pending | Platform CI configuration exists; recorded execution is local macOS arm64. Linux/Windows/MSVC and other wheel gates remain. | +| 60 | Remote, batch and distributed execution | Not started | No remote/distributed execution service or worker infrastructure. | +| 61 | Parameter tuning and reusable profiles | Not started | No measured automatic tuner or held-out reusable profile program. | +| 62 | Large-model memory and resource controls | Partial | Sparse storage and explicit logical/work/frontier limits; comprehensive large-model/RSS/worker resource testing remains. | +| 63 | Regression testing, proof checking and performance provenance | Partial | Strong local correctness/sanitizer/install evidence and FAST delivered. Broad uncontended external performance and independent full proofs remain. | diff --git a/docs/solver-parity/QUADRATIC-DESIGN.md b/docs/solver-parity/QUADRATIC-DESIGN.md new file mode 100644 index 0000000000..324315c423 --- /dev/null +++ b/docs/solver-parity/QUADRATIC-DESIGN.md @@ -0,0 +1,388 @@ +# W13 design: bounded convex continuous QP through HiGHS + +Status: research/design only, 2026-09-05. No QP source implementation or shared +`Model`, native, solve, workflow or binding change is authorized by this document. + +## Recommendation and first support boundary + +Implement an isolated `QuadraticModel` / `QuadraticSnapshot` wrapper, an explicit +`solve_quadratic` backend, and an independent original-objective/KKT/bound checker. +The first supported class is **finite-box continuous variables, ordinary linear +constraints, and positive weighted squared affine objective terms**. Minimize a +convex objective or maximize a concave objective. Preserve singular curvature, +fixed variables and empty/constant terms correctly; do not require positive +definiteness. Return `Unsupported` for unbounded original variable domains, +integer/binary/semi variables, indicators, CP globals, arbitrary Hessians, +quadratic constraints, nonconvex objectives, starts, sessions and Exact/Certified +solve requests in this first slice. This is a useful bounded least-squares and +penalty-objective feature, not MIQP, QCP, nonlinear or full QP parity. + +Lower each square to a private residual variable and a diagonal Hessian. This +establishes convexity structurally, preserves the user's original factored +objective, and avoids forming a rounded Gram matrix. Keep the existing linear +model API and binary layout unchanged. A distinct snapshot type without an +implicit conversion makes accidental use by an older linear workflow a compile +error. Build registration/umbrella inclusion is the only shared change needed +for the first C++ vertical slice. + +Finite original boxes are a deliberate initial restriction: they make a +residual-corrected global lower bound available without inverting a possibly +singular Hessian or treating small stationarity residuals as exactly zero. +Removing that restriction requires additional bound/curvature verification; +it must not be simulated by inventing large artificial bounds. + +## Pinned source findings + +The local dependency is **HiGHS v1.15.1**, commit +`04024d701f79feb8e2f18bc3df0dffc04ef05088`. The installed integration build has +`HIPO=OFF`. The following findings come from that source, not an assumption about +current development documentation. + +| Contract | Pinned evidence and implication | +| --- | --- | +| Objective convention | `c0 + c'x + 0.5*x'Q*x`. Lower triangular column-compressed entries represent one symmetric Hessian. Diagonal contribution is `0.5*Qjj*xj^2`; one off-diagonal entry contributes `Qij*xi*xj`. [QP README](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/qpsolver/README.md), [Hessian evaluation](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/model/HighsHessian.cpp#L218-L235). | +| Hessian upload | `HighsHessian` uses `dim_`, `format_`, `start_`, `index_`, `value_`; prefer canonical lower CSC with `start.size()==dim+1`, sorted unique row indices, and finite values. [Type](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/model/HighsHessian.h), [assessment/normalization](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/model/HighsHessianUtils.cpp#L22-L82). | +| Upload may change data | Assessment sums duplicates, normalizes the triangle, filters small values and completes missing diagonals. Square asymmetry is rejected; upper triangular entries in triangular input can be moved/summed. Avoid relying on correction/warnings; preflight and inspect the uploaded representation. [Normalization](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/model/HighsHessianUtils.cpp#L321). | +| Convexity is not established | `okHessianDiagonal` only rejects a diagonal sign inconsistent with the sense. Passing it is not a PSD proof. For example, `[[1,2],[2,1]]` has positive diagonal and eigenvalues `3,-1`. Later negative-curvature detection is not a complete acceptance test. [Diagonal test](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/model/HighsHessianUtils.cpp#L169-L211), [solve gate](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L1343-L1372). | +| No MIQP | A QP with integrality is rejected unless `solve_relaxation` was requested. That latter path drops integrality; it is not MIQP support. The adapter must never enable it as a fallback. [Dispatch](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L1343-L1372). | +| Actual initial algorithm | The active-set solver is the default; HiPO is used only when selected and compiled/available. It maintains a reduced Hessian and has a nullspace limit, default 4000. Explicitly select `qpasm` for reproducible first-slice behavior; do not infer HiPO availability from recent docs. [QP dispatcher](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L4139-L4350), [options](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsOptions.h#L1390-L1408). | +| Regularization changes the working objective | `solveqp` adds `qp_regularization_value` to each stored diagonal; the default is `1e-7`. The source explicitly describes perturbed solutions. Final HiGHS checks use the original model. Our acceptance checks must also use the unregularized original squares. [Regularization](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/qpsolver/a_quass.cpp#L130-L193), [settings](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/qpsolver/settings.hpp#L40-L54). | +| Dual values are available, not automatic proof | Original-sense column and row duals are returned; multiply by the objective sense sign to normalize. `getDualObjectiveValue` is available, but its computation assumes meaningful dual data and selects bound contributions from primal location. Preserve it as a vendor diagnostic, not an independently verified bound. `mip_dual_bound` is a MIP field and is not the QP bound. [Dual mapping](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/qpsolver/a_quass.cpp#L65-L85), [dual objective](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/HighsSolution.cpp#L1329-L1398). | +| Final numerical checks | HiGHS computes original objective/KKT failures and calls `checkOptimality` for a QP reported optimal. Recheck independently rather than assuming that report establishes convexity or exact optimality. [Final checks](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L4333-L4346). | +| Cancellation limits | The active-set call receives time/iteration limits, but the inspected path does not pass the general HiGHS callback object to QUASS. Check cancellation before/after backend work and exclude late candidates; do not advertise an in-loop interrupt callback. Propagation, factorization and phase-I work are cooperative. [QP call](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/lp_data/Highs.cpp#L4139-L4350), [time checks](https://github.com/ERGO-Code/HiGHS/blob/04024d701f79feb8e2f18bc3df0dffc04ef05088/highs/qpsolver/quass.cpp#L350-L365). | + +The [current official solver documentation](https://ergo-code.github.io/HiGHS/dev/solvers/) +likewise cautions that the diagonal convexity check can miss nonconvexity. It is +supporting context, not the version pin or an authorization to enable new solvers. + +## Objective semantics and lowering + +Let `s=+1` for minimization and `s=-1` for maximization. Define the original +objective explicitly as + +``` +f(x) = c0 + c'x + s * sum_k w_k (a_k'x + b_k)^2, w_k > 0. +``` + +The maximization entry point is named `maximize_concave_squares` so its negative +penalties are explicit. Its normalized minimized objective is + +``` +F(x) = s*f(x) = s*c0 + (s*c)'x + sum_k w_k (a_k'x+b_k)^2. +``` + +For each square, introduce private continuous `z_k` and linear equality +`z_k - a_k'x = b_k`. Minimize `s*c0 + (s*c)'x + sum w_k*z_k^2`, with diagonal +`Q[z_k,z_k]=2*w_k` and zero curvature on original `x` columns. Residual variables +may be free; only original variables require finite boxes. The backend Hessian +is PSD by construction, including when some original directions are flat. +Auxiliary values and rows stay private; result slots use original wrapper +variables, including tombstones. Square names/indices identify diagnostics. + +This formulation uses `O(sum nnz(a_k)+number_of_squares)` extra linear entries +and diagonal curvature. Expanding `2*sum w_k*a_k*a_k'` can cause quadratic fill-in +and floating rounding can destroy exact PSD of the submitted matrix. The lifted +route avoids both issues, at the cost of additional rows/columns and possible +conditioning/nullspace costs. These costs must be measured, not assumed away. + +Reject non-finite or underflowed/generated coefficients, dimensions outside +`HighsInt`, values beyond HiGHS's infinity/range limits, and nonzero entries at +or below the configured removal threshold. Multiplication by two for the +Hessian must stay finite and nonzero. Do not silently drop small `a_k` or weights. +Set the matrix threshold explicitly to `1e-12`, as the existing adapter does, +and audit the round-tripped backend model before solving. Do not form or alter +the original linear/constant terms by an expanded-square cancellation. + +Initial solver setting recommendation: `qpasm`, one worker, zero seed, +`qp_regularization_value=0`, and an explicit bounded nullspace/iteration policy. +The zero-regularization choice needs direct comparison with the pinned default +on singular/ill-conditioned fixtures before adoption. A later robustness fallback +may use nonzero regularization only with separate recorded settings and the same +unregularized acceptance gates; no retry may restart the total budget. + +## Exact proposed C++ surface + +Candidate declarations; implementation review may simplify names, not semantics: + +```cpp +struct WeightedSquare { + std::vector terms; // original Variable handles; canonicalized + double offset = 0; + double weight = 1; // strictly positive finite + std::string name; +}; + +class QuadraticSnapshot; // immutable owning data; private construction +class QuadraticModel { +public: + QuadraticModel(); + QuadraticModel(QuadraticModel&&) noexcept; + QuadraticModel& operator=(QuadraticModel&&) noexcept; + QuadraticModel(const QuadraticModel&) = delete; + ModelId id() const noexcept; + Revision revision() const noexcept; + Variable add_continuous(double lower, double upper, std::string name = {}); + Constraint add_row(const std::vector&, double lower, double upper, + std::string name = {}); + void set_bounds(Variable, double lower, double upper); + void set_bounds(Constraint, double lower, double upper); + void set_coefficient(Constraint, Variable, double); + void remove(Variable); // reject references in rows, linear cost or squares + void remove(Constraint); + void minimize_squares(const std::vector&, + const std::vector& linear = {}, double offset = 0); + void maximize_concave_squares(const std::vector&, + const std::vector& linear = {}, double offset = 0); + QuadraticSnapshot snapshot() const; +}; + +struct QuadraticOptions { + SolveOptions solve; // Numerical + Auto/Highs only; no node quota/start + std::uint64_t iteration_limit = 100000; + std::size_t max_auxiliary_variables = 100000; + std::size_t max_lifted_nonzeros = 2000000; + double stationarity_tolerance = 1e-7; + double complementarity_tolerance = 1e-7; +}; +struct QuadraticValidation { + bool primal_valid = false, objective_valid = false; + bool kkt_available = false, kkt_valid = false, bound_valid = false; + double max_stationarity = 0, max_complementarity = 0; + std::optional original_objective, normalized_lower_bound; + std::vector square_values, original_gradient; + std::string message; +}; +struct QuadraticResult { + SolveResult result; // original owner/revision/slots, not lifted identity + QuadraticValidation checks; + std::optional vendor_objective, vendor_dual_estimate; + std::uint64_t qp_iterations = 0; +}; +QuadraticResult solve_quadratic(const QuadraticSnapshot&, + const QuadraticOptions& = {}); +QuadraticResult solve_quadratic(const QuadraticModel&, + const QuadraticOptions& = {}); +BackendCapabilities quadratic_capabilities(); +``` + +`QuadraticSnapshot` exposes const variable/row/full-objective views and identity, +not a public `ModelSnapshot` or `Model&`, and has no conversion operator. Its +private data can contain a copied `ModelSnapshot` plus squares for compiler reuse. +The mutable wrapper can privately own `Model`: normalize/validate every square +and finish all allocating staging before calling `Model::set_objective` for the +linear part and revision increment, then swap the already-staged squares without +throwing. Thus quadratic-only objective changes advance the same revision, and +failed mutation preserves both old objective and revision. Moves preserve the +owner; moved-from access fails explicitly. Snapshot data owns all metadata after +model destruction. Do not attach squares to an externally accessible linear +`Model` with the same identity/revision. + +An import from an existing linear model, if added later, must allocate a fresh +wrapper owner and return an explicit original-to-wrapper handle mapping, while +rejecting unsupported active types/metadata. It must not borrow the original +owner and create two different objectives with identical identity and revision. + +## Independent numerical acceptance and original dual checks + +1. Validate snapshot structure and finite-box scope before backend construction. + Establish convexity from positive square weights and affine terms, not a + user flag or HiGHS status. No arbitrary sparse Hessian input in this slice. +2. Validate finite primal values in original slots, bounds and original rows. + Compute each `a_k'x+b_k` with compensated accumulation including its offset; + compute the full original objective and gradient independently of the lifted + Hessian and auxiliary values. Preserve numerical residuals and check the + lifted equalities/auxiliary objective too. Never use a rounded auxiliary value + as the authoritative original square residual. +3. The proposed backend always minimizes normalized `F`, so its original-column + and original-row duals already have normalized signs: do not multiply them by + `s` a second time. Multiply by `s` only when exposing original-sense duals to + callers. For `L<=Ax<=U`, a positive normalized row + multiplier belongs to a lower side and a negative multiplier to an upper + side. Fixed/equality rows allow either sign. Check absent-side signs, + complementarity, and stationarity `grad(F)-A'lambda-z=0`. Use both absolute + and scale-aware residual reports; a large objective offset must not mask a + gradient residual. Do not trust `dual_valid` without size/finite/sign checks. +4. A vendor `Optimal` result is promoted only with independently valid original + primal/objective, known convexity, accepted original KKT residuals, and a + residual-corrected bound whose ordered original objective gap closes within + requested tolerances. Otherwise retain a valid primal point but report + `NumericalFailure`/the actual interruption, with no invented optimum or gap. + A contradictory `bound > primal` for minimization is not silently clamped. +5. `Guarantee::Numerical` remains essential: primal feasibility and KKT acceptance + use explicit tolerances. An independently enclosed dual bound is not an exact + primal-feasibility or complete solve certificate. Exact and Certified solve + requests return `Unsupported`. Vendor dual objective estimates stay separate. + +A finite-box continuous objective is bounded whenever feasible. Therefore a +backend `Unbounded`/ambiguous infeasible-or-unbounded report is a numerical failure +for this slice, not a valid unbounded conclusion. A numerical infeasible report +must not coexist with an independently valid primal witness. If accepted as +`Infeasible`, identify it as the backend's numerical conclusion; do not claim an +independently checked Farkas certificate. Stronger infeasibility validation is a +separate later feature. + +## Residual-corrected lower bound: proposed verifier + +Use the original positive squares and any finite chosen `t_k`, for example a +numerical approximation of `a_k'x+b_k`. Completing a square gives + +``` +w*z^2 >= 2*w*t*z - w*t^2, w>0. +``` + +Choose any finite signed row multipliers `lambda_i`, selecting finite row lower +bounds for positive multipliers and finite upper bounds for negative ones. Set a +multiplier to zero when its chosen side is unavailable; it is a proposal, not a +solver-authenticated proof value. Define + +``` +r = s*c + sum_k 2*w_k*t_k*a_k - A'lambda +K = s*c0 + sum_k (2*w_k*t_k*b_k - w_k*t_k^2) + + sum_i lambda_i * selected_row_bound_i +D = K + sum_j min(r_j*l_j, r_j*u_j). +``` + +Then `D <= min F(x)` for every original feasible point. The calculation uses the +original rows/bounds/squares, not the lifted matrix. It remains valid with a +singular Hessian, inaccurate duals, nonstationary candidate, or infeasible +candidate; those may only make the bound weaker. This is a derived application +of weak duality and the quadratic conjugate, not a claim that HiGHS exports such +a certificate. This parameterization also avoids division by small square +weights. [Boyd and Vandenberghe, *Convex Optimization*, duality/conjugates](https://web.stanford.edu/~boyd/cvxbook/). + +Implement checked one-sided enclosures, not a guessed epsilon subtracted from a +floating answer. Enclose each arithmetic operation and use the lower endpoint +for `K`. For a residual interval `[rlo,rhi]`, use a lower enclosure of the minimum +of all four endpoint products with `[l,u]`. Overflow, non-finite arithmetic, +unsupported rounding behavior, or budget exhaustion makes the bound unavailable. +Test the enclosure routine against an exact rational oracle, including subnormals, +cancellation and extreme ratios. Require IEEE semantics/no fast-math, or use a +verified higher-precision alternative; do not assume `long double` is wider on +arm64. Keep the Numerical solve guarantee even if the bound subroutine is checked. + +Convert the final bound back as `D` for minimization or `-D` for maximization; +`F` already included the signed original offset, so do not add it twice. Restore +row/bound dual signs and report original objective values consistently. Never use +a MIP bound field, a stationarity residual rounded to zero, or the vendor primal +objective as a substitute for this computation. + +For a future unbounded original domain, a nonzero residual can make its box +infimum `-infinity`, even if tiny. Supporting those models with strong finite +bounds needs verified stationarity or a retained positive-curvature residual +bound, or independently justified finite domain tightening. Do not drop this +residual or clip the domain to make a gap appear closed. + +## Old-route safety and integration gates + +| Existing entry point | First-slice rule and required regression | +| --- | --- | +| `solve(Model/ModelSnapshot)`, Auto | Unchanged. Wrapper is not convertible; use only explicit `solve_quadratic`. Optional future typed `solve(QuadraticSnapshot)` may delegate, never expose its private linear part as a user model. | +| `solve_native`, `solve_native_lp`, `solve_native_search` | No quadratic overload or implicit conversion. Compile-time detection tests show wrapper/snapshot cannot bind. Explicit `Backend::Native` passed to `solve_quadratic` returns `Unsupported`. | +| `presolve_integer` and postsolve | No wrapper conversion, so integer presolve cannot drop squares. Future quadratic substitution must update square offsets/full objective and preserve owning identity. | +| pools, repair, lexicographic workflow, diagnostics | No wrapper overload in Q1. Do not convert to the private linear snapshot. A later feasibility-only diagnostic may deliberately ignore an objective, but must have a typed documented contract. Quadratic retention locks are QCP and cannot be passed to a linear lex workflow. | +| incremental `Session` | Reject by type; no hidden Hessian omission or stale basis. A dedicated QP session is later work with its own revision and warm-start rules. | +| common validation | Add a typed quadratic checker. Internal reuse of ordinary row/bound validation is permitted, but its linear objective cannot be returned as the original quadratic objective. | +| LP/MPS I/O and CLI | No wrapper export/import in Q1. Existing strict parsers continue rejecting nonlinear LP syntax and unsupported MPS sections; add explicit QP-file negative fixtures. No file may be partially written before unsupported capability is reported. | +| C API/Python | No opaque wrapper token is an existing linear Model token. Future QP bindings use a new handle kind and versioned objective payload; existing functions reject a wrong kind. No ABI struct reinterpretation, no addition of hidden squares to existing Model tokens. | +| snapshots/results | Existing C++ aggregate `ModelSnapshot` layout stays unchanged. QP snapshots are immutable distinct types; results retain wrapper owner/revision and original slots. All lifted indices remain private. | + +If shared `ModelSnapshot` quadratic metadata is introduced in a later version, +all of these routes require explicit active-quadratic capability checks before +any transformation/backend conversion. Every full-replacement versus linear-only +objective mutation must be specified, and serialized/binary compatibility must +be versioned. The isolated wrapper avoids that cross-cutting risk now. + +## Implementation allocation and budget contract + +Proposed independently owned files: + +- `gecode/optimize/quadratic.hpp/.cpp`: wrapper, immutable snapshot, typed full + objective, transactional normalization/mutations, structure/point validation. +- `gecode/optimize/quadratic_solve.cpp`: pinned HiGHS lowering, options/statuses, + original KKT and bound acceptance, backend-off boundary. +- `gecode/optimize/quadratic_bound.hpp/.cpp`: private numerical enclosure and + original-form lower-bound checker, if separation keeps the first two files small. +- `test/optimize/quadratic.cpp`, `test/optimize/quadratic_bound.cpp`: model, oracle, + fake-backend coordinator and enclosure tests. +- `docs/solver-parity/QUADRATIC.md`: implemented contract and actual validation. + +Root owns registration, installation/umbrella integration and capability exposure. +Expose the supported class through `quadratic_capabilities()`; leave the ordinary +`Model` capability response unchanged until its API can express quadratic data. +No existing shared source needs editing beyond that integration for Q1. Avoid a +new required dense linear-algebra dependency. Reuse the pinned HiGHS build; OSQP +is an optional differential research oracle, not a new runtime requirement. + +One monotonic budget starts before snapshot/copy and covers normalization, +preflight/lifting, backend import, solve and independent acceptance. Pass the +remaining deadline and QP iteration limit to HiGHS. No starts, node quotas or +multiple workers in Q1; reject rather than silently reinterpret them. Check a +cancelled token before/after backend work and before publishing; a live active-set +callback is not promised. Enforce auxiliary/nonzero caps before large allocations. +No missing HiGHS fallback. Nullspace/solver failures are explicit, not evidence +of nonconvexity, infeasibility, or a supported problem becoming an LP. + +## Conformance and research gate + +1. **Foundation, no backend:** identity/revision, move/destruction/history, + tombstones, reference-protected removal, transactional malformed square input, + canonical term duplicates, invalid weights, both named sense methods, and + compile-time non-conversion to every old route. Keep old snapshots unchanged. +2. **Exact tiny oracle:** rational KKT active-set enumeration for small rational + strictly convex problems, plus analytic singular cases. A vertex/grid search + is not an exact QP oracle. Cover unconstrained interior points *inside the + finite box*, active bounds, equalities, ranged rows, fixed variables, empty + objectives, constant squares, both senses/offsets, rank deficiency and ties. +3. **Lowering/metamorphism:** verify `Qzz=2w`; reconstruct residuals; split a square + into two identical half-weight squares; change its affine sign; permute original + slots; duplicate/reorder linear rows; reverse objective sense/sign; add large + objective constants. Require identical original objectives and admissible gaps. +4. **Adversarial numerics:** positive-diagonal indefinite Hessian rejection by API, + near-singular Gram factors, extreme weights/coefficient ratios, threshold + filtering, overflow/underflow, large-offset cancellation, raw auxiliary/objective + mismatch, missing/malformed/incorrect-sign duals, nonzero residual on a wide + box, bound above primal, false optimal/infeasible/unbounded reports. Perturbed + working-model solutions must pass the unregularized checker or fail explicitly. +5. **Coordinator/budgets:** zero deadline, pre/mid-work cancellation, iteration, + storage and allocation limits, late valid/invalid candidates, foreign/stale + identities and mask errors, unavailable backend, Exact/Certified rejection, + original model unchanged. No status or bound manufactured by a fake oracle. +6. **Integration:** ordinary/native/hybrid/HiGHS regressions and installed C++ + consumer; core-only and full ASan/UBSan builds; Linux/macOS/Windows. C/Python + remain explicitly outside Q1, with negative handle/type tests when added. +7. **Evaluation after correctness:** compare lifted versus direct diagonal/simple + factored QPs against raw pinned HiGHS and an independently implemented solver. + Use application-generated bounded least-squares/portfolio/penalty problems, + report primal/KKT residuals and checked gaps alongside time and memory. The + Maros–Mészáros collection is a later broad QP corpus: an arbitrary-Hessian or + unbounded-domain instance is outside Q1 unless an equivalent supported form is + established. Do not count unsupported exclusions as solved benchmark cases. + +Primary research to read/replicate next: + +- Michael Feldmeier, *Going quadratic: Applying advanced techniques from linear + programming to convex quadratic programming*, MPhil, University of Edinburgh, + 2024: reduced-Hessian implementation, ratio tests, pricing and its limitations. + [Author's thesis](https://era.ed.ac.uk/bitstreams/977adea4-6729-4707-a3be-ff55faf95b33/download). +- Anders Forsgren, Philip E. Gill and Elizabeth Wong, *Primal and dual active-set + methods for convex quadratic programming* (2015): KKT systems and primal/dual + active-set initialization; guide degeneracy and singular-case tests. + [Paper](https://arxiv.org/abs/1503.08349). +- Bartolomeo Stellato et al., *OSQP: An Operator Splitting Solver for Quadratic + Programs*, Mathematical Programming Computation 12, 2020: independent algorithm + family for differential numerical checks, not a convexity oracle. + [Authors' page](https://web.stanford.edu/~boyd/papers/osqp.html), + [official residual/infeasibility conditions](https://osqp.org/docs/solver/index.html). +- István Maros and Csaba Mészáros, *A Repository of Convex Quadratic Programming + Problems*, Imperial College report DOC97/6 (1997), journal version 1999: source + benchmark formulation and objective conventions. + [Original report](https://www.doc.ic.ac.uk/research/technicalreports/1997/DTR97-6.pdf). + +A future arbitrary sparse Hessian API requires a separate verified PSD/NSD +acceptance mechanism. A floating Cholesky failure does not distinguish singular +PSD from indefinite input reliably; tolerating negative pivots or projecting +negative eigenvalues changes the model. Exact/rational or rigorously enclosed +factorization, or sufficient verified diagonal-dominance subclasses, are possible +later gates. Convexity only on an equality-restricted feasible space is also +outside Q1. Preserve these boundaries until their own proofs and conformance +oracles exist. diff --git a/docs/solver-parity/QUADRATIC.md b/docs/solver-parity/QUADRATIC.md new file mode 100644 index 0000000000..cd6480d715 --- /dev/null +++ b/docs/solver-parity/QUADRATIC.md @@ -0,0 +1,200 @@ +# Explicit bounded continuous quadratic optimization + +`quadratic.hpp` adds `QuadraticModel`, immutable owning `QuadraticSnapshot`, and +`solve_quadratic`. It does not change `Model`, `solve()`/Auto, native solving, or +any existing workflow. A quadratic wrapper/snapshot cannot bind to their linear +model overloads. This is an initial convex/concave QP capability, not MIQP, QCP, +arbitrary-Hessian, or general nonlinear support. + +## Model and result contract + +All original variables are continuous with explicit finite bounds. Constraints +are ordinary linear rows, with finite or infinite row sides. The objective is a +linear part plus strictly positive weighted squared affine forms for minimization, +or the linear part minus those forms for maximization: + +```cpp +#include +using namespace Gecode::Optimize; +QuadraticModel model; +auto x = model.add_continuous(-5, 5, "x"); +auto y = model.add_continuous(-5, 5, "y"); +model.add_row({{x, 1}, {y, 1}}, 1, 3); +model.minimize_squares({{{{x, 1}}, -2, 1, "x target"}, + {{{y, 1}}, -1, 2, "y target"}}); +const auto result = solve_quadratic(model); +if (result.result.has_solution()) { + const double value = result.result.value(x); + (void)value; +} +``` + +`maximize_concave_squares` makes the negative-square convention explicit. Both +objective setters replace the complete objective, canonicalize duplicate terms, +and advance the revision even for quadratic-only changes. They stage allocating +work before committing; malformed input leaves the previous model/revision intact. +Removing a variable referenced by a row, linear objective, or square is rejected. +Deleted slots remain tombstones. Wrapper moves preserve identity; moved-from +wrappers reject access except their zero identity/revision. Snapshots own their +history after edits/destruction, and copying or moving a snapshot retains a usable +immutable view. There is no public conversion to the private linear core model. + +Result identity, active mask, values and handles refer to original wrapper slots. +Auxiliary variables/rows are private. `validate_quadratic` independently checks +original rows/bounds, objective and gradient; it establishes numerical primal +validity, not optimality. `QuadraticResult.result.solution_validated` is set only +for a checked original quadratic candidate. Raw lifted objective/duals are never +presented as an independent proof. + +The following are unavailable by construction or return `Unsupported`: unbounded +original variable domains, integer/binary/semi domains, indicators/globals, +arbitrary Hessian input, quadratic constraints, native backends, Exact/Certified +requests, primal starts, node quotas, multiple workers and nonzero random seeds. +The first interface does not support QP sessions, pools, repair, lexicographic +retention, diagnostics, LP/MPS I/O or CLI integration. Additive C/Python bindings +use distinct model/result handles; see [the binding contract](BINDINGS.md#distinct-continuous-quadratic-models). Existing typed entry +points reject the wrapper rather than solving only its linear part. A future +quadratic objective retention constraint would require QCP support. + +## Lowering, acceptance and numerical bounds + +Write `s=1` for min and `s=-1` for max. The backend always minimizes +`F=s*offset+(s*c)'x+sum w*(a'x+b)^2`. Each square receives a private continuous +residual `z` with `z-a'x=b`; its sole Hessian entry is `Qzz=2*w` under HiGHS's +`0.5*x'Q*x` convention. This diagonal Hessian is PSD by construction, including +singular cases. The implementation does not expand a rounded Gram matrix. + +The uploaded LP coefficients, bounds, costs, dimensions and Hessian are checked +against the intended representation before running. Nonzero matrix/Hessian values +at or below `1e-12`, matrix/Hessian magnitudes at or above `1e15`, finite bounds, +affine offsets or linear costs at or above `1e20`, overflow and incompatible +HiGHS index sizes require explicit rescaling and return `Unsupported`. Private +residuals may have free domains; original variables must have finite boxes. + +A vendor `Optimal` status is accepted only after these independent gates: + +- Original numerical primal feasibility, compensated original objective/gradient, + and lifted residual/objective agreement. +- Original normalized row/bound dual signs and complementary slackness. A positive + row dual selects a finite lower side, a negative one a finite upper side. + The backend already minimizes `F`, so its duals are already normalized. +- Stationarity against the original unregularized objective, with tolerance + `stationarity_tolerance * (1+abs(gradient)+abs(bound dual)+sum abs(A*row dual))`. + Complementarity uses an absolute original-unit tolerance. +- An independently enclosed lower bound on `min F`, plus an offset-free upper + enclosure on the primal-minus-bound gap no larger than `optimality_tolerance`. + +The defaults are stationarity/complementarity `1e-7` and absolute optimality +acceptance `1e-6`. `optimality_tolerance` is separate from the common solver's +requested search gaps: this QP adapter has no early relative/absolute search-gap +cutoff. It requires HiGHS optimal completion and its own numerical acceptance. +Large objective constants do not relax any of these gates. + +For any finite tangent value `t`, `w*z*z >= 2*w*t*z-w*t*t`. Combining these +inequalities with sign-valid original row multipliers produces an affine lower +bound. Minimize that affine residual over every original finite variable box. +This remains sound for imperfect duals and singular curvature. The checker uses +outward `nextafter` enclosures of each binary64 arithmetic operation; it does not +subtract a guessed epsilon or invert a Hessian. Overflow or unsupported arithmetic +makes the bound unavailable. Production does not change the process rounding mode. +IEEE binary64, nearest rounding, preserved subnormals and no fast-math are required; +`quadratic_capabilities().available` reflects that arithmetic environment as well +as backend availability. Missing HiGHS has no fallback. + +The original offset cancels algebraically before computing +`checks.gap_upper_bound`. `SolveResult.absolute_gap` instead uses the independently +outward-rounded full bound and rounded full objective. Near a huge offset, its +reported gap can therefore be larger than the offset-free acceptance gap. Both +are retained honestly. A regression with offset `1e16` passes the tight centered +gap while retaining a full scalar gap of at least one unit; it does not invent a +zero scalar gap. Contradictory bound ordering becomes `NumericalFailure`, with +scalar bound/gaps unavailable, never a clamped zero. + +All accepted solves retain `Guarantee::Numerical`: primal feasibility and KKT use +tolerances, even though the finite-box lower-bound enclosure is independently +checked. A feasible original point can survive an iteration/numerical failure; +that is not an optimality claim. An infeasible vendor status is explicitly a +numerical conclusion without an independently checked Farkas certificate, and a +valid raw primal witness disproves it even if the vendor declined `value_valid`. +A feasible finite-box QP cannot be unbounded; such a backend report is a numerical +failure. Nonfinite, foreign, stale or malformed raw evidence is rejected. + +## Budgets and solver setting + +A shared monotonic budget covers snapshot copying, compilation/upload, backend +work, original checking and publication. A zero deadline/pre-cancelled token stops +before solving. Late candidates and bounds are excluded. Limits are cooperative: +the pinned active-set path does not forward the general callback to its QP loop, +so cancellation is checked before/after backend work, not promised to preempt a +factorization. The remaining time is passed to HiGHS. The default QP iteration cap +is 100,000. Auxiliary/nonzero caps are checked before growing backend structures; +allocation failures return `MemoryLimit` with original provenance. +The pinned active-set nullspace limit remains 4,000; factorization/nullspace +failures are reported as backend failures, not infeasibility or nonconvexity. + +The initial runtime is pinned HiGHS 1.15.1's `qpasm`, one worker, zero seed, and +**zero diagonal regularization**, with no hidden retries. The pinned default is +`1e-7`, which perturbs the working objective. Reproducible comparison in +`test/optimize/quadratic.cpp` found: + +| Original-model acceptance, macOS arm64 pinned build | Regularization 0 | Pinned default `1e-7` | +| --- | --- | --- | +| 360 min/max cases checked against exact rational 2-D KKT active-set enumeration | 360 accepted | 172 accepted; 188 rejected by the original checks | +| Six scaled rank-one cases, weights `1,1e-2,1e-4,1e-6,1e-8,1e-10` | 3 accepted | 4 accepted | + +Both settings reach the iteration cap on the rank-one weights `1e-4` and `1e-6` +in this fixture/build. At `1e-8`, zero regularization fails the original KKT gate +while `1e-7` passes. These are explicit limitations, not solved instances or timing +results. Counts may vary with backend/platform arithmetic; every accepted result +must still pass the same gates. Broader accurate behavior favors zero for this +first slice; a later conditioning/retry policy needs its own budget and original +witness retention tests. The test-only regularization override is absent from +production and is not a supported runtime option. + +## Validation evidence + +The standalone tests cover: + +- Immutable ownership/revision/mutation failure, foreign/tombstone handles, moved + models/snapshots and compile-time rejection by existing linear/native/workflow + entry points. +- 360 exact rational KKT oracle cases with both senses, plus analytic interior, + equality, active bounds/rows, fixed/empty/constant objectives, singular curvature, + a mixed curvature ratio of `1e12`, large offsets and infeasibility cases. +- 22,688 exact signed dyadic checks of interval sums/products using an independent + arbitrary-width integer reference, plus 400 exact tangent/row-dual/box formulas, + subnormal arithmetic, cancellation, overflow and changed rounding modes. +- Fake backend replies: wrong identity/revision/mask, malformed primal/auxiliary/ + objective/duals, false optimal/infeasible/unbounded statuses, interrupted primal + retention, and huge constants masking a nonoptimal point. Deterministic hooks + exercise cancellation before/after backend/checking and allocation failure. +- Core-only missing-backend behavior, production without test hooks, and fully + instrumented ASan/UBSan foundation/QP/HiGHS builds. A separate fast-math build of + the arithmetic checker verifies its fail-closed support gate. + +`quadratic_bound.hpp` is a private implementation/test header; public clients use +`quadratic.hpp`, also included by ``. Both standalone and +combined packages install the public header and exclude the private checker. +CMake registers production, exact-bound, isolated coordinator and (GCC/Clang) +arithmetic-rejection tests; the last compiles only the checker with fast-math. +Installed consumers exercise the public solve or the backend-disabled response. +No performance/default-routing claim is made by these conformance runs. + +Pinned implementation/source findings, derivation and primary algorithm papers +are in [QUADRATIC-DESIGN.md](QUADRATIC-DESIGN.md), including the HiGHS Hessian and +regularization code, Feldmeier's QP thesis, Forsgren–Gill–Wong active-set methods, +Boyd–Vandenberghe duality, and OSQP as a future differential oracle. Arbitrary +Hessians, unbounded original domains and stronger infeasibility certificates remain +separate research/verification gates. + + +## C and Python + +The explicit wrapper is available through the version 1 C ABI and the Python +`QuadraticModel`, `WeightedSquare`, `QuadraticOptions`, `QuadraticResult` and +`QuadraticChecks` classes. These types preserve the finite-box, positive-square, +convex-min/concave-max scope and all numerical acceptance gates described above. +Ordinary linear models, sessions and result accessors cannot accept their handles. +[Binding examples and ownership rules](BINDINGS.md#distinct-continuous-quadratic-models) +cover atomic objective replacement, copied arrays, historical slot identities, +original checks, vendor diagnostics and explicit evidence availability. diff --git a/docs/solver-parity/README.md b/docs/solver-parity/README.md new file mode 100644 index 0000000000..300a7eaef7 --- /dev/null +++ b/docs/solver-parity/README.md @@ -0,0 +1,250 @@ +# Additive optimization API + +This branch adds `Gecode::Optimize`, an owning sparse numerical model API with a +HiGHS LP/MILP backend, persistent sessions, native global constraints, +numerical conflict diagnostics, weighted feasibility repair, ranked solution pools +and exact integer presolve with owning reconstruction. +An explicit bounded integer bridge also compiles this model to native Gecode +search. An explicit [checked LP hybrid](NATIVE-LP.md) adds safe integer relaxation +deductions, with separate LP statistics and unchanged default routing. Existing +`Space`, propagator and search interfaces remain available. +The [algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md) adds bounded exact binary capacity +optimization to the +[ninth integrated checkpoint](NINTH-CHECKPOINT.md), which includes selected-basis +LP sensitivity and a bounded native incumbent neighborhood. Regression and +immediate prior-version timings are recorded separately from historical results. +Further roadmap implementation is on hold; commercial parity remains incomplete. + +The common Native solve now uses a [structural automatic policy](NATIVE.md): +it preserves eligible DP and selects compatible checked LP, covers and bounded +branching without problem-family labels. Direct `solve_native` remains the +ordinary route. Bounded exact presolve, independent components, duplicate-column +symmetry and compact knapsack DP now extend this policy. The separate C++ +`solve_native_race` option tries this policy and ordinary BAB under one shared +budget, then selects a route. Exploration/restarting may increase CPU work or +solve time; longer trials can pay off if they discover a better search strategy. +MiniZinc exposure and parallel racing remain future work. The final three-cohort +benchmark compares the original pre-algorithm runtime, automatic racing and +frozen family presets; the earlier studies below keep their own observations. + +The [configured benchmark](CONFIGURED-BENCHMARK.md) compares ordinary settings +with explicitly selected algorithm settings in the same current solver build. +It preserves admitted knapsack DP, enables checked LP where effective, and uses +bounded reliability branching for production and oversized knapsacks. The +runner's [saved family policy](checkpoints/configured.json) +is explicit; public API defaults were unchanged during that study. All candidate pilot +results, activity counters and adaptive measurements are retained separately. + +The [adaptive boundary study](ADAPTIVE-BOUNDARIES.md) searches each native version +independently, stops expansion after a failed size, and confirms sampled +ten-second boundaries. Original witnesses are checked independently; optimality +remains the exact backend's claim without a separate reference oracle. This +study and the fixed panels below retain their own observations and methods. + +The [seven-category scaling study](CATEGORY-SCALING.md) records 132 runs of the +unchanged native product. Knapsack is one category requiring both distributions +to pass at each size; its tested maximum rises from 32 to 384 variables. The +other six category maxima are unchanged, and native routing/queen dimensions +distinguish input entities from actual model variables. + +The earlier [capacity scaling study](CAPACITY-SCALING.md) measures the unchanged native +product with ten-second limits. Across two fixed knapsack distributions, the +largest tested size proved in both repetitions rises from 32 to 384 variables; +the 512-variable fallback remains unfinished. Assignment stays at 256 variables. +These are sampled size results, not general solver limits or speed ratios. + +The [before/after benchmark report](BENCHMARKS.md) separates existing native +capabilities, added numerical routes, completion rates and measured runtimes. +Gecode's native Doxygen documentation now includes an Optimize task guide from +[`doxygen/optimize.hh`](../../doxygen/optimize.hh), covering the current API and +these backend boundaries. + +## Build and run + +The standalone component needs C++17 and CMake 3.21+. It does not build native +Gecode. With an installed HiGHS 1.15 package on `CMAKE_PREFIX_PATH`: + +```sh +cmake -S gecode/optimize -B build/optimize -DCMAKE_BUILD_TYPE=Release +cmake --build build/optimize -j 4 +ctest --test-dir build/optimize --output-on-failure +build/optimize/optimize-example +``` + +For this isolated workspace, the separately copied and pinned HiGHS source is +`../deps/HiGHS` relative to the implementation checkout. The tested configure +command is: + +```sh +cmake -S gecode/optimize -B build/optimize \ + -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF \ + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$PWD/../deps/HiGHS" +``` + +The dependency is HiGHS 1.15.1, commit +`04024d701f79feb8e2f18bc3df0dffc04ef05088`, from +[ERGO-Code/HiGHS](https://github.com/ERGO-Code/HiGHS). +Configuration never downloads dependencies. An unavailable installed package +produces a configure error; it does not silently select another solver. +`-DGECODE_OPTIMIZE_WITH_HIGHS=OFF` builds the model, checker, I/O and workflow +coordination without a numerical backend; solving reports `Unsupported`. + +For a combined native Gecode build, use `-DGECODE_ENABLE_OPTIMIZE=ON` at the +repository root. This option defaults to OFF, preserving the existing build. +When integer and search components are enabled, the combined build also enables +`GECODE_OPTIMIZE_WITH_NATIVE` by default. A standalone optimization build cannot +enable that bridge; use the combined build described in [NATIVE.md](NATIVE.md). +After installation, use either `find_package(GecodeOptimize CONFIG REQUIRED)` +for the standalone package or `find_package(Gecode CONFIG REQUIRED COMPONENTS +optimize)` for the combined package. Both expose `Gecode::optimize` and +`Gecode::gecodeoptimize`. A native-only component request does not require HiGHS. + +## Model and solve + +```cpp +#include +#include +namespace O = Gecode::Optimize; + +O::Model model; +auto open = model.add_binary("open"); +auto quantity = model.add_continuous(0, 100, "quantity"); +const double inf = std::numeric_limits::infinity(); +model.add_row({{quantity, 1}, {open, -100}}, -inf, 0, "capacity"); +model.add_row({{quantity, 1}}, 40, inf, "demand"); +model.minimize({{open, 12}, {quantity, 0.5}}); + +O::SolveOptions options; +options.time_limit_seconds = 10; +options.primal_start = {{open, 1}}; // Partial hint, not a fixed assignment. +auto result = O::solve(model, options); +if (result.has_solution()) { + double produced = result.value(quantity); + // Check result.termination separately before claiming completion. +} +``` + +The example's optimum is 32. Continuous, integer, binary, semicontinuous and +semiinteger domains are represented explicitly. Rows have lower and upper +bounds; objectives support minimization, maximization and offsets. Duplicate +terms are normalized deterministically. Successful edits advance the model +revision. Handles carry a model identity and never-reused slot; removed slots +remain tombstones. Results and model snapshots own their data and survive edits. + +`SolveResult` separates termination from incumbent availability. It records the +backend/version, validated original-variable values, objective, best bound, +gaps and elapsed time. Missing bounds/gaps remain missing. `has_solution()` does +not imply optimality, and `Optimal` is explicitly **numerical** for this backend. +Original rows, variable domains, integrality and objective are independently +recomputed before a candidate is accepted. This checker is not a proof verifier +or an exact certificate for general real arithmetic. + +`SolveOptions::primal_start` accepts unique, finite, original-variable entries. +Individual domains are checked; complete starts must also satisfy all original +constraints. Invalid starts return `InvalidModel` with an explanation. Partial +starts may be completed or repaired by HiGHS; `start_submitted` only says the +backend accepted the hint, not that the hint became an incumbent. Starts use +handles rather than a solver's compacted column numbering. + +For repeated edits, [SolveSession](SESSIONS.md) retains compatible LP basis +state and revalidates old MIP witnesses before submitting them as hints. For +infeasible models, [analyze_conflict](DIAGNOSTICS.md) reports original rows, +bounds and domain groups with explicit numerical irreducibility semantics. +Set `SolveOptions::backend = Backend::Native` for the bounded exact-integer +route. The [typed global helpers](GLOBALS.md) retain all-different, element, +table, cumulative, circuit and Regular constraints; `Auto` selects native Gecode for +active globals and HiGHS for other models. The [fast regression command](FAST-REGRESSION.md) +covers both routes and these workflows within one 28-second budget. + +[LP observations](LP-OBSERVATIONS.md), [explicit basis starts](LP-BASIS.md) and +[numerical rays/Farkas evidence](LP-EVIDENCE.md), together with +[selected-basis LP sensitivity](LP-SENSITIVITY.md), retain original-model identity +and distinguish accepted data from diagnostics. [Scenario batches](SCENARIOS.md) +apply sparse overrides under one budget. These workflows have C and Python +bindings. The separate [MiniZinc registration](MINIZINC.md) is opt-in and includes +build/install compiler checks. + +The C++ [native neighborhood API](NATIVE-NEIGHBORHOODS.md) optionally attempts +one checked binary incumbent improvement within the shared search budget. + +## Limits and numerical contracts + +- `capabilities()` identifies the numerical backend and current limitations. + HiGHS rejects `Exact` and `Certified`; numerical solving is never substituted for + them. The existing certified binary LP module is unchanged. +- Time limits cover snapshot copying, structural validation, conversion, solving + and candidate checking. Cancellation uses a shared monotonic token. Backend + calls are cooperative and may overrun; actual elapsed time is reported. A + candidate first observed after the deadline is not accepted. A candidate + observed in time can be checked after the cutoff and retained with a limit + termination status. +- The first HiGHS adapter supports one worker per solve. Other thread counts + return `Unsupported`, avoiding unreliable changes to HiGHS's global scheduler. + Concurrent heterogeneous HiGHS sessions are not an advertised capability. +- Default native relative/absolute MIP gap tolerances are `1e-4`/`1e-6`. + Feasibility/integrality tolerances are `1e-7`/`1e-6`. The backend receives the + stricter feasibility/integrality tolerance for MIP feasibility checks. +- Reported relative gap is `abs(primal-dual)/max(1,abs(primal),abs(dual))`. + `native_backend_gap` preserves HiGHS's convention separately. Native relative + stopping criteria use HiGHS's convention, not the normalized reported gap. +- Finite bounds, objective costs and offsets must have magnitude below `1e20`; + nonzero matrix coefficients must have magnitude strictly between `1e-12` and + `1e15`. Unsupported scaling is rejected before HiGHS can discard coefficients. + Semi variables currently require a finite positive nonzero-domain lower bound + and finite upper bound at most 100000. These are adapter limits, not claims + about all possible HiGHS formulations or native Gecode domains. + +## Additional workflows and model exchange + +[Ordered objectives](WORKFLOWS.md) use an explicit highest-priority-first vector, +one outer deadline/cancellation token and independently checked retention rows. +Stage completion requires an agreeing numerical bound. Both native MIP gap +targets are zero for this workflow. Degradation is explicit, and an unfinished +stage never becomes a claimed lexicographic optimum. Multi-stage node budgets +remain unsupported until cumulative consumed-node reporting is available. + +[Constraint helpers](CONSTRAINTS.md) describe bounded indicators and Boolean +AND/OR formulations, including generated rows, original logical validation and +the restrictions needed to keep bound-derived formulations valid after edits. + +[Model I/O](IO.md) documents the deliberately supported LP and free-MPS syntax. +The readers reject unsupported semantics. Writers retain double precision, +verify reimported model equivalence, then replace the destination atomically. +This does not imply support for every vendor-specific LP/MPS extension. + +The JSON command-line runner supports cold-start correctness checks: + +```sh +build/optimize/optimize-file experiments/solver-bench/miplib-cache/p0033.mps \ + --time-limit 30 --relative-gap 0 --absolute-gap 0 --seed 0 +python3 experiments/optimize/verify_miplib.py \ + --binary build/optimize/optimize-file \ + --output build/optimize/miplib-correctness.json +``` + +The runner's budget includes file import, and its JSON distinguishes import, +solve and total wall time. The five-model harness uses the existing suite's +separate exact parser and assignment checker, matches the original input +hashes, and compares rounded feasible binary witnesses against the published +optima. It never passes reference solutions to the solver. These runs establish +correctness on those instances; they are not a MIPLIB2017 performance comparison +or evidence of commercial-solver speed parity. + +## Repair, C and Python + +`relax_feasibility` accepts selected row/bound sides and positive L1 penalties. +It builds a distinct private model, minimizes weighted violations and optionally +refines the original objective at minimum violation. The returned original +residuals distinguish a repaired point from a feasible solution of the unchanged +model. See [repair semantics and supported domains](RELAXATION.md). + +The build also produces the versioned shared C library `gecodeoptimize_c`. +Installed CMake consumers link `Gecode::optimize_c` and include +`gecode/optimize/c_api.h`. The Python 3.9+ ctypes package lives in `python/`: +set `PYTHONPATH` to that directory and `GECODE_OPTIMIZE_LIBRARY` to the absolute +shared-library path. There is no runtime download or solver implementation in +Python. [Bindings](BINDINGS.md) describes ownership, typed globals/logic, +sessions, errors and the remaining workflow/binary-distribution work. + +See [implementation status](IMPLEMENTATION.md) for remaining roadmap work and +[validation evidence](VALIDATION.md) for completed checks and their limits. diff --git a/docs/solver-parity/REGULAR-BINDINGS.md b/docs/solver-parity/REGULAR-BINDINGS.md new file mode 100644 index 0000000000..ec788328e2 --- /dev/null +++ b/docs/solver-parity/REGULAR-BINDINGS.md @@ -0,0 +1,31 @@ +# Regular constraints through C and Python + +`gecode_opt_v1_model_add_regular` and Python `Model.add_regular` construct the [typed sparse Regular global](REGULAR.md). They add one ordinary `GlobalConstraint` identity, so existing global naming/removal APIs apply. The versioned C record is `gecode_opt_regular_transition_v1`: `struct_size`, zero `reserved`, unsigned 64-bit `from`, signed 64-bit `symbol`, and unsigned 64-bit `to`. The call also receives an exact transition element size, independent array counts, state count, initial state, and final-state array. + +State count is positive; state IDs lie in `[0, state_count)`. Zero is a real state and a real symbol. Symbols must be exactly representable integers within ±2^53 in the shared model; the native solver admits a narrower range, as described in the C++ contract. Missing transitions reject the word. Duplicate `(from, symbol)` keys are invalid even when their targets match. Duplicate final states are harmless. There are no epsilon transitions. The empty word is accepted exactly when the initial state is final. Repeated variables in the word retain equality and are not copied into independent decisions. Huge sparse state numbers do not allocate a dense state-count array. + +The C boundary validates pointers, address/vector count limits, the exact element size, every record's exact size and zero reserved field, entity kind, and UTF-8 name before posting. The C++ model validates source ownership, deleted handles, discrete variable types, automaton ranges, exact symbols, and deterministic transition keys. A failure leaves the model and revision unchanged and clears a provided output ID. Successful posting advances the revision once. Arrays and names are copied; changing caller buffers afterward cannot change the model. No exception crosses the C boundary, and solver `Unsupported` remains distinct from API/model-building errors. + +Python accepts ordinary variable, transition, and final-state sequences without NumPy. Each transition is a frozen `RegularTransition(from_state, symbol, to_state)` value. It rejects booleans, fractional numbers, and out-of-range integers before ctypes can truncate them. `None` or a tuple is not a transition record. Entities from another loaded ABI instance are rejected in Python; foreign or deleted source identities are rejected by C++. + +```python +from gecode_optimize import ( + Model, Options, Guarantee, VariableType, RegularTransition as Edge, +) + +with Model() as model: + word = [model.add_variable(VariableType.INTEGER, -1, 1) for _ in range(3)] + model.add_regular( + word, state_count=2, initial_state=0, + transitions=[Edge(0, -1, 0), Edge(0, 1, 1), + Edge(1, -1, 1), Edge(1, 1, 0)], + final_states=[0], name="even number of +1 symbols", + ) + model.set_objective([(variable, 1) for variable in word]) + with model.solve(Options(guarantee=Guarantee.EXACT)) as result: + print(result.termination) +``` + +An active Regular global makes the one-shot `Auto` route select Native. A build without Native still constructs the record, and solving returns `Unsupported`. Explicit HiGHS and persistent sessions reject the complete model; they never omit its Regular constraint. Native solves preserve original result identities, both objective senses, offsets, other admitted globals, and linear rows. Closing a model or removing a global cannot alter an already owned historical result. A variable still referenced by an active Regular global cannot be removed. + +The actual C99 consumer `test/optimize/regular_c_api.c` uses an independent parity language oracle and mixed all-different/linear constraints, both objective senses, source-buffer mutation, historical results, and malformed count/size/reserved/state/symbol/owner cases. `python/tests/test_regular.py` first enumerates accepted labeled paths and then exhausts independent variable assignments, covering missing transitions, signed symbols, empty words, repeated variables, duplicate finals, huge sparse state IDs, min/max, mixed constraints, backend routing, atomic rejection, and semi-integer zero semantics. The facade and C wrapper must both be recompiled after this C++ `GlobalPayload` variant change; old facade objects are not binary-compatible merely because the C ABI remains version 1. diff --git a/docs/solver-parity/REGULAR.md b/docs/solver-parity/REGULAR.md new file mode 100644 index 0000000000..0f8ea0cc85 --- /dev/null +++ b/docs/solver-parity/REGULAR.md @@ -0,0 +1,172 @@ +# Sparse deterministic regular constraints + +`add_regular` retains an owning deterministic finite automaton and its ordered +integer word in the original optimization model. Native solving posts Gecode's +existing DFA propagator; the independent original-model checker walks the +original sparse transition function. It is an additional typed global, with no +change to default search or propagation settings. + +```cpp +#include +#include +namespace O = Gecode::Optimize; +O::Model model; +auto x = model.add_integer(-1, 1); +auto y = model.add_integer(-1, 1); +// Accept (-1, 1) and (1, -1). State 0 is an ordinary initial state. +O::add_regular(model, {x, y}, 4, 0, + {{0, -1, 1}, {0, 1, 2}, {1, 1, 3}, {2, -1, 3}}, {3}, "opposite"); +model.minimize({{x, 1}}); +O::SolveOptions options; +options.guarantee = O::Guarantee::Exact; +auto result = O::solve(model, options); // Auto selects Native for active globals. +``` + +## Original semantics and ownership + +`RegularData` owns `variables`, `state_count`, `initial_state`, `transitions` and +`final_states`. `RegularTransition` contains `(from, symbol, to)`. State IDs use +`uint64_t`; the declared count must be positive and every referenced state must +be strictly below it. Symbols use `int64_t` within the exact public constant +range ±2^53. State labels are metadata, so they need not fit an integer variable +or a double. A declared count close to the uint64 limit needs no dense storage. + +| Input | Meaning or admission | +| --- | --- | +| Missing `(state, symbol)` transition | Reject the word. | +| Duplicate `(from, symbol)` key | Reject the model, including identical duplicate edges. This interface describes a function, not an NFA. | +| Repeated final state | Harmless set duplication. | +| Empty word | Accepted exactly when the initial state is final. | +| Empty final set | No word is accepted. | +| Empty transition set | Only an empty word can be accepted. | +| Unreachable state, transition or final | Retained in the original record and checked structurally. | +| Repeated variable in the word | The repeated positions must take the same value. | +| Negative or zero symbol, state zero | Ordinary symbol/state values in this typed API. No reserved failure state. | + +Every word variable must be a live, same-model Integer, Binary or SemiInteger +handle. The original record follows existing global names, revisions, removal +and tombstone rules. Failed addition leaves the model unchanged. An active +record prevents removal of any referenced variable; removing it releases those +guards. Changing a variable's bounds keeps the same automaton semantics. +Snapshots copy and own all automaton data. Publicly edited snapshots undergo +full structural checking, including malformed inactive records. Empty-word and +empty-language fast paths occur only after complete structural and native +admission. + +The general numerical checker rounds only within its requested integrality +tolerance before evaluating the discrete original word. Native exact solving +and complete-start admission require integral values without rounding. A +candidate must satisfy every original row, domain, indicator and global before +publication. This adds no proof-certificate format; `Certified` stays unsupported. + +## Native lowering and conservative storage limits + +The compiler compacts only referenced state IDs, including the initial state +and finals. It creates its own transition and deduplicated-final arrays with +explicit native sentinels. Gecode `DFA(..., false)` normalizes the state layout +with optional minimization disabled. The native extensional propagator owns its +DFA data. Aliased word positions use equal fresh native variables, preserving +source equality while satisfying Gecode's distinct-variable-object requirement. +Space cloning retains ordinary native ownership; no pointer into temporary +transition buffers survives posting. + +Alphabet symbols must fit `Gecode::Int::Limits`, even in unreachable transitions +or an empty word. The rest of the model still has to meet the bounded native +integer/linear arithmetic contract. Large exact public symbols can therefore +validate correctly yet return `Unsupported` when solving natively. + +The private `native_regular_limits.hpp` preflights native allocation/index +arithmetic before creating a DFA or layered graph. Its conservative sufficient +conditions use word length `n`, referenced-state count `Q`, edge count `T`, and +distinct-symbol count `S`: + +- `n`, `Q`, and `T` are below `INT_MAX`, with `Q > 0`, leaving room for count-plus-one arrays. +- `Q * (n + 1) <= INT_MAX`, protecting signed initialization/index products in the layered graph. +- `n * T <= UINT_MAX`, protecting aggregate layer-edge counts. +- `S < INT_MAX/2 + 1`, so the native hash table's next strictly larger power of two remains a positive signed shift. +- When every symbol fits `short`, `S <= USHRT_MAX`, protecting the short-valued graph's per-layer support count. + +Products are checked by division, with overflow-sized input rejected before +multiplication. These are storage-safety bounds, not a claim that such large +models fit available memory. Allocation failure still returns `MemoryLimit`. +Compaction loops share the outer solve deadline/cancellation checks; DFA +construction and propagation are cooperative native calls, with checkpoints +before and after them. There is no hard wall-clock interruption inside those +calls and no added probing or solver work hidden outside the existing budget. + +The conditions follow the implementation in +[`dfa.cpp`](../../gecode/int/extensional/dfa.cpp), +[`dfa.hpp`](../../gecode/int/extensional/dfa.hpp), and +[`layered-graph.hpp`](../../gecode/int/extensional/layered-graph.hpp), not an +assumed external automaton representation. The private helper is not an +installed API. + +## Routes and validation evidence + +Ordinary Native/BAB, NativeLP, and both frontier orders enforce the native +Regular propagator and the original checker. NativeLP omits the global from its +linear relaxation, while retaining it in the full native model and checking all +incumbents. Thus an LP bound alone cannot establish original feasibility. +Complete starts, interrupted bounds, tombstones, min/max offsets and native +clones keep their existing contracts. + +Explicit HiGHS, persistent HiGHS sessions, current conflict extraction, exact +linear presolve, feasibility relaxation, and LP/MPS export reject active Regular +records. They never drop the language constraint. Export rejection happens +before replacing the destination. A backend-free build still supports +construction and independent validation and reports unsupported native solving. + +`test/optimize/regular.cpp` independently generates accepted words by following +all labeled paths, then enumerates the complete product of each tiny original +variable domain. It compares that language with checker results and solver +optima, including all partial two-state transition functions over `{-1,1}`, +initial/final combinations and word lengths zero through three. Additional +cases cover repeated handles, semis, duplicate finals, huge sparse state IDs, +unreachable data, signed objective costs and offsets, complete and invalid +starts, all small frontier node quotas, concurrent solves, lifecycle/history, +mutated payloads, unsupported routes and atomic export rejection. Pure boundary +cases test each native arithmetic condition and one value beyond it without +allocating enormous graphs; an actual 65,536-symbol short alphabet exercises +the production support-count guard. + +The existing native-start, frontier, branching and globals oracles also compile +against the enlarged variant; their independent predicate visitors explicitly +handle Regular. All optimization facade objects must be rebuilt when adding +this variant alternative. Borrowing an old facade archive would violate the +C++ object layout; only matching native/HiGHS foundation libraries may be reused. + +The separate source compiler now admits the six-argument FlatZinc spelling; the local +[`fzn_regular.mzn`](../../gecode/flatzinc/mznlib/fzn_regular.mzn) declares +`gecode_regular(x,Q,S,d,q0,F)`. Its state labels and symbols start at one, and +transition target zero means failure, as described by the official +[MiniZinc regular documentation](https://docs.minizinc.dev/en/2.3.2/predicates.html). +These source conventions must be translated explicitly; they are not the +zero-based typed API's semantics. Regex/NFA interfaces, reified regular, +set-valued regular and new automatic portfolio policies remain outside this +slice. + +The isolated implementation gate passed the combined native/HiGHS and +backend-free builds (5/5 tests each), and ASan+UBSan with every facade source and +both native/HiGHS foundations instrumented (5/5, no suppressions). The Regular +oracle checked 2,619 configurations and 25,985 original assignments; the +combined run performed 263 native-route solves, including interrupted solves. +Assertions were enabled throughout. These are correctness gates, not timings +or evidence of a performance benefit. The sanitizer runtime used +`ASAN_OPTIONS=detect_leaks=0:halt_on_error=1` and +`UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1`. + +The FlatZinc compiler's independent path-language oracle adds every two-state +transition matrix over symbols `1..2`, every initial/final combination, and word +lengths zero through three, with domains also containing rejected symbols 0 +and 3. It covers raw aliases/literals, zero transitions, empty/duplicate/interval +finals, malformed and nonliteral parameters, exact product overflow, payload +limits, cancellation, history, and combinations with table, reification and +linear objective mapping. Its source checker uses the original row-major table +rather than the typed sparse automaton. Actual parser/CLI integration belongs +to the separate CLI gate; these tests construct authoritative capture records. + +The subsequent source-compiler gate passed 5,992 configurations and 303,429 +original assignments with Native+HiGHS, native-only, and fully instrumented +Native+HiGHS ASan/UBSan. The backend-free compiler gate passed 5,990 +configurations with the same assignment count (two native-dependent setup cases +are absent). The typed Regular oracle remained green after compiler integration. diff --git a/docs/solver-parity/RELAXATION.md b/docs/solver-parity/RELAXATION.md new file mode 100644 index 0000000000..3189f1536c --- /dev/null +++ b/docs/solver-parity/RELAXATION.md @@ -0,0 +1,160 @@ +# Explicit weighted feasibility relaxation + +`relax_feasibility` constructs and solves a separate linear model in which only +selected original row sides or variable bounds can be violated. Every selected +side receives its own nonnegative continuous slack and strictly positive finite +penalty. The first objective minimizes their weighted L1 sum. Unselected row +sides, variable bounds, integrality, and original logical constraints remain hard. +The original `Model` or `ModelSnapshot` is never modified. + +```cpp +#include +using namespace Gecode::Optimize; + +Model model; +auto production = model.add_integer(0, 4, "production"); +auto demand = model.add_row({{production, 1}}, 6, + std::numeric_limits::infinity(), "demand"); +model.minimize({{production, 3}}, 10); + +RelaxationOptions options; +options.rows = {{demand, RelaxationSide::Lower, 5}}; +options.optimize_original_objective = true; +options.solve.time_limit_seconds = 10; +auto repair = relax_feasibility(model, options); +// Minimum weighted violation is 10: produce 4, missing demand is 2. +// Original cost at that repair is 22. The original demand is still infeasible. +if (repair.has_repair()) { + const auto amount = repair.original_values.at(production.id); + const bool originally_feasible = repair.original_validation.valid; + (void)amount; (void)originally_feasible; +} +``` + +## Mathematical meaning + +For selected lower side `a*x >= l`, the private row is `a*x + s >= l`. +For selected upper side `a*x <= u`, it is `a*x - s <= u`. In either case +`s >= 0`, and the original selected side is disabled. Selecting both sides +creates two independent slacks. Variable bound selections use a penalty row with +coefficient one on that variable. All coefficients, bounds, weights, and reports +remain in original model units; there is no automatic weight normalization. + +The first objective is `min sum(penalty_i * s_i)`. Positive penalties make its +minimum equal to the minimum weighted sum of actual side violations, subject to +numerical tolerances. These violations are recomputed independently from original +row activities and variable values. They are not merely read from slack variables. + +With `optimize_original_objective = true`, a second stage optimizes the original +objective, including its sense and offset, subject to a hard upper lock on the +first stage's optimal weighted slack sum. Requested degradation is zero. Each +stage requests zero native absolute and relative MIP gaps, and completion also +requires an independently checked feasible witness and agreeing finite numerical +global bound. Existing feasibility and integrality tolerances still apply. + +`original_objective_optimized` means optimal **within the minimum-violation repair +region**. It does not mean that an infeasible original model has become feasible, +or that the solution optimizes the original objective over any broader region. +A repair can have zero violation and be feasible in the original model. + +## Evidence and provenance + +- `source_model_id` and `source_revision` identify the untouched original input. +- `private_model` has a fresh model identity. Original variable and row slots, + including tombstones, are retained; penalty variables and rows are appended. + `private_variables` maps each original variable slot to its private handle. +- `private_model.objective` retains the original objective. Without phase two it + describes the elastic feasible region, not a model already locked to minimum + violation. With an established phase-two lock it also contains that hard row, + whose handle is `violation_lock`. The first objective can be reconstructed from + `items` as `sum(item.penalty * item.slack)`. +- Every `workflow` stage and its `final_solution` belongs to the private model. + Passing an original variable handle to that result's `value()` is an error. + Stage records provide their own objective, bound, status, and numerical gap. +- `original_values` uses original variable slots. `original_validation` reports + original feasibility and residual maxima, including indicators. It is usually + invalid when the minimum violation is positive. No original feasible + `SolveResult` or `solution_validated = true` is manufactured. +- Each `item` identifies exactly one original row or variable side and includes + its name, bound, weight, private slack/row handles, independently computed + activity, violation and weighted violation, and private slack value. Items are + ordered by original row slot then variable slot, with lower before upper. +- `minimum_weighted_violation` is the first stage's verified weighted slack + objective. `weighted_violation` is the selected original residual sum at the + returned repair. They agree within numerical tolerances when minimum violation + was established, but are intentionally reported separately. + +All evidence is `Guarantee::Numerical`, including backend optimality and the +independent long-double residual checks. Exact or Certified requests return +`Unsupported`. No proof certificate or exact infeasibility/optimality claim is +provided. Weighted residual checks account for the sum of penalties times the +absolute feasibility tolerance and floating-point accumulation error. Very large +weights therefore magnify the permitted weighted residual discrepancy. Precision +or backend numeric-range limitations return an explicit failure or `Unsupported`. + +## Supported domains and hard constraints + +| Input | Behavior | +| --- | --- | +| Continuous or Integer selected bounds | Replace the selected private bound by infinity and add its penalty row. Integrality remains hard; fractional integer endpoints keep their original units. | +| Binary selected bounds | Widen only to intrinsic `[0,1]`. Binary integrality and its intrinsic domain stay hard. A fixed binary can be repaired by paying for the selected fixing bound. | +| SemiContinuous or SemiInteger, untouched bounds | Preserve `{0} union [lower, upper]`, including the zero disjunct, and the backend's existing support limits. Ordinary row sides involving semis can be selected. | +| Semi-variable selected bounds | `Unsupported`; a conventional interval slack alone would incorrectly penalize the legal zero disjunct. | +| Active indicators, untouched bound dependencies | Copy and rebind all original metadata, gates, generated rows and captured-domain guards to the fresh private identity. Indicators remain hard and are independently validated. | +| Indicator-generated row selection or indicator-participating variable bound selection | `Unsupported`; these would invalidate the original logical semantics or captured big-M justification. Select an ordinary row instead. | +| Typed active globals | `Unsupported` until an explicit relaxation formulation is implemented. Inactive global tombstones are harmless and omitted from the fresh private model. | +| Empty expressions and constant contradictory rows | Supported, including models with no original variables. | +| No selected sides | Solve the hard model with zero first objective. Its infeasibility remains infeasibility. Optional phase two optimizes the original objective. | + +Public snapshots undergo structural validation before construction, and the +private snapshot is validated again. Foreign, absent or deleted selectors, +duplicate selections of the same side, nonfinite selected sides, invalid side +enumerators, and nonpositive/nonfinite weights return `InvalidModel`. The API does +not repair malformed model structure or contradictory lower/upper ordering. +Nonempty primal starts return `Unsupported` until private slack mapping is +implemented. Models that require continuous penalty slacks need a numerical +backend supporting them; requesting the finite-domain Native backend cannot +silently change those slacks' domain. + +## Budgets and incomplete outcomes + +A single end-to-end monotonic budget covers construction, both solves, validation, +and reporting. Remaining time decreases between stages, and both stages share a +cancellation token. No candidate returned after the total budget stops is +promoted. A node limit can be used for a single-stage repair; two-stage node +limits are `Unsupported` until consumed-node accounting is available across the +backend boundary. Zero time or node budgets stop immediately. + +Inspect status and evidence flags separately: + +| Outcome | `has_repair()` | `minimum_violation_established` | `original_objective_optimized` | +| --- | --- | --- | --- | +| First stage completed, no phase two requested | true | true | false | +| Both stages completed | true | true | true | +| First stage limited, with an independently validated timely candidate | true | false | false | +| Second stage limited or unbounded, with a retained valid candidate | true | true | false | +| Total deadline/cancellation reached before promotion | false | false | false | +| Hard constraints infeasible in first stage | false | false | false | + +Malformed witnesses, inconsistent bounds, or an apparent optimum with an open +independently recomputed gap produce `NumericalFailure`. A forged cached gap field +cannot establish completion. A later oracle's false infeasibility claim conflicts +with a known retained witness and is reported as numerical failure. + +## Correctness checks + +`test/optimize/relaxation.cpp` includes independent exhaustive integer arithmetic +for weighted repairs; objective ties resolved in both senses with negative +offsets; penalty-priority changes; continuous, fractional-integer-bound, binary, +semi and hard-indicator cases; constant contradictions; hard infeasibility and +unbounded second objectives; tombstones; malformed selectors/snapshots; explicit +unsupported combinations; source immutability and private handle provenance. + +A second compile mode, `GECODE_RELAXATION_TEST_FAKE_SOLVER`, replaces only the solve +oracle. It deterministically checks first/second-stage interruption and +cancellation, invalid witnesses, false objective values, forged zero gaps, +inconsistent/missing/open bounds, bad identity/active masks (including interrupted +results), honest and forged objectives with large offset cancellation, and false +infeasibility without sleeps or runtime-sensitive timing assumptions. Compile it +with `model.cpp`, `result.cpp`, `validate.cpp`, `constraints.cpp`, `globals.cpp`, +`workflow.cpp`, and `relaxation.cpp`, omitting the real `solve.cpp`. diff --git a/docs/solver-parity/SCENARIO-BINDINGS.md b/docs/solver-parity/SCENARIO-BINDINGS.md new file mode 100644 index 0000000000..2dc670883b --- /dev/null +++ b/docs/solver-parity/SCENARIO-BINDINGS.md @@ -0,0 +1,140 @@ +# Serial scenario batches in C and Python + +The additive ABI 1 scenario API exposes the owning C++ workflow in +[SCENARIOS.md](SCENARIOS.md). It solves independent sparse variations of one +ordinary linear source model. Automatic reuse uses a private numerical session; +Cold and Native use independent calls. These are serial batch solves, without +shared search trees or commercial multi-scenario performance claims. + +```python +from gecode_optimize import (Model, VariableType, ScenarioDefinition, + ScenarioVariableBounds, ScenarioRowBounds, ScenarioOptions) + +with Model() as model: + x = model.add_variable(VariableType.INTEGER, 0, 10) + demand = model.add_row([(x, 1)], lower=3) + model.set_objective([(x, 2)], offset=7) + cases = [ScenarioDefinition("base"), + ScenarioDefinition("higher demand", row_bounds=[ + ScenarioRowBounds(demand, lower=5)]), + ScenarioDefinition("higher unit cost", [(x, 4)], + variable_bounds=[ScenarioVariableBounds(x, upper=8)])] + with model.solve_scenarios(cases, ScenarioOptions()) as batch: + for index in range(batch.info.scenario_count): + case = batch.scenario(index) + outcome = batch.outcome(case) + # Later cases can be NotStarted after an earlier incomplete solve. + if outcome.result is not None and outcome.result.has_solution: + print(batch.definition(case).name, batch.value(case, x)) + first = batch.scenario(0) + mapped_x = batch.map(x) + saved = batch.copy_result(first) # independent owning ordinary Result +# saved uses the private owner/revision, so use mapped_x, not original x. +with saved: + if saved.has_solution: + print(saved.value(mapped_x)) +``` + +Each coefficient, objective offset and bound side is an **absolute override**. +Missing fields inherit the historical base; zero coefficients remove terms. +Names do not identify scenarios. A `ScenarioId` contains its private batch owner +and input index. All calls validate the owner and index. Maps validate the +historical original model owner and live variable/row slot, including tombstones. +Later edits to the caller model do not make a historical mapping stale. An ID +from another batch or a deleted slot in the captured base is rejected. + +`ScenarioDefinition`, bound records, IDs, outcome/check metadata and session +counters are copied frozen Python records. Input term/bound sequences become +tuples when a definition is created. A definition returned by the batch retains +original source IDs. Model destruction, batch close and later source edits do +not invalidate already copied records. `copy_result(case)` returns a separately +owned ordinary Result; it remains alive when the batch closes. It keeps the +private model owner and case revision `index+1`; original source IDs cannot be +used directly with its ordinary `value` accessor. Retain `batch.map(original)` +for that purpose. No borrowed child handle or implicit linear-model conversion +is exposed. The C++ `materialize` operation remains C++-only in this first binding. +There is no public Session-based scenario call: session reuse is batch-private. + +## Evidence and incomplete outcomes + +The batch info contains the original model ID/revision, optional admitted batch +ID, completion, optional stop reason and offending input index, attempted/resolved +counts, work counter, elapsed time and actual session reuse counters. A rejected +batch has no admitted definitions or per-case outcomes. The owning batch message +is available even after rejection. Successful admission creates an outcome for +each case; an unattempted outcome has no Result and no check. The passive +`check(case)` accessor returns `None` if no check was published. An existing check +can have `candidate_examined=False`; its Python `validation` is then `None`, not +a default record claiming validity. Backend status, independent identity checks +and candidate validation are separate facts. Infeasible/unbounded numerical +statuses are not new exact certificates. + +C records use explicit presence flags for all optional outcomes, checks, offsets, +stop reasons and offending indices. Absent output fields and reserved fields are +zero-initialized. Validation data is meaningful only when `candidate_examined`; +otherwise its numeric fields and optional objective are absent/zero. Finite or +infinite optional bounds on a copied Result retain the ordinary Result presence +contract; missing bounds are never represented as a present zero. + +Numerical is the admitted guarantee on all routes. Exact requires explicit Native. +Certified and Auto/HiGHS Exact are Unsupported even for an empty batch. An empty +batch with an admitted guarantee and available budget completes without a backend call. Active semis, +all indicator/global metadata (including inactive history), common starts and +quadratic models are outside this workflow's scope. A distinct QuadraticModel +cannot be passed to this ABI operation. Unsupported data is never silently +removed, and the caller model is never modified. + +## One allowance and bounded admission + +The Python wrapper deducts its input-marshalling time from a copied SolveOptions. +The C wrapper deducts its snapshot/array-copy time before calling the C++ batch +once. Each case then gets the remaining whole-batch time and the same cancellation +token. No per-case limit is reset by either binding. C input cleanup is checked +before publishing overall Complete; timely individual histories survive a final +whole-call timeout. Time/cancellation remain cooperative around indivisible +allocation/copy/backend operations. C `elapsed_seconds` measures the C call's +preparation, workflow and input cleanup; Python-only marshalling is charged to +the allowance but is not added to this C timing field. + +An absent node quota uses the normal backend contract; zero stops before any solve. A positive node +limit with exactly one case is forwarded once. Positive multi-case node limits +are explicitly Unsupported until cumulative consumed-node reporting exists. +There is no invented batch node counter. Session counters indicate actual reuse +operations and do not prove performance improvement. + +The v1 options include scenario, patch-entry, saved-value-slot and coordinator +work caps. The C wrapper checks definition and aggregate patch counts before +allocating its copied patch arrays. The C++ workflow owns the documented +`max_work` element-visit meter; language-boundary conversion is timed but not +reported as backend iterations or silently added to that work counter. Invalid +array shapes, version sizes, reserved fields and enum values return C API errors +with a zero output handle. Semantic invalid patches return an owning Rejected +batch with InvalidModel and the offending case index. An input storage cap can +return an owning Rejected MemoryLimit result before definitions are copied. + +## C ABI contract and conformance + +Use `gecode_opt_v1_scenario_options_default` to initialize the options, then +`gecode_opt_v1_solve_scenarios` with counted definition records and their exact +`sizeof(gecode_opt_scenario_definition_v1)`. Every definition and nested bound +record has an exact v1 `struct_size`, all reserved fields must be zero, and +presence fields must be exactly 0 or 1. Options also validate their embedded +ordinary SolveOptions version before reading its optional fields. Count/pointer +and representable allocation lengths are checked. Names are copied UTF-8 strings +(NULL means empty). Side values whose presence flag is zero are ignored; present +NaN or directionally invalid infinity is rejected by semantic admission. + +`scenario_batch_*` accessors are passive copies; none solves or analyzes again. +Text/buffer access uses NULL and capacity 0 to query required size, followed by a +caller-owned buffer. Text counts include the trailing NUL. Short output arrays +remain unchanged and report BUFFER_TOO_SMALL plus the required count. Typed bound +arrays additionally require the exact element size. Objective arrays and returned +bound records preserve the originally requested sparse patch order and IDs. + +Tests include C99 boundary/ownership/buffer checks and Python hand-computed and +exhaustively enumerated integer min/max cases on Native and HiGHS, cold/session +agreement, original identity/tombstone history, copied Result lifetime, invalid +sizes/counts/presence, rejected patches, missing backend, zero time/cancellation, +all outer caps, node scope and unavailable candidate checks. The C++ workflow's +separate deterministic coordinator tests cover interrupted/forged raw evidence; +the bindings call that same coordinator once and do not substitute a new oracle. diff --git a/docs/solver-parity/SCENARIOS-DESIGN.md b/docs/solver-parity/SCENARIOS-DESIGN.md new file mode 100644 index 0000000000..90c79277b0 --- /dev/null +++ b/docs/solver-parity/SCENARIOS-DESIGN.md @@ -0,0 +1,409 @@ +# Serial scenario batches with owning original-model evidence + +Design proposal, 2026-09-05. No scenario implementation or default routing change +is claimed here. Local API baseline includes O1 LP observations (header 8789972ae, +implementation 27705581b) and the existing model/session/result interfaces. + +## Recommendation and commercial scope + +Start with an explicit serial batch of independent models, each defined by sparse +absolute overrides of one immutable base snapshot. Reuse a private HiGHS session +for compatible numerical models; preserve explicit Native one-shot solving for +its admitted exact integer subset. Complete the correctness, lifetime and budget +contracts before adding parallel scheduling or any sharing of search regions. +This is a useful convenience and reoptimization feature, not a claim of integrated +multi-scenario search performance, stochastic programming, nonanticipativity or +robust optimization. + +Gurobi's integrated multi-scenario API accepts changes to linear costs, variable +bounds and linear RHS values. A single optimize call addresses the specified +scenarios; an empty scenario includes the base model. The documented model class +is broad, but has one objective and is treated as MIP even for continuous data. +Scenario callbacks/cuts have cross-scenario validity restrictions. These are +commercial scope references, not a promise that this first implementation admits +all those classes or uses the same search algorithm. The documentation does not +establish a particular internal tree representation. +[Official multi-scenario feature](https://docs.gurobi.com/projects/optimizer/en/current/features/multiscenario.html). + +Gurobi separates scenario solution, objective and bound attributes (`ScenNX`, +`ScenNObjVal`, `ScenNObjBound`) and uses `GRB.UNDEFINED` to represent inherited +attributes. Our proposal instead uses typed optional overrides and an ordinary +status-bearing result per scenario. Missing data remains absent, including after +interruption. There is no batch scalar objective or bound across different +objective functions. +[Official scenario attributes](https://docs.gurobi.com/projects/optimizer/en/current/reference/attributes/multiscenario.html). + +CPLEX 22.1.2 provides explicit routines to change +[linear objective coefficients](https://www.ibm.com/docs/en/cofz/22.1.2?topic=c-cpxxchgobj-cpxchgobj), +[variable bounds](https://www.ibm.com/docs/en/cofz/22.1.2?topic=c-cpxxchgbds-cpxchgbds), +[linear RHS values](https://www.ibm.com/docs/en/icos/22.1.2?topic=c-cpxxchgrhs-cpxchgrhs), +and the [objective offset](https://www.ibm.com/docs/en/icos/22.1.2?topic=c-cpxxchgobjoffset-cpxchgobjoffset). +Its [problem modification guidance](https://www.ibm.com/docs/en/icos/22.1.2?topic=application-change-problem-object) +explains reuse of an LP basis after compatible edits. That is the verified CPLEX +engine workflow this serial proposal targets. No equivalent CPLEX engine scenario +attribute family was established by the documentation reviewed; this is not a +claim that CPLEX cannot be used for scenario analysis. IBM's +[Decision Optimization scenario notebook](https://www.ibm.com/docs/en/ws-and-kc?topic=models-working-multiple-scenarios) +is a separate experiment-management layer, not evidence of an engine shared-tree +API or of CP Optimizer functionality. + +| Change or behavior | Gurobi multi-scenario | Verified CPLEX path | Proposed first slice | +|---|---|---|---| +| Linear objective coefficient | `ScenNObj` | `CPXchgobj` | Absolute sparse replacement, including zero | +| Variable bounds | `ScenNLB` / `ScenNUB` | `CPXchgbds` | Independently optional lower/upper | +| Linear row sides | `ScenNRHS` on existing rows | `CPXchgrhs`; ranged rows have separate representation | Optional lower/upper on ranged rows | +| Objective constant | Not one of the documented four scenario overrides | `CPXchgobjoffset` | Explicit finite offset override | +| Same variables/matrix | Base structure retained | Model-edit workflow can change more | Structure, types and objective sense fixed | +| Original base solve | Include an empty scenario | Solve the original object | Include an empty definition explicitly | +| Search sharing | Integrated multi-scenario solve | Reoptimization verified | Serial session state reuse only | +| Per-case outcome | Scenario values/objective/bound | Each solve has its own result | Full per-case status, checks, history | +| Export one scenario | `singleScenarioModel` | Ordinary changed model | Owning `materialize(id)` snapshot | + +The extraction comparison is supported by Gurobi's +[model-query reference](https://docs.gurobi.com/projects/optimizer/en/current/reference/c/queries.html). +The commercial references are primary documentation fetched on 2026-09-05. +Gurobi links use mutable `current` documentation (the +[documentation index](https://docs.gurobi.com/projects/optimizer/en/current/index.html) +identifies release 13.0); a release-specific feature URL could not be fetched, so no frozen-source +claim is made. IBM references above explicitly identify 22.1.2. Implementation +should record solver versions with results, independently of these reference +versions. + +## Candidate API + +Names below are proposed, not declarations already present in installed headers. +The first implementation should add `scenarios.hpp`, `scenarios.cpp`, +`test/optimize/scenarios.cpp`, a fake-coordinator fixture, and `SCENARIOS.md`. +C/Python bindings and build registration follow after the C++ contract passes. + +```cpp +struct ScenarioVariableBounds { + Variable variable; // handle in original base + std::optional lower, upper; // absent = inherit base side +}; +struct ScenarioRowBounds { + Constraint row; // handle in original base + std::optional lower, upper; +}; +struct ScenarioDefinition { + std::string name; + std::vector objective_coefficients; // absolute overrides, NOT increments + std::optional objective_offset; + std::vector variable_bounds; + std::vector row_bounds; +}; +struct ScenarioId { + ModelId batch_id = 0; + std::uint64_t index = 0; +}; +enum class ScenarioReuse { Automatic, Cold }; +struct ScenarioBatchOptions { + SolveOptions solve; + ScenarioReuse reuse = ScenarioReuse::Automatic; + // Explicit structural caps; final defaults require allocation tests. + std::size_t max_scenarios = 1000; + std::size_t max_patch_entries = 1000000; + std::size_t max_saved_value_slots = 10000000; + std::size_t max_work = 100000000; +}; +enum class ScenarioRunState { NotStarted, Attempted }; +enum class ScenarioBatchCompletion { Rejected, Interrupted, Complete }; + +class ScenarioBatch { // private immutable shared artifact +public: + ModelId id() const; + const ModelSnapshot& base() const; + std::size_t size() const; + ScenarioId scenario(std::size_t index) const; + const ScenarioDefinition& definition(ScenarioId) const; + ModelSnapshot materialize(ScenarioId) const; // owning copy, original slot order + Variable map(Variable original) const; // reject foreign/deleted base IDs + Constraint map(Constraint original) const; +}; +struct ScenarioCheck { + bool identity_valid = false; + bool objective_matches = false; + ValidationReport validation; // scenario's original constraints +}; +struct ScenarioOutcome { + ScenarioId scenario; + ScenarioRunState state = ScenarioRunState::NotStarted; + std::optional result; // owning private scenario identity + std::optional check; // absent until candidate checked + SessionStatistics reuse_delta; // zero for cold/native + double elapsed_seconds = 0; +}; +struct ScenarioBatchResult { + std::shared_ptr batch; // absent if admission failed + ScenarioBatchCompletion completion = ScenarioBatchCompletion::Rejected; + std::optional stop_reason; // never a batch objective status + std::optional offending_scenario; + std::string message; + std::vector outcomes; // all admitted cases, input order + SessionStatistics reuse_statistics; + std::size_t attempted = 0, resolved = 0; + double elapsed_seconds = 0; + bool all_resolved() const; + double value(ScenarioId, Variable original) const; +}; +ScenarioBatchResult solve_scenarios(const ModelSnapshot&, + const std::vector&, const ScenarioBatchOptions& = {}); +ScenarioBatchResult solve_scenarios(const Model&, + const std::vector&, const ScenarioBatchOptions& = {}); +``` + +`value` resolves an original base variable only through its owning batch mapping +and the selected scenario's validated result. It never rewrites that result's +owner to the base model. Different scenarios may have different feasible sets and +objectives; a feasible scenario point need not satisfy the base model. A separate +caller-requested validation against the base is possible, but is never implied. + +## Admission and minimal supported class + +Admit every definition before the first backend call. This makes malformed later +scenarios deterministic errors instead of consuming a partial solve budget first. +A failed admission returns no executable batch or partial materialization and +leaves the caller's model, definitions and sessions untouched. Report the first +invalid scenario/field in input order; resource/time/cancel can stop admission +before all errors have been inspected. No backend infeasibility claim follows +from malformed input. + +Definitions use absolute values relative to the base, never changes relative to +the preceding scenario. Empty scenarios mean exactly the base; duplicate/empty +names are allowed because typed ordinal IDs supply identity. Identical definitions +are retained as separate requested cases. Missing objective terms inherit the base +coefficient, which is zero if absent. An explicit zero override removes that term +from canonical sparse storage. An absent offset inherits the base offset. + +Reject foreign, deleted or malformed IDs, duplicate coefficient overrides, +duplicate variable/row records, and records with neither side specified. Lower +and upper in a single record are applied simultaneously. Reject NaNs and +nonfinite objective values; bound infinities follow existing `Model` rules. +Reject reversed final bounds as InvalidModel, matching current model admission; +don't reinterpret invalid bound pairs as an infeasible mathematical scenario. +Binary bounds must remain within `[0,1]`. No hidden coercion, clamping, rounding, +or sum-of-duplicates interpretation is permitted. A row's unspecified side is +inherited independently; changing both sides of an equality requires specifying +both sides. The base objective sense stays fixed. + +The smallest implementation scope is ordinary linear models with Continuous, +Integer and Binary variables, including inactive variable/row slots and constant +rows. Each case must satisfy its requested backend's existing numerical or exact +admission rules; no continuous relaxation substitutes for an integer solve. +SemiContinuous/SemiInteger, active indicators and typed globals are explicitly +Unsupported initially, even if the base is solvable through an existing one-shot +route. Protected origin records/metadata must not be silently erased to enter +this class. Initially reject nonempty indicator/global metadata, including its +inactive history, if a complete owner-remapping implementation is not included; +state that additional granularity limit in capabilities. This conservative bound +is preferable to accidentally retaining invalid lowering guards after widened +scenario bounds. Supporting harmless inactive metadata is a separate mapped-copy +test before removing that restriction. + +This is a restriction of the new workflow, not a reduction of existing `solve`, +Native, global, QP, LP-observation or session capability. An explicit Numerical +HiGHS case remains Numerical; an explicit Exact Native case keeps exact native +admission. Certified remains Unsupported. Current Auto routing is preserved: +ordinary linear Auto requests go to HiGHS, including the existing behavior for +an unsupported Exact request. Never use a private numerical session to turn an +explicit Native request into a HiGHS solve. Cold mode and Automatic mode must +choose the same backend class for an admitted request. + +For first delivery, reject nonempty common `solve.primal_start` explicitly rather +than silently dropping it or applying a base-feasible start to incompatible +scenarios. A later per-scenario start field can provide precise semantics. Existing +session reuse may submit an earlier incumbent only through its normal independent +revalidation against the new scenario; this is an implementation hint, not evidence +that any scenario was solved. No scenario-specific callbacks or solver policies +are introduced in this slice. + +## Ownership, reconstruction and session reuse + +Own the complete validated original base once, plus normalized sparse definitions. +Reserve a fresh private model owner through the existing Model ID allocation path. +Use that private owner consistently across materialized scenarios so the session +can reuse matrix state. Give scenario `i` a distinct private revision `i+1`, after +checked ordinal/revision range validation. These revisions are internal identities, +not the original Model's mutation count. Same-owner different-scenario results +must still fail an exact revision check against the wrong scenario. + +All original slots, including tombstones, survive materialization. Rebase every +variable, row and objective-term handle to the private owner. Validate the complete +private snapshot after patching; an unrewritten reference fails closed. No helper +variables or rows are needed for the ordinary linear first slice. Do not rebuild +only the active rows and compact away tombstones. Do not overwrite original result +identity merely to expose convenient base-variable lookups. + +`ScenarioBatch` has a private constructor and const owned data, so callers cannot +alter its definitions after admission. `materialize` returns a new owning copy with +the documented private owner/revision; altering that copy cannot mutate the batch. +`ScenarioBatchResult` owns the artifact after the input Model, a temporary snapshot, +the input definitions and the local session are destroyed. Outcome results already +own their primal vectors, masks, scalars and messages. Store one base and sparse +patches, not a full matrix snapshot per scenario. Result storage is necessarily +proportional to retained primal slot vectors; cap the worst-case scenario-count +by original-slot-count product with checked multiplication before solving. + +Use a batch-private `SolveSession` in Automatic mode for HiGHS; do not mutate a +user-supplied session in the first API. Materialize every case from the base, even +when reusing a backend instance. The existing session already compares actual +matrix/types/slots and modifies bounds/costs/row sides/offsets; it doesn't trust +revision alone. Compatible edits can retain a basis. Earlier MIP witnesses are +rechecked before reuse. MIP trees and cuts are not retained by the current session. +Cold mode uses independent one-shot solves. Native cases always use the existing +one-shot native backend; session reuse counters are zero, not fabricated. + +Capture counter deltas for model loads, incremental updates, unchanged models, +basis warm starts and incumbent starts. Check monotonicity/overflow instead of +subtracting unsigned counters blindly. Counts describe attempts to reuse state, +not measured speedups or proof reuse. Do not cache or infer solved outcomes across +identical/dominated scenarios in the first version: the backend remains responsible +for every recorded solve. `materialize` is the path to explicitly run diagnostics, +LP observations or other supported workflows on an individual scenario later. + +## Shared budgets and the missing node-accounting prerequisite + +Construct one outer `SolveBudget` before copying, normalization, allocation or +admission. Every loop checks its time/cancel state; structural work/storage caps +are separate from solver nodes. Pass only `remaining_seconds()` and the same +cancellation token to a stage. A local solve budget is an allowance inside that +outer deadline, not a fresh grant of the original limit. Recheck the outer budget +immediately before entering the backend, after return, around validation, before +publishing a candidate/status and after destroying temporary/backend state. +Future internal shared-budget entry points can pass the same budget object +instead of deriving a remaining-time allowance. + +Define structural cap units explicitly: scenarios, patch records, saved original +value slots, and metered coordinator element visits. Checked storage-cap overflow +or exhaustion returns MemoryLimit; coordinator work exhaustion returns +IterationLimit with a message naming that cap, not a claimed solver iteration +count. A zero cap permits zero units. Caps apply before reserve/copy and during +normalization, validation and materialization, with deterministic work charging. +An empty request completes only after valid admission and a final budget gate. + +A returned candidate is not promoted merely because it was timely inside a local +stage if the outer batch is already stopped. Earlier fully checked and published +scenario outcomes remain intact; the current outcome preserves its actual stopped +status and no late candidate is accepted. Unstarted cases have no SolveResult, +no solution and no bound. Cancellation takes precedence over time, then nodes, +matching SolveBudget. Cooperative propagation/backend cleanup can overshoot wall +time; this does not authorize an additional solve or late publication. + +**Current gap:** `SolveResult` has no consumed-node field; HiGHS checks local +`mip_max_nodes` but does not add its deltas to a shared SolveBudget. Passing the +same positive node limit to every session call is therefore incorrect. A remaining +wall-clock allowance cannot solve this accounting problem. + +Recommended first delivery: absent node limit is supported; zero quota stops +before a backend call; a positive node limit on a multi-scenario request is +explicitly Unsupported until the following private adapter prerequisite is ready. +A single scenario can preserve ordinary one-shot node-limit behavior without +claiming cumulative node statistics. Do not claim a supported whole-batch node +budget while this restriction remains. If node-limited batches are a mandatory +acceptance requirement for the first delivery, implement the prerequisite first; +do not relax this gate. + +The required follow-up is a private stage adapter accepting the shared SolveBudget +and an optional backend/session state. For HiGHS, apply only the remaining node +quota and charge newly observed cumulative-run deltas once, including final info +and exception paths. Check counter reset/monotonicity against pinned 1.15.1 source. +For native BAB, reuse its existing BudgetStop statistics observer with the same +outer state; for frontier, charge admitted/probe nodes under its documented rules. +Continuous LP node usage is zero by contract; an unavailable MIP counter is not +zero. If usage becomes unknowable, stop the batch explicitly and retain earlier +outcomes, rather than opening another quota. No public ABI change is necessary +for an internal stage record containing `optional consumed_nodes`. +Backend-defined node units differ; a batch uses one selected backend class and +must report that definition. Exact node-boundary tests are required independently +of time tests, and public one-shot defaults must remain unchanged. + +## Status, validation and publication rules + +A scenario is resolved by a valid Optimal, Infeasible or Unbounded backend outcome +under that backend's documented guarantee. Optimal numerical outcomes retain their +requested solver-gap interpretation; don't force zero gap or relabel them exact. +InfeasibleOrUnbounded, Unsupported, InvalidModel, numerical/internal failures and +all limits remain explicit. Stop after the first unresolved/error outcome in the +first serial coordinator; later cases stay NotStarted. Continue after definite +infeasibility or unboundedness because scenarios are independent. + +A Complete batch means every requested scenario was resolved. A batch containing +all infeasible scenarios is still a completed batch; it is not a new proof that +the base model is infeasible. An empty admitted batch completes with no solve; +solving the base requires an explicit empty definition. Never aggregate unrelated +primal objectives or bounds into a synthetic best solution, expected value, or +worst-case robust objective. Those are separate user-defined mathematical models. + +Before accepting any candidate, verify raw backend model ID/revision, dimensions, +active mask and a finite optional primal objective. Reject NaN bounds or invalid +bound orientation; retain meaningful signed infinite bounds under the common +result contract, rather than conflating an infinite bound with an absent one. +Independently evaluate the +original base with the selected overrides, not only backend arrays. Use the common +validator and compensated objective evaluation including offset. Exact native +completion also needs checked integer validation in the admitted native range; +arithmetic inability is an explicit failure, never an Exact upgrade from a float +check. Recompute/compare the scenario objective and preserve genuine bound ordering +errors; no epsilon clamp to manufacture a zero gap. A valid point supplied beside +Infeasible disproves that status and must prevent resolved classification, even +if the vendor's `solution_validated` flag is false. Unknown optional fields stay +absent. No proof certificate is invented. + +All checks and allocating copies precede a single publication gate. If result +validation fails, stop with explicit invalid-evidence diagnostics; don't retain a +forged optimality status or rewrite its identity. Earlier outcomes and their +ownership remain valid. A timely incomplete feasible candidate can be retained +only with its original incomplete termination and no resolved claim. The local +backend cannot transfer a bound from another scenario or from an unvalidated +private snapshot. + +## Conformance, reuse experiments and rollout + +1. Exhaustively enumerate tiny signed Integer/Binary boxes for both senses, + different costs/offsets, zeroed/new objective terms, each bound side and each + row side. Compare every materialized feasible set and optimum with an evaluator + reading base plus raw definitions independently. Include an empty definition + between two edited cases to detect patch leakage. +2. Use analytic continuous LPs with known optima, fractional recourse, infeasible + cases and truly unbounded cases. Compare cold and reused results at unlimited + budget: status, objective, feasibility and permissible bounds, not a particular + degenerate primal/basis. Large-offset cancellation and bound ordering receive + separate adversarial tests. +3. Cover aliases of caller containers, post-call edits/destruction, tombstones, + identical scenarios, duplicate names, foreign IDs, wrong scenario revision, + missing masks, sparse objective zero/delete, ±infinite sides, conflicting + bounds, malformed late cases, empty batches and structural caps. Failed late + admission must have zero solver calls and no partial batch. +4. Inject deterministic fake stage outcomes/checkpoints for cancellation during + admission, materialization, solving, validation, publication and cleanup; test + zero deadline and no second call after exhaustion. Supply foreign/stale results, + invalid primal values, malformed masks/objectives/bounds, false infeasibility, + invalid counters and allocation failure. Earlier published outcomes must + survive, while unstarted slots stay explicitly empty. +5. Test actual missing-backend, explicit Native/Exact, Numerical HiGHS and + unsupported class/guarantee/start boundaries in core, HiGHS-only and combined + builds. Native ordinary integer outcomes must match cold `solve_native`; no + session fallback or global/indicator stripping is allowed. +6. Assert session counter behavior for compatible bounds/cost/offset/row edits, + unchanged cases and retained basis/incumbent validation. Replay scenarios in + different orders: unlimited mathematical outcomes must agree; solve time and + basis choices need not. Under a single finite total budget, compare safety and + accounting rather than expecting identical completed prefixes. +7. Once the private node bridge exists, use forced per-stage counts and real tiny + MIPs/native trees. Verify budgets below/equal/above each cumulative boundary, + counter resets, zero-node LPs, unknown counters, exception paths and saturation. + Never multiply the requested node limit by the number of scenarios. +8. Run assertions-enabled C++17 core/normal and complete facade/backend ASan+UBSan + tests, existing workflow/session regressions, installed consumers and the + uncontended FAST gate. Add C/Python only after ownership/status semantics are + stable; bindings must copy scenario results and retain typed mappings. + +After correctness passes, choose a fixed small subset of existing benchmark +models with bounded RHS/bound/cost perturbations and report cold-versus-session +loads, solves, wall time, memory and validated outcomes. Preserve baselines and +solver versions; separate correctness from timing, and don't infer a speedup from +reuse counters alone. The first feature needs no performance claim to be useful. +A shared-search extension requires independently scoped feasible regions, +scenario-specific bounds/incumbents, globally or selectively valid cuts, and +per-scenario exhaustion proofs. It is a later algorithm project, not a parallel +loop wrapped around these serial outcomes. diff --git a/docs/solver-parity/SCENARIOS.md b/docs/solver-parity/SCENARIOS.md new file mode 100644 index 0000000000..c28f8d5472 --- /dev/null +++ b/docs/solver-parity/SCENARIOS.md @@ -0,0 +1,180 @@ +# Owning serial scenario batches + +`scenarios.hpp` adds an explicit serial workflow for ordinary linear models. +Every scenario starts from one immutable base snapshot, applies sparse absolute +overrides, and receives its own owning result. HiGHS can reuse a private session; +explicit Native requests use the ordinary native solver. This API does not share +MIP search trees, combine scenario objectives, or construct a stochastic or robust +optimization problem. The commercial comparison and later shared-search/node +accounting work are in [the scenario design](SCENARIOS-DESIGN.md). + +```cpp +Model model; +auto production = model.add_integer(0, 100); +auto demand = model.add_row({{production, 1}}, 20, + std::numeric_limits::infinity()); +model.minimize({{production, 3}}, 5); + +ScenarioDefinition peak; +peak.name = "peak"; +peak.row_bounds = {{demand, 40, std::nullopt}}; +peak.objective_coefficients = {{production, 4}}; // replace cost 3 with 4 + +auto batch = solve_scenarios(model, {{}, peak}); // base is an explicit empty case +if (batch.all_resolved()) { + auto peak_id = batch.batch->scenario(1); + if (batch.outcomes[1].result->has_solution()) + double amount = batch.value(peak_id, production); +} +``` + +## Overrides and admission + +An omitted bound side, coefficient or offset inherits the base value. A zero +coefficient removes its sparse objective term. Overrides are replacements, +including when a scenario follows another changed case. Row and variable lower +and upper bounds are applied together, so a legal final interval never fails +because one side would be temporarily reversed. The objective sense, matrix, +types, variables and rows remain fixed. + +All definitions pass structural admission before any backend solve. Foreign or +deleted handles, duplicate overrides, records with no bound side, nonfinite costs +or offsets, NaN bounds and reversed final intervals return InvalidModel. Bound +infinities follow the existing Model contract: negative infinity is legal only +as a lower side, positive infinity only as an upper side. Binary bounds stay +inside `[0,1]`. Empty/duplicate names are allowed; names never identify a case. +Malformed later cases cause zero backend calls and no published batch artifact. + +The initial class is active Continuous, Integer and Binary variables and ordinary +linear rows, including constants and inactive variable/row slots. Any nonempty +indicator/global metadata is Unsupported, including harmless inactive history. +Active semi-variables and nonempty common primal starts are Unsupported. No +hidden constraints or metadata are erased to enter this class. Existing solve, +Native, QP and global APIs retain their separate support. + +Backend-specific limits still apply at each solve. A structurally valid scenario +can return Unsupported for a numerical range, native nonintegral data, requested +guarantee or unavailable backend. The workflow stops there and retains earlier +completed outcomes. Auto keeps the existing ordinary-linear HiGHS routing; it +does not silently switch an Exact request to Native. Explicit Native requests +retain their requested guarantee and native admission. Certified is not supplied +by either current backend. + +An empty valid batch completes without invoking a solver, after the admission +and budget gates. Solving the base requires an explicit empty definition. An +already cancelled token, zero deadline or zero node quota stops before any solve. + +## Ownership and evidence + +The admitted `ScenarioBatch` owns the historical base and definitions. It creates +one fresh private model owner and gives case `i` revision `i+1`. Every original +slot, including tombstones, survives. All private variable, row and objective +handles are rebased. `materialize(id)` returns a new owning snapshot; editing it +cannot change the artifact. `map(original_handle)` checks the base owner and live +slot. Outcomes never rewrite private result identity to the base model. + +`ScenarioBatchResult.model_id/revision` identifies the caller's original source, +even after rejected admission. `batch` is absent if admission failed. Successful +admission creates one outcome slot per requested case, in input order. Model +edits/destruction, definition edits and local session destruction do not invalidate +the batch, materializations, result vectors or mapped value access. + +A returned backend result is checked for exact owner/revision, requested guarantee, +slot dimensions and active mask. Every claimed incumbent is independently checked +against the materialized original model. Its objective must equal the same +compensated original-model reevaluation used by the common result adapter; the +offset participates in that evaluation. Explicit Native witnesses additionally +pass a checked integer evaluator of original domains, rows and objective. This +does not upgrade a requested Numerical guarantee or fabricate a proof certificate. + +`ScenarioCheck.identity_valid` concerns the raw result identity. The separate +`candidate_examined` flag determines whether `validation`, `objective_matches` +and `exact_witness_validated` contain candidate checks. A status-only reply can +have a checked identity without an available candidate. A feasible raw candidate +beside Infeasible disproves that status even if `solution_validated` is false. +Finite original variable bounds that bound the objective in the improving +direction also refute an Unbounded reply. Other infeasibility/unboundedness +completion claims remain the backend's stated guarantee, not new independent +proof certificates. + +NaN bounds and incorrect bound ordering produce explicit invalid-evidence failure. +Meaningful signed infinite bounds remain present, with unavailable gaps under the +ordinary result contract. Missing bounds remain absent; no zero gap is invented. +Optimal requires an independently valid incumbent and actual backend Optimal +completion. Numerical completion keeps the backend's requested gap convention; +this workflow does not force zero MIP gaps or call numerical outcomes Exact. +Exact Optimal additionally requires a present finite global bound equal to the +independently checked exact objective. Unknown termination enumerators are invalid +evidence, rather than new public stop reasons. + +## Completion, reuse and budgets + +Complete means every requested case reached Optimal, Infeasible or Unbounded +under its backend contract. Definitive infeasibility or unboundedness does not +stop later independent scenarios. The first unresolved status, error or limit +stops the serial coordinator. Later outcomes remain NotStarted without a result. +Earlier checked outcomes survive. A timely incomplete incumbent can be retained +with its incomplete status; a late current candidate is discarded. A final +cleanup timeout can leave all individual cases resolved while the batch remains +Interrupted, so `all_resolved()` also checks batch completion. + +Automatic reuse creates a batch-private HiGHS SolveSession. Each next model is +materialized anew from the base; the session's actual content comparison controls +reuse. A compatible LP basis can survive, and a previous MIP incumbent is only a +hint after original-model revalidation. No MIP trees/cuts are retained. Cold uses +independent one-shot solves. Native always uses one-shot solves. The recorded +session counters and per-stage deltas describe the latest observed session +state, not a speedup claim. Cold/Native counters are zero by definition. + +One outer steady clock starts at workflow entry, including options, source +acquisition, admission, materialization, solve, independent checks and cleanup. +Each stage receives only the remaining time plus the same cancellation token. +No late stage can publish an incumbent or complete the batch. Cancellation takes +precedence over time, then node limits. Calls and allocation cleanup are +cooperative; wall time can overshoot while an indivisible operation finishes. + +Node scope is deliberately narrower: absent quota is supported; zero stops before +any solve; a positive quota with one scenario is forwarded once under the ordinary +backend contract. A positive quota with multiple scenarios is Unsupported until +consumed-node reporting can charge one shared count. It is never independently +reset for every scenario. No cumulative consumed-node value is reported. + +Storage caps cover scenario count, total objective/variable-bound/row-bound patch +records, and the product of scenario count and original variable-slot count. +Offsets consume their fixed definition storage rather than a patch record. +Checked cap overflow/exhaustion returns MemoryLimit. `max_work` meters coordinator +element visits: variable/row/term entries in source passes; variable/row slots in +scratch scans; patch/definition entries; name bytes before copied storage; and +exact-validator term/row visits. Each invocation of a source pass charges again. +Backend internals are not counted. Exhaustion returns IterationLimit with a +coordinator-cap message, not a backend iteration count. Zero caps allow zero units. +The Model overload must acquire its initial owning snapshot through the existing +Model API; this indivisible copy is included in time, but its allocation precedes +the snapshot-based structural preflight. Subsequent owned copies are precharged. + +## Tests and extension boundary + +The normal test compares tiny signed integer/binary scenario feasible sets in +both directions with an independent raw base-plus-overrides enumerator. It checks +both objective senses, widened/tightened bounds, costs/offsets, constant rows, +tombstones, history, analytic LP and continuous recourse examples, cold/session +equivalence, actual Native and missing-backend behavior. + +The separately compiled coordinator fixture substitutes an independent finite-box +oracle only at the private solve boundary. It injects malformed owner/revision, +mask/objective/guarantee/bounds, false infeasibility, incomplete witnesses, +allocation failure and cancellation at admission/solve/check/cleanup gates. Every +coordinator-work boundary is exercised, and the single-case versus multi-case node +contract is checked directly. The seam is absent from production builds. + +The feature remains explicit. Shared node accounting, per-case starts, mapped +indicator/semi/global scenarios, parallel execution and shared search are separate +future changes. Performance experiments must compare actual validated cold/reuse +runs; session counters alone do not establish an improvement. + +Guarantee admission is independent of backend availability and batch size: +Numerical is admitted on all routes, and Exact requires explicit Native. +Certified and Auto/HiGHS Exact are Unsupported before any attempted scenario, +including an empty batch. An empty batch with an admitted guarantee is Complete +without invoking a backend. Attempted supported requests retain strict raw +result-guarantee validation; unsupported guarantees are not relabeled Numerical. diff --git a/docs/solver-parity/SESSIONS.md b/docs/solver-parity/SESSIONS.md new file mode 100644 index 0000000000..02053b7569 --- /dev/null +++ b/docs/solver-parity/SESSIONS.md @@ -0,0 +1,62 @@ +# Persistent solve sessions + +`SolveSession` owns a HiGHS instance across calls and supports numerical LP/MILP +reoptimization. `Backend::Auto` within a session selects HiGHS; active globals +are unsupported there. The one-shot `solve` uses the same numerical pipeline +for linear models, and routes active native globals to the native compiler. + +```cpp +#include +namespace O = Gecode::Optimize; +O::Model model; +auto x = model.add_continuous(0, 100); +auto demand = model.add_row({{x, 1}}, 4, 100); +model.minimize({{x, 2}}, -3); +O::SolveSession session; +auto before = session.solve(model); // objective 5 +model.set_bounds(demand, 8, 100); +auto after = session.solve(model); // objective 13, compatible LP basis retained +auto statistics = session.statistics(); +``` + +Every call validates the original snapshot, compiles it, and compares actual +content. A caller cannot bypass invalidation by editing a public snapshot +without incrementing its revision. Model identity, active variable/row slots, +original variable types and the sparse matrix determine compatibility. Changes +to any of those reload the backend. Compatible column bounds, row sides, +objective costs, sense and offset changes use HiGHS update methods. Pure naming +changes have no mathematical effect and leave the backend names internal. + +LP updates retain the available basis; HiGHS decides how to use it. MIP search +trees and cuts are discarded on every call. A previous MIP incumbent is a hint +only after the independent validator checks it against the new original model, +including its logical indicators. An explicit user start takes precedence. +Changing model identity or structure discards the old hint. Limits never make +an invalid old assignment a feasible incumbent. + +Each call receives a fresh monotonic budget. Backend timers, optional node +limits, gaps, tolerances and seed are set for that call. Callbacks are detached +on normal completion and exception paths, before their local data is destroyed. +Invalid conversion or backend/numerical failure discards cached backend state; +invalid options rejected before conversion leave it unused. Budget expiry before +conversion likewise does not run the cached model. Deadline/cancellation checks +remain cooperative and may overrun inside backend calls. + +Statistics distinguish successful model loads, compatible updates, unchanged +models, runs entered with a valid retained LP basis, and submitted revalidated +MIP hints. A retained basis or submitted hint is not a claim of a speedup. +`reset()` discards state and counters. Moving transfers ownership; a moved-from +session rejects solves until reset. Historical `SolveResult` values remain valid +after either operation. Concurrent use of one session is not supported; +independent sessions have separate model state and use one HiGHS worker each. + +Persistent native Gecode sessions, basis import/export, LP sensitivity/dual +records, action callbacks, interrupted MIP-tree reuse and mixed worker counts +are still unsupported. Set `SolveOptions::backend = Backend::Native` for the explicit native +one-shot bridge described in [NATIVE.md](NATIVE.md). + +`test/optimize/session.cpp` compares edited sessions with cold solves, checks +seeded bounded-integer edits against exhaustive enumeration, and covers type, +matrix and identity changes, tombstones, historical results, infeasible and +unbounded revisions, malformed input, start precedence, moving and reset. +The complete sanitizer build instruments the adapter and HiGHS together. diff --git a/docs/solver-parity/SPARSE-LP.md b/docs/solver-parity/SPARSE-LP.md new file mode 100644 index 0000000000..1ceb369d9a --- /dev/null +++ b/docs/solver-parity/SPARSE-LP.md @@ -0,0 +1,311 @@ +# Sparse certified binary and bounded-integer LP relaxation + +The experimental LP relaxation now has a complete CSR path through model storage, +HiGHS import, exact certificate preparation and original Gecode constraint +posting. W5 now also has a separate explicit bounded-integer model, exact +interval certificate checker and bound-change-aware native propagator. The +original binary API remains strict. This experimental component does not change +the `Gecode::Optimize` API or its backend selection. + +## API and storage + +```cpp +namespace LP = Gecode::Experimental::LpRelaxation; +LP::SparseLinearModel model; +model.row_start = {0,2,4,6}; +model.column = {0,1, 1,2, 0,2}; +model.a = {1,1, 1,1, 1,1}; +model.b = {1,1,1}; +model.c = {1,1,1}; +auto backend = std::make_shared(std::move(model)); +// In a Gecode Space with binary IntVarArgs x and integer objective z: +LP::binary_linear_minimize(home,x,z,backend,LP::Frequency::EveryNode); +``` + +The model is `min c*x`, with `a*x >= b` and `x` binary. Row `i` occupies +`[row_start[i],row_start[i+1])`; `a[k]` belongs to `column[k]`. Offsets must start at +zero, end at the number of values and be nondecreasing. Columns in each row must +be strictly increasing, within range, with no duplicate indices or explicit zero +values. Empty rows and the default empty model are supported. Malformed public +CSR data is rejected before import, posting or certificate arithmetic. Individual +coefficients retain the existing magnitude limit of `1e9`; native posting also +checks Gecode dimensions and objective limits. + +`SparseLinearModel` contains only CSR arrays and the dense row RHS/objective +vectors. `SparseBackend` takes an immutable owned copy, with no dense matrix +shadow. HiGHS receives CSR directly; its internal working representation and +basis are additional storage. Native rows allocate coefficient/variable arrays +only for the nonzeros in that row. Matrix import, validation and posting take +`O(rows + columns + nnz)` input work. HiGHS itself may perform more work or allocate +additional factorization storage depending on the problem. + +The original `LinearModel {a,b,c}`, `Backend(LinearModel)` and dense posting/checker +entry points remain available. `Backend` now derives from `SparseBackend` and +retains its original public `const LinearModel model`. It converts constructor +input to CSR once, then uses CSR on subsequent LP/certificate/propagation calls. +Consequently the legacy backend retains both representations; choose +`SparseBackend` for sparse storage. `LP::sparse_model(dense)` converts the current +contents of a mutable dense model. Dense posting reads the current contents on +each call. There is no hidden cache keyed by a mutable model's address, and +mutating constructor input cannot alter either published backend model. + +The standalone checker accepts +`LpCertificate::SparseMatrixView{row_start,column,values,columns}`. The view borrows +arrays only for that call; a prepared `Certificate` owns its residual data. +Optional `PreparationStats` counts rows visited, residuals initialized and +nonzero coefficient products. Validation visits CSR entries, then arithmetic +visits only entries whose row has a nonzero quantized multiplier. The legacy +dense checker overload converts on each preparation; repeated evaluation should +reuse the resulting certificate or use CSR directly. + +## Proof and ownership invariants + +HiGHS supplies candidate row multipliers, not pruning decisions. Multipliers are +quantized to nonnegative `q/2^20`. The checker constructs the exact affine bound + +``` +(q*b + sum_j min((2^20*c - A^T*q)[j] * lower[j], + (2^20*c - A^T*q)[j] * upper[j])) / 2^20. +``` + +All products/sums use checked signed 128-bit arithmetic. Integer ceiling is valid +because this component's objective is integral. Invalid dimensions, malformed +CSR, nonfinite/out-of-range multipliers and arithmetic overflow produce no +certificate, with caller outputs unchanged. Platforms without the existing +checked 128-bit support keep the conservative no-certificate fallback. Binary +conditional filtering uses the same exact residuals and checks its arithmetic. +Sparse storage does not introduce floating-point summation into certification. + +The shared backend still serializes access. Every LP call replaces all column +bounds, including bounds relaxed when another sibling uses the workspace. A +simplex basis is a hot start only. Spaces/clones share backend ownership and may +reuse immutable certificates, evaluated against their own boxes. Tests cover +sibling recovery after an infeasible numerical LP and concurrent serialized +callers. Original native constraints and objective equality remain posted. +Numerical infeasibility alone never fails a Gecode space. For a completely zero +matrix, the backend uses the exact zero-multiplier box bound without calling +HiGHS; original native constant rows still enforce infeasibility. + +## Explicit bounded integers + +```cpp +LP::BoundedIntegerModel model; +model.linear.row_start = {0,2}; +model.linear.column = {0,1}; +model.linear.a = {1,1}; +model.linear.b = {-1}; +model.linear.c = {2,9}; +model.lower = {-3,-3}; +model.upper = {3,3}; +auto backend = std::make_shared(std::move(model)); +LP::IntegerOptions options; +options.frequency = LP::Frequency::EveryNode; +options.bound_tightening = true; +options.bound_change_interval = 4; +// x must already contain initialized IntVars; existing holes are preserved. +LP::integer_linear_minimize(home,x,z,backend,options); +``` + +The objective is exactly `min c*x`, with integral coefficients, finite integral +domains and rows `A*x >= b`. Negate a row to express `<=`, or post both directions +for equality. There is no objective offset, floating coefficient, variable-type +inference or arbitrary coefficient rounding. `BoundedIntegerBackend` is unrelated +to `SparseBackend` in the type hierarchy: it cannot silently enter the binary +posting API. `validate_integer_model` and `post_native_integer` provide explicit +validation and original native posting without an LP backend. + +Backend construction validates and owns the model. Every endpoint must lie in +Gecode's finite integer limits, domains must be nonempty, and coefficients/RHS +retain the magnitude limit of `1e9`. To keep original native linear propagation +within exact arithmetic, every row must satisfy +`sum max(abs(a_j*lower_j),abs(a_j*upper_j)) <= Int::Limits::max`. The objective +has the same check with `Int::Limits::max/2`, reserving the other half for its +equality's objective variable. Products fit int64 under these endpoint/coefficient +limits and sums are checked before addition. Unsupported ranges throw +`invalid_argument` before posting; tighten domains or use an exactly equivalent +integer formulation. These conservative limits can reject mathematically valid +models. They are deliberate proof boundaries, not declarations of infeasibility. + +Native posting intersects the supplied variables with the original domains, +preserves existing holes, bounds the objective to its checked expression range, +and posts every original sparse row and objective equality. Gecode retains the +actual domains; the continuous LP sees their interval hulls. Later LP boxes must +be subsets of the original model domains. Shared calls restore all endpoints, +including looser siblings; the backend remains serialized. Numerical LP status +and objective values alone never justify pruning. + +The standalone checker exposes `Certificate::lower_bound_integer`, +`Certificate::filter_integer` and dense/CSR `integer_lower_bound` helpers. Unlike +the native adapter, it accepts full int64 endpoints whenever its checked int128 +arithmetic and int64 result succeed. Existing `lower_bound` and `filter` remain +binary. With `s=2^20`, residual `r=s*c-A^T*q`, constant `q*b`, and original-box +numerator `B=q*b+sum min(r_j*l_j,r_j*u_j)`, a cutoff `c*x <= U` requires + +``` +r_j*x_j <= s*U - (B - min(r_j*l_j,r_j*u_j)). +``` + +Positive residuals give an upper bound by integer floor division; negative +residuals give a lower bound by integer ceiling division. Zero residuals need no +individual cut. Every cut uses the same original box, so simultaneous +intersections are safe. `IntegerFilterResult` returns the integer lower bound, +intersected endpoint arrays, and an infeasibility flag. When infeasible, its +endpoint arrays have no further semantic meaning. Checked endpoint products, +additions/subtractions, signed minimum divided by `-1`, and quotient narrowing +fail closed, preserving the caller's result on failure. A prepared certificate +is valid for its original row/objective data only; it has no mutable public +residual fields or association with arbitrary later model edits. + +`IntegerOptions` defaults to a bound-only LP at each observed interval change. +The root is always attempted; `bound_change_interval` counts variables whose +lower or upper endpoint changed since the previous propagation observation. +It does not wait for binary assignments. Bound tightening is opt-in. Retained +certificates can react to objective cutoffs and narrower boxes without an LP +call; interval holes and objective-only events do not count as LP reoptimization +events. Root frequency with tightening retains that certificate in descendants. +Clones copy their own scheduling state while sharing immutable certificates and +backend ownership. `Stats::variable_bound_tightenings` counts changed variable +intervals, and `variable_fixings` still counts resulting assignments. + +## Validation + +These are correctness/storage checks, not timing benchmarks: + +- Existing standalone certificate edge/overflow tests and 3,000 exhaustive + randomized binary models. +- `sparse-certificate.cpp`: malformed offsets/indices, duplicate and zero entries, + corrupted multipliers, exact arithmetic overflow, unchanged failed outputs, + 3,000 dense/CSR comparisons with independent assignment/filtering oracles, and + looser sibling boxes. Diagonal matrices of size 32,768 and 65,536 verify linear + container storage and exact operation counts; corresponding dense int64 + matrices would occupy 8 and 32 GiB. +- `backend.cpp`: original tests plus dense/CSR equivalence over all 27 boxes of a + triangle, immutable input snapshots, malformed CSR rejection, zero matrices + and serialized sparse sibling calls. +- `propagator.cpp`: 120 independently enumerated models in both storage forms, + including negative costs, empty/infeasible/constant rows and fixed variables. + Native, root/node bounds, root/node fixing and throttled fixing run DFS/BAB at + three recomputation distances: 8,640 configurations. Checks include complete + solution sets, optimal objectives and backend disposal. +- `sparse-storage.cpp`: a 16,384-square diagonal model passes backend import, + native actor posting and exact certification in both binary and signed integer + forms under a 16 MiB single-C++-allocation + guard. Dense int64 materialization would require 2 GiB. The observed largest + allocation in the tested build was 1 MiB. This guard does not assert a bound on + total memory or numerical factorization memory for arbitrary models. +- `integer-certificate.cpp`: 3,000 independent signed box/cut oracles, 625 strict + interval cuts and 14,669 cutoff-feasible witnesses; dense/CSR equivalence, + negative division, fixed/empty boxes, zero residuals, looser siblings, corrupted + candidates, int64 extrema and checked int128 overflow with unchanged results. +- `integer-backend.cpp`: signed original domains, fractional LP optimum 4.5 + certified as integer bound 5, immutable input, sibling recovery, 80 serialized + calls, zero matrices, and rejection at native domain/activity proof boundaries. +- `integer-propagator.cpp`: 80 independently enumerated signed models in 1,920 + DFS/BAB configurations; all original solutions and optima, holes, fixed/empty + models, clone/recomputation/disposal behavior, nonassignment bound scheduling, + and a targeted residual interval cut checked against every cutoff-feasible + assignment. +- `integer-driver.py`: native/LP integer modes, warm/cold starts, both branching + policies and legacy dense/CSR binary compatibility checked against independent + exhaustive enumeration; malformed/fractional/infinite input is rejected. + +All eight C++ tests pass with C++17, assertions enabled, and +`-Wall -Wextra -pedantic`, including ASan+UBSan builds. The sanitizer run instruments +the test/adapter code, HiGHS, and the native Gecode support/kernel/search/integer +libraries; those native libraries contain the `ActorLink` sentinel correction. +Address and undefined behavior errors halt the tests. Leak detection is disabled +for the macOS run, so this is not a sanitizer leak-detection claim; explicit +shared-owner lifecycle assertions still run. Use the same instrumentation for +HiGHS and the adapter: mixing instrumented libc++ vector operations with an +uninstrumented numerical dependency is unsafe. + +The standalone tests can be compiled from the repository root without any solver: + +```sh +mkdir -p build/sparse-lp +c++ -std=c++17 -Wall -Wextra -pedantic -UNDEBUG -I. \ + experiments/lp-relaxation/tests/certificate.cpp -o build/sparse-lp/certificate +c++ -std=c++17 -Wall -Wextra -pedantic -UNDEBUG -I. \ + experiments/lp-relaxation/tests/sparse-certificate.cpp -o build/sparse-lp/sparse-certificate +build/sparse-lp/certificate +build/sparse-lp/sparse-certificate +c++ -std=c++17 -Wall -Wextra -pedantic -UNDEBUG -I. \ + experiments/lp-relaxation/tests/integer-certificate.cpp -o build/sparse-lp/integer-certificate +build/sparse-lp/integer-certificate +``` + +For the binary/integer backend and propagator tests and `sparse-storage.cpp`, use the configured +native Gecode build include directory **before** the source directory, plus the +HiGHS source/generated include directories. Link HiGHS and the existing native +`gecodeminimodel`, `gecodeint`, `gecodesearch`, `gecodekernel`, `gecodesupport` +libraries and their normal platform dependencies. Tests are header based and +must compile against the changed source checkout. Existing experiment build +commands still compile the expanded backend and propagator tests; compile the +additional standalone sources explicitly until they are added to a build target. +Native libraries and source headers must come from the same kernel revision; +in particular, do not mix older brancher sentinel headers with libraries built +after the `ActorLink` sentinel correction. + +## Opt-in experiment route + +The isolated `experiments/lp-relaxation/driver.cpp` accepts a final `--sparse` +argument. Its input parser writes CSR directly, validates incumbents by nonzeros, +and uses sparse native posting/backend construction. It keeps the original +six-argument behavior as the default, and labels output `matrix_storage` as +`dense` or `csr`. Both the native-only executable and the `WITH_LP` executable +support the flag. For example, using the existing experiment build outputs: + +```sh +path/to/lp INPUT node size 5000 0 1 --sparse +path/to/stock INPUT none size 5000 0 1 --sparse +``` + +Compare feasibility/objective and independently validate returned assignments +before collecting performance data. The sparse parser retains the experiment's +10,000-row/column limits but removes the dense matrix product limit for the +explicit sparse route. The main solver-bench experiment and its defaults are +unchanged. No new timing results or claimed speedups accompany this slice. + +The new `--integer` route always uses CSR. It requires a literal `bounds` and +`n` lower/upper pairs immediately after the objective coefficients; sparse rows +and the incumbent trailer follow as before. Example with optimum `-23`: + +```text +2 1 +2 9 +bounds -3 3 -3 3 +-1 2 0 1 1 1 +incumbent 1 -3 2 +``` + +```sh +path/to/lp INPUT node size 5000 0 1 --integer +path/to/lp INPUT root-tight size 5000 1 1 --integer +path/to/lp INPUT node-tight size 5000 1 1 --integer +path/to/stock INPUT none size 5000 0 1 --integer +python3 experiments/lp-relaxation/tests/integer-driver.py \ + --lp path/to/lp --native path/to/stock +``` + +`root-tight` and `node-tight` enable exact interval cuts and are accepted only +for integer inputs. Output adds `variable_domain` (`binary` or `bounded-integer`) +alongside `matrix_storage`; consumers should not infer variable domains from +the storage format. Integer incumbents are checked against every original row +and domain, and unsupported extra trailing content is rejected. The existing +default and `--sparse` binary inputs retain their format and behavior. + +## Remaining W5 gates + +This completes the finite bounded-integer proof path within the stated native +range restrictions. It does not add continuous objectives, first-class +semi-continuous/semi-integer domains, objective offsets, rational coefficient +normalization, mixed-variable relaxation groups or a public Optimize-to-native-LP +bridge. External native integer-domain holes remain enforced, but are not new +typed domain metadata in this model. Continuous objectives must never receive +the integer-ceiling rule. The LP budget is a bounded work attempt, so a valid +certificate need not be the best LP bound. The existing per-call limits remain +10,000 simplex iterations and an additional 0.2 seconds of HiGHS runtime. The +workspace has no caller cancellation/deadline parameter; a future public bridge +must account for that cooperative call latency or extend the contract. These +limits are not a hard wall-clock guarantee for a complete search. Shared LP pooling or parallel basis +ownership remains deferred; serialized workspace access is intentional. diff --git a/docs/solver-parity/VALIDATION.md b/docs/solver-parity/VALIDATION.md new file mode 100644 index 0000000000..2e046ef5a9 --- /dev/null +++ b/docs/solver-parity/VALIDATION.md @@ -0,0 +1,751 @@ +# Validation record + +## Adaptive native size-boundary method + +The [adaptive study](ADAPTIVE-BOUNDARIES.md) has sixteen focused generator and +runner tests covering preserved input blocks, larger original-model validation, +independent version searches, confirmation and budget gates. Each version stops +expanding after a failed size and searches its remaining bracket; later failed +confirmations remain recorded. Independently checked witnesses establish original +feasibility and objective values. Exact optimality remains a backend claim; +there is no independent reference-optimum computation during adaptive trials. +The earlier fixed studies retain their own measurements and validation records. + +## Seven-category native scaling measurement + +The [category scaling study](CATEGORY-SCALING.md) records all 132 observations +from 33 frozen cases, two paired repetitions and ten-second solver limits. +All returned original-model witnesses validate. Before reports 50 Optimal and +16 TimeLimit results; current reports 58 Optimal and 8 TimeLimit. Whole +invocation: 277.4355438 seconds. Knapsack's main size requires both distributions +and both repeats, rising from 32 to 384 model variables. Assignment, facility, +bin packing, production, routing and queen maxima remain unchanged. The +single-variant 512-item stress group is retained separately and remains capped. + +Eight new generator tests and nine runner tests pass. Solver source/product and +the frozen ten-second driver are unchanged; loader and final integrity checks +pass. The earlier 52-run capacity study below remains a separate study, +not additional repetitions of this panel. No censored speed ratio or true +maximum problem size is claimed. + +## Native capacity scaling measurement + +The [capacity scaling study](CAPACITY-SCALING.md) records all 52 observations +from 13 frozen cases, two alternating paired repetitions and ten-second internal +solver limits. All 52 returned witnesses pass independent original-model checks. +Before proves 16/26 optima; current proves 24/26. Largest tested size proved twice +rises from 32 to 384 variables in both knapsack distributions, while assignment +remains at 256. The 512-variable stress point stays in the capacity calculation; +both versions time out in both repetitions. Whole invocation: 150.1307507 seconds. + +Eighteen generator/runner tests pass in 1.430 seconds. All five current runtime +library hashes match the previous algorithm checkpoint; solver source and product +are unchanged. A newly frozen driver accepts the ten-second argument for both +cohorts, preserving the older study's driver. The public record includes every +observation, frozen model/reference, provenance and integrity result. No timing +ratio uses an unfinished solve, and no true maximum size is inferred. + +## Bounded native capacity algorithm + +The [algorithm checkpoint](ALGORITHMIC-CHECKPOINT.md) supersedes the older +current-version wording below. It adds capped exact binary capacity optimization +and preserves generic search defaults after rejecting an ordering pilot. +Current Release CTest passes 70/70, including Python 84/84; the affected native +ASan/UBSan gate passes 12/12, and the new backend-disabled boundary case passes. +The independent native test covers 1,494 oracle/budget configurations, with +separate deterministic mid-table cancellation/allocation checks. The original +checkout still matches all 2,963 recorded hashes. Final FAST passes 35/35 in +5.8439 seconds; capture fixtures pass 13/13. All 60 paired benchmark witnesses +pass independent checks: before completes 24/30 runs and after 30/30. The +checkpoint retains all timings, control slowdowns and rejected pilot outcomes. + +Earlier reports retain their own measured source, configuration and scope. + +## Final review and PR preparation + +The final review corrects public API comments, documents Python's existing +four-space convention, and replaces workstation-only documentation links. +All C/C++ edits in this follow-up are comments; the measured solver binaries +remain unchanged. Python `Model.read` now allocates its owner before importing +a C model, preventing a handle leak when Python allocation fails. The combined +library passes all **84 Python tests**, including the new allocation regression. + +The benchmark reproduction runner now bounds captured output and cleans up +process groups on successful exit, timeout, interruption and exceptions. +Its **seven short Python-fixture tests pass**; these tests run no benchmark +solver. The website separately pins the audited report hashes before importing +its hand-reviewed narrative. Changed evidence is rejected even with Python +assertions disabled, without overwriting the public snapshots. These follow-up +checks do not replace or alter the measurements below. + +## Before-project benchmark page and native documentation + +The [before/after report](BENCHMARKS.md) records a fresh 54-run comparison of +preserved pre-project binaries and the ninth integrated product: five binary +optimization models and four original native FlatZinc fixtures, three paired +repetitions each, two-second solver limits. Known-optimal binary completion is +3/15 before and 15/15 now, with exact checks of returned integer witnesses. +The twelve unfinished old runs remain censored. Native CP matches all 12/12 +expected-output checks per version, while its tiny end-to-end times are longer +in the current shared-library build. No generic speedup is inferred. + +The fresh FAST gate passes 35/35 in 5.8003 seconds external wall time. Compiled +product remains `c2fabb78f`; only documentation, benchmark tooling and the +separate website change in this batch. The native Doxygen overview, chapters +and support matrix were checked against current public APIs. Focused Doxygen +1.18.0 generation passes, and 106 local links/assets/anchors across the new guide +and benchmark page resolve. This is not a full original-library documentation +build; legacy references outside the focused preview have documented warnings. +Both CMake and Autoconf documentation targets include the new source and data. + +The website imports recorded measurements without solving; its data checks +verify every displayed median, completion count and missing censored time. +Production compilation and TypeScript checks pass. A portable export reuses +the same page component and built CSS, with the generated native guide and +all page data included. Hosting is not claimed while the existing Site is +unavailable to the connected account. + +## Ninth batch: integrated sensitivity and native neighborhoods + +The [ninth checkpoint report](NINTH-CHECKPOINT.md) records the completed +integration, exact tested source, correctness gates, fresh installed consumers +and matched comparison with the eighth checkpoint. Combined CTest passes +67/67, numerical Release 54/54, backend-disabled Debug 52/52, full native/HiGHS +ASan+UBSan 66/66, and preloaded sanitizer Python 83/83. Installed consumers +pass 8/8 and Python 83/83 in all three configurations. The expanded FAST gate +passes 35/35 in 5.7852 seconds external wall time. + +Five complete paired runs of the 33 common FAST cases pass 330/330 executions; +median command time is 5.6303 seconds previously and 5.7401 seconds currently. +No case triggers the repeated >20% and >1 ms diagnostic threshold. One extra +attempted current panel times out in unchanged `cp_distinct` under the existing +four-second cap; its failure is retained and excluded from complete-pair timing +medians. Three paired five-model MIPLIB panels pass all 30 exact witness and +known-optimum checks. See the report for full limitations and artifacts. + +This completes the user-requested integration checkpoint. Further roadmap work +is on hold. The earlier records below describe their historical checkpoints; +in particular the eighth wheel has not been rebuilt for these additions. + +## Standalone W10 interface experiment after the eighth checkpoint + +The separate `tools/research` target passes **29,160 queries** with both the +normal pinned CaDiCaL library and the full dependency/fixture instrumented by +ASan+UBSan. Each run finds 14,936 SAT and 14,224 UNSAT queries, checks 3,693 +external lemmas by finite enumeration, streams 64 delayed/on-demand reasons, +and exercises 168 rejected complete models. Ten reason streams occur after +intervening notification/decision events. The eight-variable cancellation and +resume fixture additionally checks the resumed original witness. The counters +are protocol coverage, not a performance comparison or a Gecode learning result. + +Evidence is in `build/w10/validation.json`, `cadical-protocol.json`, +`w10-protocol.json`, `w10-protocol-sanitize.json`, and `cmake-*-test.log`; +the aggregate records the final fixture SHA-256 +`5f1bd71b7646882f137f128a0286d382412d07339355218635dd95e7676570cb`. +CTest passed 1/1 in each independent build. Both source/header/library provenance +records are retained in `build/w10-protocol*/dependency-provenance.txt`. +The library source is the clean tracked CaDiCaL 3.0.1 commit +`c60730422e758ef1cebe7aeddf2dda31c996bf04`; generated untracked build directories +remain in that separate dependency. Its upstream example also passed normally. +The full sanitizer build uses `-fsanitize=address,undefined`, frame pointers, +assertions and `-O1`; leak detection was disabled, with halt-on-error enabled +for ASan and UBSan. No Gecode product libraries were rebuilt for this experiment. + +The first manual fixture run incorrectly asserted that setting `quiet` must +succeed; a dependency compiled with `-DQUIET` omits that option. The fixture now +tolerates that documented compile-mode difference. Upstream configure also +prints errors when creating its convenience `src/makefile` symlink under a path +with spaces. Building explicitly inside each generated build directory succeeds; +the tracked upstream source was not patched. All dependency configure/build logs +are retained in `../deps/CaDiCaL-3.0.1/build-optimize-{spike,sanitize}`. + +See [the learning design](LEARNING-DESIGN.md) for interpretation, uncovered +production failure/lifecycle cases and the next checked-reason implementation. +This experiment does not advance the product's eighth integrated checkpoint. + +## Eighth batch: LP evidence bindings and MiniZinc registration + +Compiled functional source `bda86186d`, with documentation-only head +`158dc0b66f02929c9be957cdcad651581dd7be3f` for the final FAST and wheel gates, +tested 2026-09-05 UTC on the same Apple M1 Pro/macOS/AppleClang host and pinned +HiGHS 1.15.1. This checkpoint adds numerical LP evidence recovery, its C/Python +bindings, scenario C/Python bindings, and the explicit MiniZinc 2.10.1 route. +The sensitivity header/private compile bridge is present but its analyzer and +bindings are subsequent work. Native neighborhoods and LCG are also excluded. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Combined native/numerical and FlatZinc boundary tests | 60/60 pass | `build/native-compat/eighth-expanded-ctest.log` | +| Numerical Release | 48/48 pass | `build/optimize/eighth-ctest.log` | +| Backend-disabled Debug | 47/47 pass | `build/optimize-core/eighth-expanded-ctest.log` | +| Full-source HiGHS/facade ASan+UBSan | 47/47 pass | `build/optimize-sanitize/eighth-expanded-ctest.log` | +| Full-source native/HiGHS/facade ASan+UBSan | 59/59 pass; preloaded Python 75/75 | `build/native-sanitize/eighth-ctest.log`, `eighth-python-preloaded-sanitizer.log` | +| Actual direct FlatZinc CLI | 106/106 normal and sanitizer | `build/{native-compat,native-sanitize}/eighth-final-cli.json` | +| Actual generated MiniZinc build registration | 72/72 normal and sanitizer, including compiler/driver/output pipeline; pure JSON encoder 10 cases | `build/{native-compat,native-sanitize}/eighth-final-minizinc.json`, CTest logs | +| Installed MiniZinc registration | 72/72 with actual relative executable/library paths; existing Gecode registration unchanged | `build/native-compat/eighth-final-installed-minizinc.json` | +| Legacy FlatZinc with blackbox fixtures | 140/140, five repetitions each, seed 1701 | `build/native-compat/eighth-legacy-flatzinc.log` | +| Installed C/C++ consumers | Numerical, combined and core: 7/7 each; independent native-only 1/1 | `build/optimize/eighth-installed-consumers.json` | +| Python against installed libraries | 75/75 in each of those three configurations | `build/{optimize,native-compat,optimize-core}/eighth-installed-*.log` | +| Self-contained macOS arm64 wheel | Automatic Native/HiGHS load and 75/75 on both Python 3.12 and 3.14 | `build/eighth-wheel-pack.json`, `eighth-wheel-installed-results.json` | +| Runner and containment contracts | 24 pass, 9 actual-Windows checks explicitly skipped | `build/native-compat/eighth-harness-tests.log` | +| Required FAST gate | **33/33 pass, 5.73 seconds external wall**, 5.68 inside runner | `build/optimize/eighth-fast.json`, `eighth-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 exact witness and known-optimum checks pass | `build/optimize/eighth-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, branch and commit unchanged | `build/optimize/eighth-original-isolation.json` | + +The new FAST case checks original feasible bases and improving directions for +both objective senses, fixed-column and row recession conditions, historical +ownership, private auxiliary identities and public solve-call counts. Its Farkas +case independently checks signed multipliers `y=1,z=-1`, finite-side selection +and a positive contradiction margin. The output is `evidence_checked`, with no +source objective values invented from slopes or margins. The full suite retains +the 28-second outer allowance and hashes both executables and twelve libraries. +All three agents explicitly paused builds/tests and the root test processes +exited before timing. A read-only process inventory found no competing task +compiler or solver; ordinary desktop background processes remained. This is a +correctness timing gate, not a commercial-solver performance comparison. + +Evidence conformance covers independently checked original coordinates and +separate primal-ray/Farkas availability, bad auxiliary identity/scalars/status, +finite-side normalization, tolerance overlap and phase/final cleanup failures. +The C wrapper's separately compiled cleanup fixture cancels after a real accepted +analysis returns: every accepted getter becomes unavailable while raw owning +auxiliary-stage children remain usable. No auxiliary stage becomes an ordinary +original-model result. C99 fixtures explicitly preserve assertions in Release. + +MiniZinc tests use the official workspace-local 2.10.1 compiler and matching +standard library. CMake never downloads it. The generated experimental identity +uses Native/Exact with its separate millisecond protocol and dedicated lowering +library. Both build and installed registration files are exercised in place; +configuration and library hashes must remain unchanged. The existing installed +`gecode.msc` matches the seventh checkpoint byte-for-byte (SHA-256 +`18e34e3d2dfe96d77e6db410ade28aad2e30c629701c622fb5585e73ab1be463`). +No default solver preference was changed. Supported source-level answers and +emitted predicates are tested; general compiler equivalence is not proved. + +The wheel is +`gecode_optimize-0.1.0.dev20260905+g158dc0b66-py3-none-macosx_11_0_arm64.whl`, +SHA-256 `f1506dc6b1c629e104e8903ee5c9960cdeb6978ed5eb42bb0a5b556d79a377a5`. +Its solver-library SHA-256 is +`67cd47986b72fc91fe3c1f5d8b883b911fda81f2193bbe65d81a00b77e52c006`. +The first manual Python 3.12 provenance assertion used a nonexistent private +loader name and failed before tests ran. Correcting that validation command +required no package/source change; final logs assert both module and loaded +library are inside the isolated environment, then pass all 75 tests on each +interpreter. The failed setup log is retained. + +No package-index publication, remote CI, actual Windows/Linux runtime gate, +oldest-macOS execution or broad performance baseline is claimed. macOS sanitizer +leak detection remains disabled for the host runtime limitation; ASan/UBSan +error detection is enabled. LP evidence is numerical, not an exact certificate. + +## Seventh batch: explicit basis starts, Regular, scenarios and Python wheels + +Compiled facade through `77ee30327` and final installed-consumer/FAST source +`b8e3fba7f152a14c4460f3c6946c488ce59093bc`, tested 2026-09-05 UTC on the +same Apple M1 Pro/macOS/AppleClang host with pinned HiGHS 1.15.1. The first full +cohort used `5914ee047`; subsequent fixes keep C consumer assertions enabled, +classify the native Regular FAST case correctly, reject unsupported scenario +guarantees at admission and accept three exact MiniZinc context-marker atoms. +The affected component tests and installed consumers were rerun after those +fixes. All facade and test objects were rebuilt for the enlarged Regular +`GlobalPayload`; no old-layout facade archives were reused. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Combined native/numerical plus original regression target | 55/55 pass; assertions-enabled C consumers 2/2; final affected tests 7/7 | `build/native-compat/seventh-integrated-ctest.log`, `seventh-c-assertions-ctest.log`, `seventh-admission-ctest.log` | +| Numerical Release | 43/43 pass; final affected tests 4/4 | `build/optimize/seventh-integrated-ctest.log`, `seventh-admission-ctest.log` | +| Backend-disabled Debug | 42/42 pass; final affected tests 4/4 | `build/optimize-core/seventh-integrated-ctest.log`, `seventh-admission-ctest.log` | +| Full-source HiGHS/facade ASan+UBSan | 42/42 pass; final affected tests 4/4 | `build/optimize-sanitize/seventh-integrated-ctest.log`, `seventh-admission-ctest.log` | +| Full-source native/HiGHS/facade ASan+UBSan | 52/52 pass; final affected tests 7/7; preloaded Python 62/62 | `build/native-sanitize/seventh-integrated-ctest.log`, `seventh-admission-ctest.log`, `seventh-python-preloaded-sanitizer.log` | +| Actual FlatZinc CLI | 106/106 in normal and full sanitizer configurations | `build/{native-compat,native-sanitize}/seventh-final-cli.json` | +| Legacy FlatZinc with configured blackbox fixtures | 140/140 pass | `build/native-compat/seventh-final-legacy-flatzinc.log` | +| Installed C/C++ consumers | Three configurations: 5/5 each, including basis/Regular C consumers and scenario C++ behavior; independent native-only 1/1 | `build/optimize/seventh-installed-consumers.json`, `seventh-final-installed-results.json` | +| Python against installed libraries | 62/62 in each of three configurations | `build/{optimize,native-compat,optimize-core}/seventh-final-installed-*.log` | +| Self-contained macOS arm64 wheel | Automatic Native/HiGHS load, RECORD/bytecode checks and 62/62 methods on both Python 3.12 and 3.14 | `build/seventh-wheel-integrated-pack.json`, `seventh-wheel-integrated-installed-results.json` | +| Runner and containment contracts | 24 pass, 9 actual-Windows checks explicitly skipped | `build/native-compat/seventh-harness-tests.log` | +| Required FAST gate | **32/32 pass, 5.69 seconds external wall**, 5.62 inside runner | `build/optimize/seventh-fast.json`, `seventh-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 independent exact witness/known-optimum checks pass | `build/optimize/seventh-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, branch and commit unchanged | `build/optimize/seventh-original-isolation.json` | + +The FAST run had a clean source head, explicit quiet acknowledgments from every +agent and a process inventory with no competing compiler or solver. It hashes +both executables and twelve runtime libraries. New cases independently enumerate +a signed Regular parity language (exact objectives -3/1) and check analytic +scenario objectives 5/9/-11/7 with both cold and reused solves. The LP observation +case now also exports and submits an owning basis. The outer budget stays at +28 seconds. This is a bounded correctness regression gate, not evidence of +commercial or native performance parity. + +Regular admission/checking covers sparse large state namespaces, signed symbols, +missing edges, aliases, empty words/finals, determinism, native array/hash limits, +FlatZinc literal schemas and original raw-table checks. Scenario tests compare +360 outcomes with 3,840 independent original assignments, and inject bad identity, +status, exact bounds, raw witnesses and interruptions. Unsupported Certified and +Auto/HiGHS Exact requests are rejected before a batch starts. Basis tests cover +status/owner/revision/matrix compatibility, rejected or repaired submissions, +original optimality checks and session recovery. + +The initial new C consumer targets inherited Release `NDEBUG`; their source now +explicitly enables assertions and their Release checks were rerun. The first +manual legacy selection omitted optional blackbox environment variables and +selected only 118 tests. A second attempt used an incorrect local fixture-library +path and stopped at that fixture; the final run uses the configured executable +and library paths, separate log files and seed 1701, passing all 140 tests. +These setup attempts are retained in the local logs. + +The wheel artifact is +`gecode_optimize-0.1.0.dev20260905+g2e19db01d-py3-none-macosx_11_0_arm64.whl` +(SHA-256 `108a5b81b57aa6c6ebe66c1b668fa4bd3f0d3ffe6b418aa62eba72dae1a16701`). +It was built with macOS 11.0 deployment settings and tested on this newer host; +oldest-OS compatibility is not claimed as tested. Ten portable adversarial +packager tests also pass, including staged-byte inspection during source +replacement, dependency traversal and corrupt/missing RECORD entries. No package +index publication, actual Windows execution, remote CI or broad performance +baseline was performed. macOS sanitizer leak detection remains disabled because +of the host runtime limitation; ASan/UBSan error detection remains enabled. + +Scenario C/Python bindings, explicit LP evidence and experimental MiniZinc +registration are subsequent isolated work and are excluded from this checkpoint. + +## Sixth batch: starts, original LP observations and preserved FlatZinc globals + +Integrated source through `5e22c417f6824981f8a705b29af1b7c352717f10`, tested +2026-09-05 UTC on the same Apple M1 Pro/macOS/AppleClang host with pinned HiGHS +1.15.1. Compiled changes are through `7364d7a77`; subsequent commits add +cumulative CLI fixtures and scenario design only. This gate adds exact complete +native starts, owning continuous LP observations with C/Python access, and +FlatZinc table/holey-domain, circuit and fixed-data cumulative admission. +Basis submission, scenario execution and regular-language constraints are +separate subsequent work and are excluded from this gate. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Combined native/numerical plus original regression target | 48/48 pass | `build/native-compat/sixth-observations-ctest.log` | +| Numerical Release | 36/36 pass | `build/optimize/sixth-observations-ctest.log` | +| Backend-disabled Debug | 36/36 pass | `build/optimize-core/sixth-observations-ctest.log` | +| Full-source HiGHS/facade ASan+UBSan | 35/35 C/C++ tests pass | `build/optimize-sanitize/sixth-observations-ctest.log` | +| Full-source native/HiGHS/facade ASan+UBSan | 45/45 optimization/capture tests pass; 47 Python methods pass with runtime preloaded | `build/native-sanitize/sixth-observations-final-ctest.log`, `sixth-python-preloaded-sanitizer.log` | +| Expanded actual FlatZinc CLI | 79/79 cases pass in normal and full-source sanitizer builds | `build/{native-compat,native-sanitize}/sixth-cumulative-cli-final.json` | +| Complete legacy FlatZinc selection | 140/140 pass | `build/native-compat/sixth-final-legacy-flatzinc.log` | +| Fresh installed C/C++ consumers | Standalone numerical, combined and backend-disabled: 3/3 each; independent native-only: 1/1 | `build/consumer-*-sixth/`, `build/optimize/sixth-installed-consumers.json` | +| Python against freshly installed libraries | 47/47 methods pass in each of three configurations | `build/{optimize,native-compat,optimize-core}/sixth-installed-*.log` | +| Runner and containment contracts | 24 pass; 9 actual-Windows checks explicitly skipped | `build/native-compat/sixth-harness-final-tests.log` | +| Required FAST gate | **30/30 pass, 5.48 seconds external wall**, 5.40 seconds inside runner | `build/optimize/sixth-fast.json`, `sixth-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 independent exact witness/known-optimum checks pass | `build/optimize/sixth-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, original branch and commit unchanged | `build/optimize/sixth-final-original-isolation.json` | + +The final FAST run used a clean source head, explicit quiet acknowledgments from +all three agents, and a process inventory showing no competing build or solver +workload. Both executables and twelve runtime libraries are hashed. The new +native-start case checks gate completion and strict min/max improvement to +enumerated optima -4/7. The LP observation case checks analytic optima 15/19, +original dual signs, reduced costs, slacks, basis availability and independent +KKT acceptance. The outer budget remains 28 seconds. This local correctness +timing is not a commercial/native performance comparison. + +Normal and core/numerical tests were run after source integration. The later +CLI-only commit expands 64 cases to 79 without changing the compiled solver; +the final 79-case checks were rerun in both normal and sanitizer configurations. +Cumulative compiler tests independently evaluate 248,201 assignments. Actual +legacy CLI execution rejects a zero-duration singleton with height above +capacity; the new path accepts it because its half-open resource interval is +empty. The positive-duration counterpart is infeasible. Raw original-source +checking and independent integer-time oracles cover both behaviors, aliases, +overlap, shared endpoints, malformed shapes and unsupported machine variants. + +Native starts are checked before incumbent publication, including exact +original feasibility, live indicator gate derivation, explicit retained gates, +historical ownership, interrupted search and strict improvement completion. +LP observations check original row/column mapping, min/max conventions, large +offset cancellation, malformed backend data, independent KKT residuals, basis +availability, copied ownership and final-budget publication. Fresh installs +include the public LP observation header and exclude its private detail header. + +The initial native sanitizer CTest command also selected an unnecessary rebuild +of the legacy test harness. That owned process tree was stopped before running +the established optimization/capture selection, which passed all 45 tests. +Legacy regression evidence in this batch comes from the normal combined build; +the solver modules and dependencies used by the sanitizer selection are fully +instrumented. No sanitizer detector was disabled beyond the existing macOS +leak-detection limitation. The combined installed consumer initially omitted +its separately installed HiGHS dependency prefix; configuring it with the fresh +standalone-sixth HiGHS install passed. Logs retain both attempts. No remote CI, +actual-Windows gate, or broad performance baseline was executed. + +## Fifth batch: quadratic models, FlatZinc and native search extensions + +Integrated implementation `8ae59d5c1946abf47203172ba3cb89fbf5ea0a8b`, tested +2026-09-05 UTC on the same Apple M1 Pro/macOS/AppleClang host and pinned HiGHS +1.15.1. Subsequent commits through `a747330805cf1fed4c082a42900d9194c9f849b8` +change documentation only; that clean head is recorded by the final FAST run. +This batch adds verified root-cover handoff, opt-in bounded binary reliability +branching, bounded weighted-square continuous QP with C/Python APIs, owning +FlatZinc capture, scoped integer/Boolean compilation and the separate +`fzn-gecode-optimize` command. W9 starts, LP observations and broader FlatZinc +global admission are subsequent work, excluded from this gate. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Combined native/numerical plus original regression target | 43/43 pass | `build/native-compat/fifth-final-ctest.log` | +| Numerical Release | 32/32 pass | `build/optimize/fifth-final-ctest.log` | +| Backend-disabled Debug | 32/32 pass | `build/optimize-core/fifth-final-ctest.log` | +| Full-source HiGHS/facade ASan+UBSan | 31/31 C/C++ tests pass | `build/optimize-sanitize/fifth-final-ctest.log` | +| Full-source native/HiGHS/facade ASan+UBSan | 40/40 tests pass, including FlatZinc capture/CLI; 37 Python methods pass with runtime preloaded | `build/native-sanitize/fifth-final-ctest.log`, `fifth-python-preloaded-sanitizer.log` | +| Complete legacy FlatZinc selection | 140/140 pass | `build/native-compat/fifth-final-legacy-flatzinc.log` | +| Fresh installed C/C++ consumers | Standalone numerical, combined, backend-disabled: 2/2 each; independent native-only: 1/1 | `build/consumer-*-fifth/`, `build/optimize/fifth-installed-consumers.json` | +| Python against freshly installed libraries | 37/37 methods pass in each of three configurations | `build/{optimize,native-compat,optimize-core}/fifth-installed-python.log` | +| Runner and containment contracts | 24 pass; 9 actual-Windows checks explicitly skipped | `build/native-compat/fifth-harness-final-tests.log` | +| Required FAST gate | **28/28 pass, 5.55 seconds external wall**, 5.52 seconds inside runner | `build/optimize/fifth-fast.json`, `fifth-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 independent exact witness/known-optimum checks pass | `build/optimize/fifth-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, original branch and commit unchanged | `build/optimize/fifth-final-original-isolation.json` | + +FAST ran after every root build/test process exited and all three agents +confirmed a quiet window. A process inventory found no build/solver workloads; +both executables and twelve runtime libraries are hashed. The unchanged outer +budget is 28 seconds, including startup, hashing, checking and cleanup. The +5.55-second observation is a local correctness gate, not a solver-performance +comparison. The new cases independently check QP optima 3.5/2.5, root-cover +optima 15/19 and reliability-branching optima -17/17, including actual cut/probe +accounting rather than merely accepting an optimal status. + +The expanded native sanitizer build initially exhausted disk space while +linking FlatZinc executables. Superseded generated agent objects/archives and +executables were removed; source, current inputs and validation logs were +preserved. The serialized retry built all targets and the final 40-test gate +passed. Native, integer/set/float, minimodel, search, FlatZinc, HiGHS and facade +sources were instrumented with matching generated configuration. The original +checkout was not used as a build/output directory. macOS leak detection remains +unavailable (`detect_leaks=0`); address and undefined-behavior checks halt on +errors. No additional detector was disabled. + +Broader legacy testing exposed one existing restart-output expectation: +`on_restart_sol_float` required `y=1.0` for an initially unconstrained finite +float. Both the frozen fourth-batch executable and the current one printed +`-DBL_MAX` there. The test now validates any finite first value and still requires +the exact later remembered values, sequence and completion markers; adversarial +output fixtures check that it rejects malformed or semantically wrong output. +The model and search settings are unchanged. This test-only correction is +included in the 140/140 final legacy result; it is not evidence of a solver +behavior regression or a relaxation of later restart checks. + +Quadratic tests validate original primal values, objective/gradient, dual signs, +KKT residuals and an independently checked outward tangent/box bound, including +large-offset cancellation, interrupted backend data and fast-math rejection. +They do not claim arbitrary-Hessian, mixed-integer quadratic or nonlinear +support. Native reliability tests use exhaustive finite-product oracles and +fault/interruption checks; probes rank candidates but never publish proofs or +incumbents. FlatZinc tests use independent raw-source predicates and whole-model +admission, including CLI status/identity/output corruption fixtures. Fresh +installs contain the public quadratic header and exclude its private bound +header. No remote CI or actual-Windows containment gate has run locally. + +## Fourth batch: checked native search, presolve, pools and bulk bindings + +Integrated source `cf95a6167342953ddb386a9a87b18e58c7672eb5`, tested +2026-09-05 UTC on the same Apple M1 Pro/macOS/AppleClang host and pinned HiGHS. +This gate includes native LP deductions, scoped cover proof checking, explicit +native search with interrupted frontier bounds, exact integer presolve/postsolve, +ranked pools, C/Python pool and repair workflows, and atomic C++/C/Python batches. +The root cut loop and subsequent QP/FlatZinc work are separate later slices. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Combined native/numerical plus original regression target | 31/31 pass | `build/native-compat/fourth-final-ctest.log` | +| Numerical Release | 26/26 pass | `build/optimize/fourth-final-ctest.log` | +| Backend-disabled Debug | 26/26 pass | `build/optimize-core/fourth-final-ctest.log` | +| Full-source HiGHS/facade ASan+UBSan | 25/25 C/C++ tests pass | `build/optimize-sanitize/fourth-final-ctest.log` | +| Full-source native/HiGHS/facade ASan+UBSan | All 28 C/C++ tests pass; 28 Python methods pass with the sanitizer runtime preloaded | `build/native-sanitize/fourth-final-ctest.log`, `fourth-python-preloaded-sanitizer.log` | +| Fresh installed C/C++ consumers | Standalone numerical, combined, backend-disabled: 2/2 each; independent native-only: 1/1 | `build/consumer-*-fourth/`, `build/optimize/fourth-installed-consumers.json` | +| Python against freshly installed libraries | 28/28 methods pass in each of standalone numerical, combined and backend-disabled configurations | `build/{optimize,native-compat,optimize-core}/fourth-installed-python.log` | +| Runner and containment contracts | 24 pass; 9 actual-Windows checks explicitly skipped | `build/native-compat/fourth-harness-final-tests.log` | +| Required FAST gate | **25/25 pass, 5.57 seconds external wall**, 5.50 seconds inside runner | `build/optimize/fourth-fast.json`, `fourth-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 independent exact witness/optimum checks pass | `build/optimize/fourth-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, original branch and commit unchanged | `build/optimize/fourth-final-original-isolation.json` | + +All root and agent builds/tests had exited before FAST ran, with explicit agent +acknowledgments and a saved process inventory. Both executables and twelve +runtime libraries are hashed. Normal desktop services remained; this single +correctness-gate observation is not a solver-performance comparison. The outer +runner budget remains 28 seconds. No original benchmark output was modified. + +The native sanitizer CTest invocation initially also registered an ordinary +Python host. That one launch failed before the tests because AddressSanitizer +loaded too late through ctypes. The native C/C++ tests all passed. Running the +Framework Python application executable with the matching sanitizer runtime +preloaded then passed every Python test; the ordinary Python registration is +disabled in this sanitizer build. No sanitizer detector was suppressed. Local +leak detection remains unavailable (`detect_leaks=0`); address, container and +undefined-behavior checking use halt-on-error. + +Native LP tests independently enumerate 320 configurations. Frontier tests +exercise complete and interrupted minimization/maximization, queued and active +parent-region coverage, storage and node limits, cancellation/deadlines, +allocation failures, original witness checks, and optional checked LP. The +separate coordinator executable compiles test hooks into its own implementation; +the production library contains no test hooks. Presolve tests enumerate full +original/reduced feasible sets and add actual native/HiGHS reconstruction checks. +Bulk tests inject allocation failures before every allocation in all three C++ +operations, verify unchanged revisions/contents/reference addresses, and check +sparse construction without dense allocation. C/Python tests cover output +capacity, foreign/deleted handles, UTF-8, sparse dimensions and owning historical +workflow results. These are correctness gates; default native performance +selection and broader benchmark-family comparisons remain outstanding. + +## Third batch: globals, sparse LP, repairs, bindings and native lifecycle + +Integrated source through `0c6d9462d`, tested 2026-09-05 UTC on Apple M1 Pro, +macOS 15.7.4 and AppleClang 17. The HiGHS pin remains unchanged. Later work, +including solution pools and bounded-integer sparse certificates, has separate +acceptance checks and is not included in this recorded gate. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Numerical Release conformance | 19/19 pass, including 13 Python conformance methods | `build/optimize/third-batch-ctest.log` | +| Backend-free conformance | 19/19 pass; expanded binding checks also pass after their final addition | `build/optimize-core/third-batch-final-ctest.log`, `third-batch-bindings-ctest.log` | +| Combined native/numerical and original regression target | 22/22 pass | `build/native-compat/third-batch-final-green-ctest.log` | +| Full HiGHS and facade ASan/UBSan | 18/18 pass with halt-on-error; Python host excluded from this instrumented CTest configuration | `build/optimize-sanitize/third-batch-final-ctest.log` | +| Full native engine ASan/UBSan | 4/4 pass: globals, native solve, brancher lifecycle, C ABI; 8.22 seconds | `build/native-sanitize/third-batch-final-ctest.log` | +| Clean installed C/C++ consumers | Standalone numerical, combined native/numerical, backend-free and separate native-only consumers pass | `build/consumer-*-third/`, local `/private/tmp/gecode-third-installed-*.log` | +| Installed Python | 13/13 methods pass against standalone numerical and combined native/numerical libraries | `build/optimize/third-batch-installed-python.log`, `build/native-compat/third-batch-installed-python.log` | +| Package ownership | Six collision/repeat cases plus standalone-native boundary pass | `build/native-compat/third-batch-package-origin.log` | +| Fast runner contracts | 11 tests pass, including new native-global provenance checks | `build/native-compat/third-batch-final-runner-tests.log` | +| Required fast gate | 21/21 pass; **5.53 seconds external wall**, 5.45 seconds inside the runner | `build/optimize/third-batch-fast.json`, `third-batch-fast-wall.json` | +| Existing MIPLIB correctness panel | 5/5 pass with independent original witness checker; clean recorded source tree | `build/optimize/third-batch-miplib-correctness.json` | +| Original checkout isolation | All 2,963 input/source hashes plus original branch and commit unchanged | `build/optimize/third-batch-original-isolation.json` | + +The fast command ran after build/test processes finished and agents confirmed +a quiet window. It includes all startup, validation, cleanup and output work, +both executable hashes and twelve shared-library hashes. This is one local +correctness-gate timing, not a solver-performance comparison. All required cases +must finish within the unchanged 28-second runner budget. See [the fast panel](FAST-REGRESSION.md) +for independent schedule, recourse, repair and native integer oracles. + +Native global tests enumerate finite products with independent predicates, +including aliases, negative index bases, empty tables/elements, zero-resource +tasks and circuit subtours. Resource preflight now bounds native envelope, +edge-finding and index arithmetic; targeted extreme-value fixtures must reject +unsupported ranges before calling those propagators. The sparse binary LP slice +has independent 3,000-model dense/CSR certificate comparisons, 8,640 native +propagation configurations and a 16K-square allocation guard; see [sparse LP](SPARSE-LP.md) +for exact scope and the isolated-worktree instrumentation used for those tests. + +Cross-review fixed residual cancellation across large row bounds and objective +offsets, invalid stage evidence, and lost raw-stage provenance on interruptions. +Repair tests use 21 deterministic coordinator scenarios in addition to actual +HiGHS and exhaustive small-model checks. Repairs retain a distinct private model +and cannot claim that an original infeasible point became feasible. + +Full native instrumentation first exposed invalid downcasts of intrusive list +sentinels to Brancher/Propagator. The kernel now retains ActorLink cursors and +casts only actual actors after the sentinel check. Lifecycle tests cover empty +lists, forward and wrapped lookup, absent middle actors, deletion, archive +choices, cloning, propagator iteration and recomputed DFS solution sets. +Final runs retain the vptr detector and use `UBSAN_OPTIONS=halt_on_error=1`; +no undefined-behavior detector was suppressed. macOS leak detection is unavailable, +so `ASAN_OPTIONS=detect_leaks=0:halt_on_error=1` was used locally. The added Linux +native sanitizer job enables leak detection, but remote CI has not been run here. + +All native components and consumers must be rebuilt together after the cursor +representation change. The C layout remains independent of C++ internals. +ELF static native dependencies are compiled as PIC when embedded in the shared +C wrapper. A native-enabled binding fixture incorrectly expected a numerical +session to fall back to native execution; it now checks the documented +Unsupported result. Standalone native/global calls pass through both bindings. + +## Second batch: sessions, native bridge, diagnostics and fast gate + +Tested solver implementation: `6a7544e85`, on `codex/solver-parity`, +2026-09-05 UTC. Host: Apple M1 Pro, macOS 15.7.4, AppleClang 17. HiGHS remains +pinned to 1.15.1, commit `04024d701f79feb8e2f18bc3df0dffc04ef05088`. + +| Check | Result | Local evidence | +| --- | --- | --- | +| Numerical Release conformance | 14/14 pass | `build/optimize/integrated-ctest.log` | +| Backend-free conformance | 14/14 pass | `build/optimize-core/integrated-ctest.log` | +| Combined native Gecode and optimization | 16/16 pass, including the enabled native bridge and original native regression target | `build/native-compat/integrated-ctest.log` | +| Full-source Debug ASan/UBSan, including HiGHS | 14/14 pass; 41.61 seconds for the complete conformance run | `build/optimize-sanitize/integrated-ctest.log` | +| Four installed consumers | Standalone numerical, combined native/numerical, native-only without HiGHS discovery, and backend-free all pass | `build/consumer-*/integrated-ctest.log` | +| Fast regression command | 18/18 required cases pass; **5.49 seconds external wall time**, 5.37 seconds reported inside runner, against a 28-second budget | `build/optimize/second-batch-fast.json`, `second-batch-fast-wall.json` | +| Fast-runner failure regressions | 11 tests pass | `build/optimize/fast-runner-tests.log` | +| Package ownership/support boundaries | Four configure-only ownership cases plus standalone-native rejection pass | `build/optimize/package-origin-tests.log` | +| Existing MIPLIB correctness inputs | 5/5 pass with the original separate exact witness checker | `build/optimize/second-batch-miplib-correctness.json` | +| Original checkout isolation | All 2,963 hashes, original branch and commit unchanged | `build/optimize/second-batch-original-isolation.json` | + +The fast measurement ran alone after builds and solver tests finished; no +original benchmark process was observed. It includes Python startup, child +startup, source/binary hashing, eleven shared-library hashes, all cases, +validation, cleanup and report writing. This is one local timing observation, +not a performance ranking or a guarantee about slower machines. Every required +case must complete within the runner's outer budget or the command fails. +The native bridge case has explicit native backend/version and Exact guarantee +attribution; its two optima are independently enumerated. + +The new tests compare persistent edits with cold solves and exhaustive integer +oracles, exercise active/zero semi domains and indicators, and check bounds, +costs, objective senses, matrix/type/owner changes, starts and historical values. +A nontrivial 48-binary MIP is still unresolved after one node both cold and with +a retained hint; removing the node-limit reset in a temporary mutation makes +the unlimited-session regression fail. Node-limit termination after callback +registration also exercises callback teardown before a fresh model. That +conformance test has a separate 180-second timeout for slow Debug sanitizer +builds and is not part of the fast gate. + +Conflict tests reconstruct reported subsets independently and check deletion +witnesses; deterministic oracle substitutes cover ambiguous and interrupted +results. Native bridge tests exhaustively check finite integer models, +reification, offsets, semi domains, unsupported ranges and interrupted search. +Separate native-bridge ASan/UBSan tests instrumented the bridge and its test +sources; the legacy native libraries used by those tests were not instrumented. +The full-source HiGHS sanitizer configuration uses the disabled native bridge +stub. A full native-library sanitizer configuration remains additional coverage. + +Integration found a Debug HiGHS assertion when a diagnostic reduction left +integer variables and only constant rows. The adapter now decides constant rows +using the original numerical checker's absolute feasibility tolerance and omits +them from the backend matrix, while retaining them in the original model. +The regression covers feasible, contradictory and tolerance-boundary constants. +The full-source sanitizer run passes without suppressing backend assertions. + +The package tests prevent silent target collisions between different standalone +prefixes or a combined and standalone installation. The added Linux static and +Windows shared native CI configurations were checked locally at configure time; +their remote CI jobs have not run. Windows fast-runner process containment is +still pending. Generated build reports are local artifacts, not committed +benchmark results. The MIPLIB report's dirty flag reflects temporary Python +bytecode files from the runner tests, subsequently removed; solver source was +committed at the recorded hash. + +## First-batch evidence + +Completed on 2026-09-05 UTC (2026-09-04 local time). Tested implementation commit: +`8c45e7b30`, on `codex/solver-parity`. Documentation was completed afterward. +Host: Apple M1 Pro, macOS, AppleClang 17, C++17. Backend: separately pinned HiGHS +1.15.1, commit `04024d701f79feb8e2f18bc3df0dffc04ef05088`. + +## First-batch checks + +| Configuration or check | Result | Local evidence | +| --- | --- | --- | +| Standalone numerical Release build | 9/9 CTest targets pass | `build/optimize/final-ctest.log` | +| Full-source Debug ASan + UBSan, including HiGHS | 9/9 pass, no sanitizer suppression | `build/optimize-sanitize/final-ctest.log` | +| Standalone backend-disabled build | 9/9 pass | `build/optimize-core/final-ctest.log` | +| Combined native Gecode + optimization | 11/11 pass, including native regression target and its build fixture | `build/native-compat/final-ctest.log` | +| Installed standalone numerical consumer | Configure, build and runtime pass | `build/consumer-standalone/final-ctest.log` | +| Installed native + numerical consumer | Configure, build and runtime pass | `build/consumer-combined/final-ctest.log` | +| Installed native-only consumer, HiGHS discovery disabled | Configure, build and runtime pass | `build/consumer-native-only/final-ctest.log` | +| Installed backend-disabled optimization consumer | Configure, build and expected Unsupported runtime contract pass | `build/consumer-core/final-ctest.log` | +| Explicit native static-only selection | `gecodeoptimize` builds as a static library, honoring Gecode linkage options | `build/static-configuration/build.log` | +| Existing five-model MIPLIB correctness harness | 5/5 pass, independently exact-checked witnesses and known optima | `build/optimize/final-miplib-correctness.json` | +| Original checkout isolation | All 2,963 file hashes, original branch and original commit unchanged | `build/optimize/original-isolation.json` | +| Changelog tidy and whitespace | Changelog checks pass; `git diff --check` passes | Checker details below | +| Added platform CI | YAML and all shell steps checked locally; remote jobs not executed | `.github/workflows/optimize.yml` | + +The build logs and JSON reports are generated local artifacts, not committed +benchmark results. The MIPLIB report records the binary hash, input hashes, +backend version and tested source commit. Its dirty-worktree flag reflects the +implementation-ledger documentation being edited during the run; solver code +was committed at the hash above. + +The nine component targets cover model lifecycle; result/gap/budget semantics; +independent validation; indicators/Boolean logic; I/O; actual solver integration; +ordered objectives; public-file I/O; and a deterministic multiobjective +coordinator with a substitute backend. Assertions remain enabled in Release +test executables. + +Independent worktree checks preceded integration: normal C++17 builds with +`-Wall -Wextra -pedantic`, then address/undefined sanitizer runs for the owned +components. Cross-review fixes were tested again in the combined suite. +The actual solver test combines indicators, partial starts, lexicographic locks +and indicator removal, in addition to LP/MILP objectives, edits, bounds, limits, +semi-variable starts, deleted handles and tiny differential integer models. + +An initial sanitizer configuration mixed instrumented adapter code with an +uninstrumented static HiGHS library and reported a libc++ vector-container +annotation error. Rebuilding **both** with the same instrumentation passes all +tests. Container checking was not disabled. The CI sanitizer job therefore +builds the entire dependency from source with matching C and C++ flags. + +## Existing benchmark inputs + +The five unchanged cached MIPLIB3 models were solved cold, with one worker, +seed zero, zero native MIP gaps and a 30-second per-case limit. Reference +objectives were used for checking only, never supplied as starts or targets. + +| Model | Variables | Original rows | Published and independently checked optimum | +| --- | ---: | ---: | ---: | +| p0033 | 33 | 16 | 3089 | +| p0201 | 201 | 133 | 7615 | +| p0282 | 282 | 241 | 258411 | +| p0548 | 548 | 176 | 8691 | +| lseu | 89 | 28 | 1120 | + +`experiments/optimize/verify_miplib.py` reads the original MPS using the existing +suite's separate exact parser, verifies pinned payload hashes, maps returned +values by column name, checks numerical integrality, then checks rounded binary +witnesses with the existing exact assignment validator. Independently recovered +objectives must match both the published optimum and the adapter's result; +reported bounds must close at that optimum. Unsupported, failed or timed-out +cases fail the correctness check rather than disappearing from the denominator. +The report records external process wall time as well as the CLI's internal +timing fields, and rejects nonfinite JSON numbers. + +These are correctness checks on five small historical instances. They are not +a commercial-solver comparison, a full MIPLIB2017 result, a performance baseline, +or evidence for changing native search defaults. The original 3,240-row +size-scaling run completed before any implementation compilation or solver +testing started. Its suite and output files were not changed by this work. + +## Import/export regressions + +I/O tests compare every active domain, row, coefficient, objective and display +name after local round trips, including all five public models through both +formats. Backend-enabled tests also read exported files with the independent +pinned HiGHS reader and compare their mathematical content; dropping an +unconstrained free row is permitted in that external comparison only. + +Cross-review reproduced and fixed: + +- 15-digit output merging distinct coefficients and changing integer feasibility. +- Lost semi-integer declarations and omitted cost-free columns. +- Duplicate objective terms and LP constants on constraint left sides. +- Cancellation across a large LHS constant and RHS, preserving `x >= -1` in + `x + 1 - 1e16 >= -1e16`. +- Conflicting MPS domain declarations silently dropping integrality. +- MPS binary bounds that passed local round trips but were ignored by another + reader. Nondefault binary bounds now require LP export; MPS rejection leaves + an existing destination unchanged. +- Original-indicator metadata being lost through linear file exchange. Active + original indicators are rejected by these exporters. + +The independent reviewer reran the cancellation, conflicting-type, destination +preservation and narrowed-binary LP fallback reproductions successfully after +the fixes. See [I/O scope](IO.md) for syntax and portability restrictions. + +## Reproduction and remaining release work + +Build instructions are in the [API guide](README.md). For a fully instrumented +local run, use a fresh build directory and supply the pinned source path: + +```sh +cmake -S gecode/optimize -B build/optimize-sanitize \ + -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=OFF \ + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$PWD/../deps/HiGHS" \ + '-DCMAKE_C_FLAGS=-fsanitize=address,undefined -fno-omit-frame-pointer' \ + '-DCMAKE_CXX_FLAGS=-fsanitize=address,undefined -fno-omit-frame-pointer' \ + '-DCMAKE_EXE_LINKER_FLAGS=-fsanitize=address,undefined' +cmake --build build/optimize-sanitize -j 2 +ctest --test-dir build/optimize-sanitize --output-on-failure +``` + +The changelog-only `misc/tidy.py` checks were run through installed Python 3.14, +with its two `uv run` generator launches directed to that interpreter because +`uv` was unavailable. The generators are standard-library-only, require Python +3.11+, and their checking logic and source files were unchanged. + +Windows and Linux CI execution, C ABI/Python packaging, broad numerical and +general-integer panels, and an uncontended cold-start performance baseline +remain release work. The added CI workflow covers static/shared core packages +on three platforms, numerical packages, installed consumers, and full-source +sanitizers, but no remote success is claimed. Native/FlatZinc compilation, +native sparse LP/cuts/branching, explanations/learning, quadratic/nonlinear +models and native parallel hybrid solving remain separate roadmap work. diff --git a/docs/solver-parity/WHEELS.md b/docs/solver-parity/WHEELS.md new file mode 100644 index 0000000000..5ae8af7c45 --- /dev/null +++ b/docs/solver-parity/WHEELS.md @@ -0,0 +1,106 @@ +# Local self-contained Python wheels + +The first wheel recipe targets a native macOS host and packages a prebuilt +single-architecture C ABI library with native Gecode and HiGHS linked statically +inside it. The installed Python package locates that library beside its own +modules. An application can call `Model()` without setting a library path or +installing a separate solver. Explicit `load_library(path)` and +`GECODE_OPTIMIZE_LIBRARY` still take precedence. Missing/incomplete bundled data +fails explicitly; it does not silently load an unrelated solver. + +This is a local experimental distribution. It does not publish to PyPI or +provide Linux, Windows, universal macOS, or separately linked dependency repair. +Those need their own builds, dependency audits and clean-environment tests. +The declared minimum macOS version is read from the binary; a successful run on +a newer host does not establish testing on that oldest supported OS. + +## Build a suitable library + +Start from a clean implementation checkout and the pinned HiGHS source recorded +in [dependencies.json](dependencies.json). Build in an isolated directory: + +```sh +cmake -S . -B build/python-wheel \ + -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=arm64 \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ + -DGECODE_ENABLE_OPTIMIZE=ON -DGECODE_OPTIMIZE_WITH_HIGHS=ON \ + -DGECODE_OPTIMIZE_HIGHS_SOURCE="$PWD/../deps/HiGHS" \ + -DGECODE_BUILD_SHARED=OFF -DGECODE_BUILD_STATIC=ON \ + -DBUILD_SHARED_LIBS=OFF -DGECODE_DEFAULT_LINK_VARIANT=STATIC \ + -DGECODE_ENABLE_QT=OFF -DGECODE_ENABLE_GIST=OFF \ + -DGECODE_ENABLE_MPFR=OFF -DGECODE_ENABLE_EXAMPLES=OFF \ + -DGECODE_ENABLE_SET_VARS=OFF -DGECODE_ENABLE_FLOAT_VARS=OFF \ + -DGECODE_ENABLE_MINIMODEL=OFF -DGECODE_ENABLE_DRIVER=OFF \ + -DGECODE_ENABLE_FLATZINC=OFF -DBUILD_TESTING=OFF \ + -DGECODE_OPTIMIZE_BUILD_TESTS=OFF +cmake --build build/python-wheel --target gecodeoptimize_c -j2 +``` + +This Python library contains the integer/global native API and numerical +LP/MILP/QP route. It does not bundle the legacy FlatZinc executable, Gist, set or +interval-float native frontends. Existing C++ installation recipes remain +available for those modules. The builder requires a matching native host; an +x86_64 recipe needs its own suitable deployment target and actual verification. + +Use a Python environment containing `packaging` and `wheel`, then run: + +```sh +python tools/python/build_macos_wheel.py \ + --library build/python-wheel/gecode/optimize/libgecodeoptimize_c.dylib \ + --output-dir build/wheels --version 0.1.0.dev20260905 +``` + +Packaging performs no compilation or downloads. It checks thin architecture, +the macOS deployment load command, and system-only dynamic dependencies. An +input depending on other solver libraries, Homebrew paths or unresolved rpaths +is rejected; rebuild it with static dependencies. A binary targeting macOS +15.7 cannot be relabeled as requiring 15.0. For modern macOS, build at a major +baseline such as 11.0 so the wheel tag can describe the actual minimum. Platform +tags describe interpreter/ABI/platform compatibility; this ctypes package uses +`py3-none` and a macOS architecture tag, with Python >=3.9 in its metadata. +[PyPA compatibility tags](https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/). + +The builder copies Python sources and required Gecode/HiGHS/dependency notices, +records source/dependency identities and binary/source hashes, runs an isolated +automatic-load native/numerical smoke test, and uses the standard `wheel pack` +tool. It independently checks every archive member against RECORD, excludes +interpreter bytecode, and publishes the finished local file without overwriting +an existing wheel. Wheel metadata marks the archive as platform-dependent. +[PyPA wheel format](https://packaging.python.org/en/latest/specifications/binary-distribution-format/). + +The source checkout must be clean unless `--allow-dirty` is explicitly selected +for development. A binary hash and successful smoke test do not prove that a +supplied binary was built from the accompanying source tree. Keep the build +configuration, source snapshot and test logs together; a release pipeline must +build and package the same frozen inputs. Bundled notices are included from the +clean pinned dependency source. No binary is downloaded at import or solve time. + +## Verify the installed wheel + +Install the resulting wheel into a fresh virtual environment using +`pip install --no-index --no-deps /absolute/path/to/the.whl`. Clear external +solver/Python/dynamic-library search overrides. Verify that both the imported +module and loaded C ABI file are inside that environment, and run the complete +Python conformance suite from outside the source package. Test numerical and +explicit native solves, ownership, cancellation and each newly added workflow. + +Use `python -I -B` for isolated packaging checks: `-I` ignores Python environment +variables, so an environment-only bytecode suppression flag is insufficient. +The package locates its own binary rather than relying on `find_library`, whose +platform search behavior is intended for installed external libraries. +[Python ctypes library lookup](https://docs.python.org/3/library/ctypes.html#finding-shared-libraries). + +Local checks and artifact paths belong in [VALIDATION.md](VALIDATION.md) once +the complete integration gate finishes. Add actual architecture/OS CI before +claiming cross-platform or minimum-OS release coverage; the broader workflow +should use established wheel tooling such as +[cibuildwheel](https://cibuildwheel.pypa.io/en/stable/). + +The packager inspects the private staged binary after capturing its bytes, so a +concurrent rebuild cannot attach older deployment metadata to a newer library. +System dependency paths containing `.` or `..` components are rejected. Run the +portable adversarial packaging panel with a Python environment containing +`packaging`: `python -I -B tools/python/test_build_macos_wheel.py -v`. It checks +staged-byte identity, dependency traversal, deployment tags, and wheel RECORD, +binary and bytecode rejection. Actual automatic loading remains a required +packaging step on the matching macOS architecture. diff --git a/docs/solver-parity/WORKFLOWS.md b/docs/solver-parity/WORKFLOWS.md new file mode 100644 index 0000000000..1b95abca90 --- /dev/null +++ b/docs/solver-parity/WORKFLOWS.md @@ -0,0 +1,59 @@ +# Ordered linear objective workflow + +`gecode/optimize/workflow.hpp` adds `solve_lexicographic` for a `Model` or owning `ModelSnapshot`. It solves linear objectives in the supplied order: the first entry has highest priority. There is no implicit sorting, blended-weight interpretation or Pareto-front enumeration. + +```cpp +Model model; +auto x = model.add_integer(0, 4); +auto y = model.add_integer(0, 4); +model.add_row({{x, 1}, {y, 1}}, 2, + std::numeric_limits::infinity()); + +LexicographicObjective first; +first.objective = {{{x, 1}}, 2, ObjectiveSense::Minimize}; +first.absolute_degradation = 1; +LexicographicObjective second; +second.objective = {{{y, 1}}, 0, ObjectiveSense::Minimize}; + +auto result = solve_lexicographic(model, {first, second}); +// First optimum: x+2 = 2. The permitted degradation gives x+2 <= 3. +// Second optimum: y = 1, with final x = 1. +``` + +Objective expressions follow the same canonical structure as snapshots: finite nonzero coefficients, ascending unique variable slots, active same-model handles and a finite offset. Invalid objectives anywhere in the list are rejected before the first solve. An empty list is invalid. Every original model constraint remains active; its original scalar objective is replaced privately for each phase. The original model and revision are never mutated. + +## Meaning of completion + +Both native MIP gap targets are forced to zero for each phase, regardless of `SolveOptions.relative_gap` and `absolute_gap`. A phase advances only after the numerical backend reports `Optimal`, supplies an independently validated solution and provides a finite agreeing global bound. Bound discrepancy must not exceed `max(feasibility_tolerance, 64 * double_epsilon * max(1, abs(objective), abs(bound)))`. The objective is independently recomputed and compared to the stage report; the gap is recomputed from that objective and the supplied bound, rather than trusted from a cached gap field. Missing/inconsistent bounds or objective disagreement stop the workflow with `NumericalFailure`. + +The guarantee remains **Numerical**. `termination == Optimal` and `completed_numerically()` mean all ordered stages completed under these numerical checks and the requested degradation/feasibility tolerances. They do not certify exact lexicographic optimality. Exact or certified policy requests are explicitly `Unsupported`. + +For achieved stage value `v`, permitted degradation is + +`absolute_degradation + relative_degradation * abs(v)`. + +Minimization creates an upper objective threshold; maximization creates a lower threshold. A later stage may use the entire permitted degradation. Consequently its final objective vector can differ from earlier stages' attained objective values. The last objective's degradation is checked for validity but has no later stage on which to act. + +Locks are formed from independently accumulated linear terms, with offsets included in the degradation calculation. Linear lock activity and total objective activity use separate compensated sums. The total includes the offset in its accumulator before the terms, preserving small residuals when a large linear subtotal cancels against the offset, including on platforms where `long double` has the precision of `double`. This avoids subtracting a large offset from an already rounded reported objective. Conversion to a double row bound rounds toward a tighter region. Unsupported overflow, an unrepresentable lock that loses the incumbent, or a backend numerical-range rejection ends the workflow explicitly; the implementation never substitutes infinity and drops the lock. + +Independent checks evaluate the final candidate against the original model, every accumulated lock row and the original objective retention thresholds. Feasibility tolerances still apply in original units, including at zero requested degradation. This is numerical validation rather than exact arithmetic. + +## Results and interrupted work + +- `stages` contains each attempted phase's numerical `SolveResult`, its input index/name, completion flag and optional retention threshold in original objective units. These stage results refer to the original variable identities but to private phase objectives and lock rows. +- `completed_stages` counts phases accepted for progression. No phase is promoted solely because it has a good incumbent. +- `final_solution` owns the latest timely independently checked original-model feasible assignment, including deleted slots. Its scalar objective evaluates the **original model objective**. That objective need not have been optimized, so `final_solution.termination` is `Unknown` and no scalar bound/gap is advertised. Read the workflow's termination and phase results instead. +- `objective_values` evaluates every requested objective at `final_solution`, in priority order. It is empty when no validated solution is available. +- A limited or failed phase stops the workflow immediately. A timely feasible incumbent can be retained without claiming that the phase is complete. Later infeasibility contradicting an already validated retained assignment is reported as `NumericalFailure`, not as proof that the original model is infeasible. + +One outer monotonic budget and cancellation token cover snapshot copying, structural checks, all solves, lock construction and candidate checks. Every phase receives only the remaining time. Limits remain cooperative inside backend calls; elapsed time can exceed a deadline, but a phase returning after the outer deadline is not promoted and its new candidate is discarded. A previously timely validated solution remains available. Zero time or pre-cancellation stops before solving. + +Node limits are supported for a single objective through the existing adapter. Any node limit on a multi-stage request returns `Unsupported` until consumed-node reporting supports a true aggregate budget. Threads, numerical ranges and other backend restrictions remain those of `solve`. + +An explicit primal start is used only for the first phase. Later phases clear it because a start feasible for the original constraints may violate a new objective lock. This initial workflow does not transfer backend bases or reuse a search tree between phases. + +## Validation coverage + +The standalone workflow test uses exhaustive independently generated integer assignments as an oracle for conflicting objectives, input-order priority, mixed min/max senses, offsets and absolute/relative degradation. It also checks continuous models, large-offset lock construction, large-term/offset cancellation residuals, empty/tombstoned models, original-model immutability, infeasibility, a later unbounded phase, zero deadlines, cancellation, node-budget restrictions, unsupported guarantees, malformed objectives and precision overflow. This is correctness testing, not performance measurement. + +The same test file has a `GECODE_WORKFLOW_TEST_FAKE_SOLVER` mode, linked with `model.cpp`, `result.cpp`, `validate.cpp`, `workflow.cpp` and the validation dependencies (`constraints.cpp`, plus `globals.cpp` where present), but without `solve.cpp`. Its deterministic backend exercises an incomplete second phase, cancellation during a phase, missing optimum bounds, a candidate violating a prior lock, contradictory later infeasibility, correctly reported cancellation residuals, and forged objective/bound values with cached zero gaps. It checks diminishing per-phase deadlines and cleared later starts without sleeps or timing-dependent assertions. This coordinator mode is also suitable for full ASan/UBSan instrumentation of the owned workflow and foundation sources. diff --git a/docs/solver-parity/checkpoints/benchmark-page.json b/docs/solver-parity/checkpoints/benchmark-page.json new file mode 100644 index 0000000000..0c205c603c --- /dev/null +++ b/docs/solver-parity/checkpoints/benchmark-page.json @@ -0,0 +1,1109 @@ +{ + "schema_version": 1, + "date": "5 September 2026", + "machine": "Apple M1 Pro · macOS 15.7.4 · one solver process at a time", + "source_commit": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60", + "capability_baseline": "e10562fd9", + "measured_source_head": "2da8c21a64dddcce6aed58232238a0a138675509", + "timing_scope": "Before is the preserved pre-project experimental build. Now is the ninth integrated version. Three alternating paired runs per problem use a two-second solver limit. External wall time includes startup, import, search and output.", + "conclusion": "The current route completed all five binary models in every repetition; the old route completed one. The smallest binary model and all four tiny CP fixtures took more wall time now. These observations support broader practical completion on this small binary panel, not a blanket speedup.", + "deadline_note": "An earlier, separate eighth-to-ninth regression comparison also recorded one four-second native-test timeout. It is retained in the historical checkpoint record. The fresh pre-project comparison had twelve solver-limit outcomes in the old binary cohort and no external kills or process errors.", + "tracks": [ + { + "id": "mip", + "title": "Binary optimization: more instances reach an optimum", + "description": "Five existing pure-binary MIPLIB models. Both versions support these problems. Before uses the experimental binary adapter; now uses the numerical HiGHS facade.", + "before_label": "Before project · binary adapter", + "after_label": "Now · HiGHS facade", + "protocol": "3 runs per version · 2 s solve limit", + "cases": [ + { + "id": "p0033", + "name": "p0033", + "before": { + "median_ms": 16.42687525600195, + "min_ms": 16.21541753411293, + "max_ms": 17.25245825946331, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 12.4447 + }, + "after": { + "median_ms": 30.774000100791454, + "min_ms": 29.966709204018116, + "max_ms": 30.855958350002766, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 21.65425 + } + }, + { + "id": "p0201", + "name": "p0201", + "before": { + "median_ms": null, + "min_ms": null, + "max_ms": null, + "completed": 0, + "attempts": 3, + "timeouts": 3, + "errors": 0, + "internal_median_ms": 2000.07 + }, + "after": { + "median_ms": 640.6541243195534, + "min_ms": 638.4319169446826, + "max_ms": 653.9131253957748, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 627.694292 + } + }, + { + "id": "p0282", + "name": "p0282", + "before": { + "median_ms": null, + "min_ms": null, + "max_ms": null, + "completed": 0, + "attempts": 3, + "timeouts": 3, + "errors": 0, + "internal_median_ms": 2000.12 + }, + "after": { + "median_ms": 159.07612536102533, + "min_ms": 157.41937514394522, + "max_ms": 159.0917082503438, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 147.533625 + } + }, + { + "id": "p0548", + "name": "p0548", + "before": { + "median_ms": null, + "min_ms": null, + "max_ms": null, + "completed": 0, + "attempts": 3, + "timeouts": 3, + "errors": 0, + "internal_median_ms": 2000.5000000000002 + }, + "after": { + "median_ms": 70.5472081899643, + "min_ms": 70.48162445425987, + "max_ms": 71.84308394789696, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 58.0345 + } + }, + { + "id": "lseu", + "name": "lseu", + "before": { + "median_ms": null, + "min_ms": null, + "max_ms": null, + "completed": 0, + "attempts": 3, + "timeouts": 3, + "errors": 0, + "internal_median_ms": 2000.0200000000002 + }, + "after": { + "median_ms": 190.51629211753607, + "min_ms": 189.77966532111168, + "max_ms": 192.13274959474802, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 181.129417 + } + } + ], + "completion": { + "before": 1, + "after": 5, + "total": 5 + }, + "note": "Completion requires the solver to report optimal and an independent exact witness check to match the known optimum. Twelve old runs returned feasible points at the limit. p0201 found the known optimum but did not prove it; it remains unfinished. Numerical HiGHS status is not an exact optimality certificate." + }, + { + "id": "native_cp", + "title": "Native CP: tiny end-to-end checks take longer", + "description": "Four unchanged legacy FlatZinc fixtures. These capabilities already existed. Preserved self-contained binaries are compared with the current shared-library build.", + "before_label": "Before project · native FlatZinc", + "after_label": "Now · native FlatZinc", + "protocol": "3 runs per version · 2 s solve limit", + "cases": [ + { + "id": "public_fzn_jobshop", + "name": "Job-shop scheduling", + "before": { + "median_ms": 5.044084042310715, + "min_ms": 4.4004591181874275, + "max_ms": 5.101041868329048, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.061333000000000006 + }, + "after": { + "median_ms": 10.596957989037037, + "min_ms": 9.554874151945114, + "max_ms": 11.109583079814911, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.055917 + } + }, + { + "id": "public_fzn_cumulatives", + "name": "Cumulative scheduling", + "before": { + "median_ms": 4.210375249385834, + "min_ms": 3.950292244553566, + "max_ms": 4.3702078983187675, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.018917 + }, + "after": { + "median_ms": 9.190459735691547, + "min_ms": 8.941750042140484, + "max_ms": 9.425750002264977, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.02225 + } + }, + { + "id": "public_fzn_sudoku", + "name": "Sudoku", + "before": { + "median_ms": 4.5649586245417595, + "min_ms": 4.501374438405037, + "max_ms": 4.720666445791721, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.183208 + }, + "after": { + "median_ms": 9.875999763607979, + "min_ms": 8.919082581996918, + "max_ms": 9.936165995895863, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.158666 + } + }, + { + "id": "public_fzn_multidim_knapsack_simple", + "name": "Multidimensional knapsack", + "before": { + "median_ms": 4.442458041012287, + "min_ms": 4.166833125054836, + "max_ms": 4.4939592480659485, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.056749999999999995 + }, + "after": { + "median_ms": 9.367084130644798, + "min_ms": 9.337584488093853, + "max_ms": 11.360875330865383, + "completed": 3, + "attempts": 3, + "timeouts": 0, + "errors": 0, + "internal_median_ms": 0.047583 + } + } + ], + "completion": { + "before": 4, + "after": 4, + "total": 4 + }, + "note": "Both versions match the original expected output in 12/12 runs. That is an output oracle, not an independent mathematical proof. Median internal search is only about 0.02–0.18 ms; process startup, loading, parsing and output dominate these 4–11 ms wall times. The build-layout change prevents attributing the full difference to solver algorithms." + } + ], + "capabilities": [ + { + "name": "Binary & bounded-integer optimization", + "before": "Native CP; experimental binary LP hybrid", + "after": "Expanded owning API", + "kind": "added", + "detail": "Native exact integer route within activity limits; numerical integer models also use HiGHS. Binary problems were already supported." + }, + { + "name": "Continuous linear programming (LP)", + "before": "No general numerical LP route", + "after": "Added: numerical LP", + "kind": "added", + "detail": "HiGHS backend. Original FloatVar interval constraints remain a separate CP facility, not this LP solver." + }, + { + "name": "Mixed integer + continuous linear models", + "before": "No general MILP route", + "after": "Added: numerical MILP", + "kind": "added", + "detail": "HiGHS supplies MIP search. Includes integer, binary and continuous variables; numerical bounds and tolerances apply." + }, + { + "name": "Semicontinuous & semi-integer domains", + "before": "Possible CP encodings; no retained MP type", + "after": "Explicit domain types", + "kind": "partial", + "detail": "Numerical adapter requires a finite positive nonzero lower bound and upper bound ≤100,000. Native route accepts supported finite semi-integer domains." + }, + { + "name": "Global constraints & scheduling", + "before": "Native all-different, table, circuit, scheduling and more", + "after": "Already available + six retained globals", + "kind": "retained", + "detail": "Original Gecode CP remains available. The new facade retains all-different, element, table, cumulative, circuit and Regular; it does not expose every native global." + }, + { + "name": "FlatZinc & MiniZinc", + "before": "Native FlatZinc/MiniZinc route", + "after": "Existing route + opt-in new route", + "kind": "retained", + "detail": "Separate Optimize compiler/registration supports a documented integer/Boolean subset. Existing solver defaults and original route remain available." + }, + { + "name": "Continuous convex quadratic objectives", + "before": "No dedicated numerical QP API", + "after": "Added: weighted-square subset", + "kind": "partial", + "detail": "HiGHS QP via a distinct API: bounded continuous variables, weighted affine squares, convex min/concave max. No arbitrary Hessian, QCP or integer QP." + }, + { + "name": "LP duals, bases & sensitivity", + "before": "No unified original-model observation API", + "after": "Added: checked numerical data", + "kind": "partial", + "detail": "Owning duals, basis starts, rays/Farkas evidence and selected-basis coefficient/equality-RHS sensitivity. Sensitivity is not an exact certificate or a full vendor-equivalent range API." + }, + { + "name": "Repeated solves & application workflows", + "before": "Application-managed models and search", + "after": "Added: explicit workflows", + "kind": "partial", + "detail": "Persistent numerical sessions, serial scenarios, ordered objectives, conflict diagnostics, weighted L1 repair and ranked pools; each has documented support and budget limits." + }, + { + "name": "Native incumbent improvement", + "before": "Native branch-and-bound; application-defined heuristics", + "after": "Added: bounded neighborhood API", + "kind": "partial", + "detail": "One explicit binary Hamming-distance attempt after a valid incumbent. Checked against the original model; C++ only; no full heuristic portfolio." + }, + { + "name": "Owning optimization C & Python APIs", + "before": "No matching Optimize C/Python package", + "after": "Added: versioned owning bindings", + "kind": "added", + "detail": "C++ core, versioned C handles and Python ctypes, including LP sensitivity. Current installed libraries are tested; the older wheel has not been rebuilt." + }, + { + "name": "Mixed-integer QP, QCP & general global nonlinear MP", + "before": "No equivalent dedicated MP engine", + "after": "Still outside Optimize scope", + "kind": "absent", + "detail": "Existing finite-domain and FloatVar expression facilities are not equivalent to a general numerical/global MIQP, QCP or nonlinear engine." + }, + { + "name": "Parallel optimization & learning", + "before": "Native parallel CP; no general learned hybrid", + "after": "Native CP retained; new hybrid work pending", + "kind": "partial", + "detail": "The added Optimize routes use one worker. Production learning, parallel hybrid search and general action callbacks remain unfinished." + } + ], + "new_checks": [ + { + "id": "lp_sensitivity", + "name": "LP coefficient & equality sensitivity", + "wall_ms": 14.821624383330345, + "checks": 63, + "detail": "Analytic interval checks for both objective senses, quotas and historical ownership." + }, + { + "id": "native_neighborhoods", + "name": "Bounded native incumbent improvement", + "wall_ms": 27.883917093276978, + "checks": 14, + "detail": "A real local improvement and an independently enumerated global optimum of −29." + } + ], + "fast": { + "passed": 35, + "required": 35, + "external_ms": 5800.286708399653 + }, + "raw_measurements": { + "schema_version": 1, + "before_label": "Pre-project experimental checkout", + "now_label": "Current integrated implementation", + "source_head": "2da8c21a64dddcce6aed58232238a0a138675509", + "repetitions": 3, + "per_solve_seconds": 2, + "wall_seconds": 28.87205804232508, + "all_records": 54, + "tracks": [ + { + "id": "mip", + "cases": [ + { + "id": "p0033", + "before": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.01725245825946331, + 0.01642687525600195, + 0.01621541753411293 + ], + "median_wall_seconds": 0.01642687525600195, + "median_internal_seconds": 0.0124447, + "objectives": [ + 3089.0, + 3089.0, + 3089.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.030855958350002766, + 0.029966709204018116, + 0.030774000100791454 + ], + "median_wall_seconds": 0.030774000100791454, + "median_internal_seconds": 0.02165425, + "objectives": [ + 3089.0, + 3089.0, + 3089.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "uncensored_ratio_now_over_before": 1.824248905346077, + "censored": false + }, + { + "id": "p0201", + "before": { + "runs": 3, + "completed": 0, + "statuses": [ + "feasible", + "feasible", + "feasible" + ], + "wall_seconds": [ + 2.005339833907783, + 2.005091417580843, + 2.0048357909545302 + ], + "median_wall_seconds": 2.005091417580843, + "median_internal_seconds": 2.00007, + "objectives": [ + 7615.0, + 7615.0, + 7615.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.6539131253957748, + 0.6384319169446826, + 0.6406541243195534 + ], + "median_wall_seconds": 0.6406541243195534, + "median_internal_seconds": 0.627694292, + "objectives": [ + 7615.0, + 7615.0, + 7615.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "uncensored_ratio_now_over_before": null, + "censored": true + }, + { + "id": "p0282", + "before": { + "runs": 3, + "completed": 0, + "statuses": [ + "feasible", + "feasible", + "feasible" + ], + "wall_seconds": [ + 2.005312000401318, + 2.0052555417641997, + 2.005481792613864 + ], + "median_wall_seconds": 2.005312000401318, + "median_internal_seconds": 2.00012, + "objectives": [ + 387619.0, + 386895.0, + 386895.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.1590917082503438, + 0.15741937514394522, + 0.15907612536102533 + ], + "median_wall_seconds": 0.15907612536102533, + "median_internal_seconds": 0.147533625, + "objectives": [ + 258411.0, + 258411.0, + 258411.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "uncensored_ratio_now_over_before": null, + "censored": true + }, + { + "id": "p0548", + "before": { + "runs": 3, + "completed": 0, + "statuses": [ + "feasible", + "feasible", + "feasible" + ], + "wall_seconds": [ + 2.006830083206296, + 2.006179416552186, + 2.006000875495374 + ], + "median_wall_seconds": 2.006179416552186, + "median_internal_seconds": 2.0005, + "objectives": [ + 28554.0, + 28554.0, + 28554.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.0705472081899643, + 0.07184308394789696, + 0.07048162445425987 + ], + "median_wall_seconds": 0.0705472081899643, + "median_internal_seconds": 0.0580345, + "objectives": [ + 8691.0, + 8691.0, + 8691.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "uncensored_ratio_now_over_before": null, + "censored": true + }, + { + "id": "lseu", + "before": { + "runs": 3, + "completed": 0, + "statuses": [ + "feasible", + "feasible", + "feasible" + ], + "wall_seconds": [ + 2.0048314165323973, + 2.004163875244558, + 2.004320750012994 + ], + "median_wall_seconds": 2.004320750012994, + "median_internal_seconds": 2.00002, + "objectives": [ + 2278.0, + 2278.0, + 2278.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "wall_seconds": [ + 0.19051629211753607, + 0.19213274959474802, + 0.18977966532111168 + ], + "median_wall_seconds": 0.19051629211753607, + "median_internal_seconds": 0.181129417, + "objectives": [ + 1120.0, + 1120.0, + 1120.0 + ], + "validation": [ + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains", + "independent_exact_original_rows_and_domains" + ] + }, + "uncensored_ratio_now_over_before": null, + "censored": true + } + ], + "required_runs_per_cohort": 15, + "before": { + "completed_runs": 3, + "all_runs": 15, + "all_repetitions_completed_cases": 1 + }, + "now": { + "completed_runs": 15, + "all_runs": 15, + "all_repetitions_completed_cases": 5 + } + }, + { + "id": "native_cp", + "cases": [ + { + "id": "public_fzn_jobshop", + "before": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.005044084042310715, + 0.005101041868329048, + 0.0044004591181874275 + ], + "median_wall_seconds": 0.005044084042310715, + "median_internal_seconds": 6.1333e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.010596957989037037, + 0.011109583079814911, + 0.009554874151945114 + ], + "median_wall_seconds": 0.010596957989037037, + "median_internal_seconds": 5.5917e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "uncensored_ratio_now_over_before": 2.17133573914006, + "censored": false + }, + { + "id": "public_fzn_cumulatives", + "before": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.0043702078983187675, + 0.004210375249385834, + 0.003950292244553566 + ], + "median_wall_seconds": 0.004210375249385834, + "median_internal_seconds": 1.8917e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.008941750042140484, + 0.009190459735691547, + 0.009425750002264977 + ], + "median_wall_seconds": 0.009190459735691547, + "median_internal_seconds": 2.225e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "uncensored_ratio_now_over_before": 2.182812502764963, + "censored": false + }, + { + "id": "public_fzn_sudoku", + "before": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.0045649586245417595, + 0.004720666445791721, + 0.004501374438405037 + ], + "median_wall_seconds": 0.0045649586245417595, + "median_internal_seconds": 0.000183208, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.008919082581996918, + 0.009936165995895863, + 0.009875999763607979 + ], + "median_wall_seconds": 0.009875999763607979, + "median_internal_seconds": 0.000158666, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "uncensored_ratio_now_over_before": 2.104822721536181, + "censored": false + }, + { + "id": "public_fzn_multidim_knapsack_simple", + "before": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.004166833125054836, + 0.0044939592480659485, + 0.004442458041012287 + ], + "median_wall_seconds": 0.004442458041012287, + "median_internal_seconds": 5.675e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "now": { + "runs": 3, + "completed": 3, + "statuses": [ + "passed", + "passed", + "passed" + ], + "wall_seconds": [ + 0.009367084130644798, + 0.011360875330865383, + 0.009337584488093853 + ], + "median_wall_seconds": 0.009367084130644798, + "median_internal_seconds": 4.7583e-05, + "objectives": [ + null, + null, + null + ], + "validation": [ + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output", + "exact_unchanged_upstream_output" + ] + }, + "uncensored_ratio_now_over_before": 2.248010383310353, + "censored": false + } + ], + "required_runs_per_cohort": 12, + "before": { + "completed_runs": 12, + "all_runs": 12, + "all_repetitions_completed_cases": 4 + }, + "now": { + "completed_runs": 12, + "all_runs": 12, + "all_repetitions_completed_cases": 4 + } + } + ], + "caveats": [ + "Five pure-binary MIPLIB3 classics; not a broad MILP performance score.", + "Native CP uses the unchanged default FlatZinc path and pre-existing capabilities.", + "MIP before is the pre-existing experimental binary auto adapter; now is the numerical HiGHS facade. Different public file formats have exact mathematical equivalence.", + "Native CP uses exact upstream expected output, not an independent mathematical checker.", + "End-to-end times include startup, import, search and output; tiny cases are startup-sensitive.", + "Three alternating paired repetitions; one process at a time. No warm starts or reference assignments.", + "No speedup ratio is published for a case with a censored or unsuccessful repetition.", + "Before executables statically link native libraries; current executables use shared libraries. End-to-end differences include this build/layout difference, so the tiny native timings are not evidence of slower propagation.", + "Before p0201 found a known-optimal assignment in each repetition, but did not prove completion within two seconds; feasibility and proof completion are reported separately.", + "Every native Gecode source file recorded by the old build manifests matches the initial project snapshot; remaining metadata differences are experimental benchmark scripts/driver source irrelevant to the old FlatZinc binary." + ], + "compiled_facade_head": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60", + "initial_snapshot_head": "e10562fd9", + "upstream_base": "3e0e8ee76fb4ba01c53616dce02c0bb1a53f159e", + "current_fast": { + "external_seconds": 5.800286708399653, + "returncode": 0, + "required_cases": 35, + "passed": true, + "reported_elapsed_seconds": 5.716812875121832 + } + }, + "raw_provenance": { + "schema_version": 1, + "source_head": "2da8c21a64dddcce6aed58232238a0a138675509", + "compiled_facade_head": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60", + "initial_snapshot_head": "e10562fd9", + "upstream_base": "3e0e8ee76fb4ba01c53616dce02c0bb1a53f159e", + "runner_sha256": "719e921b738ec4780cedc56e031f440c648618b7a6a0e89d05c949b628890abc", + "binary_hashes": { + "mip": { + "before": { + "filename": "enhanced-binary", + "sha256": "c77953bd11dba0a8bf205e9f5d0941bc94280c9ffcc9cd5d172674e03d88a28b" + }, + "now": { + "filename": "optimize-file", + "sha256": "97cb18f1ac74721b093808269954ce6e00bb37b414916aacd60ec2a30a36729b" + } + }, + "native_cp": { + "before": { + "filename": "enhanced-fzn", + "sha256": "c1121f1490166fd4ca0425a4aa73af319547d64fbef199c0228e35fc54a5cb0b" + }, + "now": { + "filename": "fzn-gecode", + "sha256": "acf35dcb3705beb22ac43d027c8db463fb58dbd34eb9e1818049dd9e2324e66c" + } + } + }, + "library_hashes": [ + { + "filename": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "filename": "libgecodedriver.6.4.0.dylib", + "sha256": "977abee2a234dbeee4db6fdc8a1b4f1ebdd59266509b0eaf7c48a4720989a609" + }, + { + "filename": "libgecodeflatzinc.6.4.0.dylib", + "sha256": "31eb5241319cdb9e9330df6c3316483f0a0ef056fb53fa458f95b6290601409c" + }, + { + "filename": "libgecodefloat.6.4.0.dylib", + "sha256": "8a829ff435d7af3a539279dfc36967257863f8790175a932f113f954970aa8d0" + }, + { + "filename": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "filename": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "filename": "libgecodeminimodel.6.4.0.dylib", + "sha256": "67237fc86812ad3589eb0721e88d28b9b91df028c8049f0f739a5362189aefcf" + }, + { + "filename": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "filename": "libgecodeset.6.4.0.dylib", + "sha256": "df36089032432c6219707766734c2d003b05444a26cf71a66f96d595c3d5434c" + }, + { + "filename": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "inputs": { + "p0033": { + "mps_sha256": "8ccff819023237c79ef32e238a5da9348725ce9a4425d48888baf3a0b3b42628", + "old_txt_sha256": "d07a73e53afd265a31bfbf85f3d8061064760306099a676bf3b6296f19ac9793", + "old_json_sha256": "1f8a376be6004627566c3737eb85e3f7f29c8ec3ee175763b1c9b1f3bd893ef1", + "exact_equivalent": true, + "known_optimum": 3089, + "columns": 33, + "original_rows": 16 + }, + "p0201": { + "mps_sha256": "8352d7f121289185f443fdc67080fa9de01e5b9bf11b0bf41087fba4277c07a4", + "old_txt_sha256": "f0b1968004719c39aae88efb33c39e68c74c7efc6f077b62f037807fb56d53bf", + "old_json_sha256": "d7084ebeddb73a6ee3939ff8cdc2d77a06ce52f88a25324821fb3164e5aaacd8", + "exact_equivalent": true, + "known_optimum": 7615, + "columns": 201, + "original_rows": 133 + }, + "p0282": { + "mps_sha256": "3bf907c6aa3cbf80de7c48ca8e71dc29f5d70f6e5fffb716502bfc5c513196a1", + "old_txt_sha256": "408420f2b345c8d282a3983db60712a6db2cff838be4c79e1bad5dc8df7979d1", + "old_json_sha256": "a7d7aaeb805399226501d896449609fe0918f50e1becca6152cbc3952749721f", + "exact_equivalent": true, + "known_optimum": 258411, + "columns": 282, + "original_rows": 241 + }, + "p0548": { + "mps_sha256": "81fa3fb1e071cac0b72649c38196c18bca7ff6d7f2f6639776dcb0daf6bcab15", + "old_txt_sha256": "42c9a4871e7ad41cf3edbf2c55509667c11fc9826f1a681691f98fcd682e44d4", + "old_json_sha256": "dd1e7c090b1c6aa69687bfa38fdda124bd9622ff96760bc5a0bca64542f1782b", + "exact_equivalent": true, + "known_optimum": 8691, + "columns": 548, + "original_rows": 176 + }, + "lseu": { + "mps_sha256": "00416576ed4adac15b62b1982cb7be9d7dcb2d6505067dd8396183ff1eac3dab", + "old_txt_sha256": "9fbd0b9d8d97907b88baac78b687e85b4fa046a082b6e3af0fc8a4cadac00d47", + "old_json_sha256": "4a5cb033dd9afba96a9149d61cb93cec5a5afbc48ac04d6145694c9e55c57867", + "exact_equivalent": true, + "known_optimum": 1120, + "columns": 89, + "original_rows": 28 + }, + "public_fzn_cumulatives": { + "fzn_sha256": "2982f04cf31062f9c3806e400e9e23543652a28588742c06e44aa7806348867a", + "expected_sha256": "45939d382d16d51b6a2cdb164732a49fb72ea8d13da7b7e6ae9cb391b0620107", + "family": "scheduling", + "method": "satisfy", + "all_solutions": false + }, + "public_fzn_jobshop": { + "fzn_sha256": "b8cf76fa19b5c167c8234d57eb4687d70429e95841227bda01ee2ca4cc0a05b5", + "expected_sha256": "1654ffcba431fbcc189183eed0c8b6138f464261c9c7f18eef8cd0cf550adf84", + "family": "scheduling", + "method": "minimize", + "all_solutions": false + }, + "public_fzn_multidim_knapsack_simple": { + "fzn_sha256": "6f6acc59aa0055b0989c0ce99cd16261d4c0222ee0fd9781d9780a7f9cabed48", + "expected_sha256": "497377fbc5dbb4cf2ec11fd9d775809003ca1f50a66a92da4b6c62dbebdb90a1", + "family": "allocation_production", + "method": "maximize", + "all_solutions": false + }, + "public_fzn_sudoku": { + "fzn_sha256": "ffccdeaebbd461604983a6c80caa9a9741b438b464d21b5a307a346908639bab", + "expected_sha256": "37aa1bfb97da394d8e0fc043681b172d10deb4387ba2c67ab2afc3e191fef631", + "family": "latin_magic_design", + "method": "satisfy", + "all_solutions": false + } + }, + "runtime_hashes_unchanged": true, + "all_recorded_native_source_files_match_initial_snapshot": true + }, + "evidence_sha256": { + "summary.json": "7a3fa7a2d1e8fb8c054f27f5bc9694035070ef7050a630adea514fa5e16db09c", + "report.json": "1682798e2002e6c4c119641305a6f75838970787b3bde8428f136b0f85b18035", + "current-fast.json": "367953adf99670db01a6163ea5474d90d0a1c1beda504154ed7b3f36a0435df1", + "current-fast-wall.json": "7d6f415fe7cf0afae79295450372faf937af9d6412a84ad5651e7ab92be0a365" + } +} diff --git a/docs/solver-parity/checkpoints/boundaries.json b/docs/solver-parity/checkpoints/boundaries.json new file mode 100644 index 0000000000..834bd26c2d --- /dev/null +++ b/docs/solver-parity/checkpoints/boundaries.json @@ -0,0 +1,281540 @@ +{ + "projection": { + "schema_version": 1, + "families": [ + { + "id": "knapsack", + "name": "Knapsack", + "detail": "Both random and correlated profits", + "role": "target", + "cases": [ + { + "id": "knapsack-32", + "tier": "adaptive", + "variables": 32, + "size_label": "32 items", + "dimensions": "32 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 3998.5673954999997, + "min_solve_ms": 336.872166, + "max_solve_ms": 7661.121958, + "median_wall_ms": 4008.6337084999286 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.3111455, + "min_solve_ms": 0.28445800000000004, + "max_solve_ms": 2.3378330000000003, + "median_wall_ms": 15.49756300005356 + } + }, + { + "id": "knapsack-33", + "tier": "adaptive", + "variables": 33, + "size_label": "33 items", + "dimensions": "33 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 5025.736291499999, + "min_solve_ms": 318.22504200000003, + "max_solve_ms": 9990.155417, + "median_wall_ms": 5036.132083500092 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.398583, + "min_solve_ms": 0.29224999999999995, + "max_solve_ms": 0.504916, + "median_wall_ms": 10.355854499948691 + } + }, + { + "id": "knapsack-34", + "tier": "adaptive", + "variables": 34, + "size_label": "34 items", + "dimensions": "34 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 4, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.3403125, + "min_solve_ms": 0.337, + "max_solve_ms": 0.343625, + "median_wall_ms": 10.314562500070679 + } + }, + { + "id": "knapsack-36", + "tier": "adaptive", + "variables": 36, + "size_label": "36 items", + "dimensions": "36 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 1, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-40", + "tier": "adaptive", + "variables": 40, + "size_label": "40 items", + "dimensions": "40 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-48", + "tier": "adaptive", + "variables": 48, + "size_label": "48 items", + "dimensions": "48 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-64", + "tier": "adaptive", + "variables": 64, + "size_label": "64 items", + "dimensions": "64 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.8348329999999999, + "min_solve_ms": 0.833, + "max_solve_ms": 0.836666, + "median_wall_ms": 9.078833499984285 + } + }, + { + "id": "knapsack-128", + "tier": "adaptive", + "variables": 128, + "size_label": "128 items", + "dimensions": "128 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2.8064169999999997, + "min_solve_ms": 2.7743339999999996, + "max_solve_ms": 2.8385, + "median_wall_ms": 11.632604000055835 + } + }, + { + "id": "knapsack-256", + "tier": "adaptive", + "variables": 256, + "size_label": "256 items", + "dimensions": "256 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 10.884540999999999, + "min_solve_ms": 10.759540999999999, + "max_solve_ms": 11.009540999999999, + "median_wall_ms": 19.295624999926986 + } + }, + { + "id": "knapsack-384", + "tier": "adaptive", + "variables": 384, + "size_label": "384 items", + "dimensions": "384 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 24.542458500000002, + "min_solve_ms": 24.178167000000002, + "max_solve_ms": 24.90675, + "median_wall_ms": 34.672437499921216 + } + }, + { + "id": "knapsack-400", + "tier": "adaptive", + "variables": 400, + "size_label": "400 items", + "dimensions": "400 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 26.669729, + "min_solve_ms": 26.535125, + "max_solve_ms": 26.804333, + "median_wall_ms": 37.21504200007075 + } + }, + { + "id": "knapsack-404", + "tier": "adaptive", + "variables": 404, + "size_label": "404 items", + "dimensions": "404 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 27.083728999999998, + "min_solve_ms": 26.925, + "max_solve_ms": 27.242458, + "median_wall_ms": 37.502916499988714 + } + }, + { + "id": "knapsack-406", + "tier": "adaptive", + "variables": 406, + "size_label": "406 items", + "dimensions": "406 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 26.905979000000002, + "min_solve_ms": 26.7175, + "max_solve_ms": 27.31175, + "median_wall_ms": 37.05162499989001 + } + }, + { + "id": "knapsack-407", + "tier": "adaptive", + "variables": 407, + "size_label": "407 items", + "dimensions": "407 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 27.7544585, + "min_solve_ms": 27.62575, + "max_solve_ms": 27.906958999999997, + "median_wall_ms": 37.992062499938584 + } + }, + { + "id": "knapsack-408", + "tier": "adaptive", + "variables": 408, + "size_label": "408 items", + "dimensions": "408 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 4, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-416", + "tier": "adaptive", + "variables": 416, + "size_label": "416 items", + "dimensions": "416 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-448", + "tier": "adaptive", + "variables": 448, + "size_label": "448 items", + "dimensions": "448 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-512", + "tier": "adaptive", + "variables": 512, + "size_label": "512 items", + "dimensions": "512 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "33 items", + "next": "Next tested failure: 34 items (2/4 completed).", + "reversals": 0, + "confirmed_size": 33, + "next_failure_size": 34 + }, + "before_max": 33, + "after_boundary": { + "label": "407 items", + "next": "Next tested failure: 408 items (0/4 completed).", + "reversals": 0, + "confirmed_size": 407, + "next_failure_size": 408 + }, + "after_max": 407, + "expansion": 12.333333333333334 + }, + { + "id": "assignment", + "name": "Assignment", + "detail": "One task per worker", + "role": "control", + "cases": [ + { + "id": "assignment-16", + "tier": "adaptive", + "variables": 256, + "size_label": "16 tasks", + "dimensions": "16 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3001.2899580000003, + "min_solve_ms": 2996.61925, + "max_solve_ms": 3005.960666, + "median_wall_ms": 3016.1530624999386 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3041.263771, + "min_solve_ms": 3001.4066669999997, + "max_solve_ms": 3081.120875, + "median_wall_ms": 3055.9498960000155 + } + }, + { + "id": "assignment-17", + "tier": "adaptive", + "variables": 289, + "size_label": "17 tasks", + "dimensions": "17 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 6946.461020499999, + "min_solve_ms": 6940.994124999999, + "max_solve_ms": 6951.927916, + "median_wall_ms": 6958.276562500032 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 7171.5868125, + "min_solve_ms": 7095.456083, + "max_solve_ms": 7247.717542, + "median_wall_ms": 7188.858229499942 + } + }, + { + "id": "assignment-18", + "tier": "adaptive", + "variables": 324, + "size_label": "18 tasks", + "dimensions": "18 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "assignment-20", + "tier": "adaptive", + "variables": 400, + "size_label": "20 tasks", + "dimensions": "20 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "assignment-24", + "tier": "adaptive", + "variables": 576, + "size_label": "24 tasks", + "dimensions": "24 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "assignment-32", + "tier": "adaptive", + "variables": 1024, + "size_label": "32 tasks", + "dimensions": "32 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "17 tasks", + "next": "Next tested failure: 18 tasks (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "before_max": 289, + "after_boundary": { + "label": "17 tasks", + "next": "Next tested failure: 18 tasks (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "after_max": 289, + "expansion": 1.0 + }, + { + "id": "facility_location", + "name": "Facility location", + "detail": "Two customers per candidate site", + "role": "control", + "cases": [ + { + "id": "facility_location-7", + "tier": "adaptive", + "variables": 105, + "size_label": "7 sites", + "dimensions": "7 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 452.368896, + "min_solve_ms": 447.378959, + "max_solve_ms": 457.358833, + "median_wall_ms": 465.5777704999764 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 427.50172899999995, + "min_solve_ms": 417.743083, + "max_solve_ms": 437.26037499999995, + "median_wall_ms": 440.3391459999284 + } + }, + { + "id": "facility_location-8", + "tier": "adaptive", + "variables": 136, + "size_label": "8 sites", + "dimensions": "8 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2732.11075, + "min_solve_ms": 2721.0882500000002, + "max_solve_ms": 2743.13325, + "median_wall_ms": 2747.99024999993 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2846.6750620000003, + "min_solve_ms": 2710.4195830000003, + "max_solve_ms": 2982.930541, + "median_wall_ms": 2866.853562499955 + } + }, + { + "id": "facility_location-9", + "tier": "adaptive", + "variables": 171, + "size_label": "9 sites", + "dimensions": "9 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "facility_location-10", + "tier": "adaptive", + "variables": 210, + "size_label": "10 sites", + "dimensions": "10 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "facility_location-12", + "tier": "adaptive", + "variables": 300, + "size_label": "12 sites", + "dimensions": "12 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "facility_location-16", + "tier": "adaptive", + "variables": 528, + "size_label": "16 sites", + "dimensions": "16 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "8 sites", + "next": "Next tested failure: 9 sites (0/2 completed).", + "reversals": 0, + "confirmed_size": 8, + "next_failure_size": 9 + }, + "before_max": 136, + "after_boundary": { + "label": "8 sites", + "next": "Next tested failure: 9 sites (0/2 completed).", + "reversals": 0, + "confirmed_size": 8, + "next_failure_size": 9 + }, + "after_max": 136, + "expansion": 1.0 + }, + { + "id": "bin_packing", + "name": "Bin packing", + "detail": "Weighted items; candidate bins grow with size", + "role": "control", + "cases": [ + { + "id": "bin_packing-16", + "tier": "adaptive", + "variables": 102, + "size_label": "16 items", + "dimensions": "16 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 821.655792, + "min_solve_ms": 813.6678750000001, + "max_solve_ms": 829.643709, + "median_wall_ms": 837.1890834999931 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 830.9882915, + "min_solve_ms": 817.8858329999999, + "max_solve_ms": 844.09075, + "median_wall_ms": 848.1802080000307 + } + }, + { + "id": "bin_packing-17", + "tier": "adaptive", + "variables": 108, + "size_label": "17 items", + "dimensions": "17 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2998.6497295, + "min_solve_ms": 2972.161667, + "max_solve_ms": 3025.137792, + "median_wall_ms": 3010.13739550001 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2932.545833, + "min_solve_ms": 2931.9435, + "max_solve_ms": 2933.148166, + "median_wall_ms": 2943.8166250000677 + } + }, + { + "id": "bin_packing-18", + "tier": "adaptive", + "variables": 114, + "size_label": "18 items", + "dimensions": "18 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "bin_packing-20", + "tier": "adaptive", + "variables": 147, + "size_label": "20 items", + "dimensions": "20 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "bin_packing-24", + "tier": "adaptive", + "variables": 200, + "size_label": "24 items", + "dimensions": "24 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "bin_packing-32", + "tier": "adaptive", + "variables": 363, + "size_label": "32 items", + "dimensions": "32 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "17 items", + "next": "Next tested failure: 18 items (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "before_max": 108, + "after_boundary": { + "label": "17 items", + "next": "Next tested failure: 18 items (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "after_max": 108, + "expansion": 1.0 + }, + { + "id": "production", + "name": "Production planning", + "detail": "Eight quantity options per period", + "role": "control", + "cases": [ + { + "id": "production-6", + "tier": "adaptive", + "variables": 48, + "size_label": "6 periods", + "dimensions": "6 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 2.9298330000000004, + "min_solve_ms": 2.9298330000000004, + "max_solve_ms": 2.9298330000000004, + "median_wall_ms": 24.471665999953984 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 3.029458, + "min_solve_ms": 3.029458, + "max_solve_ms": 3.029458, + "median_wall_ms": 23.777500000051077 + } + }, + { + "id": "production-9", + "tier": "adaptive", + "variables": 72, + "size_label": "9 periods", + "dimensions": "9 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 54.211542, + "min_solve_ms": 54.211542, + "max_solve_ms": 54.211542, + "median_wall_ms": 67.65570900006423 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 53.94175, + "min_solve_ms": 53.94175, + "max_solve_ms": 53.94175, + "median_wall_ms": 68.85912500001723 + } + }, + { + "id": "production-10", + "tier": "adaptive", + "variables": 80, + "size_label": "10 periods", + "dimensions": "10 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1196.422125, + "min_solve_ms": 1190.613625, + "max_solve_ms": 1202.2306250000001, + "median_wall_ms": 1209.3442704999688 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1181.5364795, + "min_solve_ms": 1174.42325, + "max_solve_ms": 1188.649709, + "median_wall_ms": 1193.373854000015 + } + }, + { + "id": "production-11", + "tier": "adaptive", + "variables": 88, + "size_label": "11 periods", + "dimensions": "11 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3871.193292, + "min_solve_ms": 3850.150167, + "max_solve_ms": 3892.236417, + "median_wall_ms": 3882.827249999991 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3861.1062915, + "min_solve_ms": 3841.297708, + "max_solve_ms": 3880.9148750000004, + "median_wall_ms": 3873.54068749994 + } + }, + { + "id": "production-12", + "tier": "adaptive", + "variables": 96, + "size_label": "12 periods", + "dimensions": "12 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "11 periods", + "next": "Next tested failure: 12 periods (0/2 completed).", + "reversals": 0, + "confirmed_size": 11, + "next_failure_size": 12 + }, + "before_max": 88, + "after_boundary": { + "label": "11 periods", + "next": "Next tested failure: 12 periods (0/2 completed).", + "reversals": 0, + "confirmed_size": 11, + "next_failure_size": 12 + }, + "after_max": 88, + "expansion": 1.0 + }, + { + "id": "native_tsp", + "name": "Routing", + "detail": "Minimum-cost tour through all cities", + "role": "control", + "cases": [ + { + "id": "native_tsp-16", + "tier": "adaptive", + "variables": 32, + "size_label": "16 cities", + "dimensions": "16 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 57.045458, + "min_solve_ms": 57.045458, + "max_solve_ms": 57.045458, + "median_wall_ms": 79.36716600011096 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 58.502625, + "min_solve_ms": 58.502625, + "max_solve_ms": 58.502625, + "median_wall_ms": 79.36066599995684 + } + }, + { + "id": "native_tsp-20", + "tier": "adaptive", + "variables": 40, + "size_label": "20 cities", + "dimensions": "20 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3329.1069375000006, + "min_solve_ms": 3301.0807080000004, + "max_solve_ms": 3357.1331670000004, + "median_wall_ms": 3345.8349170000474 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3187.6184169999997, + "min_solve_ms": 3185.582417, + "max_solve_ms": 3189.6544169999997, + "median_wall_ms": 3200.6499789997633 + } + }, + { + "id": "native_tsp-21", + "tier": "adaptive", + "variables": 42, + "size_label": "21 cities", + "dimensions": "21 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9906.0240835, + "min_solve_ms": 9894.728834, + "max_solve_ms": 9917.319333, + "median_wall_ms": 9917.359833000091 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9616.1226875, + "min_solve_ms": 9552.187249999999, + "max_solve_ms": 9680.058125, + "median_wall_ms": 9630.330083499985 + } + }, + { + "id": "native_tsp-22", + "tier": "adaptive", + "variables": 44, + "size_label": "22 cities", + "dimensions": "22 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "native_tsp-24", + "tier": "adaptive", + "variables": 48, + "size_label": "24 cities", + "dimensions": "24 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "native_tsp-32", + "tier": "adaptive", + "variables": 64, + "size_label": "32 cities", + "dimensions": "32 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "21 cities", + "next": "Next tested failure: 22 cities (0/2 completed).", + "reversals": 0, + "confirmed_size": 21, + "next_failure_size": 22 + }, + "before_max": 42, + "after_boundary": { + "label": "21 cities", + "next": "Next tested failure: 22 cities (0/2 completed).", + "reversals": 0, + "confirmed_size": 21, + "next_failure_size": 22 + }, + "after_max": 42, + "expansion": 1.0 + }, + { + "id": "weighted_queens", + "name": "Weighted queens", + "detail": "Minimum-cost non-attacking placement", + "role": "control", + "cases": [ + { + "id": "weighted_queens-12", + "tier": "adaptive", + "variables": 48, + "size_label": "12 queens", + "dimensions": "12 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 7.622541, + "min_solve_ms": 7.622541, + "max_solve_ms": 7.622541, + "median_wall_ms": 30.596291999700043 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 10.291375, + "min_solve_ms": 10.291375, + "max_solve_ms": 10.291375, + "median_wall_ms": 32.5449590000062 + } + }, + { + "id": "weighted_queens-18", + "tier": "adaptive", + "variables": 72, + "size_label": "18 queens", + "dimensions": "18 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 739.1214160000001, + "min_solve_ms": 739.1214160000001, + "max_solve_ms": 739.1214160000001, + "median_wall_ms": 755.0524579996818 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 733.097084, + "min_solve_ms": 733.097084, + "max_solve_ms": 733.097084, + "median_wall_ms": 745.2865000000202 + } + }, + { + "id": "weighted_queens-21", + "tier": "adaptive", + "variables": 84, + "size_label": "21 queens", + "dimensions": "21 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 6228.711208, + "min_solve_ms": 6228.711208, + "max_solve_ms": 6228.711208, + "median_wall_ms": 6240.777417000118 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 6368.260792, + "min_solve_ms": 6368.260792, + "max_solve_ms": 6368.260792, + "median_wall_ms": 6382.471584000086 + } + }, + { + "id": "weighted_queens-22", + "tier": "adaptive", + "variables": 88, + "size_label": "22 queens", + "dimensions": "22 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 7375.941188, + "min_solve_ms": 6819.674542, + "max_solve_ms": 7932.207834, + "median_wall_ms": 7392.391583500057 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 6826.8477705, + "min_solve_ms": 6795.351833, + "max_solve_ms": 6858.343707999999, + "median_wall_ms": 6853.835812499938 + } + }, + { + "id": "weighted_queens-23", + "tier": "adaptive", + "variables": 92, + "size_label": "23 queens", + "dimensions": "23 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9274.8362295, + "min_solve_ms": 9146.579792, + "max_solve_ms": 9403.092666999999, + "median_wall_ms": 9297.531312499814 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9203.606436999999, + "min_solve_ms": 8930.659208, + "max_solve_ms": 9476.553666, + "median_wall_ms": 9216.568021000057 + } + }, + { + "id": "weighted_queens-24", + "tier": "adaptive", + "variables": 96, + "size_label": "24 queens", + "dimensions": "24 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "23 queens", + "next": "Next tested failure: 24 queens (0/2 completed).", + "reversals": 0, + "confirmed_size": 23, + "next_failure_size": 24 + }, + "before_max": 92, + "after_boundary": { + "label": "23 queens", + "next": "Next tested failure: 24 queens (0/2 completed).", + "reversals": 0, + "confirmed_size": 23, + "next_failure_size": 24 + }, + "after_max": 92, + "expansion": 1.0 + } + ], + "runs": 162, + "cases": 71, + "elapsed_seconds": 931.6176939579998, + "clock_anomalies": [ + { + "case": "assignment-18-single", + "cohort": "after", + "repetition": 1, + "solve_seconds": 25.724303041, + "external_seconds": 8.81914658300002 + } + ], + "seconds": 10, + "source_commit": "f724bd01795a87b2c310ba368c66d36bb09f660f", + "evidence": { + "report": "build/adaptive-boundaries/results/report.json", + "sha256": "d3f7f97687503c8f9e6302861bd79c83d5f36369efd4600ce1b0e2c7533db038", + "source_commit": "f724bd01795a87b2c310ba368c66d36bb09f660f" + } + }, + "report": { + "protocol": { + "seconds": 10, + "capture_seconds": 11, + "whole_seconds": 2400, + "max_attempts": 480, + "max_sizes_per_category": 32, + "limits": { + "knapsack": [ + 8, + 32, + 512 + ], + "assignment": [ + 3, + 16, + 32 + ], + "facility_location": [ + 2, + 8, + 16 + ], + "bin_packing": [ + 4, + 16, + 32 + ], + "production": [ + 3, + 6, + 48 + ], + "native_tsp": [ + 4, + 16, + 96 + ], + "weighted_queens": [ + 4, + 12, + 32 + ] + }, + "selection": "Independent anchor/exponential bracketing, integer bisection and adjacent two-repeat confirmation. Stop expanding each cohort at its first failure. Fill shared points only through the smaller confirmed boundary. No retries.", + "optimality": "Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.", + "capacity": "Largest sampled size with all variants passing both repetitions. Untested sizes remain unknown." + }, + "provenance": { + "source_head": "f724bd01795a87b2c310ba368c66d36bb09f660f", + "sources": { + "experiments/optimize/benchmark_boundaries.py": "fe6cae5ba528a8d11072d7fffc72e0b0041590d8eb8cb8d7fe16603d78d7af5a", + "experiments/optimize/boundary_instances.py": "e1a7ec77414b1f6902c6d4dd255acf400cd7cccc491ad3519a6642a73a990561", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "prior_report_sha256": "bdb0b1ced8721ee50385c6d7614637024be748f114dc4e6b36f4626dbfc40763", + "driver_sha256": "fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4", + "runtime_sources": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "expected_libraries": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98249, + "external_seconds": 0.2081547500565648, + "started_utc": "2026-09-06T04:39:57.436042+00:00", + "invocation_offset_start_seconds": 0.1788182919844985, + "invocation_offset_end_seconds": 0.3872119998559356, + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + }, + "before_loaded": [ + [ + "libgecodeint.51.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.51.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + ], + [ + "libgecodesearch.51.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.51.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "after_loaded": [ + [ + "libgecodeint.6.4.0.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.6.4.0.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + ], + [ + "libgecodesearch.6.4.0.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.6.4.0.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "integrity": { + "sources_unchanged": true, + "runtime_sources_unchanged": true, + "driver_unchanged": true, + "models_unchanged": true, + "libraries_unchanged": true + } + }, + "started_utc": "2026-09-06T05:18:06.112169+00:00", + "elapsed_seconds": 931.6176939579998, + "complete": true, + "models": [ + { + "id": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_8", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 8, + "natural_size": 8, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 8, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "input_variables": 8, + "model_variables": 8, + "modelled_variables": 8, + "size_unit": "items" + }, + "json_sha256": "0fa6b80ec5f7fba53d7b94a6f7498c8faf91295bc00c57057d71fab478bee544", + "txt_sha256": "ea9569a056bb6fad19798ad3bb6a18ea93003f9cff5ea6106c2ea429237949bb" + }, + { + "id": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_32", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "input_variables": 32, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "items" + }, + "json_sha256": "68f4f3c3731d7ae1ff950121f94f4e06199e51c83534b61504263a0cc7a3eb7e", + "txt_sha256": "5b6423445e33a99cb177f60c3c7b80f7f0f688564cdacc442b134541dc056097" + }, + { + "id": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_32", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "input_variables": 32, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "items" + }, + "json_sha256": "b6232a57b70dba325e6563a1aee75446eee18411fa7d5e780cfafa881057aca3", + "txt_sha256": "808a2c747faa0a6eb81bfee59ae4b11a16cc9081f900710e086155f2ae6e254d" + }, + { + "id": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_64", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 64, + "natural_size": 64, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 64, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3 + ], + "rows": [ + { + "b": -384, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3 + ], + "capacities": [ + 384 + ], + "capacity": 384, + "table_cells": 25025, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 64, + "variables": 64, + "rows": 1, + "nonzeros": 64, + "globals": 0 + }, + "input_variables": 64, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "items" + }, + "json_sha256": "65f7351e58abb43c31baf38c6719c0278d500080f4b631b876492ff648c8196b", + "txt_sha256": "ef3322161a34e50ede9cd8c376f74c448923373ebb9b7019191326efb057230b" + }, + { + "id": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_64", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 64, + "natural_size": 64, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 64, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39 + ], + "rows": [ + { + "b": -384, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39 + ], + "capacities": [ + 384 + ], + "capacity": 384, + "table_cells": 25025, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 64, + "variables": 64, + "rows": 1, + "nonzeros": 64, + "globals": 0 + }, + "input_variables": 64, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "items" + }, + "json_sha256": "3adb570b20946142807b3eb72f328b00ade0990ab834099624dbe1014d4fe1a1", + "txt_sha256": "60b91651118c216161a9948301c93fa5efa6eb55a5d8e6054b200cc3921ab731" + }, + { + "id": "knapsack-48-uncorrelated", + "category": "knapsack", + "size": 48, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_48", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 48, + "natural_size": 48, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 48, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80 + ], + "rows": [ + { + "b": -288, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80 + ], + "capacities": [ + 288 + ], + "capacity": 288, + "table_cells": 14161, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 1, + "nonzeros": 48, + "globals": 0 + }, + "input_variables": 48, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "items" + }, + "json_sha256": "0c3dad5e500553a725939cd632f5f258c1b8e4174caf3e021eae8284a56a46ef", + "txt_sha256": "82f0f2abcd91e78dcc582bfc24ee3b158fead2d9efddc522b38e4a1edba5a683" + }, + { + "id": "knapsack-48-correlated", + "category": "knapsack", + "size": 48, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_48", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 48, + "natural_size": 48, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 48, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2 + ], + "rows": [ + { + "b": -288, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2 + ], + "capacities": [ + 288 + ], + "capacity": 288, + "table_cells": 14161, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 1, + "nonzeros": 48, + "globals": 0 + }, + "input_variables": 48, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "items" + }, + "json_sha256": "2f0b3439ff0725eed1ba32d4a27fae7a6ce1c51e686290ab1632c6de0ae390e4", + "txt_sha256": "3d54457f313d8ab70345c124d7e14289b5b6f7b2606a32020cd9e9113c4b1c81" + }, + { + "id": "knapsack-40-uncorrelated", + "category": "knapsack", + "size": 40, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_40", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 40, + "natural_size": 40, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 40, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81 + ], + "rows": [ + { + "b": -240, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81 + ], + "capacities": [ + 240 + ], + "capacity": 240, + "table_cells": 9881, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 40, + "variables": 40, + "rows": 1, + "nonzeros": 40, + "globals": 0 + }, + "input_variables": 40, + "model_variables": 40, + "modelled_variables": 40, + "size_unit": "items" + }, + "json_sha256": "d15db1a4bb90fef325badd8afc3ee35aa5afd73117df37cdb70b20ce77afd79b", + "txt_sha256": "a5e8c3e24d0ece20a516b0220a00165fdadfbdd8854d505d72200d890e68556a" + }, + { + "id": "knapsack-40-correlated", + "category": "knapsack", + "size": 40, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_40", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 40, + "natural_size": 40, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 40, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16 + ], + "rows": [ + { + "b": -240, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16 + ], + "capacities": [ + 240 + ], + "capacity": 240, + "table_cells": 9881, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 40, + "variables": 40, + "rows": 1, + "nonzeros": 40, + "globals": 0 + }, + "input_variables": 40, + "model_variables": 40, + "modelled_variables": 40, + "size_unit": "items" + }, + "json_sha256": "79e07ed9038c82cce7efca7cd8047be45b9a0585ab0122394242e86e11e0007c", + "txt_sha256": "a80bdca741ca5c99cf3ac3f61c56a5b3fc0a12eb50995c961b8eca324b01101f" + }, + { + "id": "knapsack-36-uncorrelated", + "category": "knapsack", + "size": 36, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_36", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 36, + "natural_size": 36, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 36, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25 + ], + "rows": [ + { + "b": -216, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25 + ], + "capacities": [ + 216 + ], + "capacity": 216, + "table_cells": 8029, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 36, + "variables": 36, + "rows": 1, + "nonzeros": 36, + "globals": 0 + }, + "input_variables": 36, + "model_variables": 36, + "modelled_variables": 36, + "size_unit": "items" + }, + "json_sha256": "f02df0924596b171b8898031e0a2795a1de4c064c3a1c3c3035c9fa965a3c2b2", + "txt_sha256": "641c0eb1fa56c0cae77e3786b3c0dbd070b738087c43326613a711c69de04e85" + }, + { + "id": "knapsack-36-correlated", + "category": "knapsack", + "size": 36, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_36", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 36, + "natural_size": 36, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 36, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18 + ], + "rows": [ + { + "b": -216, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18 + ], + "capacities": [ + 216 + ], + "capacity": 216, + "table_cells": 8029, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 36, + "variables": 36, + "rows": 1, + "nonzeros": 36, + "globals": 0 + }, + "input_variables": 36, + "model_variables": 36, + "modelled_variables": 36, + "size_unit": "items" + }, + "json_sha256": "919a1ab06a058b53e7f3d84c40c574dd484c80c8f4a84a88f2a5d66bfe3a7bd7", + "txt_sha256": "1d8f20b8770e1e988b825305a2bf1624f5a092da04096190283b1838d36514a6" + }, + { + "id": "knapsack-34-uncorrelated", + "category": "knapsack", + "size": 34, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_34", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 34, + "natural_size": 34, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 34, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53 + ], + "rows": [ + { + "b": -204, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53 + ], + "capacities": [ + 204 + ], + "capacity": 204, + "table_cells": 7175, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 34, + "variables": 34, + "rows": 1, + "nonzeros": 34, + "globals": 0 + }, + "input_variables": 34, + "model_variables": 34, + "modelled_variables": 34, + "size_unit": "items" + }, + "json_sha256": "0f558b015d5198b019dc6d724d300e67232f79aaee6c1af1b8cd7505def2e40a", + "txt_sha256": "67fa17572f842031d755b7b4e9033aaee1668ac63ad94ad2ef4c6eed7af3b544" + }, + { + "id": "knapsack-34-correlated", + "category": "knapsack", + "size": 34, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_34", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 34, + "natural_size": 34, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 34, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17 + ], + "rows": [ + { + "b": -204, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17 + ], + "capacities": [ + 204 + ], + "capacity": 204, + "table_cells": 7175, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 34, + "variables": 34, + "rows": 1, + "nonzeros": 34, + "globals": 0 + }, + "input_variables": 34, + "model_variables": 34, + "modelled_variables": 34, + "size_unit": "items" + }, + "json_sha256": "29c28f184eb6d925cbaaf1918fd84865cddfa6c9b03414865f8f230d6bf86d32", + "txt_sha256": "a4e925c8257b01eaf637678a0a24a7a2c2ceb1692642dc623c3b706e8b6857d3" + }, + { + "id": "knapsack-33-uncorrelated", + "category": "knapsack", + "size": 33, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_33", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 33, + "natural_size": 33, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 33, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5 + ], + "rows": [ + { + "b": -198, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5 + ], + "capacities": [ + 198 + ], + "capacity": 198, + "table_cells": 6766, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 33, + "variables": 33, + "rows": 1, + "nonzeros": 33, + "globals": 0 + }, + "input_variables": 33, + "model_variables": 33, + "modelled_variables": 33, + "size_unit": "items" + }, + "json_sha256": "c8ae8ca2778217cea4a52353d95b534c882a99f720221d7fb470ba11efd1aa16", + "txt_sha256": "706adb57a6a2f841cb0d259722d42f35ee74fd14964aa73ba0c581e6f041ef52" + }, + { + "id": "knapsack-33-correlated", + "category": "knapsack", + "size": 33, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_33", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 33, + "natural_size": 33, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 33, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9 + ], + "rows": [ + { + "b": -198, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9 + ], + "capacities": [ + 198 + ], + "capacity": 198, + "table_cells": 6766, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 33, + "variables": 33, + "rows": 1, + "nonzeros": 33, + "globals": 0 + }, + "input_variables": 33, + "model_variables": 33, + "modelled_variables": 33, + "size_unit": "items" + }, + "json_sha256": "9bd21e045152e5413667d371210318324224187d89ca45fb4826f340148f2a51", + "txt_sha256": "d9b4302c3b2f6301b01e362505dbf4ab04e14e57639e5dba95b6d9b1d1aaad02" + }, + { + "id": "knapsack-128-uncorrelated", + "category": "knapsack", + "size": 128, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_128", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 128, + "natural_size": 128, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 128, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "input_variables": 128, + "model_variables": 128, + "modelled_variables": 128, + "size_unit": "items" + }, + "json_sha256": "2edf8bc3053748744319133d898fd49e8ccda206ac296d2e8d0842686b818e50", + "txt_sha256": "b59b0bdd0661616462e4b441fb08559f8bc487cf5d876a3e688b9a91512056ee" + }, + { + "id": "knapsack-128-correlated", + "category": "knapsack", + "size": 128, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_128", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 128, + "natural_size": 128, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 128, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "input_variables": 128, + "model_variables": 128, + "modelled_variables": 128, + "size_unit": "items" + }, + "json_sha256": "3c43b8193591f13fd83e3ca532e6f285f269e568963f87270898417d501c192f", + "txt_sha256": "4f7a15880322d7f346b1b9a8d2c13dd19c47d29caf27b08a3cda91b0be629e37" + }, + { + "id": "knapsack-256-uncorrelated", + "category": "knapsack", + "size": 256, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_256", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 256, + "natural_size": 256, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40 + ], + "rows": [ + { + "b": -1536, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40 + ], + "capacities": [ + 1536 + ], + "capacity": 1536, + "table_cells": 395009, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 1, + "nonzeros": 256, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "items" + }, + "json_sha256": "5cc1a6ed0bddb12b585dc9a16543643216f46a68702bbe090227d0fc8fa85797", + "txt_sha256": "73ff2822311101bd220315e2d2a3583e0648478148b93401489b0ad7102c0f5e" + }, + { + "id": "knapsack-256-correlated", + "category": "knapsack", + "size": 256, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_256", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 256, + "natural_size": 256, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30 + ], + "rows": [ + { + "b": -1536, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30 + ], + "capacities": [ + 1536 + ], + "capacity": 1536, + "table_cells": 395009, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 1, + "nonzeros": 256, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "items" + }, + "json_sha256": "26012002c95dcf9ba83d47c1f71ab65dd20562bcc78a2aaf71c334a1986f2a52", + "txt_sha256": "a2d7ba329b600de8285c0c09e0a71a76ca4736ce6a3062916946d8a9bb358b99" + }, + { + "id": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_512", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 512, + "natural_size": 512, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 512, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62, + -4, + -73, + -82, + -60, + -16, + -32, + -95, + -41, + -42, + -65, + -53, + -11, + -59, + -52, + -48, + -60, + -89, + -41, + -73, + -97, + -75, + -94, + -89, + -18, + -37, + -7, + -33, + -59, + -52, + -41, + -11, + -44, + -92, + -55, + -28, + -39, + -98, + -57, + -100, + -93, + -58, + -65, + -66, + -99, + -45, + -97, + -89, + -71, + -45, + -28, + -10, + -35, + -83, + -91, + -77, + -60, + -37, + -72, + -40, + -3, + -76, + -15, + -67, + -45 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ], + [ + 448, + -14 + ], + [ + 449, + -4 + ], + [ + 450, + -11 + ], + [ + 451, + -22 + ], + [ + 452, + -16 + ], + [ + 453, + -29 + ], + [ + 454, + -20 + ], + [ + 455, + -21 + ], + [ + 456, + -15 + ], + [ + 457, + -13 + ], + [ + 458, + -28 + ], + [ + 459, + -28 + ], + [ + 460, + -22 + ], + [ + 461, + -24 + ], + [ + 462, + -6 + ], + [ + 463, + -1 + ], + [ + 464, + -29 + ], + [ + 465, + -10 + ], + [ + 466, + -6 + ], + [ + 467, + -10 + ], + [ + 468, + -13 + ], + [ + 469, + -3 + ], + [ + 470, + -3 + ], + [ + 471, + -22 + ], + [ + 472, + -8 + ], + [ + 473, + -26 + ], + [ + 474, + -19 + ], + [ + 475, + -3 + ], + [ + 476, + -9 + ], + [ + 477, + -12 + ], + [ + 478, + -5 + ], + [ + 479, + -24 + ], + [ + 480, + -4 + ], + [ + 481, + -22 + ], + [ + 482, + -13 + ], + [ + 483, + -3 + ], + [ + 484, + -2 + ], + [ + 485, + -19 + ], + [ + 486, + -27 + ], + [ + 487, + -16 + ], + [ + 488, + -5 + ], + [ + 489, + -19 + ], + [ + 490, + -4 + ], + [ + 491, + -19 + ], + [ + 492, + -5 + ], + [ + 493, + -23 + ], + [ + 494, + -24 + ], + [ + 495, + -15 + ], + [ + 496, + -4 + ], + [ + 497, + -28 + ], + [ + 498, + -29 + ], + [ + 499, + -13 + ], + [ + 500, + -25 + ], + [ + 501, + -19 + ], + [ + 502, + -30 + ], + [ + 503, + -10 + ], + [ + 504, + -28 + ], + [ + 505, + -9 + ], + [ + 506, + -3 + ], + [ + 507, + -4 + ], + [ + 508, + -14 + ], + [ + 509, + -19 + ], + [ + 510, + -7 + ], + [ + 511, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 512, + "model_variables": 512, + "modelled_variables": 512, + "size_unit": "items" + }, + "json_sha256": "1e985ae702c5bc0508fd63f900b0db1ff05f6cfeca79f0bb02191b4db14d6c00", + "txt_sha256": "fe96761d0760f264dd4cab0063ad2a0b263a0f4ed1065a6162c6255c4a4c9207" + }, + { + "id": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_512", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 512, + "natural_size": 512, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 512, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11, + -11, + -20, + -31, + -13, + -8, + -12, + -24, + -13, + -16, + -18, + -34, + -5, + -23, + -20, + -12, + -18, + -9, + -11, + -4, + -32, + -14, + -20, + -38, + -5, + -21, + -15, + -7, + -15, + -15, + -15, + -10, + -14, + -15, + -36, + -19, + -16, + -17, + -21, + -30, + -11, + -6, + -22, + -34, + -27, + -28, + -5, + -11, + -20, + -14, + -27, + -34, + -16, + -19, + -14, + -20, + -12, + -19, + -8, + -31, + -40, + -27, + -19, + -16, + -11, + -33, + -11, + -16, + -32, + -31, + -22, + -15, + -7, + -31, + -18, + -35, + -11, + -32, + -20, + -16, + -18, + -37, + -6, + -7, + -12, + -31, + -19, + -8, + -30, + -32, + -39, + -16, + -36, + -24, + -36, + -9, + -17 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ], + [ + 416, + -11 + ], + [ + 417, + -15 + ], + [ + 418, + -30 + ], + [ + 419, + -4 + ], + [ + 420, + -6 + ], + [ + 421, + -4 + ], + [ + 422, + -17 + ], + [ + 423, + -10 + ], + [ + 424, + -10 + ], + [ + 425, + -8 + ], + [ + 426, + -24 + ], + [ + 427, + -3 + ], + [ + 428, + -17 + ], + [ + 429, + -18 + ], + [ + 430, + -9 + ], + [ + 431, + -14 + ], + [ + 432, + -1 + ], + [ + 433, + -8 + ], + [ + 434, + -1 + ], + [ + 435, + -25 + ], + [ + 436, + -8 + ], + [ + 437, + -11 + ], + [ + 438, + -29 + ], + [ + 439, + -2 + ], + [ + 440, + -21 + ], + [ + 441, + -12 + ], + [ + 442, + -1 + ], + [ + 443, + -10 + ], + [ + 444, + -13 + ], + [ + 445, + -11 + ], + [ + 446, + -10 + ], + [ + 447, + -4 + ], + [ + 448, + -13 + ], + [ + 449, + -27 + ], + [ + 450, + -10 + ], + [ + 451, + -11 + ], + [ + 452, + -7 + ], + [ + 453, + -20 + ], + [ + 454, + -28 + ], + [ + 455, + -10 + ], + [ + 456, + -5 + ], + [ + 457, + -19 + ], + [ + 458, + -25 + ], + [ + 459, + -24 + ], + [ + 460, + -28 + ], + [ + 461, + -3 + ], + [ + 462, + -1 + ], + [ + 463, + -15 + ], + [ + 464, + -9 + ], + [ + 465, + -22 + ], + [ + 466, + -31 + ], + [ + 467, + -9 + ], + [ + 468, + -10 + ], + [ + 469, + -10 + ], + [ + 470, + -15 + ], + [ + 471, + -11 + ], + [ + 472, + -10 + ], + [ + 473, + -5 + ], + [ + 474, + -26 + ], + [ + 475, + -31 + ], + [ + 476, + -24 + ], + [ + 477, + -19 + ], + [ + 478, + -12 + ], + [ + 479, + -4 + ], + [ + 480, + -28 + ], + [ + 481, + -5 + ], + [ + 482, + -12 + ], + [ + 483, + -29 + ], + [ + 484, + -23 + ], + [ + 485, + -19 + ], + [ + 486, + -12 + ], + [ + 487, + -7 + ], + [ + 488, + -27 + ], + [ + 489, + -13 + ], + [ + 490, + -25 + ], + [ + 491, + -10 + ], + [ + 492, + -24 + ], + [ + 493, + -12 + ], + [ + 494, + -10 + ], + [ + 495, + -13 + ], + [ + 496, + -31 + ], + [ + 497, + -6 + ], + [ + 498, + -3 + ], + [ + 499, + -4 + ], + [ + 500, + -22 + ], + [ + 501, + -16 + ], + [ + 502, + -4 + ], + [ + 503, + -25 + ], + [ + 504, + -26 + ], + [ + 505, + -30 + ], + [ + 506, + -6 + ], + [ + 507, + -30 + ], + [ + 508, + -23 + ], + [ + 509, + -30 + ], + [ + 510, + -7 + ], + [ + 511, + -8 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10, + 11, + 15, + 30, + 4, + 6, + 4, + 17, + 10, + 10, + 8, + 24, + 3, + 17, + 18, + 9, + 14, + 1, + 8, + 1, + 25, + 8, + 11, + 29, + 2, + 21, + 12, + 1, + 10, + 13, + 11, + 10, + 4, + 13, + 27, + 10, + 11, + 7, + 20, + 28, + 10, + 5, + 19, + 25, + 24, + 28, + 3, + 1, + 15, + 9, + 22, + 31, + 9, + 10, + 10, + 15, + 11, + 10, + 5, + 26, + 31, + 24, + 19, + 12, + 4, + 28, + 5, + 12, + 29, + 23, + 19, + 12, + 7, + 27, + 13, + 25, + 10, + 24, + 12, + 10, + 13, + 31, + 6, + 3, + 4, + 22, + 16, + 4, + 25, + 26, + 30, + 6, + 30, + 23, + 30, + 7, + 8 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11, + 11, + 20, + 31, + 13, + 8, + 12, + 24, + 13, + 16, + 18, + 34, + 5, + 23, + 20, + 12, + 18, + 9, + 11, + 4, + 32, + 14, + 20, + 38, + 5, + 21, + 15, + 7, + 15, + 15, + 15, + 10, + 14, + 15, + 36, + 19, + 16, + 17, + 21, + 30, + 11, + 6, + 22, + 34, + 27, + 28, + 5, + 11, + 20, + 14, + 27, + 34, + 16, + 19, + 14, + 20, + 12, + 19, + 8, + 31, + 40, + 27, + 19, + 16, + 11, + 33, + 11, + 16, + 32, + 31, + 22, + 15, + 7, + 31, + 18, + 35, + 11, + 32, + 20, + 16, + 18, + 37, + 6, + 7, + 12, + 31, + 19, + 8, + 30, + 32, + 39, + 16, + 36, + 24, + 36, + 9, + 17 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 512, + "model_variables": 512, + "modelled_variables": 512, + "size_unit": "items" + }, + "json_sha256": "a6a554e6feedbb00190e8b2612df540717bd9d8de8642d6654751bee0755f055", + "txt_sha256": "ad8202953da8af5f681625e21327591ca93996701395fd85397dd1c23b54f074" + }, + { + "id": "knapsack-384-uncorrelated", + "category": "knapsack", + "size": 384, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_384", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 384, + "natural_size": 384, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 384, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "input_variables": 384, + "model_variables": 384, + "modelled_variables": 384, + "size_unit": "items" + }, + "json_sha256": "5238bdc2b218148a51cfcc77f39eeb8d021cf7b89a9f9143a75096c40d9424d7", + "txt_sha256": "9680c130459aeefd7e563978d5df20a8d7aa209abf752bb7f18a8bd169f962b2" + }, + { + "id": "knapsack-384-correlated", + "category": "knapsack", + "size": 384, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_384", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 384, + "natural_size": 384, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 384, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "input_variables": 384, + "model_variables": 384, + "modelled_variables": 384, + "size_unit": "items" + }, + "json_sha256": "1303f63d2315befeb3ebb312e77d881ea26eb29b3104f83ad3f6c68cc647906d", + "txt_sha256": "b86e4f1a27ef7f0760a266be7dc49697c67cd5459a320536931b611b175a643c" + }, + { + "id": "knapsack-448-uncorrelated", + "category": "knapsack", + "size": 448, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_448", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 448, + "natural_size": 448, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 448, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62 + ], + "rows": [ + { + "b": -2688, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62 + ], + "capacities": [ + 2688 + ], + "capacity": 2688, + "table_cells": 1207361, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 448, + "variables": 448, + "rows": 1, + "nonzeros": 448, + "globals": 0 + }, + "input_variables": 448, + "model_variables": 448, + "modelled_variables": 448, + "size_unit": "items" + }, + "json_sha256": "f523962f5c03ef7ad6c8b58cad30a06ab2470488979524ba74ac83127c2a34d0", + "txt_sha256": "8fae4a8e7342909da33707155358e83d0fb3b3c022979fae4b4997656bf6f641" + }, + { + "id": "knapsack-448-correlated", + "category": "knapsack", + "size": 448, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_448", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 448, + "natural_size": 448, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 448, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11, + -11, + -20, + -31, + -13, + -8, + -12, + -24, + -13, + -16, + -18, + -34, + -5, + -23, + -20, + -12, + -18, + -9, + -11, + -4, + -32, + -14, + -20, + -38, + -5, + -21, + -15, + -7, + -15, + -15, + -15, + -10, + -14 + ], + "rows": [ + { + "b": -2688, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ], + [ + 416, + -11 + ], + [ + 417, + -15 + ], + [ + 418, + -30 + ], + [ + 419, + -4 + ], + [ + 420, + -6 + ], + [ + 421, + -4 + ], + [ + 422, + -17 + ], + [ + 423, + -10 + ], + [ + 424, + -10 + ], + [ + 425, + -8 + ], + [ + 426, + -24 + ], + [ + 427, + -3 + ], + [ + 428, + -17 + ], + [ + 429, + -18 + ], + [ + 430, + -9 + ], + [ + 431, + -14 + ], + [ + 432, + -1 + ], + [ + 433, + -8 + ], + [ + 434, + -1 + ], + [ + 435, + -25 + ], + [ + 436, + -8 + ], + [ + 437, + -11 + ], + [ + 438, + -29 + ], + [ + 439, + -2 + ], + [ + 440, + -21 + ], + [ + 441, + -12 + ], + [ + 442, + -1 + ], + [ + 443, + -10 + ], + [ + 444, + -13 + ], + [ + 445, + -11 + ], + [ + 446, + -10 + ], + [ + 447, + -4 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10, + 11, + 15, + 30, + 4, + 6, + 4, + 17, + 10, + 10, + 8, + 24, + 3, + 17, + 18, + 9, + 14, + 1, + 8, + 1, + 25, + 8, + 11, + 29, + 2, + 21, + 12, + 1, + 10, + 13, + 11, + 10, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11, + 11, + 20, + 31, + 13, + 8, + 12, + 24, + 13, + 16, + 18, + 34, + 5, + 23, + 20, + 12, + 18, + 9, + 11, + 4, + 32, + 14, + 20, + 38, + 5, + 21, + 15, + 7, + 15, + 15, + 15, + 10, + 14 + ], + "capacities": [ + 2688 + ], + "capacity": 2688, + "table_cells": 1207361, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 448, + "variables": 448, + "rows": 1, + "nonzeros": 448, + "globals": 0 + }, + "input_variables": 448, + "model_variables": 448, + "modelled_variables": 448, + "size_unit": "items" + }, + "json_sha256": "e475a1c2bf7cc969f39d4ef55b1a4d022bafe37c9050e170abdb1ead984cfd25", + "txt_sha256": "704f5975da38d9265cfdba000c1250b9d6f8e1f09b75810c30c3011be193a0c4" + }, + { + "id": "knapsack-416-uncorrelated", + "category": "knapsack", + "size": 416, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_416", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 416, + "natural_size": 416, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 416, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9 + ], + "rows": [ + { + "b": -2496, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9 + ], + "capacities": [ + 2496 + ], + "capacity": 2496, + "table_cells": 1041249, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 416, + "variables": 416, + "rows": 1, + "nonzeros": 416, + "globals": 0 + }, + "input_variables": 416, + "model_variables": 416, + "modelled_variables": 416, + "size_unit": "items" + }, + "json_sha256": "b4cc52b39df1992db0bcf875ee3097ce92ce6b77e6cd8b5c84f9c6ef5d23d560", + "txt_sha256": "364641e67e9778192e5ce52620f7e30df62b3cf6feadcc8e2aeceb50cfc37676" + }, + { + "id": "knapsack-416-correlated", + "category": "knapsack", + "size": 416, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_416", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 416, + "natural_size": 416, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 416, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11 + ], + "rows": [ + { + "b": -2496, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11 + ], + "capacities": [ + 2496 + ], + "capacity": 2496, + "table_cells": 1041249, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 416, + "variables": 416, + "rows": 1, + "nonzeros": 416, + "globals": 0 + }, + "input_variables": 416, + "model_variables": 416, + "modelled_variables": 416, + "size_unit": "items" + }, + "json_sha256": "6f960db3d1bb599a8cf2f5195eae7f1e7fd10246b3e263073e431b208381c31c", + "txt_sha256": "0338627e606a2b72738fea6a7ef0440466de8dfb5ec385c5a1cb1e87136814a1" + }, + { + "id": "knapsack-400-uncorrelated", + "category": "knapsack", + "size": 400, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_400", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 400, + "natural_size": 400, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57 + ], + "rows": [ + { + "b": -2400, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57 + ], + "capacities": [ + 2400 + ], + "capacity": 2400, + "table_cells": 962801, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 1, + "nonzeros": 400, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "items" + }, + "json_sha256": "eb11eff13a3ebcded9e244b8cdb4d3ac99dc593ad3f34d32f9168d2c75df81ad", + "txt_sha256": "14aa1d7429f25ad947fbcf74b151efdd61236d0d7a5bd33238c692eab7845049" + }, + { + "id": "knapsack-400-correlated", + "category": "knapsack", + "size": 400, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_400", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 400, + "natural_size": 400, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26 + ], + "rows": [ + { + "b": -2400, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26 + ], + "capacities": [ + 2400 + ], + "capacity": 2400, + "table_cells": 962801, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 1, + "nonzeros": 400, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "items" + }, + "json_sha256": "03de622188b6275fc9a1657be99c6d83bd7e37151ce029e9056378f81f15ca94", + "txt_sha256": "e62de14c4fb1857a6e97ff95f148c8fd507e634b00bf7dd6315cedb20757fb24" + }, + { + "id": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_408", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "fe7cbd8a86cab4ecbf283f0cd1d56180bf473b46e6794bfbb57f54ab39fa2b18", + "txt_sha256": "4268232dd470345470f6ee1eb620b04653772b822da383900de75e325c7603e3" + }, + { + "id": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_408", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "19e138a83cd2b42ee8c86a6bb443e238de55822be31dc03c918c7d964b156990", + "txt_sha256": "3add2fcfea9b3d807e0fe6cabef9a71b057f77d811778ee20571b815532354e0" + }, + { + "id": "knapsack-404-uncorrelated", + "category": "knapsack", + "size": 404, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_404", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 404, + "natural_size": 404, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 404, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19 + ], + "rows": [ + { + "b": -2424, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19 + ], + "capacities": [ + 2424 + ], + "capacity": 2424, + "table_cells": 982125, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 404, + "variables": 404, + "rows": 1, + "nonzeros": 404, + "globals": 0 + }, + "input_variables": 404, + "model_variables": 404, + "modelled_variables": 404, + "size_unit": "items" + }, + "json_sha256": "93a8100454ba552312b2dc93277ddf46b90c3fe5de0509ff85bb31101d32d353", + "txt_sha256": "fa346877265d7c91a6a7e75e958311a9bb65b855927df9bc7914058807479143" + }, + { + "id": "knapsack-404-correlated", + "category": "knapsack", + "size": 404, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_404", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 404, + "natural_size": 404, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 404, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28 + ], + "rows": [ + { + "b": -2424, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28 + ], + "capacities": [ + 2424 + ], + "capacity": 2424, + "table_cells": 982125, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 404, + "variables": 404, + "rows": 1, + "nonzeros": 404, + "globals": 0 + }, + "input_variables": 404, + "model_variables": 404, + "modelled_variables": 404, + "size_unit": "items" + }, + "json_sha256": "7395d9654c18664318ff47a6fff8fbfc845592822b11a6bc5a24173c38872697", + "txt_sha256": "0699e0270a034ed25fde3e2406be7c380c88b8037c0c302e1341c7ee85fd79db" + }, + { + "id": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_406", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 406, + "natural_size": 406, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 406, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25 + ], + "rows": [ + { + "b": -2436, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25 + ], + "capacities": [ + 2436 + ], + "capacity": 2436, + "table_cells": 991859, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 406, + "variables": 406, + "rows": 1, + "nonzeros": 406, + "globals": 0 + }, + "input_variables": 406, + "model_variables": 406, + "modelled_variables": 406, + "size_unit": "items" + }, + "json_sha256": "4f52cd43096e598c235de42607f225e047ccd815e43f11298987f8a0baf5828b", + "txt_sha256": "265deca2e810872aca05dc49fc2f4d487bf4b8e66159dc9cef56467936465b61" + }, + { + "id": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_406", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 406, + "natural_size": 406, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 406, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30 + ], + "rows": [ + { + "b": -2436, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30 + ], + "capacities": [ + 2436 + ], + "capacity": 2436, + "table_cells": 991859, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 406, + "variables": 406, + "rows": 1, + "nonzeros": 406, + "globals": 0 + }, + "input_variables": 406, + "model_variables": 406, + "modelled_variables": 406, + "size_unit": "items" + }, + "json_sha256": "5ad0697a65f0031480e444aee5dd38b9d0312b0d49d0b67be76d78f7795ebe73", + "txt_sha256": "9e2a110713fa7e2405816db8e0da91bde633b2bea11c5af7da4812269ac64f48" + }, + { + "id": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_407", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 407, + "natural_size": 407, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 407, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24 + ], + "rows": [ + { + "b": -2442, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24 + ], + "capacities": [ + 2442 + ], + "capacity": 2442, + "table_cells": 996744, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 407, + "variables": 407, + "rows": 1, + "nonzeros": 407, + "globals": 0 + }, + "input_variables": 407, + "model_variables": 407, + "modelled_variables": 407, + "size_unit": "items" + }, + "json_sha256": "cefa48a9a816fcbb53ea385d48df0b1846b0f2d7c17c1da9f23a16e03e096923", + "txt_sha256": "40f13ef271e867d65acea9499a2f7e876906bf3a04fd8b3779b3119c69589ef9" + }, + { + "id": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_407", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 407, + "natural_size": 407, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 407, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22 + ], + "rows": [ + { + "b": -2442, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22 + ], + "capacities": [ + 2442 + ], + "capacity": 2442, + "table_cells": 996744, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 407, + "variables": 407, + "rows": 1, + "nonzeros": 407, + "globals": 0 + }, + "input_variables": 407, + "model_variables": 407, + "modelled_variables": 407, + "size_unit": "items" + }, + "json_sha256": "bcc2426c297da3484e487e7fd9aabcca990072260dec5f66afafdf5d5204aa9d", + "txt_sha256": "662707672c2e9bee9f77f54f31aa041b6ee122e4ee274007a5884be7ec8f8ff4" + }, + { + "id": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "model": { + "id": "assignment_single_16", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 16, + 1 + ], + [ + 32, + 1 + ], + [ + 48, + 1 + ], + [ + 64, + 1 + ], + [ + 80, + 1 + ], + [ + 96, + 1 + ], + [ + 112, + 1 + ], + [ + 128, + 1 + ], + [ + 144, + 1 + ], + [ + 160, + 1 + ], + [ + 176, + 1 + ], + [ + 192, + 1 + ], + [ + 208, + 1 + ], + [ + 224, + 1 + ], + [ + 240, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 16, + -1 + ], + [ + 32, + -1 + ], + [ + 48, + -1 + ], + [ + 64, + -1 + ], + [ + 80, + -1 + ], + [ + 96, + -1 + ], + [ + 112, + -1 + ], + [ + 128, + -1 + ], + [ + 144, + -1 + ], + [ + 160, + -1 + ], + [ + 176, + -1 + ], + [ + 192, + -1 + ], + [ + 208, + -1 + ], + [ + 224, + -1 + ], + [ + 240, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 17, + 1 + ], + [ + 33, + 1 + ], + [ + 49, + 1 + ], + [ + 65, + 1 + ], + [ + 81, + 1 + ], + [ + 97, + 1 + ], + [ + 113, + 1 + ], + [ + 129, + 1 + ], + [ + 145, + 1 + ], + [ + 161, + 1 + ], + [ + 177, + 1 + ], + [ + 193, + 1 + ], + [ + 209, + 1 + ], + [ + 225, + 1 + ], + [ + 241, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 17, + -1 + ], + [ + 33, + -1 + ], + [ + 49, + -1 + ], + [ + 65, + -1 + ], + [ + 81, + -1 + ], + [ + 97, + -1 + ], + [ + 113, + -1 + ], + [ + 129, + -1 + ], + [ + 145, + -1 + ], + [ + 161, + -1 + ], + [ + 177, + -1 + ], + [ + 193, + -1 + ], + [ + 209, + -1 + ], + [ + 225, + -1 + ], + [ + 241, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 18, + 1 + ], + [ + 34, + 1 + ], + [ + 50, + 1 + ], + [ + 66, + 1 + ], + [ + 82, + 1 + ], + [ + 98, + 1 + ], + [ + 114, + 1 + ], + [ + 130, + 1 + ], + [ + 146, + 1 + ], + [ + 162, + 1 + ], + [ + 178, + 1 + ], + [ + 194, + 1 + ], + [ + 210, + 1 + ], + [ + 226, + 1 + ], + [ + 242, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 18, + -1 + ], + [ + 34, + -1 + ], + [ + 50, + -1 + ], + [ + 66, + -1 + ], + [ + 82, + -1 + ], + [ + 98, + -1 + ], + [ + 114, + -1 + ], + [ + 130, + -1 + ], + [ + 146, + -1 + ], + [ + 162, + -1 + ], + [ + 178, + -1 + ], + [ + 194, + -1 + ], + [ + 210, + -1 + ], + [ + 226, + -1 + ], + [ + 242, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 19, + 1 + ], + [ + 35, + 1 + ], + [ + 51, + 1 + ], + [ + 67, + 1 + ], + [ + 83, + 1 + ], + [ + 99, + 1 + ], + [ + 115, + 1 + ], + [ + 131, + 1 + ], + [ + 147, + 1 + ], + [ + 163, + 1 + ], + [ + 179, + 1 + ], + [ + 195, + 1 + ], + [ + 211, + 1 + ], + [ + 227, + 1 + ], + [ + 243, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 19, + -1 + ], + [ + 35, + -1 + ], + [ + 51, + -1 + ], + [ + 67, + -1 + ], + [ + 83, + -1 + ], + [ + 99, + -1 + ], + [ + 115, + -1 + ], + [ + 131, + -1 + ], + [ + 147, + -1 + ], + [ + 163, + -1 + ], + [ + 179, + -1 + ], + [ + 195, + -1 + ], + [ + 211, + -1 + ], + [ + 227, + -1 + ], + [ + 243, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 20, + 1 + ], + [ + 36, + 1 + ], + [ + 52, + 1 + ], + [ + 68, + 1 + ], + [ + 84, + 1 + ], + [ + 100, + 1 + ], + [ + 116, + 1 + ], + [ + 132, + 1 + ], + [ + 148, + 1 + ], + [ + 164, + 1 + ], + [ + 180, + 1 + ], + [ + 196, + 1 + ], + [ + 212, + 1 + ], + [ + 228, + 1 + ], + [ + 244, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 20, + -1 + ], + [ + 36, + -1 + ], + [ + 52, + -1 + ], + [ + 68, + -1 + ], + [ + 84, + -1 + ], + [ + 100, + -1 + ], + [ + 116, + -1 + ], + [ + 132, + -1 + ], + [ + 148, + -1 + ], + [ + 164, + -1 + ], + [ + 180, + -1 + ], + [ + 196, + -1 + ], + [ + 212, + -1 + ], + [ + 228, + -1 + ], + [ + 244, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 21, + 1 + ], + [ + 37, + 1 + ], + [ + 53, + 1 + ], + [ + 69, + 1 + ], + [ + 85, + 1 + ], + [ + 101, + 1 + ], + [ + 117, + 1 + ], + [ + 133, + 1 + ], + [ + 149, + 1 + ], + [ + 165, + 1 + ], + [ + 181, + 1 + ], + [ + 197, + 1 + ], + [ + 213, + 1 + ], + [ + 229, + 1 + ], + [ + 245, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 21, + -1 + ], + [ + 37, + -1 + ], + [ + 53, + -1 + ], + [ + 69, + -1 + ], + [ + 85, + -1 + ], + [ + 101, + -1 + ], + [ + 117, + -1 + ], + [ + 133, + -1 + ], + [ + 149, + -1 + ], + [ + 165, + -1 + ], + [ + 181, + -1 + ], + [ + 197, + -1 + ], + [ + 213, + -1 + ], + [ + 229, + -1 + ], + [ + 245, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 54, + 1 + ], + [ + 70, + 1 + ], + [ + 86, + 1 + ], + [ + 102, + 1 + ], + [ + 118, + 1 + ], + [ + 134, + 1 + ], + [ + 150, + 1 + ], + [ + 166, + 1 + ], + [ + 182, + 1 + ], + [ + 198, + 1 + ], + [ + 214, + 1 + ], + [ + 230, + 1 + ], + [ + 246, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 22, + -1 + ], + [ + 38, + -1 + ], + [ + 54, + -1 + ], + [ + 70, + -1 + ], + [ + 86, + -1 + ], + [ + 102, + -1 + ], + [ + 118, + -1 + ], + [ + 134, + -1 + ], + [ + 150, + -1 + ], + [ + 166, + -1 + ], + [ + 182, + -1 + ], + [ + 198, + -1 + ], + [ + 214, + -1 + ], + [ + 230, + -1 + ], + [ + 246, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 23, + 1 + ], + [ + 39, + 1 + ], + [ + 55, + 1 + ], + [ + 71, + 1 + ], + [ + 87, + 1 + ], + [ + 103, + 1 + ], + [ + 119, + 1 + ], + [ + 135, + 1 + ], + [ + 151, + 1 + ], + [ + 167, + 1 + ], + [ + 183, + 1 + ], + [ + 199, + 1 + ], + [ + 215, + 1 + ], + [ + 231, + 1 + ], + [ + 247, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 23, + -1 + ], + [ + 39, + -1 + ], + [ + 55, + -1 + ], + [ + 71, + -1 + ], + [ + 87, + -1 + ], + [ + 103, + -1 + ], + [ + 119, + -1 + ], + [ + 135, + -1 + ], + [ + 151, + -1 + ], + [ + 167, + -1 + ], + [ + 183, + -1 + ], + [ + 199, + -1 + ], + [ + 215, + -1 + ], + [ + 231, + -1 + ], + [ + 247, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 24, + 1 + ], + [ + 40, + 1 + ], + [ + 56, + 1 + ], + [ + 72, + 1 + ], + [ + 88, + 1 + ], + [ + 104, + 1 + ], + [ + 120, + 1 + ], + [ + 136, + 1 + ], + [ + 152, + 1 + ], + [ + 168, + 1 + ], + [ + 184, + 1 + ], + [ + 200, + 1 + ], + [ + 216, + 1 + ], + [ + 232, + 1 + ], + [ + 248, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 24, + -1 + ], + [ + 40, + -1 + ], + [ + 56, + -1 + ], + [ + 72, + -1 + ], + [ + 88, + -1 + ], + [ + 104, + -1 + ], + [ + 120, + -1 + ], + [ + 136, + -1 + ], + [ + 152, + -1 + ], + [ + 168, + -1 + ], + [ + 184, + -1 + ], + [ + 200, + -1 + ], + [ + 216, + -1 + ], + [ + 232, + -1 + ], + [ + 248, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 25, + 1 + ], + [ + 41, + 1 + ], + [ + 57, + 1 + ], + [ + 73, + 1 + ], + [ + 89, + 1 + ], + [ + 105, + 1 + ], + [ + 121, + 1 + ], + [ + 137, + 1 + ], + [ + 153, + 1 + ], + [ + 169, + 1 + ], + [ + 185, + 1 + ], + [ + 201, + 1 + ], + [ + 217, + 1 + ], + [ + 233, + 1 + ], + [ + 249, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 25, + -1 + ], + [ + 41, + -1 + ], + [ + 57, + -1 + ], + [ + 73, + -1 + ], + [ + 89, + -1 + ], + [ + 105, + -1 + ], + [ + 121, + -1 + ], + [ + 137, + -1 + ], + [ + 153, + -1 + ], + [ + 169, + -1 + ], + [ + 185, + -1 + ], + [ + 201, + -1 + ], + [ + 217, + -1 + ], + [ + 233, + -1 + ], + [ + 249, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 26, + 1 + ], + [ + 42, + 1 + ], + [ + 58, + 1 + ], + [ + 74, + 1 + ], + [ + 90, + 1 + ], + [ + 106, + 1 + ], + [ + 122, + 1 + ], + [ + 138, + 1 + ], + [ + 154, + 1 + ], + [ + 170, + 1 + ], + [ + 186, + 1 + ], + [ + 202, + 1 + ], + [ + 218, + 1 + ], + [ + 234, + 1 + ], + [ + 250, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 26, + -1 + ], + [ + 42, + -1 + ], + [ + 58, + -1 + ], + [ + 74, + -1 + ], + [ + 90, + -1 + ], + [ + 106, + -1 + ], + [ + 122, + -1 + ], + [ + 138, + -1 + ], + [ + 154, + -1 + ], + [ + 170, + -1 + ], + [ + 186, + -1 + ], + [ + 202, + -1 + ], + [ + 218, + -1 + ], + [ + 234, + -1 + ], + [ + 250, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 27, + 1 + ], + [ + 43, + 1 + ], + [ + 59, + 1 + ], + [ + 75, + 1 + ], + [ + 91, + 1 + ], + [ + 107, + 1 + ], + [ + 123, + 1 + ], + [ + 139, + 1 + ], + [ + 155, + 1 + ], + [ + 171, + 1 + ], + [ + 187, + 1 + ], + [ + 203, + 1 + ], + [ + 219, + 1 + ], + [ + 235, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 27, + -1 + ], + [ + 43, + -1 + ], + [ + 59, + -1 + ], + [ + 75, + -1 + ], + [ + 91, + -1 + ], + [ + 107, + -1 + ], + [ + 123, + -1 + ], + [ + 139, + -1 + ], + [ + 155, + -1 + ], + [ + 171, + -1 + ], + [ + 187, + -1 + ], + [ + 203, + -1 + ], + [ + 219, + -1 + ], + [ + 235, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 28, + 1 + ], + [ + 44, + 1 + ], + [ + 60, + 1 + ], + [ + 76, + 1 + ], + [ + 92, + 1 + ], + [ + 108, + 1 + ], + [ + 124, + 1 + ], + [ + 140, + 1 + ], + [ + 156, + 1 + ], + [ + 172, + 1 + ], + [ + 188, + 1 + ], + [ + 204, + 1 + ], + [ + 220, + 1 + ], + [ + 236, + 1 + ], + [ + 252, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 28, + -1 + ], + [ + 44, + -1 + ], + [ + 60, + -1 + ], + [ + 76, + -1 + ], + [ + 92, + -1 + ], + [ + 108, + -1 + ], + [ + 124, + -1 + ], + [ + 140, + -1 + ], + [ + 156, + -1 + ], + [ + 172, + -1 + ], + [ + 188, + -1 + ], + [ + 204, + -1 + ], + [ + 220, + -1 + ], + [ + 236, + -1 + ], + [ + 252, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 29, + 1 + ], + [ + 45, + 1 + ], + [ + 61, + 1 + ], + [ + 77, + 1 + ], + [ + 93, + 1 + ], + [ + 109, + 1 + ], + [ + 125, + 1 + ], + [ + 141, + 1 + ], + [ + 157, + 1 + ], + [ + 173, + 1 + ], + [ + 189, + 1 + ], + [ + 205, + 1 + ], + [ + 221, + 1 + ], + [ + 237, + 1 + ], + [ + 253, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 29, + -1 + ], + [ + 45, + -1 + ], + [ + 61, + -1 + ], + [ + 77, + -1 + ], + [ + 93, + -1 + ], + [ + 109, + -1 + ], + [ + 125, + -1 + ], + [ + 141, + -1 + ], + [ + 157, + -1 + ], + [ + 173, + -1 + ], + [ + 189, + -1 + ], + [ + 205, + -1 + ], + [ + 221, + -1 + ], + [ + 237, + -1 + ], + [ + 253, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 30, + 1 + ], + [ + 46, + 1 + ], + [ + 62, + 1 + ], + [ + 78, + 1 + ], + [ + 94, + 1 + ], + [ + 110, + 1 + ], + [ + 126, + 1 + ], + [ + 142, + 1 + ], + [ + 158, + 1 + ], + [ + 174, + 1 + ], + [ + 190, + 1 + ], + [ + 206, + 1 + ], + [ + 222, + 1 + ], + [ + 238, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 30, + -1 + ], + [ + 46, + -1 + ], + [ + 62, + -1 + ], + [ + 78, + -1 + ], + [ + 94, + -1 + ], + [ + 110, + -1 + ], + [ + 126, + -1 + ], + [ + 142, + -1 + ], + [ + 158, + -1 + ], + [ + 174, + -1 + ], + [ + 190, + -1 + ], + [ + 206, + -1 + ], + [ + 222, + -1 + ], + [ + 238, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 31, + 1 + ], + [ + 47, + 1 + ], + [ + 63, + 1 + ], + [ + 79, + 1 + ], + [ + 95, + 1 + ], + [ + 111, + 1 + ], + [ + 127, + 1 + ], + [ + 143, + 1 + ], + [ + 159, + 1 + ], + [ + 175, + 1 + ], + [ + 191, + 1 + ], + [ + 207, + 1 + ], + [ + 223, + 1 + ], + [ + 239, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 31, + -1 + ], + [ + 47, + -1 + ], + [ + 63, + -1 + ], + [ + 79, + -1 + ], + [ + 95, + -1 + ], + [ + 111, + -1 + ], + [ + 127, + -1 + ], + [ + 143, + -1 + ], + [ + 159, + -1 + ], + [ + 175, + -1 + ], + [ + 191, + -1 + ], + [ + 207, + -1 + ], + [ + 223, + -1 + ], + [ + 239, + -1 + ], + [ + 255, + -1 + ] + ] + } + ], + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 64, + "nonzeros": 1024, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "tasks" + }, + "json_sha256": "2b199291221284f51fb713f23b6a66db528fb3e524db08c24da0df62e3b848b6", + "txt_sha256": "4e8cd3f1666029007ce8f8859394ba317ec7ec664124615fd5e51fc93fc9a289" + }, + { + "id": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "model": { + "id": "assignment_single_32", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 1024, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60, + 56, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21, + 66, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17, + 91, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14, + 23, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4, + 68, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57, + 51, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 68, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48, + 14, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52, + 10, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47, + 21, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97, + 13, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81, + 68, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96, + 65, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21, + 15, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57, + 94, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7, + 46, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30, + 58, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1, + 47, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11, + 24, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29, + 41, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34, + 56, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96, + 32, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98, + 47, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67, + 46, + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42, + 83, + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29, + 28, + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13, + 94, + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80, + 17, + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31, + 95, + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15, + 5, + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97, + 45, + 91, + 69, + 52, + 33, + 88, + 59, + 75, + 9, + 8, + 62, + 52, + 88, + 41, + 10, + 20, + 94, + 23, + 10, + 17, + 70, + 41, + 62, + 93, + 11, + 53, + 62, + 52, + 51, + 60, + 67, + 94, + 26 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ], + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ], + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ], + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ], + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 576, + 1 + ], + [ + 577, + 1 + ], + [ + 578, + 1 + ], + [ + 579, + 1 + ], + [ + 580, + 1 + ], + [ + 581, + 1 + ], + [ + 582, + 1 + ], + [ + 583, + 1 + ], + [ + 584, + 1 + ], + [ + 585, + 1 + ], + [ + 586, + 1 + ], + [ + 587, + 1 + ], + [ + 588, + 1 + ], + [ + 589, + 1 + ], + [ + 590, + 1 + ], + [ + 591, + 1 + ], + [ + 592, + 1 + ], + [ + 593, + 1 + ], + [ + 594, + 1 + ], + [ + 595, + 1 + ], + [ + 596, + 1 + ], + [ + 597, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ], + [ + 600, + 1 + ], + [ + 601, + 1 + ], + [ + 602, + 1 + ], + [ + 603, + 1 + ], + [ + 604, + 1 + ], + [ + 605, + 1 + ], + [ + 606, + 1 + ], + [ + 607, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 576, + -1 + ], + [ + 577, + -1 + ], + [ + 578, + -1 + ], + [ + 579, + -1 + ], + [ + 580, + -1 + ], + [ + 581, + -1 + ], + [ + 582, + -1 + ], + [ + 583, + -1 + ], + [ + 584, + -1 + ], + [ + 585, + -1 + ], + [ + 586, + -1 + ], + [ + 587, + -1 + ], + [ + 588, + -1 + ], + [ + 589, + -1 + ], + [ + 590, + -1 + ], + [ + 591, + -1 + ], + [ + 592, + -1 + ], + [ + 593, + -1 + ], + [ + 594, + -1 + ], + [ + 595, + -1 + ], + [ + 596, + -1 + ], + [ + 597, + -1 + ], + [ + 598, + -1 + ], + [ + 599, + -1 + ], + [ + 600, + -1 + ], + [ + 601, + -1 + ], + [ + 602, + -1 + ], + [ + 603, + -1 + ], + [ + 604, + -1 + ], + [ + 605, + -1 + ], + [ + 606, + -1 + ], + [ + 607, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 608, + 1 + ], + [ + 609, + 1 + ], + [ + 610, + 1 + ], + [ + 611, + 1 + ], + [ + 612, + 1 + ], + [ + 613, + 1 + ], + [ + 614, + 1 + ], + [ + 615, + 1 + ], + [ + 616, + 1 + ], + [ + 617, + 1 + ], + [ + 618, + 1 + ], + [ + 619, + 1 + ], + [ + 620, + 1 + ], + [ + 621, + 1 + ], + [ + 622, + 1 + ], + [ + 623, + 1 + ], + [ + 624, + 1 + ], + [ + 625, + 1 + ], + [ + 626, + 1 + ], + [ + 627, + 1 + ], + [ + 628, + 1 + ], + [ + 629, + 1 + ], + [ + 630, + 1 + ], + [ + 631, + 1 + ], + [ + 632, + 1 + ], + [ + 633, + 1 + ], + [ + 634, + 1 + ], + [ + 635, + 1 + ], + [ + 636, + 1 + ], + [ + 637, + 1 + ], + [ + 638, + 1 + ], + [ + 639, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 608, + -1 + ], + [ + 609, + -1 + ], + [ + 610, + -1 + ], + [ + 611, + -1 + ], + [ + 612, + -1 + ], + [ + 613, + -1 + ], + [ + 614, + -1 + ], + [ + 615, + -1 + ], + [ + 616, + -1 + ], + [ + 617, + -1 + ], + [ + 618, + -1 + ], + [ + 619, + -1 + ], + [ + 620, + -1 + ], + [ + 621, + -1 + ], + [ + 622, + -1 + ], + [ + 623, + -1 + ], + [ + 624, + -1 + ], + [ + 625, + -1 + ], + [ + 626, + -1 + ], + [ + 627, + -1 + ], + [ + 628, + -1 + ], + [ + 629, + -1 + ], + [ + 630, + -1 + ], + [ + 631, + -1 + ], + [ + 632, + -1 + ], + [ + 633, + -1 + ], + [ + 634, + -1 + ], + [ + 635, + -1 + ], + [ + 636, + -1 + ], + [ + 637, + -1 + ], + [ + 638, + -1 + ], + [ + 639, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 640, + 1 + ], + [ + 641, + 1 + ], + [ + 642, + 1 + ], + [ + 643, + 1 + ], + [ + 644, + 1 + ], + [ + 645, + 1 + ], + [ + 646, + 1 + ], + [ + 647, + 1 + ], + [ + 648, + 1 + ], + [ + 649, + 1 + ], + [ + 650, + 1 + ], + [ + 651, + 1 + ], + [ + 652, + 1 + ], + [ + 653, + 1 + ], + [ + 654, + 1 + ], + [ + 655, + 1 + ], + [ + 656, + 1 + ], + [ + 657, + 1 + ], + [ + 658, + 1 + ], + [ + 659, + 1 + ], + [ + 660, + 1 + ], + [ + 661, + 1 + ], + [ + 662, + 1 + ], + [ + 663, + 1 + ], + [ + 664, + 1 + ], + [ + 665, + 1 + ], + [ + 666, + 1 + ], + [ + 667, + 1 + ], + [ + 668, + 1 + ], + [ + 669, + 1 + ], + [ + 670, + 1 + ], + [ + 671, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 640, + -1 + ], + [ + 641, + -1 + ], + [ + 642, + -1 + ], + [ + 643, + -1 + ], + [ + 644, + -1 + ], + [ + 645, + -1 + ], + [ + 646, + -1 + ], + [ + 647, + -1 + ], + [ + 648, + -1 + ], + [ + 649, + -1 + ], + [ + 650, + -1 + ], + [ + 651, + -1 + ], + [ + 652, + -1 + ], + [ + 653, + -1 + ], + [ + 654, + -1 + ], + [ + 655, + -1 + ], + [ + 656, + -1 + ], + [ + 657, + -1 + ], + [ + 658, + -1 + ], + [ + 659, + -1 + ], + [ + 660, + -1 + ], + [ + 661, + -1 + ], + [ + 662, + -1 + ], + [ + 663, + -1 + ], + [ + 664, + -1 + ], + [ + 665, + -1 + ], + [ + 666, + -1 + ], + [ + 667, + -1 + ], + [ + 668, + -1 + ], + [ + 669, + -1 + ], + [ + 670, + -1 + ], + [ + 671, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 672, + 1 + ], + [ + 673, + 1 + ], + [ + 674, + 1 + ], + [ + 675, + 1 + ], + [ + 676, + 1 + ], + [ + 677, + 1 + ], + [ + 678, + 1 + ], + [ + 679, + 1 + ], + [ + 680, + 1 + ], + [ + 681, + 1 + ], + [ + 682, + 1 + ], + [ + 683, + 1 + ], + [ + 684, + 1 + ], + [ + 685, + 1 + ], + [ + 686, + 1 + ], + [ + 687, + 1 + ], + [ + 688, + 1 + ], + [ + 689, + 1 + ], + [ + 690, + 1 + ], + [ + 691, + 1 + ], + [ + 692, + 1 + ], + [ + 693, + 1 + ], + [ + 694, + 1 + ], + [ + 695, + 1 + ], + [ + 696, + 1 + ], + [ + 697, + 1 + ], + [ + 698, + 1 + ], + [ + 699, + 1 + ], + [ + 700, + 1 + ], + [ + 701, + 1 + ], + [ + 702, + 1 + ], + [ + 703, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 672, + -1 + ], + [ + 673, + -1 + ], + [ + 674, + -1 + ], + [ + 675, + -1 + ], + [ + 676, + -1 + ], + [ + 677, + -1 + ], + [ + 678, + -1 + ], + [ + 679, + -1 + ], + [ + 680, + -1 + ], + [ + 681, + -1 + ], + [ + 682, + -1 + ], + [ + 683, + -1 + ], + [ + 684, + -1 + ], + [ + 685, + -1 + ], + [ + 686, + -1 + ], + [ + 687, + -1 + ], + [ + 688, + -1 + ], + [ + 689, + -1 + ], + [ + 690, + -1 + ], + [ + 691, + -1 + ], + [ + 692, + -1 + ], + [ + 693, + -1 + ], + [ + 694, + -1 + ], + [ + 695, + -1 + ], + [ + 696, + -1 + ], + [ + 697, + -1 + ], + [ + 698, + -1 + ], + [ + 699, + -1 + ], + [ + 700, + -1 + ], + [ + 701, + -1 + ], + [ + 702, + -1 + ], + [ + 703, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 704, + 1 + ], + [ + 705, + 1 + ], + [ + 706, + 1 + ], + [ + 707, + 1 + ], + [ + 708, + 1 + ], + [ + 709, + 1 + ], + [ + 710, + 1 + ], + [ + 711, + 1 + ], + [ + 712, + 1 + ], + [ + 713, + 1 + ], + [ + 714, + 1 + ], + [ + 715, + 1 + ], + [ + 716, + 1 + ], + [ + 717, + 1 + ], + [ + 718, + 1 + ], + [ + 719, + 1 + ], + [ + 720, + 1 + ], + [ + 721, + 1 + ], + [ + 722, + 1 + ], + [ + 723, + 1 + ], + [ + 724, + 1 + ], + [ + 725, + 1 + ], + [ + 726, + 1 + ], + [ + 727, + 1 + ], + [ + 728, + 1 + ], + [ + 729, + 1 + ], + [ + 730, + 1 + ], + [ + 731, + 1 + ], + [ + 732, + 1 + ], + [ + 733, + 1 + ], + [ + 734, + 1 + ], + [ + 735, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 704, + -1 + ], + [ + 705, + -1 + ], + [ + 706, + -1 + ], + [ + 707, + -1 + ], + [ + 708, + -1 + ], + [ + 709, + -1 + ], + [ + 710, + -1 + ], + [ + 711, + -1 + ], + [ + 712, + -1 + ], + [ + 713, + -1 + ], + [ + 714, + -1 + ], + [ + 715, + -1 + ], + [ + 716, + -1 + ], + [ + 717, + -1 + ], + [ + 718, + -1 + ], + [ + 719, + -1 + ], + [ + 720, + -1 + ], + [ + 721, + -1 + ], + [ + 722, + -1 + ], + [ + 723, + -1 + ], + [ + 724, + -1 + ], + [ + 725, + -1 + ], + [ + 726, + -1 + ], + [ + 727, + -1 + ], + [ + 728, + -1 + ], + [ + 729, + -1 + ], + [ + 730, + -1 + ], + [ + 731, + -1 + ], + [ + 732, + -1 + ], + [ + 733, + -1 + ], + [ + 734, + -1 + ], + [ + 735, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 736, + 1 + ], + [ + 737, + 1 + ], + [ + 738, + 1 + ], + [ + 739, + 1 + ], + [ + 740, + 1 + ], + [ + 741, + 1 + ], + [ + 742, + 1 + ], + [ + 743, + 1 + ], + [ + 744, + 1 + ], + [ + 745, + 1 + ], + [ + 746, + 1 + ], + [ + 747, + 1 + ], + [ + 748, + 1 + ], + [ + 749, + 1 + ], + [ + 750, + 1 + ], + [ + 751, + 1 + ], + [ + 752, + 1 + ], + [ + 753, + 1 + ], + [ + 754, + 1 + ], + [ + 755, + 1 + ], + [ + 756, + 1 + ], + [ + 757, + 1 + ], + [ + 758, + 1 + ], + [ + 759, + 1 + ], + [ + 760, + 1 + ], + [ + 761, + 1 + ], + [ + 762, + 1 + ], + [ + 763, + 1 + ], + [ + 764, + 1 + ], + [ + 765, + 1 + ], + [ + 766, + 1 + ], + [ + 767, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 736, + -1 + ], + [ + 737, + -1 + ], + [ + 738, + -1 + ], + [ + 739, + -1 + ], + [ + 740, + -1 + ], + [ + 741, + -1 + ], + [ + 742, + -1 + ], + [ + 743, + -1 + ], + [ + 744, + -1 + ], + [ + 745, + -1 + ], + [ + 746, + -1 + ], + [ + 747, + -1 + ], + [ + 748, + -1 + ], + [ + 749, + -1 + ], + [ + 750, + -1 + ], + [ + 751, + -1 + ], + [ + 752, + -1 + ], + [ + 753, + -1 + ], + [ + 754, + -1 + ], + [ + 755, + -1 + ], + [ + 756, + -1 + ], + [ + 757, + -1 + ], + [ + 758, + -1 + ], + [ + 759, + -1 + ], + [ + 760, + -1 + ], + [ + 761, + -1 + ], + [ + 762, + -1 + ], + [ + 763, + -1 + ], + [ + 764, + -1 + ], + [ + 765, + -1 + ], + [ + 766, + -1 + ], + [ + 767, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 768, + 1 + ], + [ + 769, + 1 + ], + [ + 770, + 1 + ], + [ + 771, + 1 + ], + [ + 772, + 1 + ], + [ + 773, + 1 + ], + [ + 774, + 1 + ], + [ + 775, + 1 + ], + [ + 776, + 1 + ], + [ + 777, + 1 + ], + [ + 778, + 1 + ], + [ + 779, + 1 + ], + [ + 780, + 1 + ], + [ + 781, + 1 + ], + [ + 782, + 1 + ], + [ + 783, + 1 + ], + [ + 784, + 1 + ], + [ + 785, + 1 + ], + [ + 786, + 1 + ], + [ + 787, + 1 + ], + [ + 788, + 1 + ], + [ + 789, + 1 + ], + [ + 790, + 1 + ], + [ + 791, + 1 + ], + [ + 792, + 1 + ], + [ + 793, + 1 + ], + [ + 794, + 1 + ], + [ + 795, + 1 + ], + [ + 796, + 1 + ], + [ + 797, + 1 + ], + [ + 798, + 1 + ], + [ + 799, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 768, + -1 + ], + [ + 769, + -1 + ], + [ + 770, + -1 + ], + [ + 771, + -1 + ], + [ + 772, + -1 + ], + [ + 773, + -1 + ], + [ + 774, + -1 + ], + [ + 775, + -1 + ], + [ + 776, + -1 + ], + [ + 777, + -1 + ], + [ + 778, + -1 + ], + [ + 779, + -1 + ], + [ + 780, + -1 + ], + [ + 781, + -1 + ], + [ + 782, + -1 + ], + [ + 783, + -1 + ], + [ + 784, + -1 + ], + [ + 785, + -1 + ], + [ + 786, + -1 + ], + [ + 787, + -1 + ], + [ + 788, + -1 + ], + [ + 789, + -1 + ], + [ + 790, + -1 + ], + [ + 791, + -1 + ], + [ + 792, + -1 + ], + [ + 793, + -1 + ], + [ + 794, + -1 + ], + [ + 795, + -1 + ], + [ + 796, + -1 + ], + [ + 797, + -1 + ], + [ + 798, + -1 + ], + [ + 799, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 800, + 1 + ], + [ + 801, + 1 + ], + [ + 802, + 1 + ], + [ + 803, + 1 + ], + [ + 804, + 1 + ], + [ + 805, + 1 + ], + [ + 806, + 1 + ], + [ + 807, + 1 + ], + [ + 808, + 1 + ], + [ + 809, + 1 + ], + [ + 810, + 1 + ], + [ + 811, + 1 + ], + [ + 812, + 1 + ], + [ + 813, + 1 + ], + [ + 814, + 1 + ], + [ + 815, + 1 + ], + [ + 816, + 1 + ], + [ + 817, + 1 + ], + [ + 818, + 1 + ], + [ + 819, + 1 + ], + [ + 820, + 1 + ], + [ + 821, + 1 + ], + [ + 822, + 1 + ], + [ + 823, + 1 + ], + [ + 824, + 1 + ], + [ + 825, + 1 + ], + [ + 826, + 1 + ], + [ + 827, + 1 + ], + [ + 828, + 1 + ], + [ + 829, + 1 + ], + [ + 830, + 1 + ], + [ + 831, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 800, + -1 + ], + [ + 801, + -1 + ], + [ + 802, + -1 + ], + [ + 803, + -1 + ], + [ + 804, + -1 + ], + [ + 805, + -1 + ], + [ + 806, + -1 + ], + [ + 807, + -1 + ], + [ + 808, + -1 + ], + [ + 809, + -1 + ], + [ + 810, + -1 + ], + [ + 811, + -1 + ], + [ + 812, + -1 + ], + [ + 813, + -1 + ], + [ + 814, + -1 + ], + [ + 815, + -1 + ], + [ + 816, + -1 + ], + [ + 817, + -1 + ], + [ + 818, + -1 + ], + [ + 819, + -1 + ], + [ + 820, + -1 + ], + [ + 821, + -1 + ], + [ + 822, + -1 + ], + [ + 823, + -1 + ], + [ + 824, + -1 + ], + [ + 825, + -1 + ], + [ + 826, + -1 + ], + [ + 827, + -1 + ], + [ + 828, + -1 + ], + [ + 829, + -1 + ], + [ + 830, + -1 + ], + [ + 831, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 832, + 1 + ], + [ + 833, + 1 + ], + [ + 834, + 1 + ], + [ + 835, + 1 + ], + [ + 836, + 1 + ], + [ + 837, + 1 + ], + [ + 838, + 1 + ], + [ + 839, + 1 + ], + [ + 840, + 1 + ], + [ + 841, + 1 + ], + [ + 842, + 1 + ], + [ + 843, + 1 + ], + [ + 844, + 1 + ], + [ + 845, + 1 + ], + [ + 846, + 1 + ], + [ + 847, + 1 + ], + [ + 848, + 1 + ], + [ + 849, + 1 + ], + [ + 850, + 1 + ], + [ + 851, + 1 + ], + [ + 852, + 1 + ], + [ + 853, + 1 + ], + [ + 854, + 1 + ], + [ + 855, + 1 + ], + [ + 856, + 1 + ], + [ + 857, + 1 + ], + [ + 858, + 1 + ], + [ + 859, + 1 + ], + [ + 860, + 1 + ], + [ + 861, + 1 + ], + [ + 862, + 1 + ], + [ + 863, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 832, + -1 + ], + [ + 833, + -1 + ], + [ + 834, + -1 + ], + [ + 835, + -1 + ], + [ + 836, + -1 + ], + [ + 837, + -1 + ], + [ + 838, + -1 + ], + [ + 839, + -1 + ], + [ + 840, + -1 + ], + [ + 841, + -1 + ], + [ + 842, + -1 + ], + [ + 843, + -1 + ], + [ + 844, + -1 + ], + [ + 845, + -1 + ], + [ + 846, + -1 + ], + [ + 847, + -1 + ], + [ + 848, + -1 + ], + [ + 849, + -1 + ], + [ + 850, + -1 + ], + [ + 851, + -1 + ], + [ + 852, + -1 + ], + [ + 853, + -1 + ], + [ + 854, + -1 + ], + [ + 855, + -1 + ], + [ + 856, + -1 + ], + [ + 857, + -1 + ], + [ + 858, + -1 + ], + [ + 859, + -1 + ], + [ + 860, + -1 + ], + [ + 861, + -1 + ], + [ + 862, + -1 + ], + [ + 863, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 864, + 1 + ], + [ + 865, + 1 + ], + [ + 866, + 1 + ], + [ + 867, + 1 + ], + [ + 868, + 1 + ], + [ + 869, + 1 + ], + [ + 870, + 1 + ], + [ + 871, + 1 + ], + [ + 872, + 1 + ], + [ + 873, + 1 + ], + [ + 874, + 1 + ], + [ + 875, + 1 + ], + [ + 876, + 1 + ], + [ + 877, + 1 + ], + [ + 878, + 1 + ], + [ + 879, + 1 + ], + [ + 880, + 1 + ], + [ + 881, + 1 + ], + [ + 882, + 1 + ], + [ + 883, + 1 + ], + [ + 884, + 1 + ], + [ + 885, + 1 + ], + [ + 886, + 1 + ], + [ + 887, + 1 + ], + [ + 888, + 1 + ], + [ + 889, + 1 + ], + [ + 890, + 1 + ], + [ + 891, + 1 + ], + [ + 892, + 1 + ], + [ + 893, + 1 + ], + [ + 894, + 1 + ], + [ + 895, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 864, + -1 + ], + [ + 865, + -1 + ], + [ + 866, + -1 + ], + [ + 867, + -1 + ], + [ + 868, + -1 + ], + [ + 869, + -1 + ], + [ + 870, + -1 + ], + [ + 871, + -1 + ], + [ + 872, + -1 + ], + [ + 873, + -1 + ], + [ + 874, + -1 + ], + [ + 875, + -1 + ], + [ + 876, + -1 + ], + [ + 877, + -1 + ], + [ + 878, + -1 + ], + [ + 879, + -1 + ], + [ + 880, + -1 + ], + [ + 881, + -1 + ], + [ + 882, + -1 + ], + [ + 883, + -1 + ], + [ + 884, + -1 + ], + [ + 885, + -1 + ], + [ + 886, + -1 + ], + [ + 887, + -1 + ], + [ + 888, + -1 + ], + [ + 889, + -1 + ], + [ + 890, + -1 + ], + [ + 891, + -1 + ], + [ + 892, + -1 + ], + [ + 893, + -1 + ], + [ + 894, + -1 + ], + [ + 895, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 896, + 1 + ], + [ + 897, + 1 + ], + [ + 898, + 1 + ], + [ + 899, + 1 + ], + [ + 900, + 1 + ], + [ + 901, + 1 + ], + [ + 902, + 1 + ], + [ + 903, + 1 + ], + [ + 904, + 1 + ], + [ + 905, + 1 + ], + [ + 906, + 1 + ], + [ + 907, + 1 + ], + [ + 908, + 1 + ], + [ + 909, + 1 + ], + [ + 910, + 1 + ], + [ + 911, + 1 + ], + [ + 912, + 1 + ], + [ + 913, + 1 + ], + [ + 914, + 1 + ], + [ + 915, + 1 + ], + [ + 916, + 1 + ], + [ + 917, + 1 + ], + [ + 918, + 1 + ], + [ + 919, + 1 + ], + [ + 920, + 1 + ], + [ + 921, + 1 + ], + [ + 922, + 1 + ], + [ + 923, + 1 + ], + [ + 924, + 1 + ], + [ + 925, + 1 + ], + [ + 926, + 1 + ], + [ + 927, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 896, + -1 + ], + [ + 897, + -1 + ], + [ + 898, + -1 + ], + [ + 899, + -1 + ], + [ + 900, + -1 + ], + [ + 901, + -1 + ], + [ + 902, + -1 + ], + [ + 903, + -1 + ], + [ + 904, + -1 + ], + [ + 905, + -1 + ], + [ + 906, + -1 + ], + [ + 907, + -1 + ], + [ + 908, + -1 + ], + [ + 909, + -1 + ], + [ + 910, + -1 + ], + [ + 911, + -1 + ], + [ + 912, + -1 + ], + [ + 913, + -1 + ], + [ + 914, + -1 + ], + [ + 915, + -1 + ], + [ + 916, + -1 + ], + [ + 917, + -1 + ], + [ + 918, + -1 + ], + [ + 919, + -1 + ], + [ + 920, + -1 + ], + [ + 921, + -1 + ], + [ + 922, + -1 + ], + [ + 923, + -1 + ], + [ + 924, + -1 + ], + [ + 925, + -1 + ], + [ + 926, + -1 + ], + [ + 927, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 928, + 1 + ], + [ + 929, + 1 + ], + [ + 930, + 1 + ], + [ + 931, + 1 + ], + [ + 932, + 1 + ], + [ + 933, + 1 + ], + [ + 934, + 1 + ], + [ + 935, + 1 + ], + [ + 936, + 1 + ], + [ + 937, + 1 + ], + [ + 938, + 1 + ], + [ + 939, + 1 + ], + [ + 940, + 1 + ], + [ + 941, + 1 + ], + [ + 942, + 1 + ], + [ + 943, + 1 + ], + [ + 944, + 1 + ], + [ + 945, + 1 + ], + [ + 946, + 1 + ], + [ + 947, + 1 + ], + [ + 948, + 1 + ], + [ + 949, + 1 + ], + [ + 950, + 1 + ], + [ + 951, + 1 + ], + [ + 952, + 1 + ], + [ + 953, + 1 + ], + [ + 954, + 1 + ], + [ + 955, + 1 + ], + [ + 956, + 1 + ], + [ + 957, + 1 + ], + [ + 958, + 1 + ], + [ + 959, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 928, + -1 + ], + [ + 929, + -1 + ], + [ + 930, + -1 + ], + [ + 931, + -1 + ], + [ + 932, + -1 + ], + [ + 933, + -1 + ], + [ + 934, + -1 + ], + [ + 935, + -1 + ], + [ + 936, + -1 + ], + [ + 937, + -1 + ], + [ + 938, + -1 + ], + [ + 939, + -1 + ], + [ + 940, + -1 + ], + [ + 941, + -1 + ], + [ + 942, + -1 + ], + [ + 943, + -1 + ], + [ + 944, + -1 + ], + [ + 945, + -1 + ], + [ + 946, + -1 + ], + [ + 947, + -1 + ], + [ + 948, + -1 + ], + [ + 949, + -1 + ], + [ + 950, + -1 + ], + [ + 951, + -1 + ], + [ + 952, + -1 + ], + [ + 953, + -1 + ], + [ + 954, + -1 + ], + [ + 955, + -1 + ], + [ + 956, + -1 + ], + [ + 957, + -1 + ], + [ + 958, + -1 + ], + [ + 959, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 960, + 1 + ], + [ + 961, + 1 + ], + [ + 962, + 1 + ], + [ + 963, + 1 + ], + [ + 964, + 1 + ], + [ + 965, + 1 + ], + [ + 966, + 1 + ], + [ + 967, + 1 + ], + [ + 968, + 1 + ], + [ + 969, + 1 + ], + [ + 970, + 1 + ], + [ + 971, + 1 + ], + [ + 972, + 1 + ], + [ + 973, + 1 + ], + [ + 974, + 1 + ], + [ + 975, + 1 + ], + [ + 976, + 1 + ], + [ + 977, + 1 + ], + [ + 978, + 1 + ], + [ + 979, + 1 + ], + [ + 980, + 1 + ], + [ + 981, + 1 + ], + [ + 982, + 1 + ], + [ + 983, + 1 + ], + [ + 984, + 1 + ], + [ + 985, + 1 + ], + [ + 986, + 1 + ], + [ + 987, + 1 + ], + [ + 988, + 1 + ], + [ + 989, + 1 + ], + [ + 990, + 1 + ], + [ + 991, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 960, + -1 + ], + [ + 961, + -1 + ], + [ + 962, + -1 + ], + [ + 963, + -1 + ], + [ + 964, + -1 + ], + [ + 965, + -1 + ], + [ + 966, + -1 + ], + [ + 967, + -1 + ], + [ + 968, + -1 + ], + [ + 969, + -1 + ], + [ + 970, + -1 + ], + [ + 971, + -1 + ], + [ + 972, + -1 + ], + [ + 973, + -1 + ], + [ + 974, + -1 + ], + [ + 975, + -1 + ], + [ + 976, + -1 + ], + [ + 977, + -1 + ], + [ + 978, + -1 + ], + [ + 979, + -1 + ], + [ + 980, + -1 + ], + [ + 981, + -1 + ], + [ + 982, + -1 + ], + [ + 983, + -1 + ], + [ + 984, + -1 + ], + [ + 985, + -1 + ], + [ + 986, + -1 + ], + [ + 987, + -1 + ], + [ + 988, + -1 + ], + [ + 989, + -1 + ], + [ + 990, + -1 + ], + [ + 991, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 992, + 1 + ], + [ + 993, + 1 + ], + [ + 994, + 1 + ], + [ + 995, + 1 + ], + [ + 996, + 1 + ], + [ + 997, + 1 + ], + [ + 998, + 1 + ], + [ + 999, + 1 + ], + [ + 1000, + 1 + ], + [ + 1001, + 1 + ], + [ + 1002, + 1 + ], + [ + 1003, + 1 + ], + [ + 1004, + 1 + ], + [ + 1005, + 1 + ], + [ + 1006, + 1 + ], + [ + 1007, + 1 + ], + [ + 1008, + 1 + ], + [ + 1009, + 1 + ], + [ + 1010, + 1 + ], + [ + 1011, + 1 + ], + [ + 1012, + 1 + ], + [ + 1013, + 1 + ], + [ + 1014, + 1 + ], + [ + 1015, + 1 + ], + [ + 1016, + 1 + ], + [ + 1017, + 1 + ], + [ + 1018, + 1 + ], + [ + 1019, + 1 + ], + [ + 1020, + 1 + ], + [ + 1021, + 1 + ], + [ + 1022, + 1 + ], + [ + 1023, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 992, + -1 + ], + [ + 993, + -1 + ], + [ + 994, + -1 + ], + [ + 995, + -1 + ], + [ + 996, + -1 + ], + [ + 997, + -1 + ], + [ + 998, + -1 + ], + [ + 999, + -1 + ], + [ + 1000, + -1 + ], + [ + 1001, + -1 + ], + [ + 1002, + -1 + ], + [ + 1003, + -1 + ], + [ + 1004, + -1 + ], + [ + 1005, + -1 + ], + [ + 1006, + -1 + ], + [ + 1007, + -1 + ], + [ + 1008, + -1 + ], + [ + 1009, + -1 + ], + [ + 1010, + -1 + ], + [ + 1011, + -1 + ], + [ + 1012, + -1 + ], + [ + 1013, + -1 + ], + [ + 1014, + -1 + ], + [ + 1015, + -1 + ], + [ + 1016, + -1 + ], + [ + 1017, + -1 + ], + [ + 1018, + -1 + ], + [ + 1019, + -1 + ], + [ + 1020, + -1 + ], + [ + 1021, + -1 + ], + [ + 1022, + -1 + ], + [ + 1023, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 32, + 1 + ], + [ + 64, + 1 + ], + [ + 96, + 1 + ], + [ + 128, + 1 + ], + [ + 160, + 1 + ], + [ + 192, + 1 + ], + [ + 224, + 1 + ], + [ + 256, + 1 + ], + [ + 288, + 1 + ], + [ + 320, + 1 + ], + [ + 352, + 1 + ], + [ + 384, + 1 + ], + [ + 416, + 1 + ], + [ + 448, + 1 + ], + [ + 480, + 1 + ], + [ + 512, + 1 + ], + [ + 544, + 1 + ], + [ + 576, + 1 + ], + [ + 608, + 1 + ], + [ + 640, + 1 + ], + [ + 672, + 1 + ], + [ + 704, + 1 + ], + [ + 736, + 1 + ], + [ + 768, + 1 + ], + [ + 800, + 1 + ], + [ + 832, + 1 + ], + [ + 864, + 1 + ], + [ + 896, + 1 + ], + [ + 928, + 1 + ], + [ + 960, + 1 + ], + [ + 992, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 32, + -1 + ], + [ + 64, + -1 + ], + [ + 96, + -1 + ], + [ + 128, + -1 + ], + [ + 160, + -1 + ], + [ + 192, + -1 + ], + [ + 224, + -1 + ], + [ + 256, + -1 + ], + [ + 288, + -1 + ], + [ + 320, + -1 + ], + [ + 352, + -1 + ], + [ + 384, + -1 + ], + [ + 416, + -1 + ], + [ + 448, + -1 + ], + [ + 480, + -1 + ], + [ + 512, + -1 + ], + [ + 544, + -1 + ], + [ + 576, + -1 + ], + [ + 608, + -1 + ], + [ + 640, + -1 + ], + [ + 672, + -1 + ], + [ + 704, + -1 + ], + [ + 736, + -1 + ], + [ + 768, + -1 + ], + [ + 800, + -1 + ], + [ + 832, + -1 + ], + [ + 864, + -1 + ], + [ + 896, + -1 + ], + [ + 928, + -1 + ], + [ + 960, + -1 + ], + [ + 992, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 33, + 1 + ], + [ + 65, + 1 + ], + [ + 97, + 1 + ], + [ + 129, + 1 + ], + [ + 161, + 1 + ], + [ + 193, + 1 + ], + [ + 225, + 1 + ], + [ + 257, + 1 + ], + [ + 289, + 1 + ], + [ + 321, + 1 + ], + [ + 353, + 1 + ], + [ + 385, + 1 + ], + [ + 417, + 1 + ], + [ + 449, + 1 + ], + [ + 481, + 1 + ], + [ + 513, + 1 + ], + [ + 545, + 1 + ], + [ + 577, + 1 + ], + [ + 609, + 1 + ], + [ + 641, + 1 + ], + [ + 673, + 1 + ], + [ + 705, + 1 + ], + [ + 737, + 1 + ], + [ + 769, + 1 + ], + [ + 801, + 1 + ], + [ + 833, + 1 + ], + [ + 865, + 1 + ], + [ + 897, + 1 + ], + [ + 929, + 1 + ], + [ + 961, + 1 + ], + [ + 993, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 33, + -1 + ], + [ + 65, + -1 + ], + [ + 97, + -1 + ], + [ + 129, + -1 + ], + [ + 161, + -1 + ], + [ + 193, + -1 + ], + [ + 225, + -1 + ], + [ + 257, + -1 + ], + [ + 289, + -1 + ], + [ + 321, + -1 + ], + [ + 353, + -1 + ], + [ + 385, + -1 + ], + [ + 417, + -1 + ], + [ + 449, + -1 + ], + [ + 481, + -1 + ], + [ + 513, + -1 + ], + [ + 545, + -1 + ], + [ + 577, + -1 + ], + [ + 609, + -1 + ], + [ + 641, + -1 + ], + [ + 673, + -1 + ], + [ + 705, + -1 + ], + [ + 737, + -1 + ], + [ + 769, + -1 + ], + [ + 801, + -1 + ], + [ + 833, + -1 + ], + [ + 865, + -1 + ], + [ + 897, + -1 + ], + [ + 929, + -1 + ], + [ + 961, + -1 + ], + [ + 993, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 34, + 1 + ], + [ + 66, + 1 + ], + [ + 98, + 1 + ], + [ + 130, + 1 + ], + [ + 162, + 1 + ], + [ + 194, + 1 + ], + [ + 226, + 1 + ], + [ + 258, + 1 + ], + [ + 290, + 1 + ], + [ + 322, + 1 + ], + [ + 354, + 1 + ], + [ + 386, + 1 + ], + [ + 418, + 1 + ], + [ + 450, + 1 + ], + [ + 482, + 1 + ], + [ + 514, + 1 + ], + [ + 546, + 1 + ], + [ + 578, + 1 + ], + [ + 610, + 1 + ], + [ + 642, + 1 + ], + [ + 674, + 1 + ], + [ + 706, + 1 + ], + [ + 738, + 1 + ], + [ + 770, + 1 + ], + [ + 802, + 1 + ], + [ + 834, + 1 + ], + [ + 866, + 1 + ], + [ + 898, + 1 + ], + [ + 930, + 1 + ], + [ + 962, + 1 + ], + [ + 994, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 34, + -1 + ], + [ + 66, + -1 + ], + [ + 98, + -1 + ], + [ + 130, + -1 + ], + [ + 162, + -1 + ], + [ + 194, + -1 + ], + [ + 226, + -1 + ], + [ + 258, + -1 + ], + [ + 290, + -1 + ], + [ + 322, + -1 + ], + [ + 354, + -1 + ], + [ + 386, + -1 + ], + [ + 418, + -1 + ], + [ + 450, + -1 + ], + [ + 482, + -1 + ], + [ + 514, + -1 + ], + [ + 546, + -1 + ], + [ + 578, + -1 + ], + [ + 610, + -1 + ], + [ + 642, + -1 + ], + [ + 674, + -1 + ], + [ + 706, + -1 + ], + [ + 738, + -1 + ], + [ + 770, + -1 + ], + [ + 802, + -1 + ], + [ + 834, + -1 + ], + [ + 866, + -1 + ], + [ + 898, + -1 + ], + [ + 930, + -1 + ], + [ + 962, + -1 + ], + [ + 994, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 35, + 1 + ], + [ + 67, + 1 + ], + [ + 99, + 1 + ], + [ + 131, + 1 + ], + [ + 163, + 1 + ], + [ + 195, + 1 + ], + [ + 227, + 1 + ], + [ + 259, + 1 + ], + [ + 291, + 1 + ], + [ + 323, + 1 + ], + [ + 355, + 1 + ], + [ + 387, + 1 + ], + [ + 419, + 1 + ], + [ + 451, + 1 + ], + [ + 483, + 1 + ], + [ + 515, + 1 + ], + [ + 547, + 1 + ], + [ + 579, + 1 + ], + [ + 611, + 1 + ], + [ + 643, + 1 + ], + [ + 675, + 1 + ], + [ + 707, + 1 + ], + [ + 739, + 1 + ], + [ + 771, + 1 + ], + [ + 803, + 1 + ], + [ + 835, + 1 + ], + [ + 867, + 1 + ], + [ + 899, + 1 + ], + [ + 931, + 1 + ], + [ + 963, + 1 + ], + [ + 995, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 35, + -1 + ], + [ + 67, + -1 + ], + [ + 99, + -1 + ], + [ + 131, + -1 + ], + [ + 163, + -1 + ], + [ + 195, + -1 + ], + [ + 227, + -1 + ], + [ + 259, + -1 + ], + [ + 291, + -1 + ], + [ + 323, + -1 + ], + [ + 355, + -1 + ], + [ + 387, + -1 + ], + [ + 419, + -1 + ], + [ + 451, + -1 + ], + [ + 483, + -1 + ], + [ + 515, + -1 + ], + [ + 547, + -1 + ], + [ + 579, + -1 + ], + [ + 611, + -1 + ], + [ + 643, + -1 + ], + [ + 675, + -1 + ], + [ + 707, + -1 + ], + [ + 739, + -1 + ], + [ + 771, + -1 + ], + [ + 803, + -1 + ], + [ + 835, + -1 + ], + [ + 867, + -1 + ], + [ + 899, + -1 + ], + [ + 931, + -1 + ], + [ + 963, + -1 + ], + [ + 995, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 36, + 1 + ], + [ + 68, + 1 + ], + [ + 100, + 1 + ], + [ + 132, + 1 + ], + [ + 164, + 1 + ], + [ + 196, + 1 + ], + [ + 228, + 1 + ], + [ + 260, + 1 + ], + [ + 292, + 1 + ], + [ + 324, + 1 + ], + [ + 356, + 1 + ], + [ + 388, + 1 + ], + [ + 420, + 1 + ], + [ + 452, + 1 + ], + [ + 484, + 1 + ], + [ + 516, + 1 + ], + [ + 548, + 1 + ], + [ + 580, + 1 + ], + [ + 612, + 1 + ], + [ + 644, + 1 + ], + [ + 676, + 1 + ], + [ + 708, + 1 + ], + [ + 740, + 1 + ], + [ + 772, + 1 + ], + [ + 804, + 1 + ], + [ + 836, + 1 + ], + [ + 868, + 1 + ], + [ + 900, + 1 + ], + [ + 932, + 1 + ], + [ + 964, + 1 + ], + [ + 996, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 36, + -1 + ], + [ + 68, + -1 + ], + [ + 100, + -1 + ], + [ + 132, + -1 + ], + [ + 164, + -1 + ], + [ + 196, + -1 + ], + [ + 228, + -1 + ], + [ + 260, + -1 + ], + [ + 292, + -1 + ], + [ + 324, + -1 + ], + [ + 356, + -1 + ], + [ + 388, + -1 + ], + [ + 420, + -1 + ], + [ + 452, + -1 + ], + [ + 484, + -1 + ], + [ + 516, + -1 + ], + [ + 548, + -1 + ], + [ + 580, + -1 + ], + [ + 612, + -1 + ], + [ + 644, + -1 + ], + [ + 676, + -1 + ], + [ + 708, + -1 + ], + [ + 740, + -1 + ], + [ + 772, + -1 + ], + [ + 804, + -1 + ], + [ + 836, + -1 + ], + [ + 868, + -1 + ], + [ + 900, + -1 + ], + [ + 932, + -1 + ], + [ + 964, + -1 + ], + [ + 996, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 37, + 1 + ], + [ + 69, + 1 + ], + [ + 101, + 1 + ], + [ + 133, + 1 + ], + [ + 165, + 1 + ], + [ + 197, + 1 + ], + [ + 229, + 1 + ], + [ + 261, + 1 + ], + [ + 293, + 1 + ], + [ + 325, + 1 + ], + [ + 357, + 1 + ], + [ + 389, + 1 + ], + [ + 421, + 1 + ], + [ + 453, + 1 + ], + [ + 485, + 1 + ], + [ + 517, + 1 + ], + [ + 549, + 1 + ], + [ + 581, + 1 + ], + [ + 613, + 1 + ], + [ + 645, + 1 + ], + [ + 677, + 1 + ], + [ + 709, + 1 + ], + [ + 741, + 1 + ], + [ + 773, + 1 + ], + [ + 805, + 1 + ], + [ + 837, + 1 + ], + [ + 869, + 1 + ], + [ + 901, + 1 + ], + [ + 933, + 1 + ], + [ + 965, + 1 + ], + [ + 997, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 37, + -1 + ], + [ + 69, + -1 + ], + [ + 101, + -1 + ], + [ + 133, + -1 + ], + [ + 165, + -1 + ], + [ + 197, + -1 + ], + [ + 229, + -1 + ], + [ + 261, + -1 + ], + [ + 293, + -1 + ], + [ + 325, + -1 + ], + [ + 357, + -1 + ], + [ + 389, + -1 + ], + [ + 421, + -1 + ], + [ + 453, + -1 + ], + [ + 485, + -1 + ], + [ + 517, + -1 + ], + [ + 549, + -1 + ], + [ + 581, + -1 + ], + [ + 613, + -1 + ], + [ + 645, + -1 + ], + [ + 677, + -1 + ], + [ + 709, + -1 + ], + [ + 741, + -1 + ], + [ + 773, + -1 + ], + [ + 805, + -1 + ], + [ + 837, + -1 + ], + [ + 869, + -1 + ], + [ + 901, + -1 + ], + [ + 933, + -1 + ], + [ + 965, + -1 + ], + [ + 997, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 38, + 1 + ], + [ + 70, + 1 + ], + [ + 102, + 1 + ], + [ + 134, + 1 + ], + [ + 166, + 1 + ], + [ + 198, + 1 + ], + [ + 230, + 1 + ], + [ + 262, + 1 + ], + [ + 294, + 1 + ], + [ + 326, + 1 + ], + [ + 358, + 1 + ], + [ + 390, + 1 + ], + [ + 422, + 1 + ], + [ + 454, + 1 + ], + [ + 486, + 1 + ], + [ + 518, + 1 + ], + [ + 550, + 1 + ], + [ + 582, + 1 + ], + [ + 614, + 1 + ], + [ + 646, + 1 + ], + [ + 678, + 1 + ], + [ + 710, + 1 + ], + [ + 742, + 1 + ], + [ + 774, + 1 + ], + [ + 806, + 1 + ], + [ + 838, + 1 + ], + [ + 870, + 1 + ], + [ + 902, + 1 + ], + [ + 934, + 1 + ], + [ + 966, + 1 + ], + [ + 998, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 38, + -1 + ], + [ + 70, + -1 + ], + [ + 102, + -1 + ], + [ + 134, + -1 + ], + [ + 166, + -1 + ], + [ + 198, + -1 + ], + [ + 230, + -1 + ], + [ + 262, + -1 + ], + [ + 294, + -1 + ], + [ + 326, + -1 + ], + [ + 358, + -1 + ], + [ + 390, + -1 + ], + [ + 422, + -1 + ], + [ + 454, + -1 + ], + [ + 486, + -1 + ], + [ + 518, + -1 + ], + [ + 550, + -1 + ], + [ + 582, + -1 + ], + [ + 614, + -1 + ], + [ + 646, + -1 + ], + [ + 678, + -1 + ], + [ + 710, + -1 + ], + [ + 742, + -1 + ], + [ + 774, + -1 + ], + [ + 806, + -1 + ], + [ + 838, + -1 + ], + [ + 870, + -1 + ], + [ + 902, + -1 + ], + [ + 934, + -1 + ], + [ + 966, + -1 + ], + [ + 998, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 39, + 1 + ], + [ + 71, + 1 + ], + [ + 103, + 1 + ], + [ + 135, + 1 + ], + [ + 167, + 1 + ], + [ + 199, + 1 + ], + [ + 231, + 1 + ], + [ + 263, + 1 + ], + [ + 295, + 1 + ], + [ + 327, + 1 + ], + [ + 359, + 1 + ], + [ + 391, + 1 + ], + [ + 423, + 1 + ], + [ + 455, + 1 + ], + [ + 487, + 1 + ], + [ + 519, + 1 + ], + [ + 551, + 1 + ], + [ + 583, + 1 + ], + [ + 615, + 1 + ], + [ + 647, + 1 + ], + [ + 679, + 1 + ], + [ + 711, + 1 + ], + [ + 743, + 1 + ], + [ + 775, + 1 + ], + [ + 807, + 1 + ], + [ + 839, + 1 + ], + [ + 871, + 1 + ], + [ + 903, + 1 + ], + [ + 935, + 1 + ], + [ + 967, + 1 + ], + [ + 999, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 39, + -1 + ], + [ + 71, + -1 + ], + [ + 103, + -1 + ], + [ + 135, + -1 + ], + [ + 167, + -1 + ], + [ + 199, + -1 + ], + [ + 231, + -1 + ], + [ + 263, + -1 + ], + [ + 295, + -1 + ], + [ + 327, + -1 + ], + [ + 359, + -1 + ], + [ + 391, + -1 + ], + [ + 423, + -1 + ], + [ + 455, + -1 + ], + [ + 487, + -1 + ], + [ + 519, + -1 + ], + [ + 551, + -1 + ], + [ + 583, + -1 + ], + [ + 615, + -1 + ], + [ + 647, + -1 + ], + [ + 679, + -1 + ], + [ + 711, + -1 + ], + [ + 743, + -1 + ], + [ + 775, + -1 + ], + [ + 807, + -1 + ], + [ + 839, + -1 + ], + [ + 871, + -1 + ], + [ + 903, + -1 + ], + [ + 935, + -1 + ], + [ + 967, + -1 + ], + [ + 999, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 40, + 1 + ], + [ + 72, + 1 + ], + [ + 104, + 1 + ], + [ + 136, + 1 + ], + [ + 168, + 1 + ], + [ + 200, + 1 + ], + [ + 232, + 1 + ], + [ + 264, + 1 + ], + [ + 296, + 1 + ], + [ + 328, + 1 + ], + [ + 360, + 1 + ], + [ + 392, + 1 + ], + [ + 424, + 1 + ], + [ + 456, + 1 + ], + [ + 488, + 1 + ], + [ + 520, + 1 + ], + [ + 552, + 1 + ], + [ + 584, + 1 + ], + [ + 616, + 1 + ], + [ + 648, + 1 + ], + [ + 680, + 1 + ], + [ + 712, + 1 + ], + [ + 744, + 1 + ], + [ + 776, + 1 + ], + [ + 808, + 1 + ], + [ + 840, + 1 + ], + [ + 872, + 1 + ], + [ + 904, + 1 + ], + [ + 936, + 1 + ], + [ + 968, + 1 + ], + [ + 1000, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 40, + -1 + ], + [ + 72, + -1 + ], + [ + 104, + -1 + ], + [ + 136, + -1 + ], + [ + 168, + -1 + ], + [ + 200, + -1 + ], + [ + 232, + -1 + ], + [ + 264, + -1 + ], + [ + 296, + -1 + ], + [ + 328, + -1 + ], + [ + 360, + -1 + ], + [ + 392, + -1 + ], + [ + 424, + -1 + ], + [ + 456, + -1 + ], + [ + 488, + -1 + ], + [ + 520, + -1 + ], + [ + 552, + -1 + ], + [ + 584, + -1 + ], + [ + 616, + -1 + ], + [ + 648, + -1 + ], + [ + 680, + -1 + ], + [ + 712, + -1 + ], + [ + 744, + -1 + ], + [ + 776, + -1 + ], + [ + 808, + -1 + ], + [ + 840, + -1 + ], + [ + 872, + -1 + ], + [ + 904, + -1 + ], + [ + 936, + -1 + ], + [ + 968, + -1 + ], + [ + 1000, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 41, + 1 + ], + [ + 73, + 1 + ], + [ + 105, + 1 + ], + [ + 137, + 1 + ], + [ + 169, + 1 + ], + [ + 201, + 1 + ], + [ + 233, + 1 + ], + [ + 265, + 1 + ], + [ + 297, + 1 + ], + [ + 329, + 1 + ], + [ + 361, + 1 + ], + [ + 393, + 1 + ], + [ + 425, + 1 + ], + [ + 457, + 1 + ], + [ + 489, + 1 + ], + [ + 521, + 1 + ], + [ + 553, + 1 + ], + [ + 585, + 1 + ], + [ + 617, + 1 + ], + [ + 649, + 1 + ], + [ + 681, + 1 + ], + [ + 713, + 1 + ], + [ + 745, + 1 + ], + [ + 777, + 1 + ], + [ + 809, + 1 + ], + [ + 841, + 1 + ], + [ + 873, + 1 + ], + [ + 905, + 1 + ], + [ + 937, + 1 + ], + [ + 969, + 1 + ], + [ + 1001, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 41, + -1 + ], + [ + 73, + -1 + ], + [ + 105, + -1 + ], + [ + 137, + -1 + ], + [ + 169, + -1 + ], + [ + 201, + -1 + ], + [ + 233, + -1 + ], + [ + 265, + -1 + ], + [ + 297, + -1 + ], + [ + 329, + -1 + ], + [ + 361, + -1 + ], + [ + 393, + -1 + ], + [ + 425, + -1 + ], + [ + 457, + -1 + ], + [ + 489, + -1 + ], + [ + 521, + -1 + ], + [ + 553, + -1 + ], + [ + 585, + -1 + ], + [ + 617, + -1 + ], + [ + 649, + -1 + ], + [ + 681, + -1 + ], + [ + 713, + -1 + ], + [ + 745, + -1 + ], + [ + 777, + -1 + ], + [ + 809, + -1 + ], + [ + 841, + -1 + ], + [ + 873, + -1 + ], + [ + 905, + -1 + ], + [ + 937, + -1 + ], + [ + 969, + -1 + ], + [ + 1001, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 42, + 1 + ], + [ + 74, + 1 + ], + [ + 106, + 1 + ], + [ + 138, + 1 + ], + [ + 170, + 1 + ], + [ + 202, + 1 + ], + [ + 234, + 1 + ], + [ + 266, + 1 + ], + [ + 298, + 1 + ], + [ + 330, + 1 + ], + [ + 362, + 1 + ], + [ + 394, + 1 + ], + [ + 426, + 1 + ], + [ + 458, + 1 + ], + [ + 490, + 1 + ], + [ + 522, + 1 + ], + [ + 554, + 1 + ], + [ + 586, + 1 + ], + [ + 618, + 1 + ], + [ + 650, + 1 + ], + [ + 682, + 1 + ], + [ + 714, + 1 + ], + [ + 746, + 1 + ], + [ + 778, + 1 + ], + [ + 810, + 1 + ], + [ + 842, + 1 + ], + [ + 874, + 1 + ], + [ + 906, + 1 + ], + [ + 938, + 1 + ], + [ + 970, + 1 + ], + [ + 1002, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 42, + -1 + ], + [ + 74, + -1 + ], + [ + 106, + -1 + ], + [ + 138, + -1 + ], + [ + 170, + -1 + ], + [ + 202, + -1 + ], + [ + 234, + -1 + ], + [ + 266, + -1 + ], + [ + 298, + -1 + ], + [ + 330, + -1 + ], + [ + 362, + -1 + ], + [ + 394, + -1 + ], + [ + 426, + -1 + ], + [ + 458, + -1 + ], + [ + 490, + -1 + ], + [ + 522, + -1 + ], + [ + 554, + -1 + ], + [ + 586, + -1 + ], + [ + 618, + -1 + ], + [ + 650, + -1 + ], + [ + 682, + -1 + ], + [ + 714, + -1 + ], + [ + 746, + -1 + ], + [ + 778, + -1 + ], + [ + 810, + -1 + ], + [ + 842, + -1 + ], + [ + 874, + -1 + ], + [ + 906, + -1 + ], + [ + 938, + -1 + ], + [ + 970, + -1 + ], + [ + 1002, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 43, + 1 + ], + [ + 75, + 1 + ], + [ + 107, + 1 + ], + [ + 139, + 1 + ], + [ + 171, + 1 + ], + [ + 203, + 1 + ], + [ + 235, + 1 + ], + [ + 267, + 1 + ], + [ + 299, + 1 + ], + [ + 331, + 1 + ], + [ + 363, + 1 + ], + [ + 395, + 1 + ], + [ + 427, + 1 + ], + [ + 459, + 1 + ], + [ + 491, + 1 + ], + [ + 523, + 1 + ], + [ + 555, + 1 + ], + [ + 587, + 1 + ], + [ + 619, + 1 + ], + [ + 651, + 1 + ], + [ + 683, + 1 + ], + [ + 715, + 1 + ], + [ + 747, + 1 + ], + [ + 779, + 1 + ], + [ + 811, + 1 + ], + [ + 843, + 1 + ], + [ + 875, + 1 + ], + [ + 907, + 1 + ], + [ + 939, + 1 + ], + [ + 971, + 1 + ], + [ + 1003, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 43, + -1 + ], + [ + 75, + -1 + ], + [ + 107, + -1 + ], + [ + 139, + -1 + ], + [ + 171, + -1 + ], + [ + 203, + -1 + ], + [ + 235, + -1 + ], + [ + 267, + -1 + ], + [ + 299, + -1 + ], + [ + 331, + -1 + ], + [ + 363, + -1 + ], + [ + 395, + -1 + ], + [ + 427, + -1 + ], + [ + 459, + -1 + ], + [ + 491, + -1 + ], + [ + 523, + -1 + ], + [ + 555, + -1 + ], + [ + 587, + -1 + ], + [ + 619, + -1 + ], + [ + 651, + -1 + ], + [ + 683, + -1 + ], + [ + 715, + -1 + ], + [ + 747, + -1 + ], + [ + 779, + -1 + ], + [ + 811, + -1 + ], + [ + 843, + -1 + ], + [ + 875, + -1 + ], + [ + 907, + -1 + ], + [ + 939, + -1 + ], + [ + 971, + -1 + ], + [ + 1003, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 44, + 1 + ], + [ + 76, + 1 + ], + [ + 108, + 1 + ], + [ + 140, + 1 + ], + [ + 172, + 1 + ], + [ + 204, + 1 + ], + [ + 236, + 1 + ], + [ + 268, + 1 + ], + [ + 300, + 1 + ], + [ + 332, + 1 + ], + [ + 364, + 1 + ], + [ + 396, + 1 + ], + [ + 428, + 1 + ], + [ + 460, + 1 + ], + [ + 492, + 1 + ], + [ + 524, + 1 + ], + [ + 556, + 1 + ], + [ + 588, + 1 + ], + [ + 620, + 1 + ], + [ + 652, + 1 + ], + [ + 684, + 1 + ], + [ + 716, + 1 + ], + [ + 748, + 1 + ], + [ + 780, + 1 + ], + [ + 812, + 1 + ], + [ + 844, + 1 + ], + [ + 876, + 1 + ], + [ + 908, + 1 + ], + [ + 940, + 1 + ], + [ + 972, + 1 + ], + [ + 1004, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 44, + -1 + ], + [ + 76, + -1 + ], + [ + 108, + -1 + ], + [ + 140, + -1 + ], + [ + 172, + -1 + ], + [ + 204, + -1 + ], + [ + 236, + -1 + ], + [ + 268, + -1 + ], + [ + 300, + -1 + ], + [ + 332, + -1 + ], + [ + 364, + -1 + ], + [ + 396, + -1 + ], + [ + 428, + -1 + ], + [ + 460, + -1 + ], + [ + 492, + -1 + ], + [ + 524, + -1 + ], + [ + 556, + -1 + ], + [ + 588, + -1 + ], + [ + 620, + -1 + ], + [ + 652, + -1 + ], + [ + 684, + -1 + ], + [ + 716, + -1 + ], + [ + 748, + -1 + ], + [ + 780, + -1 + ], + [ + 812, + -1 + ], + [ + 844, + -1 + ], + [ + 876, + -1 + ], + [ + 908, + -1 + ], + [ + 940, + -1 + ], + [ + 972, + -1 + ], + [ + 1004, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 45, + 1 + ], + [ + 77, + 1 + ], + [ + 109, + 1 + ], + [ + 141, + 1 + ], + [ + 173, + 1 + ], + [ + 205, + 1 + ], + [ + 237, + 1 + ], + [ + 269, + 1 + ], + [ + 301, + 1 + ], + [ + 333, + 1 + ], + [ + 365, + 1 + ], + [ + 397, + 1 + ], + [ + 429, + 1 + ], + [ + 461, + 1 + ], + [ + 493, + 1 + ], + [ + 525, + 1 + ], + [ + 557, + 1 + ], + [ + 589, + 1 + ], + [ + 621, + 1 + ], + [ + 653, + 1 + ], + [ + 685, + 1 + ], + [ + 717, + 1 + ], + [ + 749, + 1 + ], + [ + 781, + 1 + ], + [ + 813, + 1 + ], + [ + 845, + 1 + ], + [ + 877, + 1 + ], + [ + 909, + 1 + ], + [ + 941, + 1 + ], + [ + 973, + 1 + ], + [ + 1005, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 45, + -1 + ], + [ + 77, + -1 + ], + [ + 109, + -1 + ], + [ + 141, + -1 + ], + [ + 173, + -1 + ], + [ + 205, + -1 + ], + [ + 237, + -1 + ], + [ + 269, + -1 + ], + [ + 301, + -1 + ], + [ + 333, + -1 + ], + [ + 365, + -1 + ], + [ + 397, + -1 + ], + [ + 429, + -1 + ], + [ + 461, + -1 + ], + [ + 493, + -1 + ], + [ + 525, + -1 + ], + [ + 557, + -1 + ], + [ + 589, + -1 + ], + [ + 621, + -1 + ], + [ + 653, + -1 + ], + [ + 685, + -1 + ], + [ + 717, + -1 + ], + [ + 749, + -1 + ], + [ + 781, + -1 + ], + [ + 813, + -1 + ], + [ + 845, + -1 + ], + [ + 877, + -1 + ], + [ + 909, + -1 + ], + [ + 941, + -1 + ], + [ + 973, + -1 + ], + [ + 1005, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 46, + 1 + ], + [ + 78, + 1 + ], + [ + 110, + 1 + ], + [ + 142, + 1 + ], + [ + 174, + 1 + ], + [ + 206, + 1 + ], + [ + 238, + 1 + ], + [ + 270, + 1 + ], + [ + 302, + 1 + ], + [ + 334, + 1 + ], + [ + 366, + 1 + ], + [ + 398, + 1 + ], + [ + 430, + 1 + ], + [ + 462, + 1 + ], + [ + 494, + 1 + ], + [ + 526, + 1 + ], + [ + 558, + 1 + ], + [ + 590, + 1 + ], + [ + 622, + 1 + ], + [ + 654, + 1 + ], + [ + 686, + 1 + ], + [ + 718, + 1 + ], + [ + 750, + 1 + ], + [ + 782, + 1 + ], + [ + 814, + 1 + ], + [ + 846, + 1 + ], + [ + 878, + 1 + ], + [ + 910, + 1 + ], + [ + 942, + 1 + ], + [ + 974, + 1 + ], + [ + 1006, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 46, + -1 + ], + [ + 78, + -1 + ], + [ + 110, + -1 + ], + [ + 142, + -1 + ], + [ + 174, + -1 + ], + [ + 206, + -1 + ], + [ + 238, + -1 + ], + [ + 270, + -1 + ], + [ + 302, + -1 + ], + [ + 334, + -1 + ], + [ + 366, + -1 + ], + [ + 398, + -1 + ], + [ + 430, + -1 + ], + [ + 462, + -1 + ], + [ + 494, + -1 + ], + [ + 526, + -1 + ], + [ + 558, + -1 + ], + [ + 590, + -1 + ], + [ + 622, + -1 + ], + [ + 654, + -1 + ], + [ + 686, + -1 + ], + [ + 718, + -1 + ], + [ + 750, + -1 + ], + [ + 782, + -1 + ], + [ + 814, + -1 + ], + [ + 846, + -1 + ], + [ + 878, + -1 + ], + [ + 910, + -1 + ], + [ + 942, + -1 + ], + [ + 974, + -1 + ], + [ + 1006, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 47, + 1 + ], + [ + 79, + 1 + ], + [ + 111, + 1 + ], + [ + 143, + 1 + ], + [ + 175, + 1 + ], + [ + 207, + 1 + ], + [ + 239, + 1 + ], + [ + 271, + 1 + ], + [ + 303, + 1 + ], + [ + 335, + 1 + ], + [ + 367, + 1 + ], + [ + 399, + 1 + ], + [ + 431, + 1 + ], + [ + 463, + 1 + ], + [ + 495, + 1 + ], + [ + 527, + 1 + ], + [ + 559, + 1 + ], + [ + 591, + 1 + ], + [ + 623, + 1 + ], + [ + 655, + 1 + ], + [ + 687, + 1 + ], + [ + 719, + 1 + ], + [ + 751, + 1 + ], + [ + 783, + 1 + ], + [ + 815, + 1 + ], + [ + 847, + 1 + ], + [ + 879, + 1 + ], + [ + 911, + 1 + ], + [ + 943, + 1 + ], + [ + 975, + 1 + ], + [ + 1007, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 47, + -1 + ], + [ + 79, + -1 + ], + [ + 111, + -1 + ], + [ + 143, + -1 + ], + [ + 175, + -1 + ], + [ + 207, + -1 + ], + [ + 239, + -1 + ], + [ + 271, + -1 + ], + [ + 303, + -1 + ], + [ + 335, + -1 + ], + [ + 367, + -1 + ], + [ + 399, + -1 + ], + [ + 431, + -1 + ], + [ + 463, + -1 + ], + [ + 495, + -1 + ], + [ + 527, + -1 + ], + [ + 559, + -1 + ], + [ + 591, + -1 + ], + [ + 623, + -1 + ], + [ + 655, + -1 + ], + [ + 687, + -1 + ], + [ + 719, + -1 + ], + [ + 751, + -1 + ], + [ + 783, + -1 + ], + [ + 815, + -1 + ], + [ + 847, + -1 + ], + [ + 879, + -1 + ], + [ + 911, + -1 + ], + [ + 943, + -1 + ], + [ + 975, + -1 + ], + [ + 1007, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 48, + 1 + ], + [ + 80, + 1 + ], + [ + 112, + 1 + ], + [ + 144, + 1 + ], + [ + 176, + 1 + ], + [ + 208, + 1 + ], + [ + 240, + 1 + ], + [ + 272, + 1 + ], + [ + 304, + 1 + ], + [ + 336, + 1 + ], + [ + 368, + 1 + ], + [ + 400, + 1 + ], + [ + 432, + 1 + ], + [ + 464, + 1 + ], + [ + 496, + 1 + ], + [ + 528, + 1 + ], + [ + 560, + 1 + ], + [ + 592, + 1 + ], + [ + 624, + 1 + ], + [ + 656, + 1 + ], + [ + 688, + 1 + ], + [ + 720, + 1 + ], + [ + 752, + 1 + ], + [ + 784, + 1 + ], + [ + 816, + 1 + ], + [ + 848, + 1 + ], + [ + 880, + 1 + ], + [ + 912, + 1 + ], + [ + 944, + 1 + ], + [ + 976, + 1 + ], + [ + 1008, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 48, + -1 + ], + [ + 80, + -1 + ], + [ + 112, + -1 + ], + [ + 144, + -1 + ], + [ + 176, + -1 + ], + [ + 208, + -1 + ], + [ + 240, + -1 + ], + [ + 272, + -1 + ], + [ + 304, + -1 + ], + [ + 336, + -1 + ], + [ + 368, + -1 + ], + [ + 400, + -1 + ], + [ + 432, + -1 + ], + [ + 464, + -1 + ], + [ + 496, + -1 + ], + [ + 528, + -1 + ], + [ + 560, + -1 + ], + [ + 592, + -1 + ], + [ + 624, + -1 + ], + [ + 656, + -1 + ], + [ + 688, + -1 + ], + [ + 720, + -1 + ], + [ + 752, + -1 + ], + [ + 784, + -1 + ], + [ + 816, + -1 + ], + [ + 848, + -1 + ], + [ + 880, + -1 + ], + [ + 912, + -1 + ], + [ + 944, + -1 + ], + [ + 976, + -1 + ], + [ + 1008, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 49, + 1 + ], + [ + 81, + 1 + ], + [ + 113, + 1 + ], + [ + 145, + 1 + ], + [ + 177, + 1 + ], + [ + 209, + 1 + ], + [ + 241, + 1 + ], + [ + 273, + 1 + ], + [ + 305, + 1 + ], + [ + 337, + 1 + ], + [ + 369, + 1 + ], + [ + 401, + 1 + ], + [ + 433, + 1 + ], + [ + 465, + 1 + ], + [ + 497, + 1 + ], + [ + 529, + 1 + ], + [ + 561, + 1 + ], + [ + 593, + 1 + ], + [ + 625, + 1 + ], + [ + 657, + 1 + ], + [ + 689, + 1 + ], + [ + 721, + 1 + ], + [ + 753, + 1 + ], + [ + 785, + 1 + ], + [ + 817, + 1 + ], + [ + 849, + 1 + ], + [ + 881, + 1 + ], + [ + 913, + 1 + ], + [ + 945, + 1 + ], + [ + 977, + 1 + ], + [ + 1009, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 49, + -1 + ], + [ + 81, + -1 + ], + [ + 113, + -1 + ], + [ + 145, + -1 + ], + [ + 177, + -1 + ], + [ + 209, + -1 + ], + [ + 241, + -1 + ], + [ + 273, + -1 + ], + [ + 305, + -1 + ], + [ + 337, + -1 + ], + [ + 369, + -1 + ], + [ + 401, + -1 + ], + [ + 433, + -1 + ], + [ + 465, + -1 + ], + [ + 497, + -1 + ], + [ + 529, + -1 + ], + [ + 561, + -1 + ], + [ + 593, + -1 + ], + [ + 625, + -1 + ], + [ + 657, + -1 + ], + [ + 689, + -1 + ], + [ + 721, + -1 + ], + [ + 753, + -1 + ], + [ + 785, + -1 + ], + [ + 817, + -1 + ], + [ + 849, + -1 + ], + [ + 881, + -1 + ], + [ + 913, + -1 + ], + [ + 945, + -1 + ], + [ + 977, + -1 + ], + [ + 1009, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 50, + 1 + ], + [ + 82, + 1 + ], + [ + 114, + 1 + ], + [ + 146, + 1 + ], + [ + 178, + 1 + ], + [ + 210, + 1 + ], + [ + 242, + 1 + ], + [ + 274, + 1 + ], + [ + 306, + 1 + ], + [ + 338, + 1 + ], + [ + 370, + 1 + ], + [ + 402, + 1 + ], + [ + 434, + 1 + ], + [ + 466, + 1 + ], + [ + 498, + 1 + ], + [ + 530, + 1 + ], + [ + 562, + 1 + ], + [ + 594, + 1 + ], + [ + 626, + 1 + ], + [ + 658, + 1 + ], + [ + 690, + 1 + ], + [ + 722, + 1 + ], + [ + 754, + 1 + ], + [ + 786, + 1 + ], + [ + 818, + 1 + ], + [ + 850, + 1 + ], + [ + 882, + 1 + ], + [ + 914, + 1 + ], + [ + 946, + 1 + ], + [ + 978, + 1 + ], + [ + 1010, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 50, + -1 + ], + [ + 82, + -1 + ], + [ + 114, + -1 + ], + [ + 146, + -1 + ], + [ + 178, + -1 + ], + [ + 210, + -1 + ], + [ + 242, + -1 + ], + [ + 274, + -1 + ], + [ + 306, + -1 + ], + [ + 338, + -1 + ], + [ + 370, + -1 + ], + [ + 402, + -1 + ], + [ + 434, + -1 + ], + [ + 466, + -1 + ], + [ + 498, + -1 + ], + [ + 530, + -1 + ], + [ + 562, + -1 + ], + [ + 594, + -1 + ], + [ + 626, + -1 + ], + [ + 658, + -1 + ], + [ + 690, + -1 + ], + [ + 722, + -1 + ], + [ + 754, + -1 + ], + [ + 786, + -1 + ], + [ + 818, + -1 + ], + [ + 850, + -1 + ], + [ + 882, + -1 + ], + [ + 914, + -1 + ], + [ + 946, + -1 + ], + [ + 978, + -1 + ], + [ + 1010, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 51, + 1 + ], + [ + 83, + 1 + ], + [ + 115, + 1 + ], + [ + 147, + 1 + ], + [ + 179, + 1 + ], + [ + 211, + 1 + ], + [ + 243, + 1 + ], + [ + 275, + 1 + ], + [ + 307, + 1 + ], + [ + 339, + 1 + ], + [ + 371, + 1 + ], + [ + 403, + 1 + ], + [ + 435, + 1 + ], + [ + 467, + 1 + ], + [ + 499, + 1 + ], + [ + 531, + 1 + ], + [ + 563, + 1 + ], + [ + 595, + 1 + ], + [ + 627, + 1 + ], + [ + 659, + 1 + ], + [ + 691, + 1 + ], + [ + 723, + 1 + ], + [ + 755, + 1 + ], + [ + 787, + 1 + ], + [ + 819, + 1 + ], + [ + 851, + 1 + ], + [ + 883, + 1 + ], + [ + 915, + 1 + ], + [ + 947, + 1 + ], + [ + 979, + 1 + ], + [ + 1011, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 51, + -1 + ], + [ + 83, + -1 + ], + [ + 115, + -1 + ], + [ + 147, + -1 + ], + [ + 179, + -1 + ], + [ + 211, + -1 + ], + [ + 243, + -1 + ], + [ + 275, + -1 + ], + [ + 307, + -1 + ], + [ + 339, + -1 + ], + [ + 371, + -1 + ], + [ + 403, + -1 + ], + [ + 435, + -1 + ], + [ + 467, + -1 + ], + [ + 499, + -1 + ], + [ + 531, + -1 + ], + [ + 563, + -1 + ], + [ + 595, + -1 + ], + [ + 627, + -1 + ], + [ + 659, + -1 + ], + [ + 691, + -1 + ], + [ + 723, + -1 + ], + [ + 755, + -1 + ], + [ + 787, + -1 + ], + [ + 819, + -1 + ], + [ + 851, + -1 + ], + [ + 883, + -1 + ], + [ + 915, + -1 + ], + [ + 947, + -1 + ], + [ + 979, + -1 + ], + [ + 1011, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 52, + 1 + ], + [ + 84, + 1 + ], + [ + 116, + 1 + ], + [ + 148, + 1 + ], + [ + 180, + 1 + ], + [ + 212, + 1 + ], + [ + 244, + 1 + ], + [ + 276, + 1 + ], + [ + 308, + 1 + ], + [ + 340, + 1 + ], + [ + 372, + 1 + ], + [ + 404, + 1 + ], + [ + 436, + 1 + ], + [ + 468, + 1 + ], + [ + 500, + 1 + ], + [ + 532, + 1 + ], + [ + 564, + 1 + ], + [ + 596, + 1 + ], + [ + 628, + 1 + ], + [ + 660, + 1 + ], + [ + 692, + 1 + ], + [ + 724, + 1 + ], + [ + 756, + 1 + ], + [ + 788, + 1 + ], + [ + 820, + 1 + ], + [ + 852, + 1 + ], + [ + 884, + 1 + ], + [ + 916, + 1 + ], + [ + 948, + 1 + ], + [ + 980, + 1 + ], + [ + 1012, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 52, + -1 + ], + [ + 84, + -1 + ], + [ + 116, + -1 + ], + [ + 148, + -1 + ], + [ + 180, + -1 + ], + [ + 212, + -1 + ], + [ + 244, + -1 + ], + [ + 276, + -1 + ], + [ + 308, + -1 + ], + [ + 340, + -1 + ], + [ + 372, + -1 + ], + [ + 404, + -1 + ], + [ + 436, + -1 + ], + [ + 468, + -1 + ], + [ + 500, + -1 + ], + [ + 532, + -1 + ], + [ + 564, + -1 + ], + [ + 596, + -1 + ], + [ + 628, + -1 + ], + [ + 660, + -1 + ], + [ + 692, + -1 + ], + [ + 724, + -1 + ], + [ + 756, + -1 + ], + [ + 788, + -1 + ], + [ + 820, + -1 + ], + [ + 852, + -1 + ], + [ + 884, + -1 + ], + [ + 916, + -1 + ], + [ + 948, + -1 + ], + [ + 980, + -1 + ], + [ + 1012, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 53, + 1 + ], + [ + 85, + 1 + ], + [ + 117, + 1 + ], + [ + 149, + 1 + ], + [ + 181, + 1 + ], + [ + 213, + 1 + ], + [ + 245, + 1 + ], + [ + 277, + 1 + ], + [ + 309, + 1 + ], + [ + 341, + 1 + ], + [ + 373, + 1 + ], + [ + 405, + 1 + ], + [ + 437, + 1 + ], + [ + 469, + 1 + ], + [ + 501, + 1 + ], + [ + 533, + 1 + ], + [ + 565, + 1 + ], + [ + 597, + 1 + ], + [ + 629, + 1 + ], + [ + 661, + 1 + ], + [ + 693, + 1 + ], + [ + 725, + 1 + ], + [ + 757, + 1 + ], + [ + 789, + 1 + ], + [ + 821, + 1 + ], + [ + 853, + 1 + ], + [ + 885, + 1 + ], + [ + 917, + 1 + ], + [ + 949, + 1 + ], + [ + 981, + 1 + ], + [ + 1013, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 53, + -1 + ], + [ + 85, + -1 + ], + [ + 117, + -1 + ], + [ + 149, + -1 + ], + [ + 181, + -1 + ], + [ + 213, + -1 + ], + [ + 245, + -1 + ], + [ + 277, + -1 + ], + [ + 309, + -1 + ], + [ + 341, + -1 + ], + [ + 373, + -1 + ], + [ + 405, + -1 + ], + [ + 437, + -1 + ], + [ + 469, + -1 + ], + [ + 501, + -1 + ], + [ + 533, + -1 + ], + [ + 565, + -1 + ], + [ + 597, + -1 + ], + [ + 629, + -1 + ], + [ + 661, + -1 + ], + [ + 693, + -1 + ], + [ + 725, + -1 + ], + [ + 757, + -1 + ], + [ + 789, + -1 + ], + [ + 821, + -1 + ], + [ + 853, + -1 + ], + [ + 885, + -1 + ], + [ + 917, + -1 + ], + [ + 949, + -1 + ], + [ + 981, + -1 + ], + [ + 1013, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 54, + 1 + ], + [ + 86, + 1 + ], + [ + 118, + 1 + ], + [ + 150, + 1 + ], + [ + 182, + 1 + ], + [ + 214, + 1 + ], + [ + 246, + 1 + ], + [ + 278, + 1 + ], + [ + 310, + 1 + ], + [ + 342, + 1 + ], + [ + 374, + 1 + ], + [ + 406, + 1 + ], + [ + 438, + 1 + ], + [ + 470, + 1 + ], + [ + 502, + 1 + ], + [ + 534, + 1 + ], + [ + 566, + 1 + ], + [ + 598, + 1 + ], + [ + 630, + 1 + ], + [ + 662, + 1 + ], + [ + 694, + 1 + ], + [ + 726, + 1 + ], + [ + 758, + 1 + ], + [ + 790, + 1 + ], + [ + 822, + 1 + ], + [ + 854, + 1 + ], + [ + 886, + 1 + ], + [ + 918, + 1 + ], + [ + 950, + 1 + ], + [ + 982, + 1 + ], + [ + 1014, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 54, + -1 + ], + [ + 86, + -1 + ], + [ + 118, + -1 + ], + [ + 150, + -1 + ], + [ + 182, + -1 + ], + [ + 214, + -1 + ], + [ + 246, + -1 + ], + [ + 278, + -1 + ], + [ + 310, + -1 + ], + [ + 342, + -1 + ], + [ + 374, + -1 + ], + [ + 406, + -1 + ], + [ + 438, + -1 + ], + [ + 470, + -1 + ], + [ + 502, + -1 + ], + [ + 534, + -1 + ], + [ + 566, + -1 + ], + [ + 598, + -1 + ], + [ + 630, + -1 + ], + [ + 662, + -1 + ], + [ + 694, + -1 + ], + [ + 726, + -1 + ], + [ + 758, + -1 + ], + [ + 790, + -1 + ], + [ + 822, + -1 + ], + [ + 854, + -1 + ], + [ + 886, + -1 + ], + [ + 918, + -1 + ], + [ + 950, + -1 + ], + [ + 982, + -1 + ], + [ + 1014, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 55, + 1 + ], + [ + 87, + 1 + ], + [ + 119, + 1 + ], + [ + 151, + 1 + ], + [ + 183, + 1 + ], + [ + 215, + 1 + ], + [ + 247, + 1 + ], + [ + 279, + 1 + ], + [ + 311, + 1 + ], + [ + 343, + 1 + ], + [ + 375, + 1 + ], + [ + 407, + 1 + ], + [ + 439, + 1 + ], + [ + 471, + 1 + ], + [ + 503, + 1 + ], + [ + 535, + 1 + ], + [ + 567, + 1 + ], + [ + 599, + 1 + ], + [ + 631, + 1 + ], + [ + 663, + 1 + ], + [ + 695, + 1 + ], + [ + 727, + 1 + ], + [ + 759, + 1 + ], + [ + 791, + 1 + ], + [ + 823, + 1 + ], + [ + 855, + 1 + ], + [ + 887, + 1 + ], + [ + 919, + 1 + ], + [ + 951, + 1 + ], + [ + 983, + 1 + ], + [ + 1015, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 55, + -1 + ], + [ + 87, + -1 + ], + [ + 119, + -1 + ], + [ + 151, + -1 + ], + [ + 183, + -1 + ], + [ + 215, + -1 + ], + [ + 247, + -1 + ], + [ + 279, + -1 + ], + [ + 311, + -1 + ], + [ + 343, + -1 + ], + [ + 375, + -1 + ], + [ + 407, + -1 + ], + [ + 439, + -1 + ], + [ + 471, + -1 + ], + [ + 503, + -1 + ], + [ + 535, + -1 + ], + [ + 567, + -1 + ], + [ + 599, + -1 + ], + [ + 631, + -1 + ], + [ + 663, + -1 + ], + [ + 695, + -1 + ], + [ + 727, + -1 + ], + [ + 759, + -1 + ], + [ + 791, + -1 + ], + [ + 823, + -1 + ], + [ + 855, + -1 + ], + [ + 887, + -1 + ], + [ + 919, + -1 + ], + [ + 951, + -1 + ], + [ + 983, + -1 + ], + [ + 1015, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 56, + 1 + ], + [ + 88, + 1 + ], + [ + 120, + 1 + ], + [ + 152, + 1 + ], + [ + 184, + 1 + ], + [ + 216, + 1 + ], + [ + 248, + 1 + ], + [ + 280, + 1 + ], + [ + 312, + 1 + ], + [ + 344, + 1 + ], + [ + 376, + 1 + ], + [ + 408, + 1 + ], + [ + 440, + 1 + ], + [ + 472, + 1 + ], + [ + 504, + 1 + ], + [ + 536, + 1 + ], + [ + 568, + 1 + ], + [ + 600, + 1 + ], + [ + 632, + 1 + ], + [ + 664, + 1 + ], + [ + 696, + 1 + ], + [ + 728, + 1 + ], + [ + 760, + 1 + ], + [ + 792, + 1 + ], + [ + 824, + 1 + ], + [ + 856, + 1 + ], + [ + 888, + 1 + ], + [ + 920, + 1 + ], + [ + 952, + 1 + ], + [ + 984, + 1 + ], + [ + 1016, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 56, + -1 + ], + [ + 88, + -1 + ], + [ + 120, + -1 + ], + [ + 152, + -1 + ], + [ + 184, + -1 + ], + [ + 216, + -1 + ], + [ + 248, + -1 + ], + [ + 280, + -1 + ], + [ + 312, + -1 + ], + [ + 344, + -1 + ], + [ + 376, + -1 + ], + [ + 408, + -1 + ], + [ + 440, + -1 + ], + [ + 472, + -1 + ], + [ + 504, + -1 + ], + [ + 536, + -1 + ], + [ + 568, + -1 + ], + [ + 600, + -1 + ], + [ + 632, + -1 + ], + [ + 664, + -1 + ], + [ + 696, + -1 + ], + [ + 728, + -1 + ], + [ + 760, + -1 + ], + [ + 792, + -1 + ], + [ + 824, + -1 + ], + [ + 856, + -1 + ], + [ + 888, + -1 + ], + [ + 920, + -1 + ], + [ + 952, + -1 + ], + [ + 984, + -1 + ], + [ + 1016, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 25, + 1 + ], + [ + 57, + 1 + ], + [ + 89, + 1 + ], + [ + 121, + 1 + ], + [ + 153, + 1 + ], + [ + 185, + 1 + ], + [ + 217, + 1 + ], + [ + 249, + 1 + ], + [ + 281, + 1 + ], + [ + 313, + 1 + ], + [ + 345, + 1 + ], + [ + 377, + 1 + ], + [ + 409, + 1 + ], + [ + 441, + 1 + ], + [ + 473, + 1 + ], + [ + 505, + 1 + ], + [ + 537, + 1 + ], + [ + 569, + 1 + ], + [ + 601, + 1 + ], + [ + 633, + 1 + ], + [ + 665, + 1 + ], + [ + 697, + 1 + ], + [ + 729, + 1 + ], + [ + 761, + 1 + ], + [ + 793, + 1 + ], + [ + 825, + 1 + ], + [ + 857, + 1 + ], + [ + 889, + 1 + ], + [ + 921, + 1 + ], + [ + 953, + 1 + ], + [ + 985, + 1 + ], + [ + 1017, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 25, + -1 + ], + [ + 57, + -1 + ], + [ + 89, + -1 + ], + [ + 121, + -1 + ], + [ + 153, + -1 + ], + [ + 185, + -1 + ], + [ + 217, + -1 + ], + [ + 249, + -1 + ], + [ + 281, + -1 + ], + [ + 313, + -1 + ], + [ + 345, + -1 + ], + [ + 377, + -1 + ], + [ + 409, + -1 + ], + [ + 441, + -1 + ], + [ + 473, + -1 + ], + [ + 505, + -1 + ], + [ + 537, + -1 + ], + [ + 569, + -1 + ], + [ + 601, + -1 + ], + [ + 633, + -1 + ], + [ + 665, + -1 + ], + [ + 697, + -1 + ], + [ + 729, + -1 + ], + [ + 761, + -1 + ], + [ + 793, + -1 + ], + [ + 825, + -1 + ], + [ + 857, + -1 + ], + [ + 889, + -1 + ], + [ + 921, + -1 + ], + [ + 953, + -1 + ], + [ + 985, + -1 + ], + [ + 1017, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 26, + 1 + ], + [ + 58, + 1 + ], + [ + 90, + 1 + ], + [ + 122, + 1 + ], + [ + 154, + 1 + ], + [ + 186, + 1 + ], + [ + 218, + 1 + ], + [ + 250, + 1 + ], + [ + 282, + 1 + ], + [ + 314, + 1 + ], + [ + 346, + 1 + ], + [ + 378, + 1 + ], + [ + 410, + 1 + ], + [ + 442, + 1 + ], + [ + 474, + 1 + ], + [ + 506, + 1 + ], + [ + 538, + 1 + ], + [ + 570, + 1 + ], + [ + 602, + 1 + ], + [ + 634, + 1 + ], + [ + 666, + 1 + ], + [ + 698, + 1 + ], + [ + 730, + 1 + ], + [ + 762, + 1 + ], + [ + 794, + 1 + ], + [ + 826, + 1 + ], + [ + 858, + 1 + ], + [ + 890, + 1 + ], + [ + 922, + 1 + ], + [ + 954, + 1 + ], + [ + 986, + 1 + ], + [ + 1018, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 26, + -1 + ], + [ + 58, + -1 + ], + [ + 90, + -1 + ], + [ + 122, + -1 + ], + [ + 154, + -1 + ], + [ + 186, + -1 + ], + [ + 218, + -1 + ], + [ + 250, + -1 + ], + [ + 282, + -1 + ], + [ + 314, + -1 + ], + [ + 346, + -1 + ], + [ + 378, + -1 + ], + [ + 410, + -1 + ], + [ + 442, + -1 + ], + [ + 474, + -1 + ], + [ + 506, + -1 + ], + [ + 538, + -1 + ], + [ + 570, + -1 + ], + [ + 602, + -1 + ], + [ + 634, + -1 + ], + [ + 666, + -1 + ], + [ + 698, + -1 + ], + [ + 730, + -1 + ], + [ + 762, + -1 + ], + [ + 794, + -1 + ], + [ + 826, + -1 + ], + [ + 858, + -1 + ], + [ + 890, + -1 + ], + [ + 922, + -1 + ], + [ + 954, + -1 + ], + [ + 986, + -1 + ], + [ + 1018, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 59, + 1 + ], + [ + 91, + 1 + ], + [ + 123, + 1 + ], + [ + 155, + 1 + ], + [ + 187, + 1 + ], + [ + 219, + 1 + ], + [ + 251, + 1 + ], + [ + 283, + 1 + ], + [ + 315, + 1 + ], + [ + 347, + 1 + ], + [ + 379, + 1 + ], + [ + 411, + 1 + ], + [ + 443, + 1 + ], + [ + 475, + 1 + ], + [ + 507, + 1 + ], + [ + 539, + 1 + ], + [ + 571, + 1 + ], + [ + 603, + 1 + ], + [ + 635, + 1 + ], + [ + 667, + 1 + ], + [ + 699, + 1 + ], + [ + 731, + 1 + ], + [ + 763, + 1 + ], + [ + 795, + 1 + ], + [ + 827, + 1 + ], + [ + 859, + 1 + ], + [ + 891, + 1 + ], + [ + 923, + 1 + ], + [ + 955, + 1 + ], + [ + 987, + 1 + ], + [ + 1019, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 59, + -1 + ], + [ + 91, + -1 + ], + [ + 123, + -1 + ], + [ + 155, + -1 + ], + [ + 187, + -1 + ], + [ + 219, + -1 + ], + [ + 251, + -1 + ], + [ + 283, + -1 + ], + [ + 315, + -1 + ], + [ + 347, + -1 + ], + [ + 379, + -1 + ], + [ + 411, + -1 + ], + [ + 443, + -1 + ], + [ + 475, + -1 + ], + [ + 507, + -1 + ], + [ + 539, + -1 + ], + [ + 571, + -1 + ], + [ + 603, + -1 + ], + [ + 635, + -1 + ], + [ + 667, + -1 + ], + [ + 699, + -1 + ], + [ + 731, + -1 + ], + [ + 763, + -1 + ], + [ + 795, + -1 + ], + [ + 827, + -1 + ], + [ + 859, + -1 + ], + [ + 891, + -1 + ], + [ + 923, + -1 + ], + [ + 955, + -1 + ], + [ + 987, + -1 + ], + [ + 1019, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 28, + 1 + ], + [ + 60, + 1 + ], + [ + 92, + 1 + ], + [ + 124, + 1 + ], + [ + 156, + 1 + ], + [ + 188, + 1 + ], + [ + 220, + 1 + ], + [ + 252, + 1 + ], + [ + 284, + 1 + ], + [ + 316, + 1 + ], + [ + 348, + 1 + ], + [ + 380, + 1 + ], + [ + 412, + 1 + ], + [ + 444, + 1 + ], + [ + 476, + 1 + ], + [ + 508, + 1 + ], + [ + 540, + 1 + ], + [ + 572, + 1 + ], + [ + 604, + 1 + ], + [ + 636, + 1 + ], + [ + 668, + 1 + ], + [ + 700, + 1 + ], + [ + 732, + 1 + ], + [ + 764, + 1 + ], + [ + 796, + 1 + ], + [ + 828, + 1 + ], + [ + 860, + 1 + ], + [ + 892, + 1 + ], + [ + 924, + 1 + ], + [ + 956, + 1 + ], + [ + 988, + 1 + ], + [ + 1020, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 28, + -1 + ], + [ + 60, + -1 + ], + [ + 92, + -1 + ], + [ + 124, + -1 + ], + [ + 156, + -1 + ], + [ + 188, + -1 + ], + [ + 220, + -1 + ], + [ + 252, + -1 + ], + [ + 284, + -1 + ], + [ + 316, + -1 + ], + [ + 348, + -1 + ], + [ + 380, + -1 + ], + [ + 412, + -1 + ], + [ + 444, + -1 + ], + [ + 476, + -1 + ], + [ + 508, + -1 + ], + [ + 540, + -1 + ], + [ + 572, + -1 + ], + [ + 604, + -1 + ], + [ + 636, + -1 + ], + [ + 668, + -1 + ], + [ + 700, + -1 + ], + [ + 732, + -1 + ], + [ + 764, + -1 + ], + [ + 796, + -1 + ], + [ + 828, + -1 + ], + [ + 860, + -1 + ], + [ + 892, + -1 + ], + [ + 924, + -1 + ], + [ + 956, + -1 + ], + [ + 988, + -1 + ], + [ + 1020, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 29, + 1 + ], + [ + 61, + 1 + ], + [ + 93, + 1 + ], + [ + 125, + 1 + ], + [ + 157, + 1 + ], + [ + 189, + 1 + ], + [ + 221, + 1 + ], + [ + 253, + 1 + ], + [ + 285, + 1 + ], + [ + 317, + 1 + ], + [ + 349, + 1 + ], + [ + 381, + 1 + ], + [ + 413, + 1 + ], + [ + 445, + 1 + ], + [ + 477, + 1 + ], + [ + 509, + 1 + ], + [ + 541, + 1 + ], + [ + 573, + 1 + ], + [ + 605, + 1 + ], + [ + 637, + 1 + ], + [ + 669, + 1 + ], + [ + 701, + 1 + ], + [ + 733, + 1 + ], + [ + 765, + 1 + ], + [ + 797, + 1 + ], + [ + 829, + 1 + ], + [ + 861, + 1 + ], + [ + 893, + 1 + ], + [ + 925, + 1 + ], + [ + 957, + 1 + ], + [ + 989, + 1 + ], + [ + 1021, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 29, + -1 + ], + [ + 61, + -1 + ], + [ + 93, + -1 + ], + [ + 125, + -1 + ], + [ + 157, + -1 + ], + [ + 189, + -1 + ], + [ + 221, + -1 + ], + [ + 253, + -1 + ], + [ + 285, + -1 + ], + [ + 317, + -1 + ], + [ + 349, + -1 + ], + [ + 381, + -1 + ], + [ + 413, + -1 + ], + [ + 445, + -1 + ], + [ + 477, + -1 + ], + [ + 509, + -1 + ], + [ + 541, + -1 + ], + [ + 573, + -1 + ], + [ + 605, + -1 + ], + [ + 637, + -1 + ], + [ + 669, + -1 + ], + [ + 701, + -1 + ], + [ + 733, + -1 + ], + [ + 765, + -1 + ], + [ + 797, + -1 + ], + [ + 829, + -1 + ], + [ + 861, + -1 + ], + [ + 893, + -1 + ], + [ + 925, + -1 + ], + [ + 957, + -1 + ], + [ + 989, + -1 + ], + [ + 1021, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 30, + 1 + ], + [ + 62, + 1 + ], + [ + 94, + 1 + ], + [ + 126, + 1 + ], + [ + 158, + 1 + ], + [ + 190, + 1 + ], + [ + 222, + 1 + ], + [ + 254, + 1 + ], + [ + 286, + 1 + ], + [ + 318, + 1 + ], + [ + 350, + 1 + ], + [ + 382, + 1 + ], + [ + 414, + 1 + ], + [ + 446, + 1 + ], + [ + 478, + 1 + ], + [ + 510, + 1 + ], + [ + 542, + 1 + ], + [ + 574, + 1 + ], + [ + 606, + 1 + ], + [ + 638, + 1 + ], + [ + 670, + 1 + ], + [ + 702, + 1 + ], + [ + 734, + 1 + ], + [ + 766, + 1 + ], + [ + 798, + 1 + ], + [ + 830, + 1 + ], + [ + 862, + 1 + ], + [ + 894, + 1 + ], + [ + 926, + 1 + ], + [ + 958, + 1 + ], + [ + 990, + 1 + ], + [ + 1022, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 30, + -1 + ], + [ + 62, + -1 + ], + [ + 94, + -1 + ], + [ + 126, + -1 + ], + [ + 158, + -1 + ], + [ + 190, + -1 + ], + [ + 222, + -1 + ], + [ + 254, + -1 + ], + [ + 286, + -1 + ], + [ + 318, + -1 + ], + [ + 350, + -1 + ], + [ + 382, + -1 + ], + [ + 414, + -1 + ], + [ + 446, + -1 + ], + [ + 478, + -1 + ], + [ + 510, + -1 + ], + [ + 542, + -1 + ], + [ + 574, + -1 + ], + [ + 606, + -1 + ], + [ + 638, + -1 + ], + [ + 670, + -1 + ], + [ + 702, + -1 + ], + [ + 734, + -1 + ], + [ + 766, + -1 + ], + [ + 798, + -1 + ], + [ + 830, + -1 + ], + [ + 862, + -1 + ], + [ + 894, + -1 + ], + [ + 926, + -1 + ], + [ + 958, + -1 + ], + [ + 990, + -1 + ], + [ + 1022, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 31, + 1 + ], + [ + 63, + 1 + ], + [ + 95, + 1 + ], + [ + 127, + 1 + ], + [ + 159, + 1 + ], + [ + 191, + 1 + ], + [ + 223, + 1 + ], + [ + 255, + 1 + ], + [ + 287, + 1 + ], + [ + 319, + 1 + ], + [ + 351, + 1 + ], + [ + 383, + 1 + ], + [ + 415, + 1 + ], + [ + 447, + 1 + ], + [ + 479, + 1 + ], + [ + 511, + 1 + ], + [ + 543, + 1 + ], + [ + 575, + 1 + ], + [ + 607, + 1 + ], + [ + 639, + 1 + ], + [ + 671, + 1 + ], + [ + 703, + 1 + ], + [ + 735, + 1 + ], + [ + 767, + 1 + ], + [ + 799, + 1 + ], + [ + 831, + 1 + ], + [ + 863, + 1 + ], + [ + 895, + 1 + ], + [ + 927, + 1 + ], + [ + 959, + 1 + ], + [ + 991, + 1 + ], + [ + 1023, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 31, + -1 + ], + [ + 63, + -1 + ], + [ + 95, + -1 + ], + [ + 127, + -1 + ], + [ + 159, + -1 + ], + [ + 191, + -1 + ], + [ + 223, + -1 + ], + [ + 255, + -1 + ], + [ + 287, + -1 + ], + [ + 319, + -1 + ], + [ + 351, + -1 + ], + [ + 383, + -1 + ], + [ + 415, + -1 + ], + [ + 447, + -1 + ], + [ + 479, + -1 + ], + [ + 511, + -1 + ], + [ + 543, + -1 + ], + [ + 575, + -1 + ], + [ + 607, + -1 + ], + [ + 639, + -1 + ], + [ + 671, + -1 + ], + [ + 703, + -1 + ], + [ + 735, + -1 + ], + [ + 767, + -1 + ], + [ + 799, + -1 + ], + [ + 831, + -1 + ], + [ + 863, + -1 + ], + [ + 895, + -1 + ], + [ + 927, + -1 + ], + [ + 959, + -1 + ], + [ + 991, + -1 + ], + [ + 1023, + -1 + ] + ] + } + ], + "parameters": { + "size": 32, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60, + 56 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21, + 66 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17, + 91 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14, + 23 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4, + 68 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57, + 51 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 68 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48, + 14 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52, + 10 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47, + 21 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97, + 13 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81, + 68 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96, + 65 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21, + 15 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57, + 94 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7, + 46 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30, + 58 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1, + 47 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11, + 24 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29, + 41 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34, + 56 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96, + 32 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98, + 47 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67, + 46 + ], + [ + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42, + 83 + ], + [ + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29, + 28 + ], + [ + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13, + 94 + ], + [ + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80, + 17 + ], + [ + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31, + 95 + ], + [ + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15, + 5 + ], + [ + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97, + 45 + ], + [ + 91, + 69, + 52, + 33, + 88, + 59, + 75, + 9, + 8, + 62, + 52, + 88, + 41, + 10, + 20, + 94, + 23, + 10, + 17, + 70, + 41, + 62, + 93, + 11, + 53, + 62, + 52, + 51, + 60, + 67, + 94, + 26 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 1024, + "variables": 1024, + "rows": 128, + "nonzeros": 4096, + "globals": 0 + }, + "input_variables": 1024, + "model_variables": 1024, + "modelled_variables": 1024, + "size_unit": "tasks" + }, + "json_sha256": "68b2d2dd93beac22b677d2271621900e9fa30ca759153b85c427d477125b77dc", + "txt_sha256": "ee623300ceb101a5124fbf804aa908e51145675c428e25791f7fcfa443b7dad0" + }, + { + "id": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "model": { + "id": "assignment_single_24", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 576, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ], + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ], + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ], + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ], + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ], + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ], + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 24, + 1 + ], + [ + 48, + 1 + ], + [ + 72, + 1 + ], + [ + 96, + 1 + ], + [ + 120, + 1 + ], + [ + 144, + 1 + ], + [ + 168, + 1 + ], + [ + 192, + 1 + ], + [ + 216, + 1 + ], + [ + 240, + 1 + ], + [ + 264, + 1 + ], + [ + 288, + 1 + ], + [ + 312, + 1 + ], + [ + 336, + 1 + ], + [ + 360, + 1 + ], + [ + 384, + 1 + ], + [ + 408, + 1 + ], + [ + 432, + 1 + ], + [ + 456, + 1 + ], + [ + 480, + 1 + ], + [ + 504, + 1 + ], + [ + 528, + 1 + ], + [ + 552, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 24, + -1 + ], + [ + 48, + -1 + ], + [ + 72, + -1 + ], + [ + 96, + -1 + ], + [ + 120, + -1 + ], + [ + 144, + -1 + ], + [ + 168, + -1 + ], + [ + 192, + -1 + ], + [ + 216, + -1 + ], + [ + 240, + -1 + ], + [ + 264, + -1 + ], + [ + 288, + -1 + ], + [ + 312, + -1 + ], + [ + 336, + -1 + ], + [ + 360, + -1 + ], + [ + 384, + -1 + ], + [ + 408, + -1 + ], + [ + 432, + -1 + ], + [ + 456, + -1 + ], + [ + 480, + -1 + ], + [ + 504, + -1 + ], + [ + 528, + -1 + ], + [ + 552, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 25, + 1 + ], + [ + 49, + 1 + ], + [ + 73, + 1 + ], + [ + 97, + 1 + ], + [ + 121, + 1 + ], + [ + 145, + 1 + ], + [ + 169, + 1 + ], + [ + 193, + 1 + ], + [ + 217, + 1 + ], + [ + 241, + 1 + ], + [ + 265, + 1 + ], + [ + 289, + 1 + ], + [ + 313, + 1 + ], + [ + 337, + 1 + ], + [ + 361, + 1 + ], + [ + 385, + 1 + ], + [ + 409, + 1 + ], + [ + 433, + 1 + ], + [ + 457, + 1 + ], + [ + 481, + 1 + ], + [ + 505, + 1 + ], + [ + 529, + 1 + ], + [ + 553, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 25, + -1 + ], + [ + 49, + -1 + ], + [ + 73, + -1 + ], + [ + 97, + -1 + ], + [ + 121, + -1 + ], + [ + 145, + -1 + ], + [ + 169, + -1 + ], + [ + 193, + -1 + ], + [ + 217, + -1 + ], + [ + 241, + -1 + ], + [ + 265, + -1 + ], + [ + 289, + -1 + ], + [ + 313, + -1 + ], + [ + 337, + -1 + ], + [ + 361, + -1 + ], + [ + 385, + -1 + ], + [ + 409, + -1 + ], + [ + 433, + -1 + ], + [ + 457, + -1 + ], + [ + 481, + -1 + ], + [ + 505, + -1 + ], + [ + 529, + -1 + ], + [ + 553, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 26, + 1 + ], + [ + 50, + 1 + ], + [ + 74, + 1 + ], + [ + 98, + 1 + ], + [ + 122, + 1 + ], + [ + 146, + 1 + ], + [ + 170, + 1 + ], + [ + 194, + 1 + ], + [ + 218, + 1 + ], + [ + 242, + 1 + ], + [ + 266, + 1 + ], + [ + 290, + 1 + ], + [ + 314, + 1 + ], + [ + 338, + 1 + ], + [ + 362, + 1 + ], + [ + 386, + 1 + ], + [ + 410, + 1 + ], + [ + 434, + 1 + ], + [ + 458, + 1 + ], + [ + 482, + 1 + ], + [ + 506, + 1 + ], + [ + 530, + 1 + ], + [ + 554, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 26, + -1 + ], + [ + 50, + -1 + ], + [ + 74, + -1 + ], + [ + 98, + -1 + ], + [ + 122, + -1 + ], + [ + 146, + -1 + ], + [ + 170, + -1 + ], + [ + 194, + -1 + ], + [ + 218, + -1 + ], + [ + 242, + -1 + ], + [ + 266, + -1 + ], + [ + 290, + -1 + ], + [ + 314, + -1 + ], + [ + 338, + -1 + ], + [ + 362, + -1 + ], + [ + 386, + -1 + ], + [ + 410, + -1 + ], + [ + 434, + -1 + ], + [ + 458, + -1 + ], + [ + 482, + -1 + ], + [ + 506, + -1 + ], + [ + 530, + -1 + ], + [ + 554, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 27, + 1 + ], + [ + 51, + 1 + ], + [ + 75, + 1 + ], + [ + 99, + 1 + ], + [ + 123, + 1 + ], + [ + 147, + 1 + ], + [ + 171, + 1 + ], + [ + 195, + 1 + ], + [ + 219, + 1 + ], + [ + 243, + 1 + ], + [ + 267, + 1 + ], + [ + 291, + 1 + ], + [ + 315, + 1 + ], + [ + 339, + 1 + ], + [ + 363, + 1 + ], + [ + 387, + 1 + ], + [ + 411, + 1 + ], + [ + 435, + 1 + ], + [ + 459, + 1 + ], + [ + 483, + 1 + ], + [ + 507, + 1 + ], + [ + 531, + 1 + ], + [ + 555, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 27, + -1 + ], + [ + 51, + -1 + ], + [ + 75, + -1 + ], + [ + 99, + -1 + ], + [ + 123, + -1 + ], + [ + 147, + -1 + ], + [ + 171, + -1 + ], + [ + 195, + -1 + ], + [ + 219, + -1 + ], + [ + 243, + -1 + ], + [ + 267, + -1 + ], + [ + 291, + -1 + ], + [ + 315, + -1 + ], + [ + 339, + -1 + ], + [ + 363, + -1 + ], + [ + 387, + -1 + ], + [ + 411, + -1 + ], + [ + 435, + -1 + ], + [ + 459, + -1 + ], + [ + 483, + -1 + ], + [ + 507, + -1 + ], + [ + 531, + -1 + ], + [ + 555, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 28, + 1 + ], + [ + 52, + 1 + ], + [ + 76, + 1 + ], + [ + 100, + 1 + ], + [ + 124, + 1 + ], + [ + 148, + 1 + ], + [ + 172, + 1 + ], + [ + 196, + 1 + ], + [ + 220, + 1 + ], + [ + 244, + 1 + ], + [ + 268, + 1 + ], + [ + 292, + 1 + ], + [ + 316, + 1 + ], + [ + 340, + 1 + ], + [ + 364, + 1 + ], + [ + 388, + 1 + ], + [ + 412, + 1 + ], + [ + 436, + 1 + ], + [ + 460, + 1 + ], + [ + 484, + 1 + ], + [ + 508, + 1 + ], + [ + 532, + 1 + ], + [ + 556, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 28, + -1 + ], + [ + 52, + -1 + ], + [ + 76, + -1 + ], + [ + 100, + -1 + ], + [ + 124, + -1 + ], + [ + 148, + -1 + ], + [ + 172, + -1 + ], + [ + 196, + -1 + ], + [ + 220, + -1 + ], + [ + 244, + -1 + ], + [ + 268, + -1 + ], + [ + 292, + -1 + ], + [ + 316, + -1 + ], + [ + 340, + -1 + ], + [ + 364, + -1 + ], + [ + 388, + -1 + ], + [ + 412, + -1 + ], + [ + 436, + -1 + ], + [ + 460, + -1 + ], + [ + 484, + -1 + ], + [ + 508, + -1 + ], + [ + 532, + -1 + ], + [ + 556, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 29, + 1 + ], + [ + 53, + 1 + ], + [ + 77, + 1 + ], + [ + 101, + 1 + ], + [ + 125, + 1 + ], + [ + 149, + 1 + ], + [ + 173, + 1 + ], + [ + 197, + 1 + ], + [ + 221, + 1 + ], + [ + 245, + 1 + ], + [ + 269, + 1 + ], + [ + 293, + 1 + ], + [ + 317, + 1 + ], + [ + 341, + 1 + ], + [ + 365, + 1 + ], + [ + 389, + 1 + ], + [ + 413, + 1 + ], + [ + 437, + 1 + ], + [ + 461, + 1 + ], + [ + 485, + 1 + ], + [ + 509, + 1 + ], + [ + 533, + 1 + ], + [ + 557, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 29, + -1 + ], + [ + 53, + -1 + ], + [ + 77, + -1 + ], + [ + 101, + -1 + ], + [ + 125, + -1 + ], + [ + 149, + -1 + ], + [ + 173, + -1 + ], + [ + 197, + -1 + ], + [ + 221, + -1 + ], + [ + 245, + -1 + ], + [ + 269, + -1 + ], + [ + 293, + -1 + ], + [ + 317, + -1 + ], + [ + 341, + -1 + ], + [ + 365, + -1 + ], + [ + 389, + -1 + ], + [ + 413, + -1 + ], + [ + 437, + -1 + ], + [ + 461, + -1 + ], + [ + 485, + -1 + ], + [ + 509, + -1 + ], + [ + 533, + -1 + ], + [ + 557, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 30, + 1 + ], + [ + 54, + 1 + ], + [ + 78, + 1 + ], + [ + 102, + 1 + ], + [ + 126, + 1 + ], + [ + 150, + 1 + ], + [ + 174, + 1 + ], + [ + 198, + 1 + ], + [ + 222, + 1 + ], + [ + 246, + 1 + ], + [ + 270, + 1 + ], + [ + 294, + 1 + ], + [ + 318, + 1 + ], + [ + 342, + 1 + ], + [ + 366, + 1 + ], + [ + 390, + 1 + ], + [ + 414, + 1 + ], + [ + 438, + 1 + ], + [ + 462, + 1 + ], + [ + 486, + 1 + ], + [ + 510, + 1 + ], + [ + 534, + 1 + ], + [ + 558, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 30, + -1 + ], + [ + 54, + -1 + ], + [ + 78, + -1 + ], + [ + 102, + -1 + ], + [ + 126, + -1 + ], + [ + 150, + -1 + ], + [ + 174, + -1 + ], + [ + 198, + -1 + ], + [ + 222, + -1 + ], + [ + 246, + -1 + ], + [ + 270, + -1 + ], + [ + 294, + -1 + ], + [ + 318, + -1 + ], + [ + 342, + -1 + ], + [ + 366, + -1 + ], + [ + 390, + -1 + ], + [ + 414, + -1 + ], + [ + 438, + -1 + ], + [ + 462, + -1 + ], + [ + 486, + -1 + ], + [ + 510, + -1 + ], + [ + 534, + -1 + ], + [ + 558, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 31, + 1 + ], + [ + 55, + 1 + ], + [ + 79, + 1 + ], + [ + 103, + 1 + ], + [ + 127, + 1 + ], + [ + 151, + 1 + ], + [ + 175, + 1 + ], + [ + 199, + 1 + ], + [ + 223, + 1 + ], + [ + 247, + 1 + ], + [ + 271, + 1 + ], + [ + 295, + 1 + ], + [ + 319, + 1 + ], + [ + 343, + 1 + ], + [ + 367, + 1 + ], + [ + 391, + 1 + ], + [ + 415, + 1 + ], + [ + 439, + 1 + ], + [ + 463, + 1 + ], + [ + 487, + 1 + ], + [ + 511, + 1 + ], + [ + 535, + 1 + ], + [ + 559, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 31, + -1 + ], + [ + 55, + -1 + ], + [ + 79, + -1 + ], + [ + 103, + -1 + ], + [ + 127, + -1 + ], + [ + 151, + -1 + ], + [ + 175, + -1 + ], + [ + 199, + -1 + ], + [ + 223, + -1 + ], + [ + 247, + -1 + ], + [ + 271, + -1 + ], + [ + 295, + -1 + ], + [ + 319, + -1 + ], + [ + 343, + -1 + ], + [ + 367, + -1 + ], + [ + 391, + -1 + ], + [ + 415, + -1 + ], + [ + 439, + -1 + ], + [ + 463, + -1 + ], + [ + 487, + -1 + ], + [ + 511, + -1 + ], + [ + 535, + -1 + ], + [ + 559, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 32, + 1 + ], + [ + 56, + 1 + ], + [ + 80, + 1 + ], + [ + 104, + 1 + ], + [ + 128, + 1 + ], + [ + 152, + 1 + ], + [ + 176, + 1 + ], + [ + 200, + 1 + ], + [ + 224, + 1 + ], + [ + 248, + 1 + ], + [ + 272, + 1 + ], + [ + 296, + 1 + ], + [ + 320, + 1 + ], + [ + 344, + 1 + ], + [ + 368, + 1 + ], + [ + 392, + 1 + ], + [ + 416, + 1 + ], + [ + 440, + 1 + ], + [ + 464, + 1 + ], + [ + 488, + 1 + ], + [ + 512, + 1 + ], + [ + 536, + 1 + ], + [ + 560, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 32, + -1 + ], + [ + 56, + -1 + ], + [ + 80, + -1 + ], + [ + 104, + -1 + ], + [ + 128, + -1 + ], + [ + 152, + -1 + ], + [ + 176, + -1 + ], + [ + 200, + -1 + ], + [ + 224, + -1 + ], + [ + 248, + -1 + ], + [ + 272, + -1 + ], + [ + 296, + -1 + ], + [ + 320, + -1 + ], + [ + 344, + -1 + ], + [ + 368, + -1 + ], + [ + 392, + -1 + ], + [ + 416, + -1 + ], + [ + 440, + -1 + ], + [ + 464, + -1 + ], + [ + 488, + -1 + ], + [ + 512, + -1 + ], + [ + 536, + -1 + ], + [ + 560, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 33, + 1 + ], + [ + 57, + 1 + ], + [ + 81, + 1 + ], + [ + 105, + 1 + ], + [ + 129, + 1 + ], + [ + 153, + 1 + ], + [ + 177, + 1 + ], + [ + 201, + 1 + ], + [ + 225, + 1 + ], + [ + 249, + 1 + ], + [ + 273, + 1 + ], + [ + 297, + 1 + ], + [ + 321, + 1 + ], + [ + 345, + 1 + ], + [ + 369, + 1 + ], + [ + 393, + 1 + ], + [ + 417, + 1 + ], + [ + 441, + 1 + ], + [ + 465, + 1 + ], + [ + 489, + 1 + ], + [ + 513, + 1 + ], + [ + 537, + 1 + ], + [ + 561, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 33, + -1 + ], + [ + 57, + -1 + ], + [ + 81, + -1 + ], + [ + 105, + -1 + ], + [ + 129, + -1 + ], + [ + 153, + -1 + ], + [ + 177, + -1 + ], + [ + 201, + -1 + ], + [ + 225, + -1 + ], + [ + 249, + -1 + ], + [ + 273, + -1 + ], + [ + 297, + -1 + ], + [ + 321, + -1 + ], + [ + 345, + -1 + ], + [ + 369, + -1 + ], + [ + 393, + -1 + ], + [ + 417, + -1 + ], + [ + 441, + -1 + ], + [ + 465, + -1 + ], + [ + 489, + -1 + ], + [ + 513, + -1 + ], + [ + 537, + -1 + ], + [ + 561, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 34, + 1 + ], + [ + 58, + 1 + ], + [ + 82, + 1 + ], + [ + 106, + 1 + ], + [ + 130, + 1 + ], + [ + 154, + 1 + ], + [ + 178, + 1 + ], + [ + 202, + 1 + ], + [ + 226, + 1 + ], + [ + 250, + 1 + ], + [ + 274, + 1 + ], + [ + 298, + 1 + ], + [ + 322, + 1 + ], + [ + 346, + 1 + ], + [ + 370, + 1 + ], + [ + 394, + 1 + ], + [ + 418, + 1 + ], + [ + 442, + 1 + ], + [ + 466, + 1 + ], + [ + 490, + 1 + ], + [ + 514, + 1 + ], + [ + 538, + 1 + ], + [ + 562, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 34, + -1 + ], + [ + 58, + -1 + ], + [ + 82, + -1 + ], + [ + 106, + -1 + ], + [ + 130, + -1 + ], + [ + 154, + -1 + ], + [ + 178, + -1 + ], + [ + 202, + -1 + ], + [ + 226, + -1 + ], + [ + 250, + -1 + ], + [ + 274, + -1 + ], + [ + 298, + -1 + ], + [ + 322, + -1 + ], + [ + 346, + -1 + ], + [ + 370, + -1 + ], + [ + 394, + -1 + ], + [ + 418, + -1 + ], + [ + 442, + -1 + ], + [ + 466, + -1 + ], + [ + 490, + -1 + ], + [ + 514, + -1 + ], + [ + 538, + -1 + ], + [ + 562, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 35, + 1 + ], + [ + 59, + 1 + ], + [ + 83, + 1 + ], + [ + 107, + 1 + ], + [ + 131, + 1 + ], + [ + 155, + 1 + ], + [ + 179, + 1 + ], + [ + 203, + 1 + ], + [ + 227, + 1 + ], + [ + 251, + 1 + ], + [ + 275, + 1 + ], + [ + 299, + 1 + ], + [ + 323, + 1 + ], + [ + 347, + 1 + ], + [ + 371, + 1 + ], + [ + 395, + 1 + ], + [ + 419, + 1 + ], + [ + 443, + 1 + ], + [ + 467, + 1 + ], + [ + 491, + 1 + ], + [ + 515, + 1 + ], + [ + 539, + 1 + ], + [ + 563, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 35, + -1 + ], + [ + 59, + -1 + ], + [ + 83, + -1 + ], + [ + 107, + -1 + ], + [ + 131, + -1 + ], + [ + 155, + -1 + ], + [ + 179, + -1 + ], + [ + 203, + -1 + ], + [ + 227, + -1 + ], + [ + 251, + -1 + ], + [ + 275, + -1 + ], + [ + 299, + -1 + ], + [ + 323, + -1 + ], + [ + 347, + -1 + ], + [ + 371, + -1 + ], + [ + 395, + -1 + ], + [ + 419, + -1 + ], + [ + 443, + -1 + ], + [ + 467, + -1 + ], + [ + 491, + -1 + ], + [ + 515, + -1 + ], + [ + 539, + -1 + ], + [ + 563, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 36, + 1 + ], + [ + 60, + 1 + ], + [ + 84, + 1 + ], + [ + 108, + 1 + ], + [ + 132, + 1 + ], + [ + 156, + 1 + ], + [ + 180, + 1 + ], + [ + 204, + 1 + ], + [ + 228, + 1 + ], + [ + 252, + 1 + ], + [ + 276, + 1 + ], + [ + 300, + 1 + ], + [ + 324, + 1 + ], + [ + 348, + 1 + ], + [ + 372, + 1 + ], + [ + 396, + 1 + ], + [ + 420, + 1 + ], + [ + 444, + 1 + ], + [ + 468, + 1 + ], + [ + 492, + 1 + ], + [ + 516, + 1 + ], + [ + 540, + 1 + ], + [ + 564, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 36, + -1 + ], + [ + 60, + -1 + ], + [ + 84, + -1 + ], + [ + 108, + -1 + ], + [ + 132, + -1 + ], + [ + 156, + -1 + ], + [ + 180, + -1 + ], + [ + 204, + -1 + ], + [ + 228, + -1 + ], + [ + 252, + -1 + ], + [ + 276, + -1 + ], + [ + 300, + -1 + ], + [ + 324, + -1 + ], + [ + 348, + -1 + ], + [ + 372, + -1 + ], + [ + 396, + -1 + ], + [ + 420, + -1 + ], + [ + 444, + -1 + ], + [ + 468, + -1 + ], + [ + 492, + -1 + ], + [ + 516, + -1 + ], + [ + 540, + -1 + ], + [ + 564, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 37, + 1 + ], + [ + 61, + 1 + ], + [ + 85, + 1 + ], + [ + 109, + 1 + ], + [ + 133, + 1 + ], + [ + 157, + 1 + ], + [ + 181, + 1 + ], + [ + 205, + 1 + ], + [ + 229, + 1 + ], + [ + 253, + 1 + ], + [ + 277, + 1 + ], + [ + 301, + 1 + ], + [ + 325, + 1 + ], + [ + 349, + 1 + ], + [ + 373, + 1 + ], + [ + 397, + 1 + ], + [ + 421, + 1 + ], + [ + 445, + 1 + ], + [ + 469, + 1 + ], + [ + 493, + 1 + ], + [ + 517, + 1 + ], + [ + 541, + 1 + ], + [ + 565, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 37, + -1 + ], + [ + 61, + -1 + ], + [ + 85, + -1 + ], + [ + 109, + -1 + ], + [ + 133, + -1 + ], + [ + 157, + -1 + ], + [ + 181, + -1 + ], + [ + 205, + -1 + ], + [ + 229, + -1 + ], + [ + 253, + -1 + ], + [ + 277, + -1 + ], + [ + 301, + -1 + ], + [ + 325, + -1 + ], + [ + 349, + -1 + ], + [ + 373, + -1 + ], + [ + 397, + -1 + ], + [ + 421, + -1 + ], + [ + 445, + -1 + ], + [ + 469, + -1 + ], + [ + 493, + -1 + ], + [ + 517, + -1 + ], + [ + 541, + -1 + ], + [ + 565, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 38, + 1 + ], + [ + 62, + 1 + ], + [ + 86, + 1 + ], + [ + 110, + 1 + ], + [ + 134, + 1 + ], + [ + 158, + 1 + ], + [ + 182, + 1 + ], + [ + 206, + 1 + ], + [ + 230, + 1 + ], + [ + 254, + 1 + ], + [ + 278, + 1 + ], + [ + 302, + 1 + ], + [ + 326, + 1 + ], + [ + 350, + 1 + ], + [ + 374, + 1 + ], + [ + 398, + 1 + ], + [ + 422, + 1 + ], + [ + 446, + 1 + ], + [ + 470, + 1 + ], + [ + 494, + 1 + ], + [ + 518, + 1 + ], + [ + 542, + 1 + ], + [ + 566, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 38, + -1 + ], + [ + 62, + -1 + ], + [ + 86, + -1 + ], + [ + 110, + -1 + ], + [ + 134, + -1 + ], + [ + 158, + -1 + ], + [ + 182, + -1 + ], + [ + 206, + -1 + ], + [ + 230, + -1 + ], + [ + 254, + -1 + ], + [ + 278, + -1 + ], + [ + 302, + -1 + ], + [ + 326, + -1 + ], + [ + 350, + -1 + ], + [ + 374, + -1 + ], + [ + 398, + -1 + ], + [ + 422, + -1 + ], + [ + 446, + -1 + ], + [ + 470, + -1 + ], + [ + 494, + -1 + ], + [ + 518, + -1 + ], + [ + 542, + -1 + ], + [ + 566, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 39, + 1 + ], + [ + 63, + 1 + ], + [ + 87, + 1 + ], + [ + 111, + 1 + ], + [ + 135, + 1 + ], + [ + 159, + 1 + ], + [ + 183, + 1 + ], + [ + 207, + 1 + ], + [ + 231, + 1 + ], + [ + 255, + 1 + ], + [ + 279, + 1 + ], + [ + 303, + 1 + ], + [ + 327, + 1 + ], + [ + 351, + 1 + ], + [ + 375, + 1 + ], + [ + 399, + 1 + ], + [ + 423, + 1 + ], + [ + 447, + 1 + ], + [ + 471, + 1 + ], + [ + 495, + 1 + ], + [ + 519, + 1 + ], + [ + 543, + 1 + ], + [ + 567, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 39, + -1 + ], + [ + 63, + -1 + ], + [ + 87, + -1 + ], + [ + 111, + -1 + ], + [ + 135, + -1 + ], + [ + 159, + -1 + ], + [ + 183, + -1 + ], + [ + 207, + -1 + ], + [ + 231, + -1 + ], + [ + 255, + -1 + ], + [ + 279, + -1 + ], + [ + 303, + -1 + ], + [ + 327, + -1 + ], + [ + 351, + -1 + ], + [ + 375, + -1 + ], + [ + 399, + -1 + ], + [ + 423, + -1 + ], + [ + 447, + -1 + ], + [ + 471, + -1 + ], + [ + 495, + -1 + ], + [ + 519, + -1 + ], + [ + 543, + -1 + ], + [ + 567, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 40, + 1 + ], + [ + 64, + 1 + ], + [ + 88, + 1 + ], + [ + 112, + 1 + ], + [ + 136, + 1 + ], + [ + 160, + 1 + ], + [ + 184, + 1 + ], + [ + 208, + 1 + ], + [ + 232, + 1 + ], + [ + 256, + 1 + ], + [ + 280, + 1 + ], + [ + 304, + 1 + ], + [ + 328, + 1 + ], + [ + 352, + 1 + ], + [ + 376, + 1 + ], + [ + 400, + 1 + ], + [ + 424, + 1 + ], + [ + 448, + 1 + ], + [ + 472, + 1 + ], + [ + 496, + 1 + ], + [ + 520, + 1 + ], + [ + 544, + 1 + ], + [ + 568, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 40, + -1 + ], + [ + 64, + -1 + ], + [ + 88, + -1 + ], + [ + 112, + -1 + ], + [ + 136, + -1 + ], + [ + 160, + -1 + ], + [ + 184, + -1 + ], + [ + 208, + -1 + ], + [ + 232, + -1 + ], + [ + 256, + -1 + ], + [ + 280, + -1 + ], + [ + 304, + -1 + ], + [ + 328, + -1 + ], + [ + 352, + -1 + ], + [ + 376, + -1 + ], + [ + 400, + -1 + ], + [ + 424, + -1 + ], + [ + 448, + -1 + ], + [ + 472, + -1 + ], + [ + 496, + -1 + ], + [ + 520, + -1 + ], + [ + 544, + -1 + ], + [ + 568, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 41, + 1 + ], + [ + 65, + 1 + ], + [ + 89, + 1 + ], + [ + 113, + 1 + ], + [ + 137, + 1 + ], + [ + 161, + 1 + ], + [ + 185, + 1 + ], + [ + 209, + 1 + ], + [ + 233, + 1 + ], + [ + 257, + 1 + ], + [ + 281, + 1 + ], + [ + 305, + 1 + ], + [ + 329, + 1 + ], + [ + 353, + 1 + ], + [ + 377, + 1 + ], + [ + 401, + 1 + ], + [ + 425, + 1 + ], + [ + 449, + 1 + ], + [ + 473, + 1 + ], + [ + 497, + 1 + ], + [ + 521, + 1 + ], + [ + 545, + 1 + ], + [ + 569, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 41, + -1 + ], + [ + 65, + -1 + ], + [ + 89, + -1 + ], + [ + 113, + -1 + ], + [ + 137, + -1 + ], + [ + 161, + -1 + ], + [ + 185, + -1 + ], + [ + 209, + -1 + ], + [ + 233, + -1 + ], + [ + 257, + -1 + ], + [ + 281, + -1 + ], + [ + 305, + -1 + ], + [ + 329, + -1 + ], + [ + 353, + -1 + ], + [ + 377, + -1 + ], + [ + 401, + -1 + ], + [ + 425, + -1 + ], + [ + 449, + -1 + ], + [ + 473, + -1 + ], + [ + 497, + -1 + ], + [ + 521, + -1 + ], + [ + 545, + -1 + ], + [ + 569, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 42, + 1 + ], + [ + 66, + 1 + ], + [ + 90, + 1 + ], + [ + 114, + 1 + ], + [ + 138, + 1 + ], + [ + 162, + 1 + ], + [ + 186, + 1 + ], + [ + 210, + 1 + ], + [ + 234, + 1 + ], + [ + 258, + 1 + ], + [ + 282, + 1 + ], + [ + 306, + 1 + ], + [ + 330, + 1 + ], + [ + 354, + 1 + ], + [ + 378, + 1 + ], + [ + 402, + 1 + ], + [ + 426, + 1 + ], + [ + 450, + 1 + ], + [ + 474, + 1 + ], + [ + 498, + 1 + ], + [ + 522, + 1 + ], + [ + 546, + 1 + ], + [ + 570, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 42, + -1 + ], + [ + 66, + -1 + ], + [ + 90, + -1 + ], + [ + 114, + -1 + ], + [ + 138, + -1 + ], + [ + 162, + -1 + ], + [ + 186, + -1 + ], + [ + 210, + -1 + ], + [ + 234, + -1 + ], + [ + 258, + -1 + ], + [ + 282, + -1 + ], + [ + 306, + -1 + ], + [ + 330, + -1 + ], + [ + 354, + -1 + ], + [ + 378, + -1 + ], + [ + 402, + -1 + ], + [ + 426, + -1 + ], + [ + 450, + -1 + ], + [ + 474, + -1 + ], + [ + 498, + -1 + ], + [ + 522, + -1 + ], + [ + 546, + -1 + ], + [ + 570, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 43, + 1 + ], + [ + 67, + 1 + ], + [ + 91, + 1 + ], + [ + 115, + 1 + ], + [ + 139, + 1 + ], + [ + 163, + 1 + ], + [ + 187, + 1 + ], + [ + 211, + 1 + ], + [ + 235, + 1 + ], + [ + 259, + 1 + ], + [ + 283, + 1 + ], + [ + 307, + 1 + ], + [ + 331, + 1 + ], + [ + 355, + 1 + ], + [ + 379, + 1 + ], + [ + 403, + 1 + ], + [ + 427, + 1 + ], + [ + 451, + 1 + ], + [ + 475, + 1 + ], + [ + 499, + 1 + ], + [ + 523, + 1 + ], + [ + 547, + 1 + ], + [ + 571, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 43, + -1 + ], + [ + 67, + -1 + ], + [ + 91, + -1 + ], + [ + 115, + -1 + ], + [ + 139, + -1 + ], + [ + 163, + -1 + ], + [ + 187, + -1 + ], + [ + 211, + -1 + ], + [ + 235, + -1 + ], + [ + 259, + -1 + ], + [ + 283, + -1 + ], + [ + 307, + -1 + ], + [ + 331, + -1 + ], + [ + 355, + -1 + ], + [ + 379, + -1 + ], + [ + 403, + -1 + ], + [ + 427, + -1 + ], + [ + 451, + -1 + ], + [ + 475, + -1 + ], + [ + 499, + -1 + ], + [ + 523, + -1 + ], + [ + 547, + -1 + ], + [ + 571, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 44, + 1 + ], + [ + 68, + 1 + ], + [ + 92, + 1 + ], + [ + 116, + 1 + ], + [ + 140, + 1 + ], + [ + 164, + 1 + ], + [ + 188, + 1 + ], + [ + 212, + 1 + ], + [ + 236, + 1 + ], + [ + 260, + 1 + ], + [ + 284, + 1 + ], + [ + 308, + 1 + ], + [ + 332, + 1 + ], + [ + 356, + 1 + ], + [ + 380, + 1 + ], + [ + 404, + 1 + ], + [ + 428, + 1 + ], + [ + 452, + 1 + ], + [ + 476, + 1 + ], + [ + 500, + 1 + ], + [ + 524, + 1 + ], + [ + 548, + 1 + ], + [ + 572, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 44, + -1 + ], + [ + 68, + -1 + ], + [ + 92, + -1 + ], + [ + 116, + -1 + ], + [ + 140, + -1 + ], + [ + 164, + -1 + ], + [ + 188, + -1 + ], + [ + 212, + -1 + ], + [ + 236, + -1 + ], + [ + 260, + -1 + ], + [ + 284, + -1 + ], + [ + 308, + -1 + ], + [ + 332, + -1 + ], + [ + 356, + -1 + ], + [ + 380, + -1 + ], + [ + 404, + -1 + ], + [ + 428, + -1 + ], + [ + 452, + -1 + ], + [ + 476, + -1 + ], + [ + 500, + -1 + ], + [ + 524, + -1 + ], + [ + 548, + -1 + ], + [ + 572, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 45, + 1 + ], + [ + 69, + 1 + ], + [ + 93, + 1 + ], + [ + 117, + 1 + ], + [ + 141, + 1 + ], + [ + 165, + 1 + ], + [ + 189, + 1 + ], + [ + 213, + 1 + ], + [ + 237, + 1 + ], + [ + 261, + 1 + ], + [ + 285, + 1 + ], + [ + 309, + 1 + ], + [ + 333, + 1 + ], + [ + 357, + 1 + ], + [ + 381, + 1 + ], + [ + 405, + 1 + ], + [ + 429, + 1 + ], + [ + 453, + 1 + ], + [ + 477, + 1 + ], + [ + 501, + 1 + ], + [ + 525, + 1 + ], + [ + 549, + 1 + ], + [ + 573, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 45, + -1 + ], + [ + 69, + -1 + ], + [ + 93, + -1 + ], + [ + 117, + -1 + ], + [ + 141, + -1 + ], + [ + 165, + -1 + ], + [ + 189, + -1 + ], + [ + 213, + -1 + ], + [ + 237, + -1 + ], + [ + 261, + -1 + ], + [ + 285, + -1 + ], + [ + 309, + -1 + ], + [ + 333, + -1 + ], + [ + 357, + -1 + ], + [ + 381, + -1 + ], + [ + 405, + -1 + ], + [ + 429, + -1 + ], + [ + 453, + -1 + ], + [ + 477, + -1 + ], + [ + 501, + -1 + ], + [ + 525, + -1 + ], + [ + 549, + -1 + ], + [ + 573, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 46, + 1 + ], + [ + 70, + 1 + ], + [ + 94, + 1 + ], + [ + 118, + 1 + ], + [ + 142, + 1 + ], + [ + 166, + 1 + ], + [ + 190, + 1 + ], + [ + 214, + 1 + ], + [ + 238, + 1 + ], + [ + 262, + 1 + ], + [ + 286, + 1 + ], + [ + 310, + 1 + ], + [ + 334, + 1 + ], + [ + 358, + 1 + ], + [ + 382, + 1 + ], + [ + 406, + 1 + ], + [ + 430, + 1 + ], + [ + 454, + 1 + ], + [ + 478, + 1 + ], + [ + 502, + 1 + ], + [ + 526, + 1 + ], + [ + 550, + 1 + ], + [ + 574, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 46, + -1 + ], + [ + 70, + -1 + ], + [ + 94, + -1 + ], + [ + 118, + -1 + ], + [ + 142, + -1 + ], + [ + 166, + -1 + ], + [ + 190, + -1 + ], + [ + 214, + -1 + ], + [ + 238, + -1 + ], + [ + 262, + -1 + ], + [ + 286, + -1 + ], + [ + 310, + -1 + ], + [ + 334, + -1 + ], + [ + 358, + -1 + ], + [ + 382, + -1 + ], + [ + 406, + -1 + ], + [ + 430, + -1 + ], + [ + 454, + -1 + ], + [ + 478, + -1 + ], + [ + 502, + -1 + ], + [ + 526, + -1 + ], + [ + 550, + -1 + ], + [ + 574, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 47, + 1 + ], + [ + 71, + 1 + ], + [ + 95, + 1 + ], + [ + 119, + 1 + ], + [ + 143, + 1 + ], + [ + 167, + 1 + ], + [ + 191, + 1 + ], + [ + 215, + 1 + ], + [ + 239, + 1 + ], + [ + 263, + 1 + ], + [ + 287, + 1 + ], + [ + 311, + 1 + ], + [ + 335, + 1 + ], + [ + 359, + 1 + ], + [ + 383, + 1 + ], + [ + 407, + 1 + ], + [ + 431, + 1 + ], + [ + 455, + 1 + ], + [ + 479, + 1 + ], + [ + 503, + 1 + ], + [ + 527, + 1 + ], + [ + 551, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 47, + -1 + ], + [ + 71, + -1 + ], + [ + 95, + -1 + ], + [ + 119, + -1 + ], + [ + 143, + -1 + ], + [ + 167, + -1 + ], + [ + 191, + -1 + ], + [ + 215, + -1 + ], + [ + 239, + -1 + ], + [ + 263, + -1 + ], + [ + 287, + -1 + ], + [ + 311, + -1 + ], + [ + 335, + -1 + ], + [ + 359, + -1 + ], + [ + 383, + -1 + ], + [ + 407, + -1 + ], + [ + 431, + -1 + ], + [ + 455, + -1 + ], + [ + 479, + -1 + ], + [ + 503, + -1 + ], + [ + 527, + -1 + ], + [ + 551, + -1 + ], + [ + 575, + -1 + ] + ] + } + ], + "parameters": { + "size": 24, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 576, + "variables": 576, + "rows": 96, + "nonzeros": 2304, + "globals": 0 + }, + "input_variables": 576, + "model_variables": 576, + "modelled_variables": 576, + "size_unit": "tasks" + }, + "json_sha256": "55fac4018a514754eba3ff4c96aed96226722164943b1e11d94a8058bbfda3af", + "txt_sha256": "ba99bcdc121b61f47d6659da536d2fb42dfbfa491bf9b5276c513a869af5f6b9" + }, + { + "id": "assignment-20-single", + "category": "assignment", + "size": 20, + "variant": "single", + "model": { + "id": "assignment_single_20", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 20, + 1 + ], + [ + 40, + 1 + ], + [ + 60, + 1 + ], + [ + 80, + 1 + ], + [ + 100, + 1 + ], + [ + 120, + 1 + ], + [ + 140, + 1 + ], + [ + 160, + 1 + ], + [ + 180, + 1 + ], + [ + 200, + 1 + ], + [ + 220, + 1 + ], + [ + 240, + 1 + ], + [ + 260, + 1 + ], + [ + 280, + 1 + ], + [ + 300, + 1 + ], + [ + 320, + 1 + ], + [ + 340, + 1 + ], + [ + 360, + 1 + ], + [ + 380, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 20, + -1 + ], + [ + 40, + -1 + ], + [ + 60, + -1 + ], + [ + 80, + -1 + ], + [ + 100, + -1 + ], + [ + 120, + -1 + ], + [ + 140, + -1 + ], + [ + 160, + -1 + ], + [ + 180, + -1 + ], + [ + 200, + -1 + ], + [ + 220, + -1 + ], + [ + 240, + -1 + ], + [ + 260, + -1 + ], + [ + 280, + -1 + ], + [ + 300, + -1 + ], + [ + 320, + -1 + ], + [ + 340, + -1 + ], + [ + 360, + -1 + ], + [ + 380, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 21, + 1 + ], + [ + 41, + 1 + ], + [ + 61, + 1 + ], + [ + 81, + 1 + ], + [ + 101, + 1 + ], + [ + 121, + 1 + ], + [ + 141, + 1 + ], + [ + 161, + 1 + ], + [ + 181, + 1 + ], + [ + 201, + 1 + ], + [ + 221, + 1 + ], + [ + 241, + 1 + ], + [ + 261, + 1 + ], + [ + 281, + 1 + ], + [ + 301, + 1 + ], + [ + 321, + 1 + ], + [ + 341, + 1 + ], + [ + 361, + 1 + ], + [ + 381, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 21, + -1 + ], + [ + 41, + -1 + ], + [ + 61, + -1 + ], + [ + 81, + -1 + ], + [ + 101, + -1 + ], + [ + 121, + -1 + ], + [ + 141, + -1 + ], + [ + 161, + -1 + ], + [ + 181, + -1 + ], + [ + 201, + -1 + ], + [ + 221, + -1 + ], + [ + 241, + -1 + ], + [ + 261, + -1 + ], + [ + 281, + -1 + ], + [ + 301, + -1 + ], + [ + 321, + -1 + ], + [ + 341, + -1 + ], + [ + 361, + -1 + ], + [ + 381, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 22, + 1 + ], + [ + 42, + 1 + ], + [ + 62, + 1 + ], + [ + 82, + 1 + ], + [ + 102, + 1 + ], + [ + 122, + 1 + ], + [ + 142, + 1 + ], + [ + 162, + 1 + ], + [ + 182, + 1 + ], + [ + 202, + 1 + ], + [ + 222, + 1 + ], + [ + 242, + 1 + ], + [ + 262, + 1 + ], + [ + 282, + 1 + ], + [ + 302, + 1 + ], + [ + 322, + 1 + ], + [ + 342, + 1 + ], + [ + 362, + 1 + ], + [ + 382, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 22, + -1 + ], + [ + 42, + -1 + ], + [ + 62, + -1 + ], + [ + 82, + -1 + ], + [ + 102, + -1 + ], + [ + 122, + -1 + ], + [ + 142, + -1 + ], + [ + 162, + -1 + ], + [ + 182, + -1 + ], + [ + 202, + -1 + ], + [ + 222, + -1 + ], + [ + 242, + -1 + ], + [ + 262, + -1 + ], + [ + 282, + -1 + ], + [ + 302, + -1 + ], + [ + 322, + -1 + ], + [ + 342, + -1 + ], + [ + 362, + -1 + ], + [ + 382, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 23, + 1 + ], + [ + 43, + 1 + ], + [ + 63, + 1 + ], + [ + 83, + 1 + ], + [ + 103, + 1 + ], + [ + 123, + 1 + ], + [ + 143, + 1 + ], + [ + 163, + 1 + ], + [ + 183, + 1 + ], + [ + 203, + 1 + ], + [ + 223, + 1 + ], + [ + 243, + 1 + ], + [ + 263, + 1 + ], + [ + 283, + 1 + ], + [ + 303, + 1 + ], + [ + 323, + 1 + ], + [ + 343, + 1 + ], + [ + 363, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 23, + -1 + ], + [ + 43, + -1 + ], + [ + 63, + -1 + ], + [ + 83, + -1 + ], + [ + 103, + -1 + ], + [ + 123, + -1 + ], + [ + 143, + -1 + ], + [ + 163, + -1 + ], + [ + 183, + -1 + ], + [ + 203, + -1 + ], + [ + 223, + -1 + ], + [ + 243, + -1 + ], + [ + 263, + -1 + ], + [ + 283, + -1 + ], + [ + 303, + -1 + ], + [ + 323, + -1 + ], + [ + 343, + -1 + ], + [ + 363, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 24, + 1 + ], + [ + 44, + 1 + ], + [ + 64, + 1 + ], + [ + 84, + 1 + ], + [ + 104, + 1 + ], + [ + 124, + 1 + ], + [ + 144, + 1 + ], + [ + 164, + 1 + ], + [ + 184, + 1 + ], + [ + 204, + 1 + ], + [ + 224, + 1 + ], + [ + 244, + 1 + ], + [ + 264, + 1 + ], + [ + 284, + 1 + ], + [ + 304, + 1 + ], + [ + 324, + 1 + ], + [ + 344, + 1 + ], + [ + 364, + 1 + ], + [ + 384, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 24, + -1 + ], + [ + 44, + -1 + ], + [ + 64, + -1 + ], + [ + 84, + -1 + ], + [ + 104, + -1 + ], + [ + 124, + -1 + ], + [ + 144, + -1 + ], + [ + 164, + -1 + ], + [ + 184, + -1 + ], + [ + 204, + -1 + ], + [ + 224, + -1 + ], + [ + 244, + -1 + ], + [ + 264, + -1 + ], + [ + 284, + -1 + ], + [ + 304, + -1 + ], + [ + 324, + -1 + ], + [ + 344, + -1 + ], + [ + 364, + -1 + ], + [ + 384, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 25, + 1 + ], + [ + 45, + 1 + ], + [ + 65, + 1 + ], + [ + 85, + 1 + ], + [ + 105, + 1 + ], + [ + 125, + 1 + ], + [ + 145, + 1 + ], + [ + 165, + 1 + ], + [ + 185, + 1 + ], + [ + 205, + 1 + ], + [ + 225, + 1 + ], + [ + 245, + 1 + ], + [ + 265, + 1 + ], + [ + 285, + 1 + ], + [ + 305, + 1 + ], + [ + 325, + 1 + ], + [ + 345, + 1 + ], + [ + 365, + 1 + ], + [ + 385, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 25, + -1 + ], + [ + 45, + -1 + ], + [ + 65, + -1 + ], + [ + 85, + -1 + ], + [ + 105, + -1 + ], + [ + 125, + -1 + ], + [ + 145, + -1 + ], + [ + 165, + -1 + ], + [ + 185, + -1 + ], + [ + 205, + -1 + ], + [ + 225, + -1 + ], + [ + 245, + -1 + ], + [ + 265, + -1 + ], + [ + 285, + -1 + ], + [ + 305, + -1 + ], + [ + 325, + -1 + ], + [ + 345, + -1 + ], + [ + 365, + -1 + ], + [ + 385, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 26, + 1 + ], + [ + 46, + 1 + ], + [ + 66, + 1 + ], + [ + 86, + 1 + ], + [ + 106, + 1 + ], + [ + 126, + 1 + ], + [ + 146, + 1 + ], + [ + 166, + 1 + ], + [ + 186, + 1 + ], + [ + 206, + 1 + ], + [ + 226, + 1 + ], + [ + 246, + 1 + ], + [ + 266, + 1 + ], + [ + 286, + 1 + ], + [ + 306, + 1 + ], + [ + 326, + 1 + ], + [ + 346, + 1 + ], + [ + 366, + 1 + ], + [ + 386, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 26, + -1 + ], + [ + 46, + -1 + ], + [ + 66, + -1 + ], + [ + 86, + -1 + ], + [ + 106, + -1 + ], + [ + 126, + -1 + ], + [ + 146, + -1 + ], + [ + 166, + -1 + ], + [ + 186, + -1 + ], + [ + 206, + -1 + ], + [ + 226, + -1 + ], + [ + 246, + -1 + ], + [ + 266, + -1 + ], + [ + 286, + -1 + ], + [ + 306, + -1 + ], + [ + 326, + -1 + ], + [ + 346, + -1 + ], + [ + 366, + -1 + ], + [ + 386, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 27, + 1 + ], + [ + 47, + 1 + ], + [ + 67, + 1 + ], + [ + 87, + 1 + ], + [ + 107, + 1 + ], + [ + 127, + 1 + ], + [ + 147, + 1 + ], + [ + 167, + 1 + ], + [ + 187, + 1 + ], + [ + 207, + 1 + ], + [ + 227, + 1 + ], + [ + 247, + 1 + ], + [ + 267, + 1 + ], + [ + 287, + 1 + ], + [ + 307, + 1 + ], + [ + 327, + 1 + ], + [ + 347, + 1 + ], + [ + 367, + 1 + ], + [ + 387, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 27, + -1 + ], + [ + 47, + -1 + ], + [ + 67, + -1 + ], + [ + 87, + -1 + ], + [ + 107, + -1 + ], + [ + 127, + -1 + ], + [ + 147, + -1 + ], + [ + 167, + -1 + ], + [ + 187, + -1 + ], + [ + 207, + -1 + ], + [ + 227, + -1 + ], + [ + 247, + -1 + ], + [ + 267, + -1 + ], + [ + 287, + -1 + ], + [ + 307, + -1 + ], + [ + 327, + -1 + ], + [ + 347, + -1 + ], + [ + 367, + -1 + ], + [ + 387, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 28, + 1 + ], + [ + 48, + 1 + ], + [ + 68, + 1 + ], + [ + 88, + 1 + ], + [ + 108, + 1 + ], + [ + 128, + 1 + ], + [ + 148, + 1 + ], + [ + 168, + 1 + ], + [ + 188, + 1 + ], + [ + 208, + 1 + ], + [ + 228, + 1 + ], + [ + 248, + 1 + ], + [ + 268, + 1 + ], + [ + 288, + 1 + ], + [ + 308, + 1 + ], + [ + 328, + 1 + ], + [ + 348, + 1 + ], + [ + 368, + 1 + ], + [ + 388, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 28, + -1 + ], + [ + 48, + -1 + ], + [ + 68, + -1 + ], + [ + 88, + -1 + ], + [ + 108, + -1 + ], + [ + 128, + -1 + ], + [ + 148, + -1 + ], + [ + 168, + -1 + ], + [ + 188, + -1 + ], + [ + 208, + -1 + ], + [ + 228, + -1 + ], + [ + 248, + -1 + ], + [ + 268, + -1 + ], + [ + 288, + -1 + ], + [ + 308, + -1 + ], + [ + 328, + -1 + ], + [ + 348, + -1 + ], + [ + 368, + -1 + ], + [ + 388, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 29, + 1 + ], + [ + 49, + 1 + ], + [ + 69, + 1 + ], + [ + 89, + 1 + ], + [ + 109, + 1 + ], + [ + 129, + 1 + ], + [ + 149, + 1 + ], + [ + 169, + 1 + ], + [ + 189, + 1 + ], + [ + 209, + 1 + ], + [ + 229, + 1 + ], + [ + 249, + 1 + ], + [ + 269, + 1 + ], + [ + 289, + 1 + ], + [ + 309, + 1 + ], + [ + 329, + 1 + ], + [ + 349, + 1 + ], + [ + 369, + 1 + ], + [ + 389, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 29, + -1 + ], + [ + 49, + -1 + ], + [ + 69, + -1 + ], + [ + 89, + -1 + ], + [ + 109, + -1 + ], + [ + 129, + -1 + ], + [ + 149, + -1 + ], + [ + 169, + -1 + ], + [ + 189, + -1 + ], + [ + 209, + -1 + ], + [ + 229, + -1 + ], + [ + 249, + -1 + ], + [ + 269, + -1 + ], + [ + 289, + -1 + ], + [ + 309, + -1 + ], + [ + 329, + -1 + ], + [ + 349, + -1 + ], + [ + 369, + -1 + ], + [ + 389, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 30, + 1 + ], + [ + 50, + 1 + ], + [ + 70, + 1 + ], + [ + 90, + 1 + ], + [ + 110, + 1 + ], + [ + 130, + 1 + ], + [ + 150, + 1 + ], + [ + 170, + 1 + ], + [ + 190, + 1 + ], + [ + 210, + 1 + ], + [ + 230, + 1 + ], + [ + 250, + 1 + ], + [ + 270, + 1 + ], + [ + 290, + 1 + ], + [ + 310, + 1 + ], + [ + 330, + 1 + ], + [ + 350, + 1 + ], + [ + 370, + 1 + ], + [ + 390, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 30, + -1 + ], + [ + 50, + -1 + ], + [ + 70, + -1 + ], + [ + 90, + -1 + ], + [ + 110, + -1 + ], + [ + 130, + -1 + ], + [ + 150, + -1 + ], + [ + 170, + -1 + ], + [ + 190, + -1 + ], + [ + 210, + -1 + ], + [ + 230, + -1 + ], + [ + 250, + -1 + ], + [ + 270, + -1 + ], + [ + 290, + -1 + ], + [ + 310, + -1 + ], + [ + 330, + -1 + ], + [ + 350, + -1 + ], + [ + 370, + -1 + ], + [ + 390, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 31, + 1 + ], + [ + 51, + 1 + ], + [ + 71, + 1 + ], + [ + 91, + 1 + ], + [ + 111, + 1 + ], + [ + 131, + 1 + ], + [ + 151, + 1 + ], + [ + 171, + 1 + ], + [ + 191, + 1 + ], + [ + 211, + 1 + ], + [ + 231, + 1 + ], + [ + 251, + 1 + ], + [ + 271, + 1 + ], + [ + 291, + 1 + ], + [ + 311, + 1 + ], + [ + 331, + 1 + ], + [ + 351, + 1 + ], + [ + 371, + 1 + ], + [ + 391, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 31, + -1 + ], + [ + 51, + -1 + ], + [ + 71, + -1 + ], + [ + 91, + -1 + ], + [ + 111, + -1 + ], + [ + 131, + -1 + ], + [ + 151, + -1 + ], + [ + 171, + -1 + ], + [ + 191, + -1 + ], + [ + 211, + -1 + ], + [ + 231, + -1 + ], + [ + 251, + -1 + ], + [ + 271, + -1 + ], + [ + 291, + -1 + ], + [ + 311, + -1 + ], + [ + 331, + -1 + ], + [ + 351, + -1 + ], + [ + 371, + -1 + ], + [ + 391, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 32, + 1 + ], + [ + 52, + 1 + ], + [ + 72, + 1 + ], + [ + 92, + 1 + ], + [ + 112, + 1 + ], + [ + 132, + 1 + ], + [ + 152, + 1 + ], + [ + 172, + 1 + ], + [ + 192, + 1 + ], + [ + 212, + 1 + ], + [ + 232, + 1 + ], + [ + 252, + 1 + ], + [ + 272, + 1 + ], + [ + 292, + 1 + ], + [ + 312, + 1 + ], + [ + 332, + 1 + ], + [ + 352, + 1 + ], + [ + 372, + 1 + ], + [ + 392, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 32, + -1 + ], + [ + 52, + -1 + ], + [ + 72, + -1 + ], + [ + 92, + -1 + ], + [ + 112, + -1 + ], + [ + 132, + -1 + ], + [ + 152, + -1 + ], + [ + 172, + -1 + ], + [ + 192, + -1 + ], + [ + 212, + -1 + ], + [ + 232, + -1 + ], + [ + 252, + -1 + ], + [ + 272, + -1 + ], + [ + 292, + -1 + ], + [ + 312, + -1 + ], + [ + 332, + -1 + ], + [ + 352, + -1 + ], + [ + 372, + -1 + ], + [ + 392, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 33, + 1 + ], + [ + 53, + 1 + ], + [ + 73, + 1 + ], + [ + 93, + 1 + ], + [ + 113, + 1 + ], + [ + 133, + 1 + ], + [ + 153, + 1 + ], + [ + 173, + 1 + ], + [ + 193, + 1 + ], + [ + 213, + 1 + ], + [ + 233, + 1 + ], + [ + 253, + 1 + ], + [ + 273, + 1 + ], + [ + 293, + 1 + ], + [ + 313, + 1 + ], + [ + 333, + 1 + ], + [ + 353, + 1 + ], + [ + 373, + 1 + ], + [ + 393, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 33, + -1 + ], + [ + 53, + -1 + ], + [ + 73, + -1 + ], + [ + 93, + -1 + ], + [ + 113, + -1 + ], + [ + 133, + -1 + ], + [ + 153, + -1 + ], + [ + 173, + -1 + ], + [ + 193, + -1 + ], + [ + 213, + -1 + ], + [ + 233, + -1 + ], + [ + 253, + -1 + ], + [ + 273, + -1 + ], + [ + 293, + -1 + ], + [ + 313, + -1 + ], + [ + 333, + -1 + ], + [ + 353, + -1 + ], + [ + 373, + -1 + ], + [ + 393, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 34, + 1 + ], + [ + 54, + 1 + ], + [ + 74, + 1 + ], + [ + 94, + 1 + ], + [ + 114, + 1 + ], + [ + 134, + 1 + ], + [ + 154, + 1 + ], + [ + 174, + 1 + ], + [ + 194, + 1 + ], + [ + 214, + 1 + ], + [ + 234, + 1 + ], + [ + 254, + 1 + ], + [ + 274, + 1 + ], + [ + 294, + 1 + ], + [ + 314, + 1 + ], + [ + 334, + 1 + ], + [ + 354, + 1 + ], + [ + 374, + 1 + ], + [ + 394, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 34, + -1 + ], + [ + 54, + -1 + ], + [ + 74, + -1 + ], + [ + 94, + -1 + ], + [ + 114, + -1 + ], + [ + 134, + -1 + ], + [ + 154, + -1 + ], + [ + 174, + -1 + ], + [ + 194, + -1 + ], + [ + 214, + -1 + ], + [ + 234, + -1 + ], + [ + 254, + -1 + ], + [ + 274, + -1 + ], + [ + 294, + -1 + ], + [ + 314, + -1 + ], + [ + 334, + -1 + ], + [ + 354, + -1 + ], + [ + 374, + -1 + ], + [ + 394, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 35, + 1 + ], + [ + 55, + 1 + ], + [ + 75, + 1 + ], + [ + 95, + 1 + ], + [ + 115, + 1 + ], + [ + 135, + 1 + ], + [ + 155, + 1 + ], + [ + 175, + 1 + ], + [ + 195, + 1 + ], + [ + 215, + 1 + ], + [ + 235, + 1 + ], + [ + 255, + 1 + ], + [ + 275, + 1 + ], + [ + 295, + 1 + ], + [ + 315, + 1 + ], + [ + 335, + 1 + ], + [ + 355, + 1 + ], + [ + 375, + 1 + ], + [ + 395, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 35, + -1 + ], + [ + 55, + -1 + ], + [ + 75, + -1 + ], + [ + 95, + -1 + ], + [ + 115, + -1 + ], + [ + 135, + -1 + ], + [ + 155, + -1 + ], + [ + 175, + -1 + ], + [ + 195, + -1 + ], + [ + 215, + -1 + ], + [ + 235, + -1 + ], + [ + 255, + -1 + ], + [ + 275, + -1 + ], + [ + 295, + -1 + ], + [ + 315, + -1 + ], + [ + 335, + -1 + ], + [ + 355, + -1 + ], + [ + 375, + -1 + ], + [ + 395, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 36, + 1 + ], + [ + 56, + 1 + ], + [ + 76, + 1 + ], + [ + 96, + 1 + ], + [ + 116, + 1 + ], + [ + 136, + 1 + ], + [ + 156, + 1 + ], + [ + 176, + 1 + ], + [ + 196, + 1 + ], + [ + 216, + 1 + ], + [ + 236, + 1 + ], + [ + 256, + 1 + ], + [ + 276, + 1 + ], + [ + 296, + 1 + ], + [ + 316, + 1 + ], + [ + 336, + 1 + ], + [ + 356, + 1 + ], + [ + 376, + 1 + ], + [ + 396, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 36, + -1 + ], + [ + 56, + -1 + ], + [ + 76, + -1 + ], + [ + 96, + -1 + ], + [ + 116, + -1 + ], + [ + 136, + -1 + ], + [ + 156, + -1 + ], + [ + 176, + -1 + ], + [ + 196, + -1 + ], + [ + 216, + -1 + ], + [ + 236, + -1 + ], + [ + 256, + -1 + ], + [ + 276, + -1 + ], + [ + 296, + -1 + ], + [ + 316, + -1 + ], + [ + 336, + -1 + ], + [ + 356, + -1 + ], + [ + 376, + -1 + ], + [ + 396, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 37, + 1 + ], + [ + 57, + 1 + ], + [ + 77, + 1 + ], + [ + 97, + 1 + ], + [ + 117, + 1 + ], + [ + 137, + 1 + ], + [ + 157, + 1 + ], + [ + 177, + 1 + ], + [ + 197, + 1 + ], + [ + 217, + 1 + ], + [ + 237, + 1 + ], + [ + 257, + 1 + ], + [ + 277, + 1 + ], + [ + 297, + 1 + ], + [ + 317, + 1 + ], + [ + 337, + 1 + ], + [ + 357, + 1 + ], + [ + 377, + 1 + ], + [ + 397, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 37, + -1 + ], + [ + 57, + -1 + ], + [ + 77, + -1 + ], + [ + 97, + -1 + ], + [ + 117, + -1 + ], + [ + 137, + -1 + ], + [ + 157, + -1 + ], + [ + 177, + -1 + ], + [ + 197, + -1 + ], + [ + 217, + -1 + ], + [ + 237, + -1 + ], + [ + 257, + -1 + ], + [ + 277, + -1 + ], + [ + 297, + -1 + ], + [ + 317, + -1 + ], + [ + 337, + -1 + ], + [ + 357, + -1 + ], + [ + 377, + -1 + ], + [ + 397, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 38, + 1 + ], + [ + 58, + 1 + ], + [ + 78, + 1 + ], + [ + 98, + 1 + ], + [ + 118, + 1 + ], + [ + 138, + 1 + ], + [ + 158, + 1 + ], + [ + 178, + 1 + ], + [ + 198, + 1 + ], + [ + 218, + 1 + ], + [ + 238, + 1 + ], + [ + 258, + 1 + ], + [ + 278, + 1 + ], + [ + 298, + 1 + ], + [ + 318, + 1 + ], + [ + 338, + 1 + ], + [ + 358, + 1 + ], + [ + 378, + 1 + ], + [ + 398, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 38, + -1 + ], + [ + 58, + -1 + ], + [ + 78, + -1 + ], + [ + 98, + -1 + ], + [ + 118, + -1 + ], + [ + 138, + -1 + ], + [ + 158, + -1 + ], + [ + 178, + -1 + ], + [ + 198, + -1 + ], + [ + 218, + -1 + ], + [ + 238, + -1 + ], + [ + 258, + -1 + ], + [ + 278, + -1 + ], + [ + 298, + -1 + ], + [ + 318, + -1 + ], + [ + 338, + -1 + ], + [ + 358, + -1 + ], + [ + 378, + -1 + ], + [ + 398, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 39, + 1 + ], + [ + 59, + 1 + ], + [ + 79, + 1 + ], + [ + 99, + 1 + ], + [ + 119, + 1 + ], + [ + 139, + 1 + ], + [ + 159, + 1 + ], + [ + 179, + 1 + ], + [ + 199, + 1 + ], + [ + 219, + 1 + ], + [ + 239, + 1 + ], + [ + 259, + 1 + ], + [ + 279, + 1 + ], + [ + 299, + 1 + ], + [ + 319, + 1 + ], + [ + 339, + 1 + ], + [ + 359, + 1 + ], + [ + 379, + 1 + ], + [ + 399, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 39, + -1 + ], + [ + 59, + -1 + ], + [ + 79, + -1 + ], + [ + 99, + -1 + ], + [ + 119, + -1 + ], + [ + 139, + -1 + ], + [ + 159, + -1 + ], + [ + 179, + -1 + ], + [ + 199, + -1 + ], + [ + 219, + -1 + ], + [ + 239, + -1 + ], + [ + 259, + -1 + ], + [ + 279, + -1 + ], + [ + 299, + -1 + ], + [ + 319, + -1 + ], + [ + 339, + -1 + ], + [ + 359, + -1 + ], + [ + 379, + -1 + ], + [ + 399, + -1 + ] + ] + } + ], + "parameters": { + "size": 20, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 80, + "nonzeros": 1600, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "tasks" + }, + "json_sha256": "3d1722683664e926239b76e59c1f99416a04d662bcf588240efa7d5cdff91ef5", + "txt_sha256": "4c6315ffaa357a6d18671613ac04cc78e6a69b5d3310dc06a509973e0b6a94c2" + }, + { + "id": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "model": { + "id": "assignment_single_18", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 324, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 18, + 1 + ], + [ + 36, + 1 + ], + [ + 54, + 1 + ], + [ + 72, + 1 + ], + [ + 90, + 1 + ], + [ + 108, + 1 + ], + [ + 126, + 1 + ], + [ + 144, + 1 + ], + [ + 162, + 1 + ], + [ + 180, + 1 + ], + [ + 198, + 1 + ], + [ + 216, + 1 + ], + [ + 234, + 1 + ], + [ + 252, + 1 + ], + [ + 270, + 1 + ], + [ + 288, + 1 + ], + [ + 306, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 18, + -1 + ], + [ + 36, + -1 + ], + [ + 54, + -1 + ], + [ + 72, + -1 + ], + [ + 90, + -1 + ], + [ + 108, + -1 + ], + [ + 126, + -1 + ], + [ + 144, + -1 + ], + [ + 162, + -1 + ], + [ + 180, + -1 + ], + [ + 198, + -1 + ], + [ + 216, + -1 + ], + [ + 234, + -1 + ], + [ + 252, + -1 + ], + [ + 270, + -1 + ], + [ + 288, + -1 + ], + [ + 306, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 19, + 1 + ], + [ + 37, + 1 + ], + [ + 55, + 1 + ], + [ + 73, + 1 + ], + [ + 91, + 1 + ], + [ + 109, + 1 + ], + [ + 127, + 1 + ], + [ + 145, + 1 + ], + [ + 163, + 1 + ], + [ + 181, + 1 + ], + [ + 199, + 1 + ], + [ + 217, + 1 + ], + [ + 235, + 1 + ], + [ + 253, + 1 + ], + [ + 271, + 1 + ], + [ + 289, + 1 + ], + [ + 307, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 19, + -1 + ], + [ + 37, + -1 + ], + [ + 55, + -1 + ], + [ + 73, + -1 + ], + [ + 91, + -1 + ], + [ + 109, + -1 + ], + [ + 127, + -1 + ], + [ + 145, + -1 + ], + [ + 163, + -1 + ], + [ + 181, + -1 + ], + [ + 199, + -1 + ], + [ + 217, + -1 + ], + [ + 235, + -1 + ], + [ + 253, + -1 + ], + [ + 271, + -1 + ], + [ + 289, + -1 + ], + [ + 307, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 20, + 1 + ], + [ + 38, + 1 + ], + [ + 56, + 1 + ], + [ + 74, + 1 + ], + [ + 92, + 1 + ], + [ + 110, + 1 + ], + [ + 128, + 1 + ], + [ + 146, + 1 + ], + [ + 164, + 1 + ], + [ + 182, + 1 + ], + [ + 200, + 1 + ], + [ + 218, + 1 + ], + [ + 236, + 1 + ], + [ + 254, + 1 + ], + [ + 272, + 1 + ], + [ + 290, + 1 + ], + [ + 308, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 20, + -1 + ], + [ + 38, + -1 + ], + [ + 56, + -1 + ], + [ + 74, + -1 + ], + [ + 92, + -1 + ], + [ + 110, + -1 + ], + [ + 128, + -1 + ], + [ + 146, + -1 + ], + [ + 164, + -1 + ], + [ + 182, + -1 + ], + [ + 200, + -1 + ], + [ + 218, + -1 + ], + [ + 236, + -1 + ], + [ + 254, + -1 + ], + [ + 272, + -1 + ], + [ + 290, + -1 + ], + [ + 308, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 21, + 1 + ], + [ + 39, + 1 + ], + [ + 57, + 1 + ], + [ + 75, + 1 + ], + [ + 93, + 1 + ], + [ + 111, + 1 + ], + [ + 129, + 1 + ], + [ + 147, + 1 + ], + [ + 165, + 1 + ], + [ + 183, + 1 + ], + [ + 201, + 1 + ], + [ + 219, + 1 + ], + [ + 237, + 1 + ], + [ + 255, + 1 + ], + [ + 273, + 1 + ], + [ + 291, + 1 + ], + [ + 309, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 21, + -1 + ], + [ + 39, + -1 + ], + [ + 57, + -1 + ], + [ + 75, + -1 + ], + [ + 93, + -1 + ], + [ + 111, + -1 + ], + [ + 129, + -1 + ], + [ + 147, + -1 + ], + [ + 165, + -1 + ], + [ + 183, + -1 + ], + [ + 201, + -1 + ], + [ + 219, + -1 + ], + [ + 237, + -1 + ], + [ + 255, + -1 + ], + [ + 273, + -1 + ], + [ + 291, + -1 + ], + [ + 309, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 22, + 1 + ], + [ + 40, + 1 + ], + [ + 58, + 1 + ], + [ + 76, + 1 + ], + [ + 94, + 1 + ], + [ + 112, + 1 + ], + [ + 130, + 1 + ], + [ + 148, + 1 + ], + [ + 166, + 1 + ], + [ + 184, + 1 + ], + [ + 202, + 1 + ], + [ + 220, + 1 + ], + [ + 238, + 1 + ], + [ + 256, + 1 + ], + [ + 274, + 1 + ], + [ + 292, + 1 + ], + [ + 310, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 22, + -1 + ], + [ + 40, + -1 + ], + [ + 58, + -1 + ], + [ + 76, + -1 + ], + [ + 94, + -1 + ], + [ + 112, + -1 + ], + [ + 130, + -1 + ], + [ + 148, + -1 + ], + [ + 166, + -1 + ], + [ + 184, + -1 + ], + [ + 202, + -1 + ], + [ + 220, + -1 + ], + [ + 238, + -1 + ], + [ + 256, + -1 + ], + [ + 274, + -1 + ], + [ + 292, + -1 + ], + [ + 310, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 23, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 77, + 1 + ], + [ + 95, + 1 + ], + [ + 113, + 1 + ], + [ + 131, + 1 + ], + [ + 149, + 1 + ], + [ + 167, + 1 + ], + [ + 185, + 1 + ], + [ + 203, + 1 + ], + [ + 221, + 1 + ], + [ + 239, + 1 + ], + [ + 257, + 1 + ], + [ + 275, + 1 + ], + [ + 293, + 1 + ], + [ + 311, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 23, + -1 + ], + [ + 41, + -1 + ], + [ + 59, + -1 + ], + [ + 77, + -1 + ], + [ + 95, + -1 + ], + [ + 113, + -1 + ], + [ + 131, + -1 + ], + [ + 149, + -1 + ], + [ + 167, + -1 + ], + [ + 185, + -1 + ], + [ + 203, + -1 + ], + [ + 221, + -1 + ], + [ + 239, + -1 + ], + [ + 257, + -1 + ], + [ + 275, + -1 + ], + [ + 293, + -1 + ], + [ + 311, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 24, + 1 + ], + [ + 42, + 1 + ], + [ + 60, + 1 + ], + [ + 78, + 1 + ], + [ + 96, + 1 + ], + [ + 114, + 1 + ], + [ + 132, + 1 + ], + [ + 150, + 1 + ], + [ + 168, + 1 + ], + [ + 186, + 1 + ], + [ + 204, + 1 + ], + [ + 222, + 1 + ], + [ + 240, + 1 + ], + [ + 258, + 1 + ], + [ + 276, + 1 + ], + [ + 294, + 1 + ], + [ + 312, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 24, + -1 + ], + [ + 42, + -1 + ], + [ + 60, + -1 + ], + [ + 78, + -1 + ], + [ + 96, + -1 + ], + [ + 114, + -1 + ], + [ + 132, + -1 + ], + [ + 150, + -1 + ], + [ + 168, + -1 + ], + [ + 186, + -1 + ], + [ + 204, + -1 + ], + [ + 222, + -1 + ], + [ + 240, + -1 + ], + [ + 258, + -1 + ], + [ + 276, + -1 + ], + [ + 294, + -1 + ], + [ + 312, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 25, + 1 + ], + [ + 43, + 1 + ], + [ + 61, + 1 + ], + [ + 79, + 1 + ], + [ + 97, + 1 + ], + [ + 115, + 1 + ], + [ + 133, + 1 + ], + [ + 151, + 1 + ], + [ + 169, + 1 + ], + [ + 187, + 1 + ], + [ + 205, + 1 + ], + [ + 223, + 1 + ], + [ + 241, + 1 + ], + [ + 259, + 1 + ], + [ + 277, + 1 + ], + [ + 295, + 1 + ], + [ + 313, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 25, + -1 + ], + [ + 43, + -1 + ], + [ + 61, + -1 + ], + [ + 79, + -1 + ], + [ + 97, + -1 + ], + [ + 115, + -1 + ], + [ + 133, + -1 + ], + [ + 151, + -1 + ], + [ + 169, + -1 + ], + [ + 187, + -1 + ], + [ + 205, + -1 + ], + [ + 223, + -1 + ], + [ + 241, + -1 + ], + [ + 259, + -1 + ], + [ + 277, + -1 + ], + [ + 295, + -1 + ], + [ + 313, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 26, + 1 + ], + [ + 44, + 1 + ], + [ + 62, + 1 + ], + [ + 80, + 1 + ], + [ + 98, + 1 + ], + [ + 116, + 1 + ], + [ + 134, + 1 + ], + [ + 152, + 1 + ], + [ + 170, + 1 + ], + [ + 188, + 1 + ], + [ + 206, + 1 + ], + [ + 224, + 1 + ], + [ + 242, + 1 + ], + [ + 260, + 1 + ], + [ + 278, + 1 + ], + [ + 296, + 1 + ], + [ + 314, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 26, + -1 + ], + [ + 44, + -1 + ], + [ + 62, + -1 + ], + [ + 80, + -1 + ], + [ + 98, + -1 + ], + [ + 116, + -1 + ], + [ + 134, + -1 + ], + [ + 152, + -1 + ], + [ + 170, + -1 + ], + [ + 188, + -1 + ], + [ + 206, + -1 + ], + [ + 224, + -1 + ], + [ + 242, + -1 + ], + [ + 260, + -1 + ], + [ + 278, + -1 + ], + [ + 296, + -1 + ], + [ + 314, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 27, + 1 + ], + [ + 45, + 1 + ], + [ + 63, + 1 + ], + [ + 81, + 1 + ], + [ + 99, + 1 + ], + [ + 117, + 1 + ], + [ + 135, + 1 + ], + [ + 153, + 1 + ], + [ + 171, + 1 + ], + [ + 189, + 1 + ], + [ + 207, + 1 + ], + [ + 225, + 1 + ], + [ + 243, + 1 + ], + [ + 261, + 1 + ], + [ + 279, + 1 + ], + [ + 297, + 1 + ], + [ + 315, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 27, + -1 + ], + [ + 45, + -1 + ], + [ + 63, + -1 + ], + [ + 81, + -1 + ], + [ + 99, + -1 + ], + [ + 117, + -1 + ], + [ + 135, + -1 + ], + [ + 153, + -1 + ], + [ + 171, + -1 + ], + [ + 189, + -1 + ], + [ + 207, + -1 + ], + [ + 225, + -1 + ], + [ + 243, + -1 + ], + [ + 261, + -1 + ], + [ + 279, + -1 + ], + [ + 297, + -1 + ], + [ + 315, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 28, + 1 + ], + [ + 46, + 1 + ], + [ + 64, + 1 + ], + [ + 82, + 1 + ], + [ + 100, + 1 + ], + [ + 118, + 1 + ], + [ + 136, + 1 + ], + [ + 154, + 1 + ], + [ + 172, + 1 + ], + [ + 190, + 1 + ], + [ + 208, + 1 + ], + [ + 226, + 1 + ], + [ + 244, + 1 + ], + [ + 262, + 1 + ], + [ + 280, + 1 + ], + [ + 298, + 1 + ], + [ + 316, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 28, + -1 + ], + [ + 46, + -1 + ], + [ + 64, + -1 + ], + [ + 82, + -1 + ], + [ + 100, + -1 + ], + [ + 118, + -1 + ], + [ + 136, + -1 + ], + [ + 154, + -1 + ], + [ + 172, + -1 + ], + [ + 190, + -1 + ], + [ + 208, + -1 + ], + [ + 226, + -1 + ], + [ + 244, + -1 + ], + [ + 262, + -1 + ], + [ + 280, + -1 + ], + [ + 298, + -1 + ], + [ + 316, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 29, + 1 + ], + [ + 47, + 1 + ], + [ + 65, + 1 + ], + [ + 83, + 1 + ], + [ + 101, + 1 + ], + [ + 119, + 1 + ], + [ + 137, + 1 + ], + [ + 155, + 1 + ], + [ + 173, + 1 + ], + [ + 191, + 1 + ], + [ + 209, + 1 + ], + [ + 227, + 1 + ], + [ + 245, + 1 + ], + [ + 263, + 1 + ], + [ + 281, + 1 + ], + [ + 299, + 1 + ], + [ + 317, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 29, + -1 + ], + [ + 47, + -1 + ], + [ + 65, + -1 + ], + [ + 83, + -1 + ], + [ + 101, + -1 + ], + [ + 119, + -1 + ], + [ + 137, + -1 + ], + [ + 155, + -1 + ], + [ + 173, + -1 + ], + [ + 191, + -1 + ], + [ + 209, + -1 + ], + [ + 227, + -1 + ], + [ + 245, + -1 + ], + [ + 263, + -1 + ], + [ + 281, + -1 + ], + [ + 299, + -1 + ], + [ + 317, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 30, + 1 + ], + [ + 48, + 1 + ], + [ + 66, + 1 + ], + [ + 84, + 1 + ], + [ + 102, + 1 + ], + [ + 120, + 1 + ], + [ + 138, + 1 + ], + [ + 156, + 1 + ], + [ + 174, + 1 + ], + [ + 192, + 1 + ], + [ + 210, + 1 + ], + [ + 228, + 1 + ], + [ + 246, + 1 + ], + [ + 264, + 1 + ], + [ + 282, + 1 + ], + [ + 300, + 1 + ], + [ + 318, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 30, + -1 + ], + [ + 48, + -1 + ], + [ + 66, + -1 + ], + [ + 84, + -1 + ], + [ + 102, + -1 + ], + [ + 120, + -1 + ], + [ + 138, + -1 + ], + [ + 156, + -1 + ], + [ + 174, + -1 + ], + [ + 192, + -1 + ], + [ + 210, + -1 + ], + [ + 228, + -1 + ], + [ + 246, + -1 + ], + [ + 264, + -1 + ], + [ + 282, + -1 + ], + [ + 300, + -1 + ], + [ + 318, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 31, + 1 + ], + [ + 49, + 1 + ], + [ + 67, + 1 + ], + [ + 85, + 1 + ], + [ + 103, + 1 + ], + [ + 121, + 1 + ], + [ + 139, + 1 + ], + [ + 157, + 1 + ], + [ + 175, + 1 + ], + [ + 193, + 1 + ], + [ + 211, + 1 + ], + [ + 229, + 1 + ], + [ + 247, + 1 + ], + [ + 265, + 1 + ], + [ + 283, + 1 + ], + [ + 301, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 31, + -1 + ], + [ + 49, + -1 + ], + [ + 67, + -1 + ], + [ + 85, + -1 + ], + [ + 103, + -1 + ], + [ + 121, + -1 + ], + [ + 139, + -1 + ], + [ + 157, + -1 + ], + [ + 175, + -1 + ], + [ + 193, + -1 + ], + [ + 211, + -1 + ], + [ + 229, + -1 + ], + [ + 247, + -1 + ], + [ + 265, + -1 + ], + [ + 283, + -1 + ], + [ + 301, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 32, + 1 + ], + [ + 50, + 1 + ], + [ + 68, + 1 + ], + [ + 86, + 1 + ], + [ + 104, + 1 + ], + [ + 122, + 1 + ], + [ + 140, + 1 + ], + [ + 158, + 1 + ], + [ + 176, + 1 + ], + [ + 194, + 1 + ], + [ + 212, + 1 + ], + [ + 230, + 1 + ], + [ + 248, + 1 + ], + [ + 266, + 1 + ], + [ + 284, + 1 + ], + [ + 302, + 1 + ], + [ + 320, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 32, + -1 + ], + [ + 50, + -1 + ], + [ + 68, + -1 + ], + [ + 86, + -1 + ], + [ + 104, + -1 + ], + [ + 122, + -1 + ], + [ + 140, + -1 + ], + [ + 158, + -1 + ], + [ + 176, + -1 + ], + [ + 194, + -1 + ], + [ + 212, + -1 + ], + [ + 230, + -1 + ], + [ + 248, + -1 + ], + [ + 266, + -1 + ], + [ + 284, + -1 + ], + [ + 302, + -1 + ], + [ + 320, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 33, + 1 + ], + [ + 51, + 1 + ], + [ + 69, + 1 + ], + [ + 87, + 1 + ], + [ + 105, + 1 + ], + [ + 123, + 1 + ], + [ + 141, + 1 + ], + [ + 159, + 1 + ], + [ + 177, + 1 + ], + [ + 195, + 1 + ], + [ + 213, + 1 + ], + [ + 231, + 1 + ], + [ + 249, + 1 + ], + [ + 267, + 1 + ], + [ + 285, + 1 + ], + [ + 303, + 1 + ], + [ + 321, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 33, + -1 + ], + [ + 51, + -1 + ], + [ + 69, + -1 + ], + [ + 87, + -1 + ], + [ + 105, + -1 + ], + [ + 123, + -1 + ], + [ + 141, + -1 + ], + [ + 159, + -1 + ], + [ + 177, + -1 + ], + [ + 195, + -1 + ], + [ + 213, + -1 + ], + [ + 231, + -1 + ], + [ + 249, + -1 + ], + [ + 267, + -1 + ], + [ + 285, + -1 + ], + [ + 303, + -1 + ], + [ + 321, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 34, + 1 + ], + [ + 52, + 1 + ], + [ + 70, + 1 + ], + [ + 88, + 1 + ], + [ + 106, + 1 + ], + [ + 124, + 1 + ], + [ + 142, + 1 + ], + [ + 160, + 1 + ], + [ + 178, + 1 + ], + [ + 196, + 1 + ], + [ + 214, + 1 + ], + [ + 232, + 1 + ], + [ + 250, + 1 + ], + [ + 268, + 1 + ], + [ + 286, + 1 + ], + [ + 304, + 1 + ], + [ + 322, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 34, + -1 + ], + [ + 52, + -1 + ], + [ + 70, + -1 + ], + [ + 88, + -1 + ], + [ + 106, + -1 + ], + [ + 124, + -1 + ], + [ + 142, + -1 + ], + [ + 160, + -1 + ], + [ + 178, + -1 + ], + [ + 196, + -1 + ], + [ + 214, + -1 + ], + [ + 232, + -1 + ], + [ + 250, + -1 + ], + [ + 268, + -1 + ], + [ + 286, + -1 + ], + [ + 304, + -1 + ], + [ + 322, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 35, + 1 + ], + [ + 53, + 1 + ], + [ + 71, + 1 + ], + [ + 89, + 1 + ], + [ + 107, + 1 + ], + [ + 125, + 1 + ], + [ + 143, + 1 + ], + [ + 161, + 1 + ], + [ + 179, + 1 + ], + [ + 197, + 1 + ], + [ + 215, + 1 + ], + [ + 233, + 1 + ], + [ + 251, + 1 + ], + [ + 269, + 1 + ], + [ + 287, + 1 + ], + [ + 305, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 35, + -1 + ], + [ + 53, + -1 + ], + [ + 71, + -1 + ], + [ + 89, + -1 + ], + [ + 107, + -1 + ], + [ + 125, + -1 + ], + [ + 143, + -1 + ], + [ + 161, + -1 + ], + [ + 179, + -1 + ], + [ + 197, + -1 + ], + [ + 215, + -1 + ], + [ + 233, + -1 + ], + [ + 251, + -1 + ], + [ + 269, + -1 + ], + [ + 287, + -1 + ], + [ + 305, + -1 + ], + [ + 323, + -1 + ] + ] + } + ], + "parameters": { + "size": 18, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 324, + "variables": 324, + "rows": 72, + "nonzeros": 1296, + "globals": 0 + }, + "input_variables": 324, + "model_variables": 324, + "modelled_variables": 324, + "size_unit": "tasks" + }, + "json_sha256": "f7aec878b0d183145a18e4a617de998b1de1367b4d786aed6bd6f3c04e94ec14", + "txt_sha256": "da55d2790da690ed9f306d2169173379e76528f1c7760cdc7978b7294cdcf80a" + }, + { + "id": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "model": { + "id": "assignment_single_17", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 17, + "natural_size": 17, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 289, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 17, + 1 + ], + [ + 34, + 1 + ], + [ + 51, + 1 + ], + [ + 68, + 1 + ], + [ + 85, + 1 + ], + [ + 102, + 1 + ], + [ + 119, + 1 + ], + [ + 136, + 1 + ], + [ + 153, + 1 + ], + [ + 170, + 1 + ], + [ + 187, + 1 + ], + [ + 204, + 1 + ], + [ + 221, + 1 + ], + [ + 238, + 1 + ], + [ + 255, + 1 + ], + [ + 272, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 17, + -1 + ], + [ + 34, + -1 + ], + [ + 51, + -1 + ], + [ + 68, + -1 + ], + [ + 85, + -1 + ], + [ + 102, + -1 + ], + [ + 119, + -1 + ], + [ + 136, + -1 + ], + [ + 153, + -1 + ], + [ + 170, + -1 + ], + [ + 187, + -1 + ], + [ + 204, + -1 + ], + [ + 221, + -1 + ], + [ + 238, + -1 + ], + [ + 255, + -1 + ], + [ + 272, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 18, + 1 + ], + [ + 35, + 1 + ], + [ + 52, + 1 + ], + [ + 69, + 1 + ], + [ + 86, + 1 + ], + [ + 103, + 1 + ], + [ + 120, + 1 + ], + [ + 137, + 1 + ], + [ + 154, + 1 + ], + [ + 171, + 1 + ], + [ + 188, + 1 + ], + [ + 205, + 1 + ], + [ + 222, + 1 + ], + [ + 239, + 1 + ], + [ + 256, + 1 + ], + [ + 273, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 18, + -1 + ], + [ + 35, + -1 + ], + [ + 52, + -1 + ], + [ + 69, + -1 + ], + [ + 86, + -1 + ], + [ + 103, + -1 + ], + [ + 120, + -1 + ], + [ + 137, + -1 + ], + [ + 154, + -1 + ], + [ + 171, + -1 + ], + [ + 188, + -1 + ], + [ + 205, + -1 + ], + [ + 222, + -1 + ], + [ + 239, + -1 + ], + [ + 256, + -1 + ], + [ + 273, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 19, + 1 + ], + [ + 36, + 1 + ], + [ + 53, + 1 + ], + [ + 70, + 1 + ], + [ + 87, + 1 + ], + [ + 104, + 1 + ], + [ + 121, + 1 + ], + [ + 138, + 1 + ], + [ + 155, + 1 + ], + [ + 172, + 1 + ], + [ + 189, + 1 + ], + [ + 206, + 1 + ], + [ + 223, + 1 + ], + [ + 240, + 1 + ], + [ + 257, + 1 + ], + [ + 274, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 19, + -1 + ], + [ + 36, + -1 + ], + [ + 53, + -1 + ], + [ + 70, + -1 + ], + [ + 87, + -1 + ], + [ + 104, + -1 + ], + [ + 121, + -1 + ], + [ + 138, + -1 + ], + [ + 155, + -1 + ], + [ + 172, + -1 + ], + [ + 189, + -1 + ], + [ + 206, + -1 + ], + [ + 223, + -1 + ], + [ + 240, + -1 + ], + [ + 257, + -1 + ], + [ + 274, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 20, + 1 + ], + [ + 37, + 1 + ], + [ + 54, + 1 + ], + [ + 71, + 1 + ], + [ + 88, + 1 + ], + [ + 105, + 1 + ], + [ + 122, + 1 + ], + [ + 139, + 1 + ], + [ + 156, + 1 + ], + [ + 173, + 1 + ], + [ + 190, + 1 + ], + [ + 207, + 1 + ], + [ + 224, + 1 + ], + [ + 241, + 1 + ], + [ + 258, + 1 + ], + [ + 275, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 20, + -1 + ], + [ + 37, + -1 + ], + [ + 54, + -1 + ], + [ + 71, + -1 + ], + [ + 88, + -1 + ], + [ + 105, + -1 + ], + [ + 122, + -1 + ], + [ + 139, + -1 + ], + [ + 156, + -1 + ], + [ + 173, + -1 + ], + [ + 190, + -1 + ], + [ + 207, + -1 + ], + [ + 224, + -1 + ], + [ + 241, + -1 + ], + [ + 258, + -1 + ], + [ + 275, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 21, + 1 + ], + [ + 38, + 1 + ], + [ + 55, + 1 + ], + [ + 72, + 1 + ], + [ + 89, + 1 + ], + [ + 106, + 1 + ], + [ + 123, + 1 + ], + [ + 140, + 1 + ], + [ + 157, + 1 + ], + [ + 174, + 1 + ], + [ + 191, + 1 + ], + [ + 208, + 1 + ], + [ + 225, + 1 + ], + [ + 242, + 1 + ], + [ + 259, + 1 + ], + [ + 276, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 21, + -1 + ], + [ + 38, + -1 + ], + [ + 55, + -1 + ], + [ + 72, + -1 + ], + [ + 89, + -1 + ], + [ + 106, + -1 + ], + [ + 123, + -1 + ], + [ + 140, + -1 + ], + [ + 157, + -1 + ], + [ + 174, + -1 + ], + [ + 191, + -1 + ], + [ + 208, + -1 + ], + [ + 225, + -1 + ], + [ + 242, + -1 + ], + [ + 259, + -1 + ], + [ + 276, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 22, + 1 + ], + [ + 39, + 1 + ], + [ + 56, + 1 + ], + [ + 73, + 1 + ], + [ + 90, + 1 + ], + [ + 107, + 1 + ], + [ + 124, + 1 + ], + [ + 141, + 1 + ], + [ + 158, + 1 + ], + [ + 175, + 1 + ], + [ + 192, + 1 + ], + [ + 209, + 1 + ], + [ + 226, + 1 + ], + [ + 243, + 1 + ], + [ + 260, + 1 + ], + [ + 277, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 22, + -1 + ], + [ + 39, + -1 + ], + [ + 56, + -1 + ], + [ + 73, + -1 + ], + [ + 90, + -1 + ], + [ + 107, + -1 + ], + [ + 124, + -1 + ], + [ + 141, + -1 + ], + [ + 158, + -1 + ], + [ + 175, + -1 + ], + [ + 192, + -1 + ], + [ + 209, + -1 + ], + [ + 226, + -1 + ], + [ + 243, + -1 + ], + [ + 260, + -1 + ], + [ + 277, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 23, + 1 + ], + [ + 40, + 1 + ], + [ + 57, + 1 + ], + [ + 74, + 1 + ], + [ + 91, + 1 + ], + [ + 108, + 1 + ], + [ + 125, + 1 + ], + [ + 142, + 1 + ], + [ + 159, + 1 + ], + [ + 176, + 1 + ], + [ + 193, + 1 + ], + [ + 210, + 1 + ], + [ + 227, + 1 + ], + [ + 244, + 1 + ], + [ + 261, + 1 + ], + [ + 278, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 23, + -1 + ], + [ + 40, + -1 + ], + [ + 57, + -1 + ], + [ + 74, + -1 + ], + [ + 91, + -1 + ], + [ + 108, + -1 + ], + [ + 125, + -1 + ], + [ + 142, + -1 + ], + [ + 159, + -1 + ], + [ + 176, + -1 + ], + [ + 193, + -1 + ], + [ + 210, + -1 + ], + [ + 227, + -1 + ], + [ + 244, + -1 + ], + [ + 261, + -1 + ], + [ + 278, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 24, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 75, + 1 + ], + [ + 92, + 1 + ], + [ + 109, + 1 + ], + [ + 126, + 1 + ], + [ + 143, + 1 + ], + [ + 160, + 1 + ], + [ + 177, + 1 + ], + [ + 194, + 1 + ], + [ + 211, + 1 + ], + [ + 228, + 1 + ], + [ + 245, + 1 + ], + [ + 262, + 1 + ], + [ + 279, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 24, + -1 + ], + [ + 41, + -1 + ], + [ + 58, + -1 + ], + [ + 75, + -1 + ], + [ + 92, + -1 + ], + [ + 109, + -1 + ], + [ + 126, + -1 + ], + [ + 143, + -1 + ], + [ + 160, + -1 + ], + [ + 177, + -1 + ], + [ + 194, + -1 + ], + [ + 211, + -1 + ], + [ + 228, + -1 + ], + [ + 245, + -1 + ], + [ + 262, + -1 + ], + [ + 279, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 25, + 1 + ], + [ + 42, + 1 + ], + [ + 59, + 1 + ], + [ + 76, + 1 + ], + [ + 93, + 1 + ], + [ + 110, + 1 + ], + [ + 127, + 1 + ], + [ + 144, + 1 + ], + [ + 161, + 1 + ], + [ + 178, + 1 + ], + [ + 195, + 1 + ], + [ + 212, + 1 + ], + [ + 229, + 1 + ], + [ + 246, + 1 + ], + [ + 263, + 1 + ], + [ + 280, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 25, + -1 + ], + [ + 42, + -1 + ], + [ + 59, + -1 + ], + [ + 76, + -1 + ], + [ + 93, + -1 + ], + [ + 110, + -1 + ], + [ + 127, + -1 + ], + [ + 144, + -1 + ], + [ + 161, + -1 + ], + [ + 178, + -1 + ], + [ + 195, + -1 + ], + [ + 212, + -1 + ], + [ + 229, + -1 + ], + [ + 246, + -1 + ], + [ + 263, + -1 + ], + [ + 280, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 26, + 1 + ], + [ + 43, + 1 + ], + [ + 60, + 1 + ], + [ + 77, + 1 + ], + [ + 94, + 1 + ], + [ + 111, + 1 + ], + [ + 128, + 1 + ], + [ + 145, + 1 + ], + [ + 162, + 1 + ], + [ + 179, + 1 + ], + [ + 196, + 1 + ], + [ + 213, + 1 + ], + [ + 230, + 1 + ], + [ + 247, + 1 + ], + [ + 264, + 1 + ], + [ + 281, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 26, + -1 + ], + [ + 43, + -1 + ], + [ + 60, + -1 + ], + [ + 77, + -1 + ], + [ + 94, + -1 + ], + [ + 111, + -1 + ], + [ + 128, + -1 + ], + [ + 145, + -1 + ], + [ + 162, + -1 + ], + [ + 179, + -1 + ], + [ + 196, + -1 + ], + [ + 213, + -1 + ], + [ + 230, + -1 + ], + [ + 247, + -1 + ], + [ + 264, + -1 + ], + [ + 281, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 27, + 1 + ], + [ + 44, + 1 + ], + [ + 61, + 1 + ], + [ + 78, + 1 + ], + [ + 95, + 1 + ], + [ + 112, + 1 + ], + [ + 129, + 1 + ], + [ + 146, + 1 + ], + [ + 163, + 1 + ], + [ + 180, + 1 + ], + [ + 197, + 1 + ], + [ + 214, + 1 + ], + [ + 231, + 1 + ], + [ + 248, + 1 + ], + [ + 265, + 1 + ], + [ + 282, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 27, + -1 + ], + [ + 44, + -1 + ], + [ + 61, + -1 + ], + [ + 78, + -1 + ], + [ + 95, + -1 + ], + [ + 112, + -1 + ], + [ + 129, + -1 + ], + [ + 146, + -1 + ], + [ + 163, + -1 + ], + [ + 180, + -1 + ], + [ + 197, + -1 + ], + [ + 214, + -1 + ], + [ + 231, + -1 + ], + [ + 248, + -1 + ], + [ + 265, + -1 + ], + [ + 282, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 28, + 1 + ], + [ + 45, + 1 + ], + [ + 62, + 1 + ], + [ + 79, + 1 + ], + [ + 96, + 1 + ], + [ + 113, + 1 + ], + [ + 130, + 1 + ], + [ + 147, + 1 + ], + [ + 164, + 1 + ], + [ + 181, + 1 + ], + [ + 198, + 1 + ], + [ + 215, + 1 + ], + [ + 232, + 1 + ], + [ + 249, + 1 + ], + [ + 266, + 1 + ], + [ + 283, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 28, + -1 + ], + [ + 45, + -1 + ], + [ + 62, + -1 + ], + [ + 79, + -1 + ], + [ + 96, + -1 + ], + [ + 113, + -1 + ], + [ + 130, + -1 + ], + [ + 147, + -1 + ], + [ + 164, + -1 + ], + [ + 181, + -1 + ], + [ + 198, + -1 + ], + [ + 215, + -1 + ], + [ + 232, + -1 + ], + [ + 249, + -1 + ], + [ + 266, + -1 + ], + [ + 283, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 29, + 1 + ], + [ + 46, + 1 + ], + [ + 63, + 1 + ], + [ + 80, + 1 + ], + [ + 97, + 1 + ], + [ + 114, + 1 + ], + [ + 131, + 1 + ], + [ + 148, + 1 + ], + [ + 165, + 1 + ], + [ + 182, + 1 + ], + [ + 199, + 1 + ], + [ + 216, + 1 + ], + [ + 233, + 1 + ], + [ + 250, + 1 + ], + [ + 267, + 1 + ], + [ + 284, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 29, + -1 + ], + [ + 46, + -1 + ], + [ + 63, + -1 + ], + [ + 80, + -1 + ], + [ + 97, + -1 + ], + [ + 114, + -1 + ], + [ + 131, + -1 + ], + [ + 148, + -1 + ], + [ + 165, + -1 + ], + [ + 182, + -1 + ], + [ + 199, + -1 + ], + [ + 216, + -1 + ], + [ + 233, + -1 + ], + [ + 250, + -1 + ], + [ + 267, + -1 + ], + [ + 284, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 30, + 1 + ], + [ + 47, + 1 + ], + [ + 64, + 1 + ], + [ + 81, + 1 + ], + [ + 98, + 1 + ], + [ + 115, + 1 + ], + [ + 132, + 1 + ], + [ + 149, + 1 + ], + [ + 166, + 1 + ], + [ + 183, + 1 + ], + [ + 200, + 1 + ], + [ + 217, + 1 + ], + [ + 234, + 1 + ], + [ + 251, + 1 + ], + [ + 268, + 1 + ], + [ + 285, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 30, + -1 + ], + [ + 47, + -1 + ], + [ + 64, + -1 + ], + [ + 81, + -1 + ], + [ + 98, + -1 + ], + [ + 115, + -1 + ], + [ + 132, + -1 + ], + [ + 149, + -1 + ], + [ + 166, + -1 + ], + [ + 183, + -1 + ], + [ + 200, + -1 + ], + [ + 217, + -1 + ], + [ + 234, + -1 + ], + [ + 251, + -1 + ], + [ + 268, + -1 + ], + [ + 285, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 31, + 1 + ], + [ + 48, + 1 + ], + [ + 65, + 1 + ], + [ + 82, + 1 + ], + [ + 99, + 1 + ], + [ + 116, + 1 + ], + [ + 133, + 1 + ], + [ + 150, + 1 + ], + [ + 167, + 1 + ], + [ + 184, + 1 + ], + [ + 201, + 1 + ], + [ + 218, + 1 + ], + [ + 235, + 1 + ], + [ + 252, + 1 + ], + [ + 269, + 1 + ], + [ + 286, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 31, + -1 + ], + [ + 48, + -1 + ], + [ + 65, + -1 + ], + [ + 82, + -1 + ], + [ + 99, + -1 + ], + [ + 116, + -1 + ], + [ + 133, + -1 + ], + [ + 150, + -1 + ], + [ + 167, + -1 + ], + [ + 184, + -1 + ], + [ + 201, + -1 + ], + [ + 218, + -1 + ], + [ + 235, + -1 + ], + [ + 252, + -1 + ], + [ + 269, + -1 + ], + [ + 286, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 32, + 1 + ], + [ + 49, + 1 + ], + [ + 66, + 1 + ], + [ + 83, + 1 + ], + [ + 100, + 1 + ], + [ + 117, + 1 + ], + [ + 134, + 1 + ], + [ + 151, + 1 + ], + [ + 168, + 1 + ], + [ + 185, + 1 + ], + [ + 202, + 1 + ], + [ + 219, + 1 + ], + [ + 236, + 1 + ], + [ + 253, + 1 + ], + [ + 270, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 32, + -1 + ], + [ + 49, + -1 + ], + [ + 66, + -1 + ], + [ + 83, + -1 + ], + [ + 100, + -1 + ], + [ + 117, + -1 + ], + [ + 134, + -1 + ], + [ + 151, + -1 + ], + [ + 168, + -1 + ], + [ + 185, + -1 + ], + [ + 202, + -1 + ], + [ + 219, + -1 + ], + [ + 236, + -1 + ], + [ + 253, + -1 + ], + [ + 270, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 33, + 1 + ], + [ + 50, + 1 + ], + [ + 67, + 1 + ], + [ + 84, + 1 + ], + [ + 101, + 1 + ], + [ + 118, + 1 + ], + [ + 135, + 1 + ], + [ + 152, + 1 + ], + [ + 169, + 1 + ], + [ + 186, + 1 + ], + [ + 203, + 1 + ], + [ + 220, + 1 + ], + [ + 237, + 1 + ], + [ + 254, + 1 + ], + [ + 271, + 1 + ], + [ + 288, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 33, + -1 + ], + [ + 50, + -1 + ], + [ + 67, + -1 + ], + [ + 84, + -1 + ], + [ + 101, + -1 + ], + [ + 118, + -1 + ], + [ + 135, + -1 + ], + [ + 152, + -1 + ], + [ + 169, + -1 + ], + [ + 186, + -1 + ], + [ + 203, + -1 + ], + [ + 220, + -1 + ], + [ + 237, + -1 + ], + [ + 254, + -1 + ], + [ + 271, + -1 + ], + [ + 288, + -1 + ] + ] + } + ], + "parameters": { + "size": 17, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 289, + "variables": 289, + "rows": 68, + "nonzeros": 1156, + "globals": 0 + }, + "input_variables": 289, + "model_variables": 289, + "modelled_variables": 289, + "size_unit": "tasks" + }, + "json_sha256": "b44f5b80efe1397da234315a1f1ae2138e6aedc87e778c4795bdaa14c335192d", + "txt_sha256": "c3f64b31096e37a5d728345f26a81f4b1641f05fcdb6e0cdc24cb1fbcdab4b96" + }, + { + "id": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "model": { + "id": "facility_location_single_8", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 8, + "natural_size": 8, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 136, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28 + ], + "rows": [ + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 8, + "customers": 16, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 136, + "variables": 136, + "rows": 160, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 136, + "model_variables": 136, + "modelled_variables": 136, + "size_unit": "sites" + }, + "json_sha256": "190819fd38a9728383da6dd75a7cebdc550aa46bdf4b25c35da143c99235a6d1", + "txt_sha256": "b0f797de641e8de8333bd11212b36adb4d9df8045fdaa1e19dc69fdce0f61b35" + }, + { + "id": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "model": { + "id": "facility_location_single_16", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 528, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31, + 49, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18, + 13, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19, + 18, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27, + 12, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23, + 26, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22, + 25, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16, + 15, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20, + 15, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29, + 8, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7, + 24, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21, + 26, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9, + 28, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33, + 4, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32, + 25, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48, + 19, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25, + 8, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20, + 11, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18, + 21, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43, + 14, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12, + 35, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38, + 9, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22, + 27, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44, + 15, + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37, + 8, + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19, + 18, + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25, + 18, + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32, + 15, + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12, + 19, + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42, + 13, + 27, + 32, + 11, + 16, + 25, + 11, + 27, + 21, + 10, + 7, + 27, + 20, + 27, + 16, + 32, + 3, + 21, + 10, + 25, + 26, + 7, + 33, + 5, + 27, + 14, + 23, + 19, + 14, + 21, + 8, + 14, + 21 + ], + "rows": [ + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 300, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 301, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 302, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 303, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 304, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 305, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 306, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 307, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 308, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 309, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 310, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 311, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 312, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 313, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 314, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 315, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 316, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 317, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 318, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 319, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 320, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 321, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 322, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 323, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 324, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 325, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 326, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 327, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 328, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 329, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 330, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 331, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 332, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 333, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 334, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 335, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 336, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 337, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 338, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 339, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 340, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 341, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 342, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 343, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 344, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 345, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 346, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 347, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 348, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 349, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 350, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 351, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 352, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 353, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 354, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 355, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 356, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 357, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 358, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 359, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 360, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 361, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 362, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 363, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 364, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 365, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 366, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 367, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 368, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 369, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 370, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 371, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 372, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 373, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 374, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 375, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 376, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 377, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 378, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 379, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 380, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 381, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 382, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 383, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 384, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 385, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 386, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 387, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 388, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 389, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 390, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 391, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 392, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 393, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 394, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 395, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 396, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 397, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 398, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 399, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 400, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 401, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 402, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 403, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 404, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 405, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 406, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 407, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 408, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 409, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 410, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 411, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 412, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 413, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 414, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 415, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 416, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 417, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 418, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 419, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 420, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 421, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 422, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 423, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 424, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 425, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 426, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 427, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 428, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 429, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 430, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 431, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 432, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 433, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 434, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 435, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 436, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 437, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 438, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 439, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 440, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 441, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 442, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 443, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 444, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 445, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 446, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 447, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 448, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 449, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 450, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 451, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 452, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 453, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 454, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 455, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 456, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 457, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 458, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 459, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 460, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 461, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 462, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 463, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 464, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 465, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 466, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 467, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 468, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 469, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 470, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 471, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 472, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 473, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 474, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 475, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 476, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 477, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 478, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 479, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 480, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 481, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 482, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 483, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 484, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 485, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 486, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 487, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 488, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 489, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 490, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 491, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 492, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 493, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 494, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 495, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 496, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 497, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 498, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 499, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 500, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 501, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 502, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 503, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 504, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 505, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 506, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 507, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 508, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 509, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 510, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 511, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 512, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 513, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 514, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 515, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 516, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 517, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 518, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 519, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 520, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 521, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 522, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 523, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 524, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 525, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 526, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 527, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 16, + "customers": 32, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18, + 13 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19, + 18 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27, + 12 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23, + 26 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22, + 25 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16, + 15 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20, + 15 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29, + 8 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7, + 24 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21, + 26 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9, + 28 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33, + 4 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32, + 25 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48, + 19 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25, + 8 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20, + 11 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18, + 21 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43, + 14 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12, + 35 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38, + 9 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22, + 27 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44, + 15 + ], + [ + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37, + 8 + ], + [ + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19, + 18 + ], + [ + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25, + 18 + ], + [ + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32, + 15 + ], + [ + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12, + 19 + ], + [ + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42, + 13 + ], + [ + 27, + 32, + 11, + 16, + 25, + 11, + 27, + 21, + 10, + 7, + 27, + 20, + 27, + 16, + 32, + 3 + ], + [ + 21, + 10, + 25, + 26, + 7, + 33, + 5, + 27, + 14, + 23, + 19, + 14, + 21, + 8, + 14, + 21 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 528, + "variables": 528, + "rows": 576, + "nonzeros": 2048, + "globals": 0 + }, + "input_variables": 528, + "model_variables": 528, + "modelled_variables": 528, + "size_unit": "sites" + }, + "json_sha256": "bd68c17069291061eaaf8bfdc47804720bbf0c023502894dc39d214b396a5ee9", + "txt_sha256": "1775ee4193597c4e9921b2ba31b64f1b0a72116a2178c11589ce7ee4f1019bed" + }, + { + "id": "facility_location-12-single", + "category": "facility_location", + "size": 12, + "variant": "single", + "model": { + "id": "facility_location_single_12", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 300, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ], + "rows": [ + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 12, + "customers": 24, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 336, + "nonzeros": 1152, + "globals": 0 + }, + "input_variables": 300, + "model_variables": 300, + "modelled_variables": 300, + "size_unit": "sites" + }, + "json_sha256": "8f45cb4e67eff3884b3744f424d3bec44726b04bc9fdbc20d3543d9947a67669", + "txt_sha256": "6559cee8a28138dbf741000c629fa3e2765bc6d38642235f99ef2da3912540a1" + }, + { + "id": "facility_location-10-single", + "category": "facility_location", + "size": 10, + "variant": "single", + "model": { + "id": "facility_location_single_10", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 10, + "natural_size": 10, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 210, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14 + ], + "rows": [ + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 10, + "customers": 20, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 210, + "variables": 210, + "rows": 240, + "nonzeros": 800, + "globals": 0 + }, + "input_variables": 210, + "model_variables": 210, + "modelled_variables": 210, + "size_unit": "sites" + }, + "json_sha256": "5077f6ef8cb8e4e3e35a7ebb97ddf1c40d5e7942f003ce716a7722e673fcc6f3", + "txt_sha256": "15ab2b917a27e9a09ee3b438de882ad103e8fcde75d5784d36d4427f82aab992" + }, + { + "id": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "model": { + "id": "facility_location_single_9", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 9, + "natural_size": 9, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 171, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + "rows": [ + { + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 9, + "customers": 18, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 171, + "variables": 171, + "rows": 198, + "nonzeros": 648, + "globals": 0 + }, + "input_variables": 171, + "model_variables": 171, + "modelled_variables": 171, + "size_unit": "sites" + }, + "json_sha256": "05f7bcfa7613bffd669d5a7f96940f90cd41684099a00eadd2131825328dbac6", + "txt_sha256": "b26947191b79bcc264afbba5d5b55bc042c4a0d53b7b9306e3ac4dc38be09b03" + }, + { + "id": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "model": { + "id": "facility_location_single_7", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 7, + "natural_size": 7, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 105, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 5, + 24, + 19, + 20, + 25, + 27, + 23 + ], + "rows": [ + { + "a": [ + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 7, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 7, + "customers": 14, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 105, + "variables": 105, + "rows": 126, + "nonzeros": 392, + "globals": 0 + }, + "input_variables": 105, + "model_variables": 105, + "modelled_variables": 105, + "size_unit": "sites" + }, + "json_sha256": "753831bd59b0ab034951c719d8dcc5de1f794f093cf346034cb520c298dcbbd1", + "txt_sha256": "fd93455ff892b40231f77a40c518d0c62888464ad52ce3d08ecaf136d234b8fb" + }, + { + "id": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "model": { + "id": "bin_packing_single_16", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 102, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 16, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10 + ], + "capacity": 18, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 102, + "variables": 102, + "rows": 139, + "nonzeros": 496, + "globals": 0 + }, + "input_variables": 102, + "model_variables": 102, + "modelled_variables": 102, + "size_unit": "items" + }, + "json_sha256": "ab23b38e4f288cb36da155c3612d1c2d45815c492581fb326e5f8bb42a253c85", + "txt_sha256": "d538c983783ee5d86b07eb018f797508410b687242f61d1c7d0857059c664e6d" + }, + { + "id": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "model": { + "id": "bin_packing_single_32", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 363, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 289, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 290, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 291, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 292, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 293, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 294, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 295, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 296, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 298, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 299, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 300, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 301, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 302, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 303, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 305, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 306, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 307, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 309, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 310, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 311, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 312, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 313, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 314, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 315, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 316, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 317, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 318, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 321, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 322, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 323, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 324, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 325, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 326, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 327, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 328, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 329, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 331, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 332, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 333, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 334, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 335, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 337, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 338, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 339, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 340, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 341, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 342, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 343, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 344, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 345, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 346, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 347, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 348, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 349, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 350, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 351, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 11, + -6 + ], + [ + 22, + -3 + ], + [ + 33, + -4 + ], + [ + 44, + -7 + ], + [ + 55, + -7 + ], + [ + 66, + -6 + ], + [ + 77, + -2 + ], + [ + 88, + -3 + ], + [ + 99, + -4 + ], + [ + 110, + -4 + ], + [ + 121, + -4 + ], + [ + 132, + -8 + ], + [ + 143, + -10 + ], + [ + 154, + -7 + ], + [ + 165, + -10 + ], + [ + 176, + -3 + ], + [ + 187, + -9 + ], + [ + 198, + -6 + ], + [ + 209, + -4 + ], + [ + 220, + -6 + ], + [ + 231, + -3 + ], + [ + 242, + -5 + ], + [ + 253, + -7 + ], + [ + 264, + -8 + ], + [ + 275, + -5 + ], + [ + 286, + -9 + ], + [ + 297, + -10 + ], + [ + 308, + -9 + ], + [ + 319, + -10 + ], + [ + 330, + -4 + ], + [ + 341, + -9 + ], + [ + 352, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 12, + -6 + ], + [ + 23, + -3 + ], + [ + 34, + -4 + ], + [ + 45, + -7 + ], + [ + 56, + -7 + ], + [ + 67, + -6 + ], + [ + 78, + -2 + ], + [ + 89, + -3 + ], + [ + 100, + -4 + ], + [ + 111, + -4 + ], + [ + 122, + -4 + ], + [ + 133, + -8 + ], + [ + 144, + -10 + ], + [ + 155, + -7 + ], + [ + 166, + -10 + ], + [ + 177, + -3 + ], + [ + 188, + -9 + ], + [ + 199, + -6 + ], + [ + 210, + -4 + ], + [ + 221, + -6 + ], + [ + 232, + -3 + ], + [ + 243, + -5 + ], + [ + 254, + -7 + ], + [ + 265, + -8 + ], + [ + 276, + -5 + ], + [ + 287, + -9 + ], + [ + 298, + -10 + ], + [ + 309, + -9 + ], + [ + 320, + -10 + ], + [ + 331, + -4 + ], + [ + 342, + -9 + ], + [ + 353, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 13, + -6 + ], + [ + 24, + -3 + ], + [ + 35, + -4 + ], + [ + 46, + -7 + ], + [ + 57, + -7 + ], + [ + 68, + -6 + ], + [ + 79, + -2 + ], + [ + 90, + -3 + ], + [ + 101, + -4 + ], + [ + 112, + -4 + ], + [ + 123, + -4 + ], + [ + 134, + -8 + ], + [ + 145, + -10 + ], + [ + 156, + -7 + ], + [ + 167, + -10 + ], + [ + 178, + -3 + ], + [ + 189, + -9 + ], + [ + 200, + -6 + ], + [ + 211, + -4 + ], + [ + 222, + -6 + ], + [ + 233, + -3 + ], + [ + 244, + -5 + ], + [ + 255, + -7 + ], + [ + 266, + -8 + ], + [ + 277, + -5 + ], + [ + 288, + -9 + ], + [ + 299, + -10 + ], + [ + 310, + -9 + ], + [ + 321, + -10 + ], + [ + 332, + -4 + ], + [ + 343, + -9 + ], + [ + 354, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 14, + -6 + ], + [ + 25, + -3 + ], + [ + 36, + -4 + ], + [ + 47, + -7 + ], + [ + 58, + -7 + ], + [ + 69, + -6 + ], + [ + 80, + -2 + ], + [ + 91, + -3 + ], + [ + 102, + -4 + ], + [ + 113, + -4 + ], + [ + 124, + -4 + ], + [ + 135, + -8 + ], + [ + 146, + -10 + ], + [ + 157, + -7 + ], + [ + 168, + -10 + ], + [ + 179, + -3 + ], + [ + 190, + -9 + ], + [ + 201, + -6 + ], + [ + 212, + -4 + ], + [ + 223, + -6 + ], + [ + 234, + -3 + ], + [ + 245, + -5 + ], + [ + 256, + -7 + ], + [ + 267, + -8 + ], + [ + 278, + -5 + ], + [ + 289, + -9 + ], + [ + 300, + -10 + ], + [ + 311, + -9 + ], + [ + 322, + -10 + ], + [ + 333, + -4 + ], + [ + 344, + -9 + ], + [ + 355, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 15, + -6 + ], + [ + 26, + -3 + ], + [ + 37, + -4 + ], + [ + 48, + -7 + ], + [ + 59, + -7 + ], + [ + 70, + -6 + ], + [ + 81, + -2 + ], + [ + 92, + -3 + ], + [ + 103, + -4 + ], + [ + 114, + -4 + ], + [ + 125, + -4 + ], + [ + 136, + -8 + ], + [ + 147, + -10 + ], + [ + 158, + -7 + ], + [ + 169, + -10 + ], + [ + 180, + -3 + ], + [ + 191, + -9 + ], + [ + 202, + -6 + ], + [ + 213, + -4 + ], + [ + 224, + -6 + ], + [ + 235, + -3 + ], + [ + 246, + -5 + ], + [ + 257, + -7 + ], + [ + 268, + -8 + ], + [ + 279, + -5 + ], + [ + 290, + -9 + ], + [ + 301, + -10 + ], + [ + 312, + -9 + ], + [ + 323, + -10 + ], + [ + 334, + -4 + ], + [ + 345, + -9 + ], + [ + 356, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 16, + -6 + ], + [ + 27, + -3 + ], + [ + 38, + -4 + ], + [ + 49, + -7 + ], + [ + 60, + -7 + ], + [ + 71, + -6 + ], + [ + 82, + -2 + ], + [ + 93, + -3 + ], + [ + 104, + -4 + ], + [ + 115, + -4 + ], + [ + 126, + -4 + ], + [ + 137, + -8 + ], + [ + 148, + -10 + ], + [ + 159, + -7 + ], + [ + 170, + -10 + ], + [ + 181, + -3 + ], + [ + 192, + -9 + ], + [ + 203, + -6 + ], + [ + 214, + -4 + ], + [ + 225, + -6 + ], + [ + 236, + -3 + ], + [ + 247, + -5 + ], + [ + 258, + -7 + ], + [ + 269, + -8 + ], + [ + 280, + -5 + ], + [ + 291, + -9 + ], + [ + 302, + -10 + ], + [ + 313, + -9 + ], + [ + 324, + -10 + ], + [ + 335, + -4 + ], + [ + 346, + -9 + ], + [ + 357, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 17, + -6 + ], + [ + 28, + -3 + ], + [ + 39, + -4 + ], + [ + 50, + -7 + ], + [ + 61, + -7 + ], + [ + 72, + -6 + ], + [ + 83, + -2 + ], + [ + 94, + -3 + ], + [ + 105, + -4 + ], + [ + 116, + -4 + ], + [ + 127, + -4 + ], + [ + 138, + -8 + ], + [ + 149, + -10 + ], + [ + 160, + -7 + ], + [ + 171, + -10 + ], + [ + 182, + -3 + ], + [ + 193, + -9 + ], + [ + 204, + -6 + ], + [ + 215, + -4 + ], + [ + 226, + -6 + ], + [ + 237, + -3 + ], + [ + 248, + -5 + ], + [ + 259, + -7 + ], + [ + 270, + -8 + ], + [ + 281, + -5 + ], + [ + 292, + -9 + ], + [ + 303, + -10 + ], + [ + 314, + -9 + ], + [ + 325, + -10 + ], + [ + 336, + -4 + ], + [ + 347, + -9 + ], + [ + 358, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 18, + -6 + ], + [ + 29, + -3 + ], + [ + 40, + -4 + ], + [ + 51, + -7 + ], + [ + 62, + -7 + ], + [ + 73, + -6 + ], + [ + 84, + -2 + ], + [ + 95, + -3 + ], + [ + 106, + -4 + ], + [ + 117, + -4 + ], + [ + 128, + -4 + ], + [ + 139, + -8 + ], + [ + 150, + -10 + ], + [ + 161, + -7 + ], + [ + 172, + -10 + ], + [ + 183, + -3 + ], + [ + 194, + -9 + ], + [ + 205, + -6 + ], + [ + 216, + -4 + ], + [ + 227, + -6 + ], + [ + 238, + -3 + ], + [ + 249, + -5 + ], + [ + 260, + -7 + ], + [ + 271, + -8 + ], + [ + 282, + -5 + ], + [ + 293, + -9 + ], + [ + 304, + -10 + ], + [ + 315, + -9 + ], + [ + 326, + -10 + ], + [ + 337, + -4 + ], + [ + 348, + -9 + ], + [ + 359, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 19, + -6 + ], + [ + 30, + -3 + ], + [ + 41, + -4 + ], + [ + 52, + -7 + ], + [ + 63, + -7 + ], + [ + 74, + -6 + ], + [ + 85, + -2 + ], + [ + 96, + -3 + ], + [ + 107, + -4 + ], + [ + 118, + -4 + ], + [ + 129, + -4 + ], + [ + 140, + -8 + ], + [ + 151, + -10 + ], + [ + 162, + -7 + ], + [ + 173, + -10 + ], + [ + 184, + -3 + ], + [ + 195, + -9 + ], + [ + 206, + -6 + ], + [ + 217, + -4 + ], + [ + 228, + -6 + ], + [ + 239, + -3 + ], + [ + 250, + -5 + ], + [ + 261, + -7 + ], + [ + 272, + -8 + ], + [ + 283, + -5 + ], + [ + 294, + -9 + ], + [ + 305, + -10 + ], + [ + 316, + -9 + ], + [ + 327, + -10 + ], + [ + 338, + -4 + ], + [ + 349, + -9 + ], + [ + 360, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 20, + -6 + ], + [ + 31, + -3 + ], + [ + 42, + -4 + ], + [ + 53, + -7 + ], + [ + 64, + -7 + ], + [ + 75, + -6 + ], + [ + 86, + -2 + ], + [ + 97, + -3 + ], + [ + 108, + -4 + ], + [ + 119, + -4 + ], + [ + 130, + -4 + ], + [ + 141, + -8 + ], + [ + 152, + -10 + ], + [ + 163, + -7 + ], + [ + 174, + -10 + ], + [ + 185, + -3 + ], + [ + 196, + -9 + ], + [ + 207, + -6 + ], + [ + 218, + -4 + ], + [ + 229, + -6 + ], + [ + 240, + -3 + ], + [ + 251, + -5 + ], + [ + 262, + -7 + ], + [ + 273, + -8 + ], + [ + 284, + -5 + ], + [ + 295, + -9 + ], + [ + 306, + -10 + ], + [ + 317, + -9 + ], + [ + 328, + -10 + ], + [ + 339, + -4 + ], + [ + 350, + -9 + ], + [ + 361, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -3 + ], + [ + 21, + -6 + ], + [ + 32, + -3 + ], + [ + 43, + -4 + ], + [ + 54, + -7 + ], + [ + 65, + -7 + ], + [ + 76, + -6 + ], + [ + 87, + -2 + ], + [ + 98, + -3 + ], + [ + 109, + -4 + ], + [ + 120, + -4 + ], + [ + 131, + -4 + ], + [ + 142, + -8 + ], + [ + 153, + -10 + ], + [ + 164, + -7 + ], + [ + 175, + -10 + ], + [ + 186, + -3 + ], + [ + 197, + -9 + ], + [ + 208, + -6 + ], + [ + 219, + -4 + ], + [ + 230, + -6 + ], + [ + 241, + -3 + ], + [ + 252, + -5 + ], + [ + 263, + -7 + ], + [ + 274, + -8 + ], + [ + 285, + -5 + ], + [ + 296, + -9 + ], + [ + 307, + -10 + ], + [ + 318, + -9 + ], + [ + 329, + -10 + ], + [ + 340, + -4 + ], + [ + 351, + -9 + ], + [ + 362, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 352, + 1 + ], + [ + 353, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 353, + 1 + ], + [ + 354, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 354, + 1 + ], + [ + 355, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 355, + 1 + ], + [ + 356, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 356, + 1 + ], + [ + 357, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 357, + 1 + ], + [ + 358, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 358, + 1 + ], + [ + 359, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 359, + 1 + ], + [ + 360, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 360, + 1 + ], + [ + 361, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 361, + 1 + ], + [ + 362, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 32, + "bins": 11, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10, + 9, + 10, + 4, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 363, + "variables": 363, + "rows": 437, + "nonzeros": 1791, + "globals": 0 + }, + "input_variables": 363, + "model_variables": 363, + "modelled_variables": 363, + "size_unit": "items" + }, + "json_sha256": "7298fd6ca66193cc1f1fb3311b582f770b210321f0848497aef42640247a3e34", + "txt_sha256": "01f2b0a3fbedc211ab868a4340df6ab66f2f34e214ad28e0d79193152c93e2e5" + }, + { + "id": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "model": { + "id": "bin_packing_single_24", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 200, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 8, + -6 + ], + [ + 16, + -3 + ], + [ + 24, + -4 + ], + [ + 32, + -7 + ], + [ + 40, + -7 + ], + [ + 48, + -6 + ], + [ + 56, + -2 + ], + [ + 64, + -3 + ], + [ + 72, + -4 + ], + [ + 80, + -4 + ], + [ + 88, + -4 + ], + [ + 96, + -8 + ], + [ + 104, + -10 + ], + [ + 112, + -7 + ], + [ + 120, + -10 + ], + [ + 128, + -3 + ], + [ + 136, + -9 + ], + [ + 144, + -6 + ], + [ + 152, + -4 + ], + [ + 160, + -6 + ], + [ + 168, + -3 + ], + [ + 176, + -5 + ], + [ + 184, + -7 + ], + [ + 192, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 9, + -6 + ], + [ + 17, + -3 + ], + [ + 25, + -4 + ], + [ + 33, + -7 + ], + [ + 41, + -7 + ], + [ + 49, + -6 + ], + [ + 57, + -2 + ], + [ + 65, + -3 + ], + [ + 73, + -4 + ], + [ + 81, + -4 + ], + [ + 89, + -4 + ], + [ + 97, + -8 + ], + [ + 105, + -10 + ], + [ + 113, + -7 + ], + [ + 121, + -10 + ], + [ + 129, + -3 + ], + [ + 137, + -9 + ], + [ + 145, + -6 + ], + [ + 153, + -4 + ], + [ + 161, + -6 + ], + [ + 169, + -3 + ], + [ + 177, + -5 + ], + [ + 185, + -7 + ], + [ + 193, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 10, + -6 + ], + [ + 18, + -3 + ], + [ + 26, + -4 + ], + [ + 34, + -7 + ], + [ + 42, + -7 + ], + [ + 50, + -6 + ], + [ + 58, + -2 + ], + [ + 66, + -3 + ], + [ + 74, + -4 + ], + [ + 82, + -4 + ], + [ + 90, + -4 + ], + [ + 98, + -8 + ], + [ + 106, + -10 + ], + [ + 114, + -7 + ], + [ + 122, + -10 + ], + [ + 130, + -3 + ], + [ + 138, + -9 + ], + [ + 146, + -6 + ], + [ + 154, + -4 + ], + [ + 162, + -6 + ], + [ + 170, + -3 + ], + [ + 178, + -5 + ], + [ + 186, + -7 + ], + [ + 194, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 11, + -6 + ], + [ + 19, + -3 + ], + [ + 27, + -4 + ], + [ + 35, + -7 + ], + [ + 43, + -7 + ], + [ + 51, + -6 + ], + [ + 59, + -2 + ], + [ + 67, + -3 + ], + [ + 75, + -4 + ], + [ + 83, + -4 + ], + [ + 91, + -4 + ], + [ + 99, + -8 + ], + [ + 107, + -10 + ], + [ + 115, + -7 + ], + [ + 123, + -10 + ], + [ + 131, + -3 + ], + [ + 139, + -9 + ], + [ + 147, + -6 + ], + [ + 155, + -4 + ], + [ + 163, + -6 + ], + [ + 171, + -3 + ], + [ + 179, + -5 + ], + [ + 187, + -7 + ], + [ + 195, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 12, + -6 + ], + [ + 20, + -3 + ], + [ + 28, + -4 + ], + [ + 36, + -7 + ], + [ + 44, + -7 + ], + [ + 52, + -6 + ], + [ + 60, + -2 + ], + [ + 68, + -3 + ], + [ + 76, + -4 + ], + [ + 84, + -4 + ], + [ + 92, + -4 + ], + [ + 100, + -8 + ], + [ + 108, + -10 + ], + [ + 116, + -7 + ], + [ + 124, + -10 + ], + [ + 132, + -3 + ], + [ + 140, + -9 + ], + [ + 148, + -6 + ], + [ + 156, + -4 + ], + [ + 164, + -6 + ], + [ + 172, + -3 + ], + [ + 180, + -5 + ], + [ + 188, + -7 + ], + [ + 196, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 13, + -6 + ], + [ + 21, + -3 + ], + [ + 29, + -4 + ], + [ + 37, + -7 + ], + [ + 45, + -7 + ], + [ + 53, + -6 + ], + [ + 61, + -2 + ], + [ + 69, + -3 + ], + [ + 77, + -4 + ], + [ + 85, + -4 + ], + [ + 93, + -4 + ], + [ + 101, + -8 + ], + [ + 109, + -10 + ], + [ + 117, + -7 + ], + [ + 125, + -10 + ], + [ + 133, + -3 + ], + [ + 141, + -9 + ], + [ + 149, + -6 + ], + [ + 157, + -4 + ], + [ + 165, + -6 + ], + [ + 173, + -3 + ], + [ + 181, + -5 + ], + [ + 189, + -7 + ], + [ + 197, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 14, + -6 + ], + [ + 22, + -3 + ], + [ + 30, + -4 + ], + [ + 38, + -7 + ], + [ + 46, + -7 + ], + [ + 54, + -6 + ], + [ + 62, + -2 + ], + [ + 70, + -3 + ], + [ + 78, + -4 + ], + [ + 86, + -4 + ], + [ + 94, + -4 + ], + [ + 102, + -8 + ], + [ + 110, + -10 + ], + [ + 118, + -7 + ], + [ + 126, + -10 + ], + [ + 134, + -3 + ], + [ + 142, + -9 + ], + [ + 150, + -6 + ], + [ + 158, + -4 + ], + [ + 166, + -6 + ], + [ + 174, + -3 + ], + [ + 182, + -5 + ], + [ + 190, + -7 + ], + [ + 198, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 15, + -6 + ], + [ + 23, + -3 + ], + [ + 31, + -4 + ], + [ + 39, + -7 + ], + [ + 47, + -7 + ], + [ + 55, + -6 + ], + [ + 63, + -2 + ], + [ + 71, + -3 + ], + [ + 79, + -4 + ], + [ + 87, + -4 + ], + [ + 95, + -4 + ], + [ + 103, + -8 + ], + [ + 111, + -10 + ], + [ + 119, + -7 + ], + [ + 127, + -10 + ], + [ + 135, + -3 + ], + [ + 143, + -9 + ], + [ + 151, + -6 + ], + [ + 159, + -4 + ], + [ + 167, + -6 + ], + [ + 175, + -3 + ], + [ + 183, + -5 + ], + [ + 191, + -7 + ], + [ + 199, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 24, + "bins": 8, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 200, + "variables": 200, + "rows": 255, + "nonzeros": 982, + "globals": 0 + }, + "input_variables": 200, + "model_variables": 200, + "modelled_variables": 200, + "size_unit": "items" + }, + "json_sha256": "24dd85d59f39979fed67f9b991924b3423436ea4aeb2e92fcb264123bb515c33", + "txt_sha256": "531a3642198ce1cecaeffef4bc352a18bce764f34fec4107354599527f2d2268" + }, + { + "id": "bin_packing-20-single", + "category": "bin_packing", + "size": 20, + "variant": "single", + "model": { + "id": "bin_packing_single_20", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 147, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 7, + -6 + ], + [ + 14, + -3 + ], + [ + 21, + -4 + ], + [ + 28, + -7 + ], + [ + 35, + -7 + ], + [ + 42, + -6 + ], + [ + 49, + -2 + ], + [ + 56, + -3 + ], + [ + 63, + -4 + ], + [ + 70, + -4 + ], + [ + 77, + -4 + ], + [ + 84, + -8 + ], + [ + 91, + -10 + ], + [ + 98, + -7 + ], + [ + 105, + -10 + ], + [ + 112, + -3 + ], + [ + 119, + -9 + ], + [ + 126, + -6 + ], + [ + 133, + -4 + ], + [ + 140, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 8, + -6 + ], + [ + 15, + -3 + ], + [ + 22, + -4 + ], + [ + 29, + -7 + ], + [ + 36, + -7 + ], + [ + 43, + -6 + ], + [ + 50, + -2 + ], + [ + 57, + -3 + ], + [ + 64, + -4 + ], + [ + 71, + -4 + ], + [ + 78, + -4 + ], + [ + 85, + -8 + ], + [ + 92, + -10 + ], + [ + 99, + -7 + ], + [ + 106, + -10 + ], + [ + 113, + -3 + ], + [ + 120, + -9 + ], + [ + 127, + -6 + ], + [ + 134, + -4 + ], + [ + 141, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 9, + -6 + ], + [ + 16, + -3 + ], + [ + 23, + -4 + ], + [ + 30, + -7 + ], + [ + 37, + -7 + ], + [ + 44, + -6 + ], + [ + 51, + -2 + ], + [ + 58, + -3 + ], + [ + 65, + -4 + ], + [ + 72, + -4 + ], + [ + 79, + -4 + ], + [ + 86, + -8 + ], + [ + 93, + -10 + ], + [ + 100, + -7 + ], + [ + 107, + -10 + ], + [ + 114, + -3 + ], + [ + 121, + -9 + ], + [ + 128, + -6 + ], + [ + 135, + -4 + ], + [ + 142, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 10, + -6 + ], + [ + 17, + -3 + ], + [ + 24, + -4 + ], + [ + 31, + -7 + ], + [ + 38, + -7 + ], + [ + 45, + -6 + ], + [ + 52, + -2 + ], + [ + 59, + -3 + ], + [ + 66, + -4 + ], + [ + 73, + -4 + ], + [ + 80, + -4 + ], + [ + 87, + -8 + ], + [ + 94, + -10 + ], + [ + 101, + -7 + ], + [ + 108, + -10 + ], + [ + 115, + -3 + ], + [ + 122, + -9 + ], + [ + 129, + -6 + ], + [ + 136, + -4 + ], + [ + 143, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 11, + -6 + ], + [ + 18, + -3 + ], + [ + 25, + -4 + ], + [ + 32, + -7 + ], + [ + 39, + -7 + ], + [ + 46, + -6 + ], + [ + 53, + -2 + ], + [ + 60, + -3 + ], + [ + 67, + -4 + ], + [ + 74, + -4 + ], + [ + 81, + -4 + ], + [ + 88, + -8 + ], + [ + 95, + -10 + ], + [ + 102, + -7 + ], + [ + 109, + -10 + ], + [ + 116, + -3 + ], + [ + 123, + -9 + ], + [ + 130, + -6 + ], + [ + 137, + -4 + ], + [ + 144, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 12, + -6 + ], + [ + 19, + -3 + ], + [ + 26, + -4 + ], + [ + 33, + -7 + ], + [ + 40, + -7 + ], + [ + 47, + -6 + ], + [ + 54, + -2 + ], + [ + 61, + -3 + ], + [ + 68, + -4 + ], + [ + 75, + -4 + ], + [ + 82, + -4 + ], + [ + 89, + -8 + ], + [ + 96, + -10 + ], + [ + 103, + -7 + ], + [ + 110, + -10 + ], + [ + 117, + -3 + ], + [ + 124, + -9 + ], + [ + 131, + -6 + ], + [ + 138, + -4 + ], + [ + 145, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 13, + -6 + ], + [ + 20, + -3 + ], + [ + 27, + -4 + ], + [ + 34, + -7 + ], + [ + 41, + -7 + ], + [ + 48, + -6 + ], + [ + 55, + -2 + ], + [ + 62, + -3 + ], + [ + 69, + -4 + ], + [ + 76, + -4 + ], + [ + 83, + -4 + ], + [ + 90, + -8 + ], + [ + 97, + -10 + ], + [ + 104, + -7 + ], + [ + 111, + -10 + ], + [ + 118, + -3 + ], + [ + 125, + -9 + ], + [ + 132, + -6 + ], + [ + 139, + -4 + ], + [ + 146, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 20, + "bins": 7, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 147, + "variables": 147, + "rows": 193, + "nonzeros": 719, + "globals": 0 + }, + "input_variables": 147, + "model_variables": 147, + "modelled_variables": 147, + "size_unit": "items" + }, + "json_sha256": "b5d72feb251cc62e4b1c353c37ede0f507cc1ac353616644ce4209204957e9b1", + "txt_sha256": "3d1a49d86dbbb883d09f09d54c4116fb90d16b689421cade8a0f1d0fde16b0b5" + }, + { + "id": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "model": { + "id": "bin_packing_single_18", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 114, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + -3 + ], + [ + 102, + -9 + ], + [ + 108, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + -3 + ], + [ + 103, + -9 + ], + [ + 109, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + -3 + ], + [ + 104, + -9 + ], + [ + 110, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + -3 + ], + [ + 105, + -9 + ], + [ + 111, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + -3 + ], + [ + 106, + -9 + ], + [ + 112, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + -3 + ], + [ + 107, + -9 + ], + [ + 113, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 18, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 114, + "variables": 114, + "rows": 155, + "nonzeros": 556, + "globals": 0 + }, + "input_variables": 114, + "model_variables": 114, + "modelled_variables": 114, + "size_unit": "items" + }, + "json_sha256": "be46d22bc3c55ef31810dbe72abf6ae58cfbec40d59051e862a7cd96d5fc5d21", + "txt_sha256": "28c54c1da14a556c1c8a807af4ab9fc0101d60cda4f326a87cdc956a3a97996b" + }, + { + "id": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "model": { + "id": "bin_packing_single_17", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 17, + "natural_size": 17, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 108, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + -3 + ], + [ + 102, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + -3 + ], + [ + 103, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + -3 + ], + [ + 104, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + -3 + ], + [ + 105, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + -3 + ], + [ + 106, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + -3 + ], + [ + 107, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 17, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 108, + "variables": 108, + "rows": 147, + "nonzeros": 526, + "globals": 0 + }, + "input_variables": 108, + "model_variables": 108, + "modelled_variables": 108, + "size_unit": "items" + }, + "json_sha256": "f75e648545e33e44bf4163a7f18a9fa95454d344ff7db1c908ee483b4179e808", + "txt_sha256": "5575c3d1e1c847bc377f83c6385231d828429df31165b3390f48f4e88bfcfc68" + }, + { + "id": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "model": { + "id": "production_single_6", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 6, + "natural_size": 6, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 48, + "c": [ + 0, + 39, + 59, + 79, + 99, + 124, + 149, + 174, + 0, + 45, + 72, + 99, + 126, + 158, + 190, + 222, + 0, + 30, + 50, + 70, + 90, + 115, + 140, + 165, + 0, + 29, + 49, + 69, + 89, + 114, + 139, + 164, + 0, + 25, + 33, + 41, + 49, + 62, + 75, + 88, + 0, + 28, + 43, + 58, + 73, + 93, + 113, + 133 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -21 + } + ], + "parameters": { + "periods": 6, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ] + ], + "objective_constant": -273, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 26, + "nonzeros": 474, + "globals": 0 + }, + "input_variables": 48, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "periods" + }, + "json_sha256": "7864f7faacb3d0f63222f9b9ceff7a3f4a41175f5bc473eef250e29d39586b20", + "txt_sha256": "be37c1e132cdd71a4ade9f6b65fc49f1a5dc7c1efe62aabb83a686f3f6bcefc0" + }, + { + "id": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "model": { + "id": "production_single_12", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 96, + "c": [ + 0, + 57, + 95, + 133, + 171, + 214, + 257, + 300, + 0, + 63, + 108, + 153, + 198, + 248, + 298, + 348, + 0, + 48, + 86, + 124, + 162, + 205, + 248, + 291, + 0, + 47, + 85, + 123, + 161, + 204, + 247, + 290, + 0, + 43, + 69, + 95, + 121, + 152, + 183, + 214, + 0, + 46, + 79, + 112, + 145, + 183, + 221, + 259, + 0, + 34, + 62, + 90, + 118, + 151, + 184, + 217, + 0, + 38, + 64, + 90, + 116, + 147, + 178, + 209, + 0, + 26, + 42, + 58, + 74, + 95, + 116, + 137, + 0, + 25, + 45, + 65, + 85, + 110, + 135, + 160, + 0, + 25, + 34, + 43, + 52, + 66, + 80, + 94, + 0, + 26, + 41, + 56, + 71, + 91, + 111, + 131 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -48 + } + ], + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "input_variables": 96, + "model_variables": 96, + "modelled_variables": 96, + "size_unit": "periods" + }, + "json_sha256": "d281e652807ad9c43e43e86c393a53ae7a5eeb0fcff04480f6dc20f02cd03df9", + "txt_sha256": "766f8af6b209308f8c82f23a8473f99e66ba425dfb8621a08d0cb04418045b0a" + }, + { + "id": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "model": { + "id": "production_single_9", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 9, + "natural_size": 9, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 72, + "c": [ + 0, + 48, + 77, + 106, + 135, + 169, + 203, + 237, + 0, + 54, + 90, + 126, + 162, + 203, + 244, + 285, + 0, + 39, + 68, + 97, + 126, + 160, + 194, + 228, + 0, + 38, + 67, + 96, + 125, + 159, + 193, + 227, + 0, + 34, + 51, + 68, + 85, + 107, + 129, + 151, + 0, + 37, + 61, + 85, + 109, + 138, + 167, + 196, + 0, + 25, + 44, + 63, + 82, + 106, + 130, + 154, + 0, + 29, + 46, + 63, + 80, + 102, + 124, + 146, + 0, + 17, + 24, + 31, + 38, + 50, + 62, + 74 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -34 + } + ], + "parameters": { + "periods": 9, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ] + ], + "objective_constant": -543, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 72, + "variables": 72, + "rows": 38, + "nonzeros": 900, + "globals": 0 + }, + "input_variables": 72, + "model_variables": 72, + "modelled_variables": 72, + "size_unit": "periods" + }, + "json_sha256": "7c386f79595e743d7548ae2910e2bd6267d1b71cdcaeb2ff6b82ff68b6eb0d61", + "txt_sha256": "a0fe8195644a3981517c066266ad3c5832a52321ffc351c92c59b51b25ea5cf9" + }, + { + "id": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "model": { + "id": "production_single_10", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 10, + "natural_size": 10, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 80, + "c": [ + 0, + 51, + 83, + 115, + 147, + 184, + 221, + 258, + 0, + 57, + 96, + 135, + 174, + 218, + 262, + 306, + 0, + 42, + 74, + 106, + 138, + 175, + 212, + 249, + 0, + 41, + 73, + 105, + 137, + 174, + 211, + 248, + 0, + 37, + 57, + 77, + 97, + 122, + 147, + 172, + 0, + 40, + 67, + 94, + 121, + 153, + 185, + 217, + 0, + 28, + 50, + 72, + 94, + 121, + 148, + 175, + 0, + 32, + 52, + 72, + 92, + 117, + 142, + 167, + 0, + 20, + 30, + 40, + 50, + 65, + 80, + 95, + 0, + 19, + 33, + 47, + 61, + 80, + 99, + 118 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -41 + } + ], + "parameters": { + "periods": 10, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ] + ], + "objective_constant": -666, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 80, + "variables": 80, + "rows": 42, + "nonzeros": 1070, + "globals": 0 + }, + "input_variables": 80, + "model_variables": 80, + "modelled_variables": 80, + "size_unit": "periods" + }, + "json_sha256": "bed882f860a8d70c56548ddf90ff112c1ea1c2da262714bf01ee02c5352a2305", + "txt_sha256": "900d70bcbdf298300876b33867d2e76a16c4d5385a6e1677cf4648e2aefdb6e8" + }, + { + "id": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "model": { + "id": "production_single_11", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 11, + "natural_size": 11, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 88, + "c": [ + 0, + 54, + 89, + 124, + 159, + 199, + 239, + 279, + 0, + 60, + 102, + 144, + 186, + 233, + 280, + 327, + 0, + 45, + 80, + 115, + 150, + 190, + 230, + 270, + 0, + 44, + 79, + 114, + 149, + 189, + 229, + 269, + 0, + 40, + 63, + 86, + 109, + 137, + 165, + 193, + 0, + 43, + 73, + 103, + 133, + 168, + 203, + 238, + 0, + 31, + 56, + 81, + 106, + 136, + 166, + 196, + 0, + 35, + 58, + 81, + 104, + 132, + 160, + 188, + 0, + 23, + 36, + 49, + 62, + 80, + 98, + 116, + 0, + 22, + 39, + 56, + 73, + 95, + 117, + 139, + 0, + 22, + 28, + 34, + 40, + 51, + 62, + 73 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -45 + } + ], + "parameters": { + "periods": 11, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ] + ], + "objective_constant": -801, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 88, + "variables": 88, + "rows": 46, + "nonzeros": 1254, + "globals": 0 + }, + "input_variables": 88, + "model_variables": 88, + "modelled_variables": 88, + "size_unit": "periods" + }, + "json_sha256": "697e33f65e86285e0b3537f962c1597cdd592ddea4e658966636b59e087f5285", + "txt_sha256": "b04d76d9245e929c364a91e45d55f97f510b018e7cc14c42f4390d1f21ac6446" + }, + { + "id": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "model": { + "id": "native_tsp_single_16", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 16, + "size": 16, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0 + ] + ], + "parameters": { + "size": 16 + }, + "dimensions": { + "input_variables": 16, + "variables": 32, + "rows": 0, + "nonzeros": 0, + "globals": 17 + }, + "input_variables": 16, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "cities" + }, + "json_sha256": "121e140c9a4565bf0bd95d7d1880c59a52fc77688d7c1bd48a2e24995569de02", + "txt_sha256": "3ea0e6d39fe10c3f3f27d4d03c536036a771ae1a2a052702ca4648ed8e4e6492" + }, + { + "id": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "model": { + "id": "native_tsp_single_32", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "size": 32, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70, + 21, + 39, + 85, + 16, + 42, + 125, + 76, + 85, + 36, + 145 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40, + 103, + 81, + 53, + 96, + 68, + 17, + 34, + 73, + 76, + 41 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56, + 97, + 115, + 13, + 92, + 78, + 53, + 58, + 11, + 112, + 105 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96, + 65, + 43, + 139, + 60, + 74, + 99, + 94, + 159, + 40, + 75 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 62, + 40, + 130, + 55, + 65, + 90, + 85, + 150, + 35, + 78 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64, + 91, + 69, + 107, + 84, + 56, + 67, + 62, + 127, + 64, + 49 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39, + 80, + 98, + 20, + 75, + 61, + 60, + 41, + 26, + 95, + 88 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90, + 153, + 131, + 75, + 146, + 118, + 35, + 84, + 89, + 126, + 25 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47, + 80, + 58, + 90, + 73, + 45, + 50, + 45, + 110, + 53, + 60 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 58, + 36, + 130, + 51, + 65, + 90, + 85, + 150, + 31, + 82 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77, + 140, + 118, + 62, + 133, + 105, + 22, + 71, + 70, + 113, + 44 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 84, + 62, + 130, + 77, + 65, + 90, + 85, + 150, + 57, + 56 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24, + 65, + 83, + 39, + 60, + 46, + 79, + 30, + 41, + 80, + 99 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84, + 95, + 73, + 127, + 88, + 62, + 87, + 82, + 147, + 68, + 45 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70, + 133, + 111, + 55, + 126, + 98, + 15, + 64, + 59, + 106, + 55 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50, + 67, + 45, + 93, + 60, + 32, + 53, + 48, + 113, + 40, + 73 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37, + 42, + 60, + 52, + 37, + 23, + 92, + 43, + 64, + 57, + 112 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60, + 123, + 101, + 45, + 116, + 88, + 7, + 54, + 55, + 96, + 59 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26, + 67, + 85, + 19, + 62, + 48, + 55, + 28, + 39, + 82, + 75 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46, + 27, + 45, + 61, + 22, + 18, + 101, + 52, + 79, + 42, + 121 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32, + 73, + 91, + 21, + 68, + 54, + 61, + 34, + 33, + 88, + 81 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0, + 64, + 60, + 44, + 57, + 29, + 56, + 7, + 64, + 57, + 76 + ], + [ + 21, + 103, + 97, + 65, + 62, + 91, + 80, + 153, + 80, + 58, + 140, + 84, + 65, + 95, + 133, + 67, + 42, + 123, + 67, + 27, + 73, + 64, + 0, + 23, + 85, + 8, + 36, + 119, + 70, + 105, + 28, + 139 + ], + [ + 39, + 81, + 115, + 43, + 40, + 69, + 98, + 131, + 58, + 36, + 118, + 62, + 83, + 73, + 111, + 45, + 60, + 101, + 85, + 45, + 91, + 60, + 23, + 0, + 103, + 24, + 38, + 97, + 58, + 123, + 6, + 117 + ], + [ + 85, + 53, + 13, + 139, + 130, + 107, + 20, + 75, + 90, + 130, + 62, + 130, + 39, + 127, + 55, + 93, + 52, + 45, + 19, + 61, + 21, + 44, + 85, + 103, + 0, + 80, + 66, + 41, + 46, + 21, + 100, + 93 + ], + [ + 16, + 96, + 92, + 60, + 55, + 84, + 75, + 146, + 73, + 51, + 133, + 77, + 60, + 88, + 126, + 60, + 37, + 116, + 62, + 22, + 68, + 57, + 8, + 24, + 80, + 0, + 29, + 112, + 63, + 100, + 21, + 132 + ], + [ + 42, + 68, + 78, + 74, + 65, + 56, + 61, + 118, + 45, + 65, + 105, + 65, + 46, + 62, + 98, + 32, + 23, + 88, + 48, + 18, + 54, + 29, + 36, + 38, + 66, + 29, + 0, + 84, + 35, + 86, + 35, + 104 + ], + [ + 125, + 17, + 53, + 99, + 90, + 67, + 60, + 35, + 50, + 90, + 22, + 90, + 79, + 87, + 15, + 53, + 92, + 7, + 55, + 101, + 61, + 56, + 119, + 97, + 41, + 112, + 84, + 0, + 50, + 61, + 92, + 53 + ], + [ + 76, + 34, + 58, + 94, + 85, + 62, + 41, + 84, + 45, + 85, + 71, + 85, + 30, + 82, + 64, + 48, + 43, + 54, + 28, + 52, + 34, + 7, + 70, + 58, + 46, + 63, + 35, + 50, + 0, + 66, + 55, + 70 + ], + [ + 85, + 73, + 11, + 159, + 150, + 127, + 26, + 89, + 110, + 150, + 70, + 150, + 41, + 147, + 59, + 113, + 64, + 55, + 39, + 79, + 33, + 64, + 105, + 123, + 21, + 100, + 86, + 61, + 66, + 0, + 120, + 113 + ], + [ + 36, + 76, + 112, + 40, + 35, + 64, + 95, + 126, + 53, + 31, + 113, + 57, + 80, + 68, + 106, + 40, + 57, + 96, + 82, + 42, + 88, + 57, + 28, + 6, + 100, + 21, + 35, + 92, + 55, + 120, + 0, + 112 + ], + [ + 145, + 41, + 105, + 75, + 78, + 49, + 88, + 25, + 60, + 82, + 44, + 56, + 99, + 45, + 55, + 73, + 112, + 59, + 75, + 121, + 81, + 76, + 139, + 117, + 93, + 132, + 104, + 53, + 70, + 113, + 112, + 0 + ] + ], + "parameters": { + "size": 32 + }, + "dimensions": { + "input_variables": 32, + "variables": 64, + "rows": 0, + "nonzeros": 0, + "globals": 33 + }, + "input_variables": 32, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "cities" + }, + "json_sha256": "d10241d34fc8901bfa98d4aae944975bedc9f381a5e89e4cca8bf8ab2a52f354", + "txt_sha256": "e48910606a4762b47870e83936ddeebee40f030d343524c3f502e4f63ffe4746" + }, + { + "id": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "model": { + "id": "native_tsp_single_24", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 24, + "size": 24, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70, + 21, + 39 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40, + 103, + 81 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56, + 97, + 115 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96, + 65, + 43 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 62, + 40 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64, + 91, + 69 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39, + 80, + 98 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90, + 153, + 131 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47, + 80, + 58 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 58, + 36 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77, + 140, + 118 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 84, + 62 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24, + 65, + 83 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84, + 95, + 73 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70, + 133, + 111 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50, + 67, + 45 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37, + 42, + 60 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60, + 123, + 101 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26, + 67, + 85 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46, + 27, + 45 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32, + 73, + 91 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0, + 64, + 60 + ], + [ + 21, + 103, + 97, + 65, + 62, + 91, + 80, + 153, + 80, + 58, + 140, + 84, + 65, + 95, + 133, + 67, + 42, + 123, + 67, + 27, + 73, + 64, + 0, + 23 + ], + [ + 39, + 81, + 115, + 43, + 40, + 69, + 98, + 131, + 58, + 36, + 118, + 62, + 83, + 73, + 111, + 45, + 60, + 101, + 85, + 45, + 91, + 60, + 23, + 0 + ] + ], + "parameters": { + "size": 24 + }, + "dimensions": { + "input_variables": 24, + "variables": 48, + "rows": 0, + "nonzeros": 0, + "globals": 25 + }, + "input_variables": 24, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "cities" + }, + "json_sha256": "293e12a1e1e1fd89c14ef8da9435bfdfec0f21da0fa7ed3e39a4453393b8df0f", + "txt_sha256": "33c69492ea94c1dc978650b54ee6717641d377404e4a3bdddd0cc8bff1b3d80c" + }, + { + "id": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "model": { + "id": "native_tsp_single_20", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 20, + "size": 20, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0 + ] + ], + "parameters": { + "size": 20 + }, + "dimensions": { + "input_variables": 20, + "variables": 40, + "rows": 0, + "nonzeros": 0, + "globals": 21 + }, + "input_variables": 20, + "model_variables": 40, + "modelled_variables": 40, + "size_unit": "cities" + }, + "json_sha256": "8c783de32bb0b170f986d61ded202e1c9c2c3b8d629c6a04e1c8cb007c328811", + "txt_sha256": "8d944a60ff4a02e0147d31b941ab120bedff9260a4b8ae6cad3ae9ae3049d62d" + }, + { + "id": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "model": { + "id": "native_tsp_single_22", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 22, + "natural_size": 22, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 22, + "size": 22, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0 + ] + ], + "parameters": { + "size": 22 + }, + "dimensions": { + "input_variables": 22, + "variables": 44, + "rows": 0, + "nonzeros": 0, + "globals": 23 + }, + "input_variables": 22, + "model_variables": 44, + "modelled_variables": 44, + "size_unit": "cities" + }, + "json_sha256": "5e238ec4bfcba52720af6fbd752c9fb24a833d44a833526624a6fb4b603685d9", + "txt_sha256": "d6da030ef84ccc18e6b2c899f783c5451e5dfaecbae502b2f93d510048668045" + }, + { + "id": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "model": { + "id": "native_tsp_single_21", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 21, + "natural_size": 21, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 21, + "size": 21, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0 + ] + ], + "parameters": { + "size": 21 + }, + "dimensions": { + "input_variables": 21, + "variables": 42, + "rows": 0, + "nonzeros": 0, + "globals": 22 + }, + "input_variables": 21, + "model_variables": 42, + "modelled_variables": 42, + "size_unit": "cities" + }, + "json_sha256": "1ffb0456495705677709a48968ca92a8fd15e0caf1cec1a35ff0fdbb2e929a9c", + "txt_sha256": "896abb9ed75bba7251ec62f8a52e1b6d9c295f411a534e5756ea185f12a5719b" + }, + { + "id": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "model": { + "id": "weighted_queens_single_12", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 12, + "size": 12, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10 + ] + ], + "parameters": { + "size": 12 + }, + "dimensions": { + "input_variables": 12, + "variables": 48, + "rows": 24, + "nonzeros": 48, + "globals": 15 + }, + "input_variables": 12, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "queens" + }, + "json_sha256": "24f11216157b9fa653aad18549ecf9e273dc78a97269251c6594cf68b15bee41", + "txt_sha256": "54882e539a49f6fbad775422f801a03194cc224560b7dfa52f8c8b662b1b2384" + }, + { + "id": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "model": { + "id": "weighted_queens_single_24", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 24, + "size": 24, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24, + 36, + 41 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43, + 35, + 30 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2, + 24, + 28 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33, + 24, + 37 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43, + 38, + 39 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30, + 3, + 19 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31, + 17, + 49 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22, + 20, + 49 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6, + 32, + 17 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24, + 9, + 29 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36, + 31, + 45 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35, + 21, + 23 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19, + 21, + 28 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43, + 9, + 50 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35, + 37, + 43 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17, + 26, + 33 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48, + 50, + 27 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48, + 7, + 6 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17, + 7, + 12 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12, + 41, + 46 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7, + 48, + 15 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4, + 32, + 5 + ], + [ + 35, + 36, + 36, + 42, + 10, + 28, + 35, + 37, + 12, + 30, + 26, + 1, + 13, + 13, + 46, + 45, + 40, + 14, + 14, + 11, + 38, + 29, + 49, + 11 + ], + [ + 1, + 10, + 17, + 8, + 12, + 34, + 10, + 22, + 43, + 46, + 43, + 26, + 34, + 16, + 17, + 42, + 42, + 43, + 49, + 49, + 3, + 7, + 29, + 47 + ] + ], + "parameters": { + "size": 24 + }, + "dimensions": { + "input_variables": 24, + "variables": 96, + "rows": 48, + "nonzeros": 96, + "globals": 27 + }, + "input_variables": 24, + "model_variables": 96, + "modelled_variables": 96, + "size_unit": "queens" + }, + "json_sha256": "f0747cdd4c707787111f4add6d5203db3b0d7ee72677fa8587f3ac6860b27508", + "txt_sha256": "9946060eafc937524e83ffb72b2597b6c55751e7c46f497e89080842e48f8112" + }, + { + "id": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "model": { + "id": "weighted_queens_single_18", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 18, + "size": 18, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24 + ] + ], + "parameters": { + "size": 18 + }, + "dimensions": { + "input_variables": 18, + "variables": 72, + "rows": 36, + "nonzeros": 72, + "globals": 21 + }, + "input_variables": 18, + "model_variables": 72, + "modelled_variables": 72, + "size_unit": "queens" + }, + "json_sha256": "dc98fb609b6d1fcb64a690e1759c3f5e9602191e307ff4847ae9106cdaf09293", + "txt_sha256": "e5423ecc66be6cd244a1198880f311c60b745cbefe401d21859382e5cfce31fd" + }, + { + "id": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "model": { + "id": "weighted_queens_single_21", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 21, + "natural_size": 21, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 21, + "size": 21, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46 + ] + ], + "parameters": { + "size": 21 + }, + "dimensions": { + "input_variables": 21, + "variables": 84, + "rows": 42, + "nonzeros": 84, + "globals": 24 + }, + "input_variables": 21, + "model_variables": 84, + "modelled_variables": 84, + "size_unit": "queens" + }, + "json_sha256": "badd42498e3f6c0600eec3e3eb55fb9e44a9b6977db1612e41e42fafc485013e", + "txt_sha256": "e472cdac1f5b96e5b4cf33d88905e3f70963d2135556b8cca452d3aab512b446" + }, + { + "id": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "model": { + "id": "weighted_queens_single_22", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 22, + "natural_size": 22, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 22, + "size": 22, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4 + ] + ], + "parameters": { + "size": 22 + }, + "dimensions": { + "input_variables": 22, + "variables": 88, + "rows": 44, + "nonzeros": 88, + "globals": 25 + }, + "input_variables": 22, + "model_variables": 88, + "modelled_variables": 88, + "size_unit": "queens" + }, + "json_sha256": "9e8b11d1d2cf5ca8212c52c2c01e57620982fb2276d2039a1c2a54bb7fdfdd83", + "txt_sha256": "91e669c247c7697ddbe01782db8e862417dfa7edd312a2e9b5dcf08e9fa55f8b" + }, + { + "id": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "model": { + "id": "weighted_queens_single_23", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 23, + "natural_size": 23, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 23, + "size": 23, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24, + 36 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43, + 35 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2, + 24 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33, + 24 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43, + 38 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30, + 3 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31, + 17 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22, + 20 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6, + 32 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24, + 9 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36, + 31 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35, + 21 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19, + 21 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43, + 9 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35, + 37 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17, + 26 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48, + 50 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48, + 7 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17, + 7 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12, + 41 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7, + 48 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4, + 32 + ], + [ + 35, + 36, + 36, + 42, + 10, + 28, + 35, + 37, + 12, + 30, + 26, + 1, + 13, + 13, + 46, + 45, + 40, + 14, + 14, + 11, + 38, + 29, + 49 + ] + ], + "parameters": { + "size": 23 + }, + "dimensions": { + "input_variables": 23, + "variables": 92, + "rows": 46, + "nonzeros": 92, + "globals": 26 + }, + "input_variables": 23, + "model_variables": 92, + "modelled_variables": 92, + "size_unit": "queens" + }, + "json_sha256": "c17e1b78bdf74203a9ecb42c886dcebbf402a4551b3c93c16739c1a2c5457b14", + "txt_sha256": "585bd834efa6c69ccd15c62368f371a059c4c54984f17eee16b6c242e32b1ec3" + } + ], + "records": [ + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 0, + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.0344343750000462, + "offset_end": 0.09908237499985262, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 770, + "stderr_bytes_observed": 98249, + "external_seconds": 0.06444250000004104, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.003506875, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000109625, + "solve_seconds": 0.003506875, + "driver_seconds": 0.003655583, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 0, + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.11400499999990643, + "offset_end": 0.17151595799987263, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.05736191699998017, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004248959, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.9542e-05, + "solve_seconds": 0.004248959, + "driver_seconds": 0.004351959, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.189065957999901, + "offset_end": 0.5648320410000451, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 861, + "stderr_bytes_observed": 0, + "external_seconds": 0.3755527079999865, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.366026333, + "objective": -1096, + "best_bound": -1096, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.6e-05, + "solve_seconds": 0.366026333, + "driver_seconds": 0.36609975, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.5687104159999308, + "offset_end": 8.210579625000037, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 862, + "stderr_bytes_observed": 0, + "external_seconds": 7.641714708999871, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 7.631108458, + "objective": -312, + "best_bound": -312, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.7375e-05, + "solve_seconds": 7.631108458, + "driver_seconds": 7.631190417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 8.215174082999965, + "offset_end": 18.22597695799982, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 967, + "stderr_bytes_observed": 0, + "external_seconds": 10.010440166999842, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000113375, + "objective": -1999, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -1999, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.7375e-05, + "solve_seconds": 10.000113375, + "driver_seconds": 10.000206041, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 18.230791290999832, + "offset_end": 28.241295415999957, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 972, + "stderr_bytes_observed": 0, + "external_seconds": 10.010409084000003, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000081541, + "objective": -531, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -531, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 8.8833e-05, + "solve_seconds": 10.000081541, + "driver_seconds": 10.000197416, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-48-uncorrelated", + "category": "knapsack", + "size": 48, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 28.24708854100004, + "offset_end": 38.27066474999992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 909, + "stderr_bytes_observed": 0, + "external_seconds": 10.023482416999968, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000054375, + "objective": -1481, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 1, + "model_globals": 0, + "objective": -1481, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 7.7292e-05, + "solve_seconds": 10.000054375, + "driver_seconds": 10.000154042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-48-correlated", + "category": "knapsack", + "size": 48, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 38.27588962499999, + "offset_end": 48.32520754099983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 902, + "stderr_bytes_observed": 0, + "external_seconds": 10.049052291999942, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000090125, + "objective": -458, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 1, + "model_globals": 0, + "objective": -458, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.0625e-05, + "solve_seconds": 10.000090125, + "driver_seconds": 10.000174291, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-40-uncorrelated", + "category": "knapsack", + "size": 40, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 48.33234791599989, + "offset_end": 58.34423512499984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 883, + "stderr_bytes_observed": 0, + "external_seconds": 10.011706250000088, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000091958, + "objective": -1283, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 40, + "model_rows": 1, + "model_globals": 0, + "objective": -1283, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 5.025e-05, + "solve_seconds": 10.000091958, + "driver_seconds": 10.000166333, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-40-correlated", + "category": "knapsack", + "size": 40, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 58.35018049999985, + "offset_end": 68.36169866599994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 864, + "stderr_bytes_observed": 0, + "external_seconds": 10.01133512499996, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000092167, + "objective": -396, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 40, + "model_rows": 1, + "model_globals": 0, + "objective": -396, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 5.7833e-05, + "solve_seconds": 10.000092167, + "driver_seconds": 10.00017825, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-36-uncorrelated", + "category": "knapsack", + "size": 36, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 68.3694049579999, + "offset_end": 70.18084554099983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 899, + "stderr_bytes_observed": 0, + "external_seconds": 1.8112767920001716, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.801108708, + "objective": -1177, + "best_bound": -1177, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 1, + "model_globals": 0, + "objective": -1177, + "best_bound": -1177, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.7125e-05, + "solve_seconds": 1.801108708, + "driver_seconds": 1.80119525, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-36-correlated", + "category": "knapsack", + "size": 36, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 70.18735724999988, + "offset_end": 80.19695191599999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 854, + "stderr_bytes_observed": 0, + "external_seconds": 10.009265791999951, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000080875, + "objective": -361, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 1, + "model_globals": 0, + "objective": -361, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 4.7875e-05, + "solve_seconds": 10.000080875, + "driver_seconds": 10.000161625, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-uncorrelated", + "category": "knapsack", + "size": 34, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 80.20520454099983, + "offset_end": 81.00834491599994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 893, + "stderr_bytes_observed": 0, + "external_seconds": 0.8029804590000822, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.793636458, + "objective": -1139, + "best_bound": -1139, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -1139, + "best_bound": -1139, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.4417e-05, + "solve_seconds": 0.793636458, + "driver_seconds": 0.793748042, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-correlated", + "category": "knapsack", + "size": 34, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 81.015396625, + "offset_end": 91.0242888329999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 858, + "stderr_bytes_observed": 0, + "external_seconds": 10.00847445799991, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000084084, + "objective": -339, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -339, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 5.2958e-05, + "solve_seconds": 10.000084084, + "driver_seconds": 10.000168417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-uncorrelated", + "category": "knapsack", + "size": 33, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 91.03324891599982, + "offset_end": 91.362929291, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 889, + "stderr_bytes_observed": 0, + "external_seconds": 0.32918304200006787, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.318225042, + "objective": -1114, + "best_bound": -1114, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -1114, + "best_bound": -1114, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.0416e-05, + "solve_seconds": 0.318225042, + "driver_seconds": 0.318308291, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-correlated", + "category": "knapsack", + "size": 33, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 91.37039962499989, + "offset_end": 101.36978770799988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 878, + "stderr_bytes_observed": 0, + "external_seconds": 9.999182000000019, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.990155417, + "objective": -325, + "best_bound": -325, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -325, + "best_bound": -325, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.7041e-05, + "solve_seconds": 9.990155417, + "driver_seconds": 9.990253375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 101.37869887499983, + "offset_end": 101.7341295409999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 874, + "stderr_bytes_observed": 0, + "external_seconds": 0.3553117910000765, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.336872166, + "objective": -1096, + "best_bound": -1096, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000190667, + "solve_seconds": 0.336872166, + "driver_seconds": 0.337093042, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 101.74606649999987, + "offset_end": 109.42490212500002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 881, + "stderr_bytes_observed": 0, + "external_seconds": 7.678694583000151, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 7.661121958, + "objective": -312, + "best_bound": -312, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000257583, + "solve_seconds": 7.661121958, + "driver_seconds": 7.661410083, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-uncorrelated", + "category": "knapsack", + "size": 33, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 109.43207237499996, + "offset_end": 109.76437983300002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 881, + "stderr_bytes_observed": 0, + "external_seconds": 0.3319199170000502, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.321217791, + "objective": -1114, + "best_bound": -1114, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -1114, + "best_bound": -1114, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000204541, + "solve_seconds": 0.321217791, + "driver_seconds": 0.321444375, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-correlated", + "category": "knapsack", + "size": 33, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 109.76974158300004, + "offset_end": 119.51030891599999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 873, + "stderr_bytes_observed": 0, + "external_seconds": 9.740344250000135, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.730254792, + "objective": -325, + "best_bound": -325, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -325, + "best_bound": -325, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.1041e-05, + "solve_seconds": 9.730254792, + "driver_seconds": 9.730365416, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-uncorrelated", + "category": "knapsack", + "size": 34, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.51735320800003, + "offset_end": 120.25617029099999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 882, + "stderr_bytes_observed": 0, + "external_seconds": 0.7385709999998653, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.728449667, + "objective": -1139, + "best_bound": -1139, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -1139, + "best_bound": -1139, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000264708, + "solve_seconds": 0.728449667, + "driver_seconds": 0.728742417, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-correlated", + "category": "knapsack", + "size": 34, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 120.26162416599982, + "offset_end": 130.2706713749999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 852, + "stderr_bytes_observed": 0, + "external_seconds": 10.008876957999973, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000057375, + "objective": -339, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -339, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000253583, + "solve_seconds": 10.000057375, + "driver_seconds": 10.000335458, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.27848374999985, + "offset_end": 130.30050099999994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 889, + "stderr_bytes_observed": 0, + "external_seconds": 0.021924459000047136, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002337833, + "objective": -1096, + "best_bound": -1096, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.4583e-05, + "solve_seconds": 0.002337833, + "driver_seconds": 0.002457083, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.3060734579999, + "offset_end": 130.31526008299988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 889, + "stderr_bytes_observed": 0, + "external_seconds": 0.009070667000059984, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000284458, + "objective": -312, + "best_bound": -312, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.1667e-05, + "solve_seconds": 0.000284458, + "driver_seconds": 0.00035225, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.3226763329999, + "offset_end": 130.33185570799992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1008, + "stderr_bytes_observed": 0, + "external_seconds": 0.00907941699983894, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000836666, + "objective": -2355, + "best_bound": -2355, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -2355, + "best_bound": -2355, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000417459, + "solve_seconds": 0.000836666, + "driver_seconds": 0.001274292, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.33762858299997, + "offset_end": 130.34680408299982, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1016, + "stderr_bytes_observed": 0, + "external_seconds": 0.009078250000129628, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000833, + "objective": -613, + "best_bound": -613, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -613, + "best_bound": -613, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000284792, + "solve_seconds": 0.000833, + "driver_seconds": 0.001141292, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-128-uncorrelated", + "category": "knapsack", + "size": 128, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.35837770800003, + "offset_end": 130.37018158299998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1262, + "stderr_bytes_observed": 0, + "external_seconds": 0.011662957999988066, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0028385, + "objective": -4318, + "best_bound": -4318, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.1875e-05, + "solve_seconds": 0.0028385, + "driver_seconds": 0.002921041, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-128-correlated", + "category": "knapsack", + "size": 128, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.380664625, + "offset_end": 130.39241179099986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1264, + "stderr_bytes_observed": 0, + "external_seconds": 0.011602250000123604, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002774334, + "objective": -1211, + "best_bound": -1211, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.7583e-05, + "solve_seconds": 0.002774334, + "driver_seconds": 0.002848958, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-256-uncorrelated", + "category": "knapsack", + "size": 256, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.40670095799987, + "offset_end": 130.42600508299984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1775, + "stderr_bytes_observed": 0, + "external_seconds": 0.019181582999863167, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.010759541, + "objective": -9157, + "best_bound": -9157, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -9157, + "best_bound": -9157, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.9042e-05, + "solve_seconds": 0.010759541, + "driver_seconds": 0.010866875, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-256-correlated", + "category": "knapsack", + "size": 256, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 130.4391216659999, + "offset_end": 130.45868099999984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1775, + "stderr_bytes_observed": 0, + "external_seconds": 0.019409666999990804, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.011009541, + "objective": -2397, + "best_bound": -2397, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -2397, + "best_bound": -2397, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.9417e-05, + "solve_seconds": 0.011009541, + "driver_seconds": 0.011123417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 130.47921508299987, + "offset_end": 140.49025537499983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2767, + "stderr_bytes_observed": 0, + "external_seconds": 10.010857417000125, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000309792, + "objective": -11574, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000142291, + "solve_seconds": 10.000309792, + "driver_seconds": 10.000476916, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 140.50965237499986, + "offset_end": 150.52121883299992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2755, + "stderr_bytes_observed": 0, + "external_seconds": 10.011384833999955, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000527166, + "objective": -4104, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -4104, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000151958, + "solve_seconds": 10.000527166, + "driver_seconds": 10.000710667, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-384-uncorrelated", + "category": "knapsack", + "size": 384, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 150.54834445799997, + "offset_end": 150.58320545799984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2287, + "stderr_bytes_observed": 0, + "external_seconds": 0.034760624999989886, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.02490675, + "objective": -13832, + "best_bound": -13832, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000152041, + "solve_seconds": 0.02490675, + "driver_seconds": 0.025086791, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-384-correlated", + "category": "knapsack", + "size": 384, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 150.60652779099996, + "offset_end": 150.6412479579999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2276, + "stderr_bytes_observed": 0, + "external_seconds": 0.034584249999852545, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.024178167, + "objective": -3648, + "best_bound": -3648, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000114542, + "solve_seconds": 0.024178167, + "driver_seconds": 0.024312167, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-448-uncorrelated", + "category": "knapsack", + "size": 448, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 150.67491491600003, + "offset_end": 160.68493716599983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2491, + "stderr_bytes_observed": 0, + "external_seconds": 10.009755999999925, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000232167, + "objective": -9749, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 448, + "model_rows": 1, + "model_globals": 0, + "objective": -9749, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0001215, + "solve_seconds": 10.000232167, + "driver_seconds": 10.000378541, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-448-correlated", + "category": "knapsack", + "size": 448, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 160.71223824999993, + "offset_end": 170.72496095799988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2499, + "stderr_bytes_observed": 0, + "external_seconds": 10.012551457999962, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000173625, + "objective": -3617, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 448, + "model_rows": 1, + "model_globals": 0, + "objective": -3617, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000164334, + "solve_seconds": 10.000173625, + "driver_seconds": 10.000365625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-416-uncorrelated", + "category": "knapsack", + "size": 416, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 170.76361729099995, + "offset_end": 180.77512412499982, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2382, + "stderr_bytes_observed": 0, + "external_seconds": 10.010991916999956, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000206958, + "objective": -8891, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 416, + "model_rows": 1, + "model_globals": 0, + "objective": -8891, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000151792, + "solve_seconds": 10.000206958, + "driver_seconds": 10.000384542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-416-correlated", + "category": "knapsack", + "size": 416, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 180.80676399999993, + "offset_end": 190.81735587499998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2370, + "stderr_bytes_observed": 0, + "external_seconds": 10.010401959000092, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00022175, + "objective": -3320, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 416, + "model_rows": 1, + "model_globals": 0, + "objective": -3320, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000158417, + "solve_seconds": 10.00022175, + "driver_seconds": 10.00040925, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-400-uncorrelated", + "category": "knapsack", + "size": 400, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 190.863183833, + "offset_end": 190.9006583329999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2333, + "stderr_bytes_observed": 0, + "external_seconds": 0.03729220900004293, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026535125, + "objective": -14402, + "best_bound": -14402, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -14402, + "best_bound": -14402, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000137167, + "solve_seconds": 0.026535125, + "driver_seconds": 0.026697959, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-400-correlated", + "category": "knapsack", + "size": 400, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 190.93733462499995, + "offset_end": 190.97459716599997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2338, + "stderr_bytes_observed": 0, + "external_seconds": 0.037137875000098575, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026804333, + "objective": -3797, + "best_bound": -3797, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -3797, + "best_bound": -3797, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001205, + "solve_seconds": 0.026804333, + "driver_seconds": 0.026951417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 191.02456029099994, + "offset_end": 201.03570858299986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2356, + "stderr_bytes_observed": 0, + "external_seconds": 10.010856541000066, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000205917, + "objective": -8628, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8628, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000124834, + "solve_seconds": 10.000205917, + "driver_seconds": 10.000359834, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 201.077253208, + "offset_end": 211.08722612499992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2350, + "stderr_bytes_observed": 0, + "external_seconds": 10.009748916000035, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000214708, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0001655, + "solve_seconds": 10.000214708, + "driver_seconds": 10.000410667, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-404-uncorrelated", + "category": "knapsack", + "size": 404, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.14421937499992, + "offset_end": 211.1819741249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2367, + "stderr_bytes_observed": 0, + "external_seconds": 0.03754249999997228, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027242458, + "objective": -14476, + "best_bound": -14476, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -14476, + "best_bound": -14476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000140958, + "solve_seconds": 0.027242458, + "driver_seconds": 0.027408541, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-404-correlated", + "category": "knapsack", + "size": 404, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.2268261659999, + "offset_end": 211.26446487499993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2376, + "stderr_bytes_observed": 0, + "external_seconds": 0.03746333300000515, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026925, + "objective": -3828, + "best_bound": -3828, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -3828, + "best_bound": -3828, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000124667, + "solve_seconds": 0.026925, + "driver_seconds": 0.027076917, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.32747879099998, + "offset_end": 211.36463387499998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2386, + "stderr_bytes_observed": 0, + "external_seconds": 0.03702662499995313, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026822166, + "objective": -14512, + "best_bound": -14512, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -14512, + "best_bound": -14512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000222125, + "solve_seconds": 0.026822166, + "driver_seconds": 0.027065708, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.41336116599996, + "offset_end": 211.45068249999986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2384, + "stderr_bytes_observed": 0, + "external_seconds": 0.03707662499982689, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026989792, + "objective": -3844, + "best_bound": -3844, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -3844, + "best_bound": -3844, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000126875, + "solve_seconds": 0.026989792, + "driver_seconds": 0.027145542, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.51789337499986, + "offset_end": 211.55575, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2379, + "stderr_bytes_observed": 0, + "external_seconds": 0.03761916700000256, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.02762575, + "objective": -14531, + "best_bound": -14531, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -14531, + "best_bound": -14531, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000119667, + "solve_seconds": 0.02762575, + "driver_seconds": 0.027769542, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.61073312500002, + "offset_end": 211.64890970800002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2365, + "stderr_bytes_observed": 0, + "external_seconds": 0.038015582999832986, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027906959, + "objective": -3858, + "best_bound": -3858, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -3858, + "best_bound": -3858, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00018275, + "solve_seconds": 0.027906959, + "driver_seconds": 0.0281135, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.70245241599991, + "offset_end": 211.73795695800004, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2386, + "stderr_bytes_observed": 0, + "external_seconds": 0.03535312500002874, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0267175, + "objective": -14512, + "best_bound": -14512, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -14512, + "best_bound": -14512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000143458, + "solve_seconds": 0.0267175, + "driver_seconds": 0.026881958, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.77421620799987, + "offset_end": 211.81221566599993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2375, + "stderr_bytes_observed": 0, + "external_seconds": 0.037760624999918946, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.02731175, + "objective": -3844, + "best_bound": -3844, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -3844, + "best_bound": -3844, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001385, + "solve_seconds": 0.02731175, + "driver_seconds": 0.027470833, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.86676375000002, + "offset_end": 211.90493179099985, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2381, + "stderr_bytes_observed": 0, + "external_seconds": 0.03796854200004418, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027882292, + "objective": -14531, + "best_bound": -14531, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -14531, + "best_bound": -14531, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000123875, + "solve_seconds": 0.027882292, + "driver_seconds": 0.028031542, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 211.94429187499986, + "offset_end": 211.98288912499993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2388, + "stderr_bytes_observed": 0, + "external_seconds": 0.03835833299990554, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027626625, + "objective": -3858, + "best_bound": -3858, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -3858, + "best_bound": -3858, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000123458, + "solve_seconds": 0.027626625, + "driver_seconds": 0.027772416, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 212.03723583299984, + "offset_end": 222.04832929099985, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2356, + "stderr_bytes_observed": 0, + "external_seconds": 10.010937209000076, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000122709, + "objective": -8628, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8628, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000368125, + "solve_seconds": 10.000122709, + "driver_seconds": 10.000515417, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 222.0869063329999, + "offset_end": 232.10035237499983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2356, + "stderr_bytes_observed": 0, + "external_seconds": 10.013199875000055, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000248, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000178334, + "solve_seconds": 10.000248, + "driver_seconds": 10.000450084, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-uncorrelated", + "category": "knapsack", + "size": 33, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 232.17505666600005, + "offset_end": 232.18555658299988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 884, + "stderr_bytes_observed": 0, + "external_seconds": 0.010329875000024913, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000504916, + "objective": -1114, + "best_bound": -1114, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -1114, + "best_bound": -1114, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000198167, + "solve_seconds": 0.000504916, + "driver_seconds": 0.000721459, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-33-correlated", + "category": "knapsack", + "size": 33, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 232.225164791, + "offset_end": 232.23575141599986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 882, + "stderr_bytes_observed": 0, + "external_seconds": 0.01038183399987247, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00029225, + "objective": -325, + "best_bound": -325, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 33, + "model_rows": 1, + "model_globals": 0, + "objective": -325, + "best_bound": -325, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000263083, + "solve_seconds": 0.00029225, + "driver_seconds": 0.000571583, + "assignment": [ + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-uncorrelated", + "category": "knapsack", + "size": 34, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 232.29136787499988, + "offset_end": 232.30196808300002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 877, + "stderr_bytes_observed": 0, + "external_seconds": 0.01037820900000952, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000343625, + "objective": -1139, + "best_bound": -1139, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -1139, + "best_bound": -1139, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000288292, + "solve_seconds": 0.000343625, + "driver_seconds": 0.000658334, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "knapsack-34-correlated", + "category": "knapsack", + "size": 34, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 232.339535458, + "offset_end": 232.34988687500004, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 897, + "stderr_bytes_observed": 0, + "external_seconds": 0.010250916000131838, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000337, + "objective": -339, + "best_bound": -339, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 34, + "model_rows": 1, + "model_globals": 0, + "objective": -339, + "best_bound": -339, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000323625, + "solve_seconds": 0.000337, + "driver_seconds": 0.000682708, + "assignment": [ + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 232.429831875, + "offset_end": 235.44576483299988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1766, + "stderr_bytes_observed": 0, + "external_seconds": 3.0157879999999295, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.99661925, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000200125, + "solve_seconds": 2.99661925, + "driver_seconds": 2.996852542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 235.53778079099993, + "offset_end": 245.551561666, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4816, + "stderr_bytes_observed": 0, + "external_seconds": 10.013655208000046, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000940083, + "objective": 1197, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 1024, + "model_rows": 128, + "model_globals": 0, + "objective": 1197, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000501208, + "solve_seconds": 10.000940083, + "driver_seconds": 10.00146575, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 245.66021941600002, + "offset_end": 255.671803833, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3015, + "stderr_bytes_observed": 0, + "external_seconds": 10.011424000000034, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000194792, + "objective": 579, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 576, + "model_rows": 96, + "model_globals": 0, + "objective": 579, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000358375, + "solve_seconds": 10.000194792, + "driver_seconds": 10.000582375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-20-single", + "category": "assignment", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 255.78431258299997, + "offset_end": 265.79805783300003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2317, + "stderr_bytes_observed": 0, + "external_seconds": 10.013124542000014, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000104417, + "objective": 334, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 80, + "model_globals": 0, + "objective": 334, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000317875, + "solve_seconds": 10.000104417, + "driver_seconds": 10.000449625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 265.91692479099993, + "offset_end": 275.9291509999998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2019, + "stderr_bytes_observed": 0, + "external_seconds": 10.012012582999887, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000096875, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000270625, + "solve_seconds": 10.000096875, + "driver_seconds": 10.000396375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 276.04824262499983, + "offset_end": 283.0126882079999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1909, + "stderr_bytes_observed": 0, + "external_seconds": 6.964192292000007, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.951927916, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000209542, + "solve_seconds": 6.951927916, + "driver_seconds": 6.952171542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 283.106613166, + "offset_end": 286.1234387499999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1759, + "stderr_bytes_observed": 0, + "external_seconds": 3.0165181249999478, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.005960666, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000336542, + "solve_seconds": 3.005960666, + "driver_seconds": 3.006325459, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 286.21456483299994, + "offset_end": 293.16725591599993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1909, + "stderr_bytes_observed": 0, + "external_seconds": 6.952360833000057, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.940994125, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000189334, + "solve_seconds": 6.940994125, + "driver_seconds": 6.941214417, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 293.2596119579998, + "offset_end": 303.27082333299995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2008, + "stderr_bytes_observed": 0, + "external_seconds": 10.01095783300002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000108125, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000310709, + "solve_seconds": 10.000108125, + "driver_seconds": 10.000442167, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 303.36443095799996, + "offset_end": 306.3843206249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1770, + "stderr_bytes_observed": 0, + "external_seconds": 3.019652292000046, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.001406667, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000328083, + "solve_seconds": 3.001406667, + "driver_seconds": 3.001770042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 306.4775931659999, + "offset_end": 316.4962741659999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4816, + "stderr_bytes_observed": 0, + "external_seconds": 10.015625499999942, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.001041375, + "objective": 1197, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 1024, + "model_rows": 128, + "model_globals": 0, + "objective": 1197, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000944042, + "solve_seconds": 10.001041375, + "driver_seconds": 10.002007584, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 316.59411183299994, + "offset_end": 326.60684033300004, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3021, + "stderr_bytes_observed": 0, + "external_seconds": 10.012336541999957, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000191583, + "objective": 579, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 576, + "model_rows": 96, + "model_globals": 0, + "objective": 579, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000583916, + "solve_seconds": 10.000191583, + "driver_seconds": 10.000800708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-20-single", + "category": "assignment", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 326.701104, + "offset_end": 336.71429862499986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2298, + "stderr_bytes_observed": 0, + "external_seconds": 10.01306062499998, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000139167, + "objective": 334, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 80, + "model_globals": 0, + "objective": 334, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000463666, + "solve_seconds": 10.000139167, + "driver_seconds": 10.0006355, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 336.8109246659999, + "offset_end": 345.7443350409999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2019, + "stderr_bytes_observed": 0, + "external_seconds": 8.81914658300002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 25.724303041, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000373042, + "solve_seconds": 25.724303041, + "driver_seconds": 25.724782209, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 346.095850958, + "offset_end": 353.36615004099986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1902, + "stderr_bytes_observed": 0, + "external_seconds": 7.270079708999901, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 7.247717542, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000356333, + "solve_seconds": 7.247717542, + "driver_seconds": 7.248111958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 353.46466633299997, + "offset_end": 356.557195375, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1777, + "stderr_bytes_observed": 0, + "external_seconds": 3.092247499999985, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.081120875, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000313875, + "solve_seconds": 3.081120875, + "driver_seconds": 3.081467375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 356.654996666, + "offset_end": 363.7628037909999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1895, + "stderr_bytes_observed": 0, + "external_seconds": 7.107636749999983, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 7.095456083, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000203, + "solve_seconds": 7.095456083, + "driver_seconds": 7.095689875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 363.86285795799995, + "offset_end": 373.87469583300003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2013, + "stderr_bytes_observed": 0, + "external_seconds": 10.01137266600017, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000075625, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000422917, + "solve_seconds": 10.000075625, + "driver_seconds": 10.000528333, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 374.1043918329999, + "offset_end": 376.86906633299986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1286, + "stderr_bytes_observed": 0, + "external_seconds": 2.7643737079999937, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.74313325, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00021525, + "solve_seconds": 2.74313325, + "driver_seconds": 2.743382125, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 377.0121341249999, + "offset_end": 387.02480187499987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2830, + "stderr_bytes_observed": 0, + "external_seconds": 10.012380792000158, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000581708, + "objective": 519, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 528, + "model_rows": 576, + "model_globals": 0, + "objective": 519, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000409917, + "solve_seconds": 10.000581708, + "driver_seconds": 10.001016292, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-12-single", + "category": "facility_location", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 387.1773160829998, + "offset_end": 397.18796966599984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1924, + "stderr_bytes_observed": 0, + "external_seconds": 10.01041024999995, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000089, + "objective": 435, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000276209, + "solve_seconds": 10.000089, + "driver_seconds": 10.000390292, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-10-single", + "category": "facility_location", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 397.3441291659999, + "offset_end": 407.35629274999997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1540, + "stderr_bytes_observed": 0, + "external_seconds": 10.011937458000148, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000099041, + "objective": 341, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 210, + "model_rows": 240, + "model_globals": 0, + "objective": 341, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00021425, + "solve_seconds": 10.000099041, + "driver_seconds": 10.000348875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 407.5119487909999, + "offset_end": 417.52219549999995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1408, + "stderr_bytes_observed": 0, + "external_seconds": 10.010114582999904, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000119917, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0001745, + "solve_seconds": 10.000119917, + "driver_seconds": 10.000324125, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 417.6812051249999, + "offset_end": 418.14439920799987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1176, + "stderr_bytes_observed": 0, + "external_seconds": 0.462737000000061, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.447378959, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000142042, + "solve_seconds": 0.447378959, + "driver_seconds": 0.447544167, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 418.2243504579999, + "offset_end": 418.6931442079999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1176, + "stderr_bytes_observed": 0, + "external_seconds": 0.4684185409998918, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.457358833, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000116584, + "solve_seconds": 0.457358833, + "driver_seconds": 0.457502417, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 418.81546108299995, + "offset_end": 421.547394083, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1286, + "stderr_bytes_observed": 0, + "external_seconds": 2.731606791999866, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.72108825, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00044475, + "solve_seconds": 2.72108825, + "driver_seconds": 2.721572625, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 421.69150120799986, + "offset_end": 431.70421191599985, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1397, + "stderr_bytes_observed": 0, + "external_seconds": 10.012526209000043, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000550666, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000161917, + "solve_seconds": 10.000550666, + "driver_seconds": 10.000748834, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 431.82802108299984, + "offset_end": 434.5653458749998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1287, + "stderr_bytes_observed": 0, + "external_seconds": 2.7371699169998465, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.710419583, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000312541, + "solve_seconds": 2.710419583, + "driver_seconds": 2.710777291, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 434.68744074999995, + "offset_end": 444.7012567909999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2824, + "stderr_bytes_observed": 0, + "external_seconds": 10.0136697920002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.001519917, + "objective": 519, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 528, + "model_rows": 576, + "model_globals": 0, + "objective": 519, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00068, + "solve_seconds": 10.001519917, + "driver_seconds": 10.002226666, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-12-single", + "category": "facility_location", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 444.82260491600005, + "offset_end": 454.83711666599993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1898, + "stderr_bytes_observed": 0, + "external_seconds": 10.014346542000112, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000129583, + "objective": 435, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000428, + "solve_seconds": 10.000129583, + "driver_seconds": 10.000594625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-10-single", + "category": "facility_location", + "size": 10, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 454.959531666, + "offset_end": 464.97234133300003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1564, + "stderr_bytes_observed": 0, + "external_seconds": 10.012644207999983, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000100125, + "objective": 341, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 210, + "model_rows": 240, + "model_globals": 0, + "objective": 341, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000384333, + "solve_seconds": 10.000100125, + "driver_seconds": 10.000518791, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 465.09521645799987, + "offset_end": 475.108311833, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1402, + "stderr_bytes_observed": 0, + "external_seconds": 10.012898833999998, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000098666, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000330167, + "solve_seconds": 10.000098666, + "driver_seconds": 10.000475833, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 475.24448566599995, + "offset_end": 475.6968345, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1176, + "stderr_bytes_observed": 0, + "external_seconds": 0.45204229199998736, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.437260375, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000336292, + "solve_seconds": 0.437260375, + "driver_seconds": 0.437630792, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 475.78185333299984, + "offset_end": 476.2106699159999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1164, + "stderr_bytes_observed": 0, + "external_seconds": 0.42863599999986945, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.417743083, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00011375, + "solve_seconds": 0.417743083, + "driver_seconds": 0.417884667, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 476.334840666, + "offset_end": 479.33162874999994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1284, + "stderr_bytes_observed": 0, + "external_seconds": 2.9965372080000634, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.982930541, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000367875, + "solve_seconds": 2.982930541, + "driver_seconds": 2.983412333, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 479.459772791, + "offset_end": 489.47166249999987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1395, + "stderr_bytes_observed": 0, + "external_seconds": 10.01168800000005, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000087083, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000167458, + "solve_seconds": 10.000087083, + "driver_seconds": 10.00029675, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 489.76323249999996, + "offset_end": 490.61285483300003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.8494536670000343, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.829643709, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000277125, + "solve_seconds": 0.829643709, + "driver_seconds": 0.829953, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 490.7879533749999, + "offset_end": 500.7998997499999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2163, + "stderr_bytes_observed": 0, + "external_seconds": 10.011788832999855, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000884541, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 363, + "model_rows": 437, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00033375, + "solve_seconds": 10.000884541, + "driver_seconds": 10.001258875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 500.9795335409999, + "offset_end": 510.99404374999995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1516, + "stderr_bytes_observed": 0, + "external_seconds": 10.014304625000022, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000125917, + "objective": 7, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 200, + "model_rows": 255, + "model_globals": 0, + "objective": 7, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000265333, + "solve_seconds": 10.000125917, + "driver_seconds": 10.000426083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-20-single", + "category": "bin_packing", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 511.176875291, + "offset_end": 521.1912070829999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1287, + "stderr_bytes_observed": 0, + "external_seconds": 10.014005458999918, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000443916, + "objective": 6, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 147, + "model_rows": 193, + "model_globals": 0, + "objective": 6, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000228834, + "solve_seconds": 10.000443916, + "driver_seconds": 10.000730917, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 521.386168708, + "offset_end": 531.3998904999999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1161, + "stderr_bytes_observed": 0, + "external_seconds": 10.013537583000016, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000101875, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000175083, + "solve_seconds": 10.000101875, + "driver_seconds": 10.000309958, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 531.5907401249999, + "offset_end": 534.575194083, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1167, + "stderr_bytes_observed": 0, + "external_seconds": 2.984270499999866, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.972161667, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000167208, + "solve_seconds": 2.972161667, + "driver_seconds": 2.97236725, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 534.7195805829999, + "offset_end": 535.5449891659998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.8249244999999519, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.813667875, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000322167, + "solve_seconds": 0.813667875, + "driver_seconds": 0.814017042, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 535.6906327499998, + "offset_end": 538.727263791, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1171, + "stderr_bytes_observed": 0, + "external_seconds": 3.036004291000154, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.025137792, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000144375, + "solve_seconds": 3.025137792, + "driver_seconds": 3.02532175, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 538.8694652079998, + "offset_end": 548.8816997499998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1154, + "stderr_bytes_observed": 0, + "external_seconds": 10.012054541999987, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00013575, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000180583, + "solve_seconds": 10.00013575, + "driver_seconds": 10.000346833, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 549.024677875, + "offset_end": 549.8642998749999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.8395129999998971, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.817885833, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000330208, + "solve_seconds": 0.817885833, + "driver_seconds": 0.81825125, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 550.0130097909998, + "offset_end": 560.0409817079999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2163, + "stderr_bytes_observed": 0, + "external_seconds": 10.027667165999901, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.001025208, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 363, + "model_rows": 437, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000614834, + "solve_seconds": 10.001025208, + "driver_seconds": 10.001673959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 560.2027235409998, + "offset_end": 570.215986875, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1510, + "stderr_bytes_observed": 0, + "external_seconds": 10.012979667000081, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000111792, + "objective": 7, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 200, + "model_rows": 255, + "model_globals": 0, + "objective": 7, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000398833, + "solve_seconds": 10.000111792, + "driver_seconds": 10.000541208, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-20-single", + "category": "bin_packing", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 570.424662291, + "offset_end": 580.4379141659999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1298, + "stderr_bytes_observed": 0, + "external_seconds": 10.012804250000045, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000097834, + "objective": 6, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 147, + "model_rows": 193, + "model_globals": 0, + "objective": 6, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000359917, + "solve_seconds": 10.000097834, + "driver_seconds": 10.000498959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 580.5970043329999, + "offset_end": 590.6102356659999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1178, + "stderr_bytes_observed": 0, + "external_seconds": 10.012988583999913, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000102916, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000515084, + "solve_seconds": 10.000102916, + "driver_seconds": 10.000651834, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 590.7517922909999, + "offset_end": 593.6979167909999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1164, + "stderr_bytes_observed": 0, + "external_seconds": 2.945952000000034, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.933148166, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000387625, + "solve_seconds": 2.933148166, + "driver_seconds": 2.933566667, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 593.8415989579998, + "offset_end": 594.6986428329999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1140, + "stderr_bytes_observed": 0, + "external_seconds": 0.8568474160001642, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.84409075, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000412958, + "solve_seconds": 0.84409075, + "driver_seconds": 0.844529958, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 594.8443487079999, + "offset_end": 597.7862397909998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1173, + "stderr_bytes_observed": 0, + "external_seconds": 2.9416812500001015, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.9319435, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000132584, + "solve_seconds": 2.9319435, + "driver_seconds": 2.932105959, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 597.9322050829999, + "offset_end": 607.9468197909998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1172, + "stderr_bytes_observed": 0, + "external_seconds": 10.01411154199991, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000084167, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000138167, + "solve_seconds": 10.000084167, + "driver_seconds": 10.000251167, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 608.282956041, + "offset_end": 608.307743458, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 939, + "stderr_bytes_observed": 0, + "external_seconds": 0.024471665999953984, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002929833, + "objective": 484, + "best_bound": 484, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000147334, + "solve_seconds": 0.002929833, + "driver_seconds": 0.003097042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 608.507461333, + "offset_end": 618.5204684579999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1090, + "stderr_bytes_observed": 0, + "external_seconds": 10.01267437499996, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000586166, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000179042, + "solve_seconds": 10.000586166, + "driver_seconds": 10.000789209, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 618.726810916, + "offset_end": 618.7945966249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1044, + "stderr_bytes_observed": 0, + "external_seconds": 0.06765570900006423, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.054211542, + "objective": 895, + "best_bound": 895, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 72, + "model_rows": 38, + "model_globals": 0, + "objective": 895, + "best_bound": 895, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000188125, + "solve_seconds": 0.054211542, + "driver_seconds": 0.0544285, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 619.009995333, + "offset_end": 620.2257762909999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1074, + "stderr_bytes_observed": 0, + "external_seconds": 1.2156014160000268, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.202230625, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00017975, + "solve_seconds": 1.202230625, + "driver_seconds": 1.202440917, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 620.43958075, + "offset_end": 624.3010629579999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1106, + "stderr_bytes_observed": 0, + "external_seconds": 3.8610265419999905, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.850150167, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001715, + "solve_seconds": 3.850150167, + "driver_seconds": 3.850355958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 624.4655485829999, + "offset_end": 625.6688138749998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1074, + "stderr_bytes_observed": 0, + "external_seconds": 1.2030871249999109, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.190613625, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000228542, + "solve_seconds": 1.190613625, + "driver_seconds": 1.190878542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 625.8318501659999, + "offset_end": 629.736653083, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1106, + "stderr_bytes_observed": 0, + "external_seconds": 3.904627957999992, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.892236417, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000175166, + "solve_seconds": 3.892236417, + "driver_seconds": 3.892437291, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 629.8957415, + "offset_end": 639.9072330829999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1100, + "stderr_bytes_observed": 0, + "external_seconds": 10.011157124999954, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00008575, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000184083, + "solve_seconds": 10.00008575, + "driver_seconds": 10.000296416, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 640.068550791, + "offset_end": 640.092414625, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 950, + "stderr_bytes_observed": 0, + "external_seconds": 0.023777500000051077, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.003029458, + "objective": 484, + "best_bound": 484, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00026525, + "solve_seconds": 0.003029458, + "driver_seconds": 0.003317, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 640.254528916, + "offset_end": 650.26674675, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1090, + "stderr_bytes_observed": 0, + "external_seconds": 10.011888915999862, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000697708, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000193833, + "solve_seconds": 10.000697708, + "driver_seconds": 10.000918791, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 650.4288246659999, + "offset_end": 650.498008416, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1044, + "stderr_bytes_observed": 0, + "external_seconds": 0.06885912500001723, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.05394175, + "objective": 895, + "best_bound": 895, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 72, + "model_rows": 38, + "model_globals": 0, + "objective": 895, + "best_bound": 895, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000291125, + "solve_seconds": 0.05394175, + "driver_seconds": 0.054256625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 650.65588, + "offset_end": 651.856617166, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1063, + "stderr_bytes_observed": 0, + "external_seconds": 1.2003194579999672, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.188649709, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000385208, + "solve_seconds": 1.188649709, + "driver_seconds": 1.189065833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 652.020587791, + "offset_end": 655.913273333, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1106, + "stderr_bytes_observed": 0, + "external_seconds": 3.8922411670000656, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.880914875, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000404458, + "solve_seconds": 3.880914875, + "driver_seconds": 3.881347708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 656.078868333, + "offset_end": 657.2656824579999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1059, + "stderr_bytes_observed": 0, + "external_seconds": 1.1864282500000627, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.17442325, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000163417, + "solve_seconds": 1.17442325, + "driver_seconds": 1.174610959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 657.428894875, + "offset_end": 661.2839020409999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1106, + "stderr_bytes_observed": 0, + "external_seconds": 3.854840207999814, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.841297708, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000184333, + "solve_seconds": 3.841297708, + "driver_seconds": 3.841513083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 661.443177458, + "offset_end": 671.454337416, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1101, + "stderr_bytes_observed": 0, + "external_seconds": 10.010697417000074, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000071042, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000182667, + "solve_seconds": 10.000071042, + "driver_seconds": 10.000284709, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 671.9294401249999, + "offset_end": 672.009146291, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 875, + "stderr_bytes_observed": 0, + "external_seconds": 0.07936716600011096, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.057045458, + "objective": 436, + "best_bound": 436, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000276833, + "solve_seconds": 0.057045458, + "driver_seconds": 0.057350583, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 672.2340691249999, + "offset_end": 682.2464916249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 963, + "stderr_bytes_observed": 0, + "external_seconds": 10.011932375000015, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00018225, + "objective": 624, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 98, + "model_columns": 64, + "model_rows": 0, + "model_globals": 33, + "objective": 624, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000210958, + "solve_seconds": 10.00018225, + "driver_seconds": 10.0004185, + "assignment": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7 + ], + "full_values": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7, + 16, + 41, + 11, + 20, + 10, + 25, + 14, + 20, + 38, + 5, + 12, + 12, + 19, + 21, + 11, + 14, + 16, + 7, + 26, + 25, + 8, + 7, + 23, + 6, + 13, + 8, + 23, + 41, + 35, + 41, + 31, + 25 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 682.467054791, + "offset_end": 692.483427208, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 920, + "stderr_bytes_observed": 0, + "external_seconds": 10.015960875000019, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000362792, + "objective": 518, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 48, + "model_rows": 0, + "model_globals": 25, + "objective": 518, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000182667, + "solve_seconds": 10.000362792, + "driver_seconds": 10.000571709, + "assignment": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9 + ], + "full_values": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9, + 21, + 21, + 28, + 20, + 10, + 18, + 8, + 20, + 14, + 5, + 12, + 12, + 24, + 21, + 51, + 41, + 16, + 35, + 26, + 25, + 7, + 24, + 23, + 36 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 692.7095104159998, + "offset_end": 696.0309717079999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 905, + "stderr_bytes_observed": 0, + "external_seconds": 3.32058383399999, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.301080708, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000156584, + "solve_seconds": 3.301080708, + "driver_seconds": 3.301260625, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 696.2516335, + "offset_end": 706.2648616249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 896, + "stderr_bytes_observed": 0, + "external_seconds": 10.013092832999973, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000408334, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000130208, + "solve_seconds": 10.000408334, + "driver_seconds": 10.000564875, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 706.494780625, + "offset_end": 716.423079208, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 903, + "stderr_bytes_observed": 0, + "external_seconds": 9.928156999999828, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.917319333, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001495, + "solve_seconds": 9.917319333, + "driver_seconds": 9.917521875, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 716.60782675, + "offset_end": 719.9792151250001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 916, + "stderr_bytes_observed": 0, + "external_seconds": 3.371086000000105, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.357133167, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00035725, + "solve_seconds": 3.357133167, + "driver_seconds": 3.357538875, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 720.1506568329999, + "offset_end": 730.0574240409999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 912, + "stderr_bytes_observed": 0, + "external_seconds": 9.906562666000355, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.894728834, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000214334, + "solve_seconds": 9.894728834, + "driver_seconds": 9.894979, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 730.2196258329998, + "offset_end": 740.2302245829999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 891, + "stderr_bytes_observed": 0, + "external_seconds": 10.01021687499997, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000134, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000276583, + "solve_seconds": 10.000134, + "driver_seconds": 10.000435291, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 740.3946061660001, + "offset_end": 740.47411425, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 884, + "stderr_bytes_observed": 0, + "external_seconds": 0.07936066599995684, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.058502625, + "objective": 436, + "best_bound": 436, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000491708, + "solve_seconds": 0.058502625, + "driver_seconds": 0.059019917, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 740.6390735829998, + "offset_end": 750.6522728329999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 983, + "stderr_bytes_observed": 0, + "external_seconds": 10.013070375000098, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.001004042, + "objective": 624, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 98, + "model_columns": 64, + "model_rows": 0, + "model_globals": 33, + "objective": 624, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000468708, + "solve_seconds": 10.001004042, + "driver_seconds": 10.00149825, + "assignment": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7 + ], + "full_values": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7, + 16, + 41, + 11, + 20, + 10, + 25, + 14, + 20, + 38, + 5, + 12, + 12, + 19, + 21, + 11, + 14, + 16, + 7, + 26, + 25, + 8, + 7, + 23, + 6, + 13, + 8, + 23, + 41, + 35, + 41, + 31, + 25 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 750.8181389159997, + "offset_end": 760.8307233749999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 908, + "stderr_bytes_observed": 0, + "external_seconds": 10.012441708000097, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000408209, + "objective": 518, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 48, + "model_rows": 0, + "model_globals": 25, + "objective": 518, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000276667, + "solve_seconds": 10.000408209, + "driver_seconds": 10.000711459, + "assignment": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9 + ], + "full_values": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9, + 21, + 21, + 28, + 20, + 10, + 18, + 8, + 20, + 14, + 5, + 12, + 12, + 24, + 21, + 51, + 41, + 16, + 35, + 26, + 25, + 7, + 24, + 23, + 36 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 760.9978199159998, + "offset_end": 764.1983764579998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 902, + "stderr_bytes_observed": 0, + "external_seconds": 3.2002129159996002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.185582417, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000266375, + "solve_seconds": 3.185582417, + "driver_seconds": 3.185883708, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 764.3644172910001, + "offset_end": 774.377290958, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 902, + "stderr_bytes_observed": 0, + "external_seconds": 10.01263283399976, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00042875, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000350167, + "solve_seconds": 10.00042875, + "driver_seconds": 10.000803875, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 774.549211541, + "offset_end": 784.1170074579998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 923, + "stderr_bytes_observed": 0, + "external_seconds": 9.567375084000105, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.55218725, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000297583, + "solve_seconds": 9.55218725, + "driver_seconds": 9.552515417, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 784.3277730409998, + "offset_end": 787.5290586250001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 916, + "stderr_bytes_observed": 0, + "external_seconds": 3.2010870419999264, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.189654417, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000367958, + "solve_seconds": 3.189654417, + "driver_seconds": 3.190052083, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 787.697397958, + "offset_end": 797.391088916, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 923, + "stderr_bytes_observed": 0, + "external_seconds": 9.693285082999864, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.680058125, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000135459, + "solve_seconds": 9.680058125, + "driver_seconds": 9.680229209, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 797.562172791, + "offset_end": 807.5751787910001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 896, + "stderr_bytes_observed": 0, + "external_seconds": 10.012869624999894, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000419916, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000136333, + "solve_seconds": 10.000419916, + "driver_seconds": 10.000583708, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 808.0208767080001, + "offset_end": 808.051805625, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 887, + "stderr_bytes_observed": 0, + "external_seconds": 0.030596291999700043, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.007622541, + "objective": 98, + "best_bound": 98, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000333833, + "solve_seconds": 0.007622541, + "driver_seconds": 0.007983291, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 808.2979185829997, + "offset_end": 818.3108975409998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1036, + "stderr_bytes_observed": 0, + "external_seconds": 10.012839500000155, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000869959, + "objective": 173, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 173, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000155, + "solve_seconds": 10.000869959, + "driver_seconds": 10.001051333, + "assignment": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14 + ], + "full_values": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14, + 8, + 8, + 7, + 5, + 20, + 16, + 18, + 12, + 9, + 1, + 14, + 4, + 22, + 10, + 17, + 3, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 16, + -8, + 33, + 7, + 15, + -13, + 28, + -2, + 27, + -5, + 40, + 6, + 35, + -1, + 26, + -12, + 23, + -17, + 42, + 0, + 34, + -10, + 37, + -9, + 4, + 4, + 2, + 10, + 17, + 1, + 19, + 7, + 2, + 9, + 3, + 1, + 9, + 4, + 2, + 9, + 5, + 6, + 11, + 4, + 10, + 4, + 13, + 17 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 818.5356609580001, + "offset_end": 819.2908519579998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 984, + "stderr_bytes_observed": 0, + "external_seconds": 0.7550524579996818, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.739121416, + "objective": 121, + "best_bound": 121, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 130, + "model_columns": 72, + "model_rows": 36, + "model_globals": 21, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000383459, + "solve_seconds": 0.739121416, + "driver_seconds": 0.739534084, + "assignment": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3 + ], + "full_values": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3, + 16, + 16, + 5, + 3, + 12, + 8, + 8, + 2, + 17, + 9, + 14, + 4, + 13, + 1, + 21, + 7, + 10, + -6, + 9, + -9, + 25, + 5, + 28, + 6, + 23, + -1, + 19, + -7, + 15, + -13, + 27, + -3, + 24, + -8, + 20, + -14, + 1, + 11, + 14, + 3, + 11, + 1, + 4, + 12, + 2, + 2, + 2, + 18, + 12, + 7, + 2, + 3, + 10, + 6 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 819.5364752079997, + "offset_end": 825.777400916, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1008, + "stderr_bytes_observed": 0, + "external_seconds": 6.240777417000118, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.228711208, + "objective": 128, + "best_bound": 128, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 151, + "model_columns": 84, + "model_rows": 42, + "model_globals": 24, + "objective": 128, + "best_bound": 128, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00013475, + "solve_seconds": 6.228711208, + "driver_seconds": 6.228882875, + "assignment": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6 + ], + "full_values": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6, + 8, + 8, + 17, + 15, + 7, + 3, + 18, + 12, + 24, + 16, + 14, + 4, + 13, + 1, + 11, + -3, + 25, + 9, + 9, + -9, + 12, + -8, + 22, + 0, + 31, + 7, + 16, + -10, + 15, + -13, + 28, + -2, + 34, + 2, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 4, + 9, + 6, + 10, + 12, + 1, + 4, + 5, + 6, + 2, + 1, + 10, + 9, + 9, + 2, + 9, + 9, + 5, + 1, + 11, + 3 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 826.0002817910001, + "offset_end": 832.8321555, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1048, + "stderr_bytes_observed": 0, + "external_seconds": 6.831599334000202, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.819674542, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00016525, + "solve_seconds": 6.819674542, + "driver_seconds": 6.819875833, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "before", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 833.110538791, + "offset_end": 842.2718417079998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1066, + "stderr_bytes_observed": 0, + "external_seconds": 9.16114349999998, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.146579792, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000199458, + "solve_seconds": 9.146579792, + "driver_seconds": 9.146819416, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 842.4375337909999, + "offset_end": 850.39161025, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1048, + "stderr_bytes_observed": 0, + "external_seconds": 7.953183832999912, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 7.932207834, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000169792, + "solve_seconds": 7.932207834, + "driver_seconds": 7.932566042, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 850.5739532079999, + "offset_end": 860.0080580830002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1066, + "stderr_bytes_observed": 0, + "external_seconds": 9.433919124999647, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.403092667, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000595833, + "solve_seconds": 9.403092667, + "driver_seconds": 9.403732125, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 860.1744393749998, + "offset_end": 870.186073958, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1038, + "stderr_bytes_observed": 0, + "external_seconds": 10.011507209000229, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000737167, + "objective": 173, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 173, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000338417, + "solve_seconds": 10.000737167, + "driver_seconds": 10.001116625, + "assignment": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14 + ], + "full_values": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14, + 8, + 8, + 7, + 5, + 20, + 16, + 18, + 12, + 9, + 1, + 14, + 4, + 22, + 10, + 17, + 3, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 16, + -8, + 33, + 7, + 15, + -13, + 28, + -2, + 27, + -5, + 40, + 6, + 35, + -1, + 26, + -12, + 23, + -17, + 42, + 0, + 34, + -10, + 37, + -9, + 4, + 4, + 2, + 10, + 17, + 1, + 19, + 7, + 2, + 9, + 3, + 1, + 9, + 4, + 2, + 9, + 5, + 6, + 11, + 4, + 10, + 4, + 13, + 17 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 870.3602949579997, + "offset_end": 870.393150958, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 887, + "stderr_bytes_observed": 0, + "external_seconds": 0.0325449590000062, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.010291375, + "objective": 98, + "best_bound": 98, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000396667, + "solve_seconds": 0.010291375, + "driver_seconds": 0.010717792, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 870.5652782079999, + "offset_end": 880.5791059159999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1027, + "stderr_bytes_observed": 0, + "external_seconds": 10.013614624999718, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000823375, + "objective": 173, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 173, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000160583, + "solve_seconds": 10.000823375, + "driver_seconds": 10.001018833, + "assignment": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14 + ], + "full_values": [ + 8, + 6, + 18, + 15, + 5, + 9, + 16, + 10, + 2, + 22, + 19, + 0, + 4, + 20, + 1, + 13, + 11, + 23, + 17, + 7, + 3, + 21, + 12, + 14, + 8, + 8, + 7, + 5, + 20, + 16, + 18, + 12, + 9, + 1, + 14, + 4, + 22, + 10, + 17, + 3, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 16, + -8, + 33, + 7, + 15, + -13, + 28, + -2, + 27, + -5, + 40, + 6, + 35, + -1, + 26, + -12, + 23, + -17, + 42, + 0, + 34, + -10, + 37, + -9, + 4, + 4, + 2, + 10, + 17, + 1, + 19, + 7, + 2, + 9, + 3, + 1, + 9, + 4, + 2, + 9, + 5, + 6, + 11, + 4, + 10, + 4, + 13, + 17 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 880.7710634160001, + "offset_end": 881.5166422079999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 995, + "stderr_bytes_observed": 0, + "external_seconds": 0.7452865000000202, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.733097084, + "objective": 121, + "best_bound": 121, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 130, + "model_columns": 72, + "model_rows": 36, + "model_globals": 21, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000270792, + "solve_seconds": 0.733097084, + "driver_seconds": 0.7333975, + "assignment": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3 + ], + "full_values": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3, + 16, + 16, + 5, + 3, + 12, + 8, + 8, + 2, + 17, + 9, + 14, + 4, + 13, + 1, + 21, + 7, + 10, + -6, + 9, + -9, + 25, + 5, + 28, + 6, + 23, + -1, + 19, + -7, + 15, + -13, + 27, + -3, + 24, + -8, + 20, + -14, + 1, + 11, + 14, + 3, + 11, + 1, + 4, + 12, + 2, + 2, + 2, + 18, + 12, + 7, + 2, + 3, + 10, + 6 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 881.6918022500001, + "offset_end": 888.0744811249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1034, + "stderr_bytes_observed": 0, + "external_seconds": 6.382471584000086, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.368260792, + "objective": 128, + "best_bound": 128, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 151, + "model_columns": 84, + "model_rows": 42, + "model_globals": 24, + "objective": 128, + "best_bound": 128, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000456709, + "solve_seconds": 6.368260792, + "driver_seconds": 6.368767, + "assignment": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6 + ], + "full_values": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6, + 8, + 8, + 17, + 15, + 7, + 3, + 18, + 12, + 24, + 16, + 14, + 4, + 13, + 1, + 11, + -3, + 25, + 9, + 9, + -9, + 12, + -8, + 22, + 0, + 31, + 7, + 16, + -10, + 15, + -13, + 28, + -2, + 34, + 2, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 4, + 9, + 6, + 10, + 12, + 1, + 4, + 5, + 6, + 2, + 1, + 10, + 9, + 9, + 2, + 9, + 9, + 5, + 1, + 11, + 3 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 888.246326916, + "offset_end": 895.0537455830001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1048, + "stderr_bytes_observed": 0, + "external_seconds": 6.807133457999953, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.795351833, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000341958, + "solve_seconds": 6.795351833, + "driver_seconds": 6.795726333, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "after", + "repetition": 1, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 895.226006916, + "offset_end": 904.7151966250001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1066, + "stderr_bytes_observed": 0, + "external_seconds": 9.489023417000226, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.476553666, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000337042, + "solve_seconds": 9.476553666, + "driver_seconds": 9.476927875, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 904.9049632499998, + "offset_end": 911.8058277080002, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1041, + "stderr_bytes_observed": 0, + "external_seconds": 6.900538166999922, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.858343708, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0005265, + "solve_seconds": 6.858343708, + "driver_seconds": 6.858905333, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 912.0051221249998, + "offset_end": 920.9494294579997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1066, + "stderr_bytes_observed": 0, + "external_seconds": 8.944112624999889, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.930659208, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000149458, + "solve_seconds": 8.930659208, + "driver_seconds": 8.930838583, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 2, + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 921.1206099160001, + "offset_end": 931.1331587500001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1029, + "stderr_bytes_observed": 0, + "external_seconds": 10.012152875000083, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000339, + "objective": 167, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 167, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000407625, + "solve_seconds": 10.000339, + "driver_seconds": 10.000775541, + "assignment": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4 + ], + "full_values": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4, + 16, + 16, + 7, + 5, + 23, + 19, + 8, + 2, + 12, + 4, + 20, + 10, + 24, + 12, + 17, + 3, + 10, + -6, + 9, + -9, + 13, + -7, + 22, + 0, + 31, + 7, + 35, + 9, + 15, + -13, + 28, + -2, + 33, + 1, + 40, + 6, + 32, + -4, + 26, + -12, + 29, + -11, + 41, + -1, + 34, + -10, + 27, + -19, + 1, + 4, + 2, + 3, + 1, + 5, + 12, + 7, + 2, + 2, + 7, + 10, + 9, + 9, + 2, + 9, + 23, + 6, + 14, + 4, + 1, + 9, + 13, + 12 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + } + ], + "decisions": [ + { + "category": "knapsack", + "size": 32, + "reason": "before starting size", + "repeats": 1, + "after_records": 2, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 64, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 4, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 48, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 6, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 40, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 8, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 36, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 10, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 34, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 12, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 33, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 14, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 32, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 16, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 33, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 18, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 34, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 20, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 32, + "reason": "after starting size", + "repeats": 1, + "after_records": 22, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 64, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 24, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 128, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 26, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 256, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 28, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 512, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 30, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 384, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 32, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 448, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 34, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 416, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 36, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 400, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 38, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 408, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 40, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 404, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 42, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 406, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 44, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 407, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 46, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 406, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 48, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 407, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 50, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 408, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 52, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 32, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 54, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 33, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 54, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 34, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 56, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 58, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 59, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 60, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 61, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 62, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 63, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 64, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 65, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 66, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 67, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 68, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 69, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 20, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 70, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 71, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 72, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 73, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 74, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 75, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 76, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 76, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 76, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "before starting size", + "repeats": 1, + "after_records": 76, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 16, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 77, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 12, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 78, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 10, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 79, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 80, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 7, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 81, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 83, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 84, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "after starting size", + "repeats": 1, + "after_records": 85, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 16, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 86, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 12, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 87, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 10, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 88, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 89, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 7, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 90, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 92, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 93, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 7, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 94, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 94, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 94, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 94, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 95, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 96, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 97, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 98, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 99, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 100, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 101, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 102, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 103, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 104, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 105, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 20, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 106, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 107, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 108, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 109, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 110, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 111, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 112, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 112, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 112, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 6, + "reason": "before starting size", + "repeats": 1, + "after_records": 112, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 12, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 113, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 9, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 114, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 10, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 115, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 11, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 116, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 10, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 117, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 11, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 118, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 12, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 119, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 6, + "reason": "after starting size", + "repeats": 1, + "after_records": 120, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 12, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 121, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 9, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 122, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 10, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 123, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 11, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 124, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 10, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 125, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 11, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 126, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 12, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 127, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 6, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 9, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 10, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 11, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 12, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 129, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 130, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 131, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 132, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 133, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 134, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 135, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 136, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 137, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 138, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 139, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 140, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 141, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 142, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 143, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 144, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 145, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "before starting size", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 147, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 148, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 149, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 150, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 151, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 152, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 153, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 154, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "after starting size", + "repeats": 1, + "after_records": 155, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 156, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 157, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 158, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 159, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 161, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 162, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 163, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before", + "after" + ] + } + ] + } +} diff --git a/docs/solver-parity/checkpoints/capacity-scaling.json b/docs/solver-parity/checkpoints/capacity-scaling.json new file mode 100644 index 0000000000..4fcdb27e0e --- /dev/null +++ b/docs/solver-parity/checkpoints/capacity-scaling.json @@ -0,0 +1,50605 @@ +{ + "schema_version": 1, + "report": { + "schema_version": 1, + "started_utc": "2026-09-06T04:07:48.616760+00:00", + "expected_runs": 52, + "protocol": { + "schema_version": 1, + "purpose": "largest_verified_size_within_ten_second_solver_budget", + "selection": "Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.", + "planned": [ + { + "family": "capacity_uncorrelated", + "variables": 8 + }, + { + "family": "capacity_uncorrelated", + "variables": 32 + }, + { + "family": "capacity_uncorrelated", + "variables": 128 + }, + { + "family": "capacity_uncorrelated", + "variables": 384 + }, + { + "family": "capacity_correlated", + "variables": 8 + }, + { + "family": "capacity_correlated", + "variables": 32 + }, + { + "family": "capacity_correlated", + "variables": 128 + }, + { + "family": "capacity_correlated", + "variables": 384 + }, + { + "family": "assignment", + "variables": 9 + }, + { + "family": "assignment", + "variables": 25 + }, + { + "family": "assignment", + "variables": 81 + }, + { + "family": "assignment", + "variables": 256 + }, + { + "family": "capacity_uncorrelated", + "variables": 512 + } + ], + "repetitions": 2, + "expected_measured_runs": 52, + "loader_probes": 2, + "backend": "Native", + "guarantee": "Exact", + "route": "native", + "threads": 1, + "random_seed": 0, + "primal_start": false, + "relative_gap": 0, + "absolute_gap": 0, + "solver_seconds": 10, + "process_seconds": 11, + "whole_seconds": 600, + "ordering": "First repeat before/after per case; second after/before per case.", + "capacity_rule": "Largest tested variable count, including the stress point, with independently verified Optimal results and internal solve_seconds <= 10 in both repetitions.", + "boundary_rule": "The n=512 uncorrelated case retains its DP-table-overflow stress flag and participates in the largest-tested-size calculation.", + "reference_rule": "Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima." + }, + "frozen_manifest": { + "schema_version": 1, + "ready": true, + "created_utc": "2026-09-06T04:07:16.166035+00:00", + "protocol_sha256": "530ab6fb7e7592f040755398434dd88c461b4628eddeaf4ea3e0b4ac631fbd89", + "protocol": { + "schema_version": 1, + "purpose": "largest_verified_size_within_ten_second_solver_budget", + "selection": "Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.", + "planned": [ + { + "family": "capacity_uncorrelated", + "variables": 8 + }, + { + "family": "capacity_uncorrelated", + "variables": 32 + }, + { + "family": "capacity_uncorrelated", + "variables": 128 + }, + { + "family": "capacity_uncorrelated", + "variables": 384 + }, + { + "family": "capacity_correlated", + "variables": 8 + }, + { + "family": "capacity_correlated", + "variables": 32 + }, + { + "family": "capacity_correlated", + "variables": 128 + }, + { + "family": "capacity_correlated", + "variables": 384 + }, + { + "family": "assignment", + "variables": 9 + }, + { + "family": "assignment", + "variables": 25 + }, + { + "family": "assignment", + "variables": 81 + }, + { + "family": "assignment", + "variables": 256 + }, + { + "family": "capacity_uncorrelated", + "variables": 512 + } + ], + "repetitions": 2, + "expected_measured_runs": 52, + "loader_probes": 2, + "backend": "Native", + "guarantee": "Exact", + "route": "native", + "threads": 1, + "random_seed": 0, + "primal_start": false, + "relative_gap": 0, + "absolute_gap": 0, + "solver_seconds": 10, + "process_seconds": 11, + "whole_seconds": 600, + "ordering": "First repeat before/after per case; second after/before per case.", + "capacity_rule": "Largest tested variable count, including the stress point, with independently verified Optimal results and internal solve_seconds <= 10 in both repetitions.", + "boundary_rule": "The n=512 uncorrelated case retains its DP-table-overflow stress flag and participates in the largest-tested-size calculation.", + "reference_rule": "Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima." + }, + "sources": { + "experiments/optimize/benchmark_capacity_scaling.py": "41facae2d729d8b80ae720d89114e9f3bbe9857ae53ee4ad94627b576d0a72c4", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f" + }, + "records": [ + { + "id": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "variables": 8, + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -337, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "3532382f5f607bf594a9ee2969c8db318e5185d37d5c89c2d00b354cf8d28b28", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_uncorrelated_sanity_8.json", + "txt": "models/capacity_uncorrelated_sanity_8.txt", + "json_sha256": "760837de289f3e67470e6f5ba432d88d597f8a9a5d6fe84918a9206d141ccff2", + "txt_sha256": "ea9569a056bb6fad19798ad3bb6a18ea93003f9cff5ea6106c2ea429237949bb" + }, + { + "id": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "variables": 32, + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -1096, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "129ce1700ffbb57f5114067131155e1ff7d61595a4f53abbb481357a21eeabfa", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_uncorrelated_small_32.json", + "txt": "models/capacity_uncorrelated_small_32.txt", + "json_sha256": "0be8e112ac2a3945bb68dedda90459642867ddc57c8c716552da9cf82c6cfe0c", + "txt_sha256": "5b6423445e33a99cb177f60c3c7b80f7f0f688564cdacc442b134541dc056097" + }, + { + "id": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "variables": 128, + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -4318, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "54d982cd0b01e854dc7b784fdc1169e6cfafda8cd64eff6eba27ad134d060066", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_uncorrelated_medium_128.json", + "txt": "models/capacity_uncorrelated_medium_128.txt", + "json_sha256": "6ba571d32746f59483a352dfc7f0216bf2711ca16d8379978b0b341e255f63a8", + "txt_sha256": "b59b0bdd0661616462e4b441fb08559f8bc487cf5d876a3e688b9a91512056ee" + }, + { + "id": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "variables": 384, + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -13832, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "2e01bc33e2af812ae5ace6b1f03370919953f916b9a4fd78b059bb8311f79da0", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_uncorrelated_large_384.json", + "txt": "models/capacity_uncorrelated_large_384.txt", + "json_sha256": "5567bc1a79a730e97934990b431137ee06ad9c41a763dad8c7482f55256a2f52", + "txt_sha256": "9680c130459aeefd7e563978d5df20a8d7aa209abf752bb7f18a8bd169f962b2" + }, + { + "id": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "variables": 8, + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -62, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "224d725d608edb4090706db1b5aac0aafdf5b0cfa468dfe54e8a1ff1b66a3b55", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_correlated_sanity_8.json", + "txt": "models/capacity_correlated_sanity_8.txt", + "json_sha256": "fb482402e5dae735f92f55dcad3e7c8de378d177002467bb3d752aa6f865b93e", + "txt_sha256": "70e2d975656b662443415ce774e45acb9a04121b7ef6476ace1c52dc705f6648" + }, + { + "id": "capacity_correlated_small_32", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "variables": 32, + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -312, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "85d128437540b3d05475d2781a2bdbd4bc2c0eebfc939c2db8e3c1d865eee7bb", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_correlated_small_32.json", + "txt": "models/capacity_correlated_small_32.txt", + "json_sha256": "0d1b9de3c9d4942bef169253aaef18a9f12ee5aaaa524a9de11f8360b5f17421", + "txt_sha256": "808a2c747faa0a6eb81bfee59ae4b11a16cc9081f900710e086155f2ae6e254d" + }, + { + "id": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "variables": 128, + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -1211, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "16ae1b9c1f18deb10b7f8d1d122f12d8cb72440483f97d96ff50e44fb612065b", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_correlated_medium_128.json", + "txt": "models/capacity_correlated_medium_128.txt", + "json_sha256": "fca5325f52fb6442ff1f35ea92d1ea15eb789b1669d020838ed07e9336a0ae91", + "txt_sha256": "4f7a15880322d7f346b1b9a8d2c13dd19c47d29caf27b08a3cda91b0be629e37" + }, + { + "id": "capacity_correlated_large_384", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "variables": 384, + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -3648, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "1dde254629e93f90cec642e057b4610a07c7829f40ae188ff3b3282c67a27bcb", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "json": "models/capacity_correlated_large_384.json", + "txt": "models/capacity_correlated_large_384.txt", + "json_sha256": "0a65d6258440396ffa2b129414a02bc74c90a354d14a11ad6edf5603a1f2fd9d", + "txt_sha256": "b86e4f1a27ef7f0760a266be7dc49697c67cd5459a320536931b611b175a643c" + }, + { + "id": "assignment_sanity_3", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "variables": 9, + "dimensions": { + "variables": 9, + "rows": 12, + "nonzeros": 36 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 87, + "reference_method": "exact subset-column assignment dynamic programming", + "semantic_sha256": "13e90d7bbba3d98cbf029ee965e3b17f8a282baaa9a9cba9176dc76b4929c7a4", + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "json": "models/assignment_sanity_3.json", + "txt": "models/assignment_sanity_3.txt", + "json_sha256": "1577cf4c96746e86d7951fac6b1377a723d56d826df029065e4e0edb8166d110", + "txt_sha256": "2e0e10a7d87c2f4fe5717d1a6b7016c133770a4c9014a36a0eacdfcfbf5fbf22" + }, + { + "id": "assignment_small_5", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "variables": 25, + "dimensions": { + "variables": 25, + "rows": 20, + "nonzeros": 100 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 162, + "reference_method": "exact subset-column assignment dynamic programming", + "semantic_sha256": "bce2b7a675ef398a461f98a90557b91b74bb9dc7f38964319608ede9bb67c1b0", + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "json": "models/assignment_small_5.json", + "txt": "models/assignment_small_5.txt", + "json_sha256": "78ad319697db9b55a2a292b9093543a51e9c4ea39a6b95258faa16161316593f", + "txt_sha256": "e9ad1f0dee2e81a2c58103ca6563609605281e644e8864aa50347e61a30fe816" + }, + { + "id": "assignment_medium_9", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "variables": 81, + "dimensions": { + "variables": 81, + "rows": 36, + "nonzeros": 324 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 146, + "reference_method": "exact subset-column assignment dynamic programming", + "semantic_sha256": "d579b817bd55c3ac1303eae47165e42072022ae3459f62ef6d7e038a2cddeb91", + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "json": "models/assignment_medium_9.json", + "txt": "models/assignment_medium_9.txt", + "json_sha256": "41b625c1dfb1a4f90c4f10334b4e23e5c3b1e353f24d5488844828627a39acc9", + "txt_sha256": "d1b5e8c23fbf175fe7ad5cad95fbfbbc1a324e96603876dd5c73d49981d9a58b" + }, + { + "id": "assignment_large_16", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "variables": 256, + "dimensions": { + "variables": 256, + "rows": 64, + "nonzeros": 1024 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 145, + "reference_method": "exact subset-column assignment dynamic programming", + "semantic_sha256": "ac896fe1f45b41ee98243c39f2303d3596b6376b4af6118d8e9b0f8b9dee58f5", + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "json": "models/assignment_large_16.json", + "txt": "models/assignment_large_16.txt", + "json_sha256": "24e660b0d31645f4582cda71959045284ac15b4750c6aacb7f7e71a0f207be88", + "txt_sha256": "4e8cd3f1666029007ce8f8859394ba317ec7ec664124615fd5e51fc93fc9a289" + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "variables": 512, + "dimensions": { + "variables": 512, + "rows": 1, + "nonzeros": 512 + }, + "seed": 20260906, + "stress": true, + "kind": "binary", + "route": "native", + "objective": -18731, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "semantic_sha256": "3ed2df4ae33b74b7e423e7c2b518fafcb65e4615e4cc7d034c9d8e171a841e08", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "json": "models/capacity_uncorrelated_cap_overflow_512.json", + "txt": "models/capacity_uncorrelated_cap_overflow_512.txt", + "json_sha256": "7bce5c40828962a5071c5a0d3bfbc2ab54a59af87ac391822f1af6c221e3eec1", + "txt_sha256": "fe96761d0760f264dd4cab0063ad2a0b263a0f4ed1065a6162c6255c4a4c9207" + } + ], + "generation_seconds": 1.2661927919834852 + }, + "provenance": { + "driver_name": "optimize-native-benchmark", + "driver_sha256": "fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4", + "source_head": "f76dd776af77d2b416d58ea164099b8fdca22dc5", + "runtime_source_sha256": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_capacity_scaling.py": "41facae2d729d8b80ae720d89114e9f3bbe9857ae53ee4ad94627b576d0a72c4", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f" + }, + "frozen_manifest_sha256": "ce41bc1e75e35c6dbe708b65ff3f97904533aa66c9f57b1e10d9534b55ff13d3", + "frozen_protocol_sha256": "530ab6fb7e7592f040755398434dd88c461b4628eddeaf4ea3e0b4ac631fbd89", + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 779, + "stderr_bytes_observed": 98249, + "external_seconds": 0.21873362455517054, + "started_utc": "2026-09-06T04:07:48.620105+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.054594083689153194, + "started_utc": "2026-09-06T04:07:48.858808+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + } + }, + "comparison_valid": true, + "loader_probes": [ + { + "cohort": "before", + "status": "validated", + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 779, + "stderr_bytes_observed": 98249, + "external_seconds": 0.21873362455517054, + "started_utc": "2026-09-06T04:07:48.620105+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + }, + { + "cohort": "after", + "status": "validated", + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.054594083689153194, + "started_utc": "2026-09-06T04:07:48.858808+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + ], + "records": [ + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.009522708132863045, + "started_utc": "2026-09-06T04:07:48.932750+00:00", + "stdout_file": "capacity_uncorrelated_sanity_8-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000116916, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 3.9e-05, + "solve_seconds": 0.000116916, + "driver_seconds": 0.000172792, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 769, + "stderr_bytes_observed": 0, + "external_seconds": 0.011597124859690666, + "started_utc": "2026-09-06T04:07:48.944738+00:00", + "stdout_file": "capacity_uncorrelated_sanity_8-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00013125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.3458e-05, + "solve_seconds": 0.00013125, + "driver_seconds": 0.000225875, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 873, + "stderr_bytes_observed": 0, + "external_seconds": 0.3573359167203307, + "started_utc": "2026-09-06T04:07:48.958978+00:00", + "stdout_file": "capacity_uncorrelated_small_32-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.347881084, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.9125e-05, + "solve_seconds": 0.347881084, + "driver_seconds": 0.347995792, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 880, + "stderr_bytes_observed": 0, + "external_seconds": 0.01230200007557869, + "started_utc": "2026-09-06T04:07:49.319277+00:00", + "stdout_file": "capacity_uncorrelated_small_32-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000312667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.5709e-05, + "solve_seconds": 0.000312667, + "driver_seconds": 0.000387542, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1236, + "stderr_bytes_observed": 0, + "external_seconds": 10.020563625730574, + "started_utc": "2026-09-06T04:07:49.334304+00:00", + "stdout_file": "capacity_uncorrelated_medium_128-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -2471, + "best_bound": null, + "absolute_primal_gap_to_oracle": 1847, + "solve_seconds": 10.005454416, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -2471, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.4709e-05, + "solve_seconds": 10.005454416, + "driver_seconds": 10.005584, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1252, + "stderr_bytes_observed": 0, + "external_seconds": 0.08776045776903629, + "started_utc": "2026-09-06T04:07:59.404718+00:00", + "stdout_file": "capacity_uncorrelated_medium_128-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -4318, + "best_bound": -4318, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.014345209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000724666, + "solve_seconds": 0.014345209, + "driver_seconds": 0.015100541, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2260, + "stderr_bytes_observed": 0, + "external_seconds": 10.011808041483164, + "started_utc": "2026-09-06T04:07:59.495610+00:00", + "stdout_file": "capacity_uncorrelated_large_384-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -8545, + "best_bound": null, + "absolute_primal_gap_to_oracle": 5287, + "solve_seconds": 10.000380167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -8545, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000296542, + "solve_seconds": 10.000380167, + "driver_seconds": 10.000718625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2289, + "stderr_bytes_observed": 0, + "external_seconds": 0.048019083216786385, + "started_utc": "2026-09-06T04:08:09.511973+00:00", + "stdout_file": "capacity_uncorrelated_large_384-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -13832, + "best_bound": -13832, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.028283625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000179208, + "solve_seconds": 0.028283625, + "driver_seconds": 0.028487917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 776, + "stderr_bytes_observed": 0, + "external_seconds": 0.010899749584496021, + "started_utc": "2026-09-06T04:08:09.563696+00:00", + "stdout_file": "capacity_correlated_sanity_8-r1-before.stdout", + "stderr_file": "capacity_correlated_sanity_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000299, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000240417, + "solve_seconds": 0.000299, + "driver_seconds": 0.000561875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 768, + "stderr_bytes_observed": 0, + "external_seconds": 0.009227416478097439, + "started_utc": "2026-09-06T04:08:09.577619+00:00", + "stdout_file": "capacity_correlated_sanity_8-r1-after.stdout", + "stderr_file": "capacity_correlated_sanity_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000113292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.4542e-05, + "solve_seconds": 0.000113292, + "driver_seconds": 0.000176792, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 881, + "stderr_bytes_observed": 0, + "external_seconds": 7.741252458654344, + "started_utc": "2026-09-06T04:08:09.589988+00:00", + "stdout_file": "capacity_correlated_small_32-r1-before.stdout", + "stderr_file": "capacity_correlated_small_32-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 7.732421208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00023025, + "solve_seconds": 7.732421208, + "driver_seconds": 7.732689125, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 878, + "stderr_bytes_observed": 0, + "external_seconds": 0.015935375355184078, + "started_utc": "2026-09-06T04:08:17.340119+00:00", + "stdout_file": "capacity_correlated_small_32-r1-after.stdout", + "stderr_file": "capacity_correlated_small_32-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000571167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.6208e-05, + "solve_seconds": 0.000571167, + "driver_seconds": 0.000669083, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1230, + "stderr_bytes_observed": 0, + "external_seconds": 10.01025962550193, + "started_utc": "2026-09-06T04:08:17.359312+00:00", + "stdout_file": "capacity_correlated_medium_128-r1-before.stdout", + "stderr_file": "capacity_correlated_medium_128-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -1043, + "best_bound": null, + "absolute_primal_gap_to_oracle": 168, + "solve_seconds": 10.000127958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1043, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000231959, + "solve_seconds": 10.000127958, + "driver_seconds": 10.000397959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1263, + "stderr_bytes_observed": 0, + "external_seconds": 0.03148612566292286, + "started_utc": "2026-09-06T04:08:27.318237+00:00", + "stdout_file": "capacity_correlated_medium_128-r1-after.stdout", + "stderr_file": "capacity_correlated_medium_128-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1211, + "best_bound": -1211, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.006207459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000121709, + "solve_seconds": 0.006207459, + "driver_seconds": 0.006352375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2243, + "stderr_bytes_observed": 0, + "external_seconds": 10.014845707453787, + "started_utc": "2026-09-06T04:08:27.353493+00:00", + "stdout_file": "capacity_correlated_large_384-r1-before.stdout", + "stderr_file": "capacity_correlated_large_384-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -3070, + "best_bound": null, + "absolute_primal_gap_to_oracle": 578, + "solve_seconds": 10.000571375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3070, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000447584, + "solve_seconds": 10.000571375, + "driver_seconds": 10.001069, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2296, + "stderr_bytes_observed": 0, + "external_seconds": 0.046651833690702915, + "started_utc": "2026-09-06T04:08:37.373866+00:00", + "stdout_file": "capacity_correlated_large_384-r1-after.stdout", + "stderr_file": "capacity_correlated_large_384-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -3648, + "best_bound": -3648, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.028517875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000136084, + "solve_seconds": 0.028517875, + "driver_seconds": 0.028685042, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 793, + "stderr_bytes_observed": 0, + "external_seconds": 0.009033124893903732, + "started_utc": "2026-09-06T04:08:37.425225+00:00", + "stdout_file": "assignment_sanity_3-r1-before.stdout", + "stderr_file": "assignment_sanity_3-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000289833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000173583, + "solve_seconds": 0.000289833, + "driver_seconds": 0.000480583, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 758, + "stderr_bytes_observed": 0, + "external_seconds": 0.008583208546042442, + "started_utc": "2026-09-06T04:08:37.437819+00:00", + "stdout_file": "assignment_sanity_3-r1-after.stdout", + "stderr_file": "assignment_sanity_3-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000118459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.375e-05, + "solve_seconds": 0.000118459, + "driver_seconds": 0.000176417, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "variables": 25, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.008847500197589397, + "started_utc": "2026-09-06T04:08:37.449705+00:00", + "stdout_file": "assignment_small_5-r1-before.stdout", + "stderr_file": "assignment_small_5-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000245916, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000226, + "solve_seconds": 0.000245916, + "driver_seconds": 0.000487625, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "variables": 25, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.009011249989271164, + "started_utc": "2026-09-06T04:08:37.462324+00:00", + "stdout_file": "assignment_small_5-r1-after.stdout", + "stderr_file": "assignment_small_5-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000228291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.5958e-05, + "solve_seconds": 0.000228291, + "driver_seconds": 0.0003195, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "variables": 81, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1082, + "stderr_bytes_observed": 0, + "external_seconds": 0.011296583339571953, + "started_utc": "2026-09-06T04:08:37.474951+00:00", + "stdout_file": "assignment_medium_9-r1-before.stdout", + "stderr_file": "assignment_medium_9-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003171084, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000270125, + "solve_seconds": 0.003171084, + "driver_seconds": 0.003456833, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "variables": 81, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1061, + "stderr_bytes_observed": 0, + "external_seconds": 0.011218416504561901, + "started_utc": "2026-09-06T04:08:37.490278+00:00", + "stdout_file": "assignment_medium_9-r1-after.stdout", + "stderr_file": "assignment_medium_9-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003316208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000111708, + "solve_seconds": 0.003316208, + "driver_seconds": 0.003445208, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "variables": 256, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1777, + "stderr_bytes_observed": 0, + "external_seconds": 3.034988207742572, + "started_utc": "2026-09-06T04:08:37.506095+00:00", + "stdout_file": "assignment_large_16-r1-before.stdout", + "stderr_file": "assignment_large_16-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.025276, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0004075, + "solve_seconds": 3.025276, + "driver_seconds": 3.025712375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "variables": 256, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1766, + "stderr_bytes_observed": 0, + "external_seconds": 2.992917542345822, + "started_utc": "2026-09-06T04:08:40.547102+00:00", + "stdout_file": "assignment_large_16-r1-after.stdout", + "stderr_file": "assignment_large_16-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 2.981603375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000198125, + "solve_seconds": 2.981603375, + "driver_seconds": 2.981827416, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "before", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2756, + "stderr_bytes_observed": 0, + "external_seconds": 10.013550084084272, + "started_utc": "2026-09-06T04:08:43.545278+00:00", + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.000616167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000274083, + "solve_seconds": 10.000616167, + "driver_seconds": 10.000940958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "after", + "repetition": 1, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2773, + "stderr_bytes_observed": 0, + "external_seconds": 10.02298937458545, + "started_utc": "2026-09-06T04:08:53.565491+00:00", + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.001320292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000210541, + "solve_seconds": 10.001320292, + "driver_seconds": 10.0015715, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.011250750161707401, + "started_utc": "2026-09-06T04:09:03.594633+00:00", + "stdout_file": "capacity_uncorrelated_sanity_8-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00080275, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00026475, + "solve_seconds": 0.00080275, + "driver_seconds": 0.001086458, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 780, + "stderr_bytes_observed": 0, + "external_seconds": 0.024055415764451027, + "started_utc": "2026-09-06T04:09:03.610835+00:00", + "stdout_file": "capacity_uncorrelated_sanity_8-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.005084792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.2458e-05, + "solve_seconds": 0.005084792, + "driver_seconds": 0.005212375, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 891, + "stderr_bytes_observed": 0, + "external_seconds": 0.008893999271094799, + "started_utc": "2026-09-06T04:09:03.639591+00:00", + "stdout_file": "capacity_uncorrelated_small_32-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000315083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000245292, + "solve_seconds": 0.000315083, + "driver_seconds": 0.000582875, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 885, + "stderr_bytes_observed": 0, + "external_seconds": 0.3591633327305317, + "started_utc": "2026-09-06T04:09:03.653414+00:00", + "stdout_file": "capacity_uncorrelated_small_32-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.349930084, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.5166e-05, + "solve_seconds": 0.349930084, + "driver_seconds": 0.350006291, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1274, + "stderr_bytes_observed": 0, + "external_seconds": 0.014147999696433544, + "started_utc": "2026-09-06T04:09:04.017778+00:00", + "stdout_file": "capacity_uncorrelated_medium_128-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -4318, + "best_bound": -4318, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002915083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000349541, + "solve_seconds": 0.002915083, + "driver_seconds": 0.00328825, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1224, + "stderr_bytes_observed": 0, + "external_seconds": 10.012786542065442, + "started_utc": "2026-09-06T04:09:04.037490+00:00", + "stdout_file": "capacity_uncorrelated_medium_128-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -2485, + "best_bound": null, + "absolute_primal_gap_to_oracle": 1833, + "solve_seconds": 10.001522709, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -2485, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 9.5791e-05, + "solve_seconds": 10.001522709, + "driver_seconds": 10.001656916, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2289, + "stderr_bytes_observed": 0, + "external_seconds": 0.03675775043666363, + "started_utc": "2026-09-06T04:09:14.056010+00:00", + "stdout_file": "capacity_uncorrelated_large_384-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -13832, + "best_bound": -13832, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.024979709, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000259, + "solve_seconds": 0.024979709, + "driver_seconds": 0.025265375, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2251, + "stderr_bytes_observed": 0, + "external_seconds": 10.012417333200574, + "started_utc": "2026-09-06T04:09:14.098330+00:00", + "stdout_file": "capacity_uncorrelated_large_384-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -8545, + "best_bound": null, + "absolute_primal_gap_to_oracle": 5287, + "solve_seconds": 10.000534, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -8545, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00012525, + "solve_seconds": 10.000534, + "driver_seconds": 10.000806542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 777, + "stderr_bytes_observed": 0, + "external_seconds": 0.021788625046610832, + "started_utc": "2026-09-06T04:09:24.118666+00:00", + "stdout_file": "capacity_correlated_sanity_8-r2-after.stdout", + "stderr_file": "capacity_correlated_sanity_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002279125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000229958, + "solve_seconds": 0.002279125, + "driver_seconds": 0.002533583, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 0, + "external_seconds": 0.011910666711628437, + "started_utc": "2026-09-06T04:09:24.145945+00:00", + "stdout_file": "capacity_correlated_sanity_8-r2-before.stdout", + "stderr_file": "capacity_correlated_sanity_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000625875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.9208e-05, + "solve_seconds": 0.000625875, + "driver_seconds": 0.000750958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 877, + "stderr_bytes_observed": 0, + "external_seconds": 0.011299584060907364, + "started_utc": "2026-09-06T04:09:24.163357+00:00", + "stdout_file": "capacity_correlated_small_32-r2-after.stdout", + "stderr_file": "capacity_correlated_small_32-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000291333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000229291, + "solve_seconds": 0.000291333, + "driver_seconds": 0.00054075, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 881, + "stderr_bytes_observed": 0, + "external_seconds": 7.752690874971449, + "started_utc": "2026-09-06T04:09:24.180027+00:00", + "stdout_file": "capacity_correlated_small_32-r2-before.stdout", + "stderr_file": "capacity_correlated_small_32-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 7.743891041, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.8e-05, + "solve_seconds": 7.743891041, + "driver_seconds": 7.74399625, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1274, + "stderr_bytes_observed": 0, + "external_seconds": 0.014725000597536564, + "started_utc": "2026-09-06T04:09:31.939814+00:00", + "stdout_file": "capacity_correlated_medium_128-r2-after.stdout", + "stderr_file": "capacity_correlated_medium_128-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1211, + "best_bound": -1211, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003199667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000421583, + "solve_seconds": 0.003199667, + "driver_seconds": 0.003649208, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1218, + "stderr_bytes_observed": 0, + "external_seconds": 10.010992375202477, + "started_utc": "2026-09-06T04:09:31.960930+00:00", + "stdout_file": "capacity_correlated_medium_128-r2-before.stdout", + "stderr_file": "capacity_correlated_medium_128-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -1043, + "best_bound": null, + "absolute_primal_gap_to_oracle": 168, + "solve_seconds": 10.000133917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1043, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 9.2167e-05, + "solve_seconds": 10.000133917, + "driver_seconds": 10.000261209, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2296, + "stderr_bytes_observed": 0, + "external_seconds": 0.03874254133552313, + "started_utc": "2026-09-06T04:09:41.979591+00:00", + "stdout_file": "capacity_correlated_large_384-r2-after.stdout", + "stderr_file": "capacity_correlated_large_384-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -3648, + "best_bound": -3648, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.026443667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00029575, + "solve_seconds": 0.026443667, + "driver_seconds": 0.026766625, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2254, + "stderr_bytes_observed": 0, + "external_seconds": 10.011801375076175, + "started_utc": "2026-09-06T04:09:42.024427+00:00", + "stdout_file": "capacity_correlated_large_384-r2-before.stdout", + "stderr_file": "capacity_correlated_large_384-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -3070, + "best_bound": null, + "absolute_primal_gap_to_oracle": 578, + "solve_seconds": 10.000235167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3070, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0001365, + "solve_seconds": 10.000235167, + "driver_seconds": 10.000400709, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 782, + "stderr_bytes_observed": 0, + "external_seconds": 0.011468167416751385, + "started_utc": "2026-09-06T04:09:52.043315+00:00", + "stdout_file": "assignment_sanity_3-r2-after.stdout", + "stderr_file": "assignment_sanity_3-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000522125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000164375, + "solve_seconds": 0.000522125, + "driver_seconds": 0.000705834, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 793, + "stderr_bytes_observed": 0, + "external_seconds": 0.011355416849255562, + "started_utc": "2026-09-06T04:09:52.060932+00:00", + "stdout_file": "assignment_sanity_3-r2-before.stdout", + "stderr_file": "assignment_sanity_3-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000376708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.8584e-05, + "solve_seconds": 0.000376708, + "driver_seconds": 0.000502417, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "variables": 25, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 849, + "stderr_bytes_observed": 0, + "external_seconds": 0.009130832739174366, + "started_utc": "2026-09-06T04:09:52.078931+00:00", + "stdout_file": "assignment_small_5-r2-after.stdout", + "stderr_file": "assignment_small_5-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000287208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000222625, + "solve_seconds": 0.000287208, + "driver_seconds": 0.000529917, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "variables": 25, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.009153416380286217, + "started_utc": "2026-09-06T04:09:52.094487+00:00", + "stdout_file": "assignment_small_5-r2-before.stdout", + "stderr_file": "assignment_small_5-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000237375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.7917e-05, + "solve_seconds": 0.000237375, + "driver_seconds": 0.000324584, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "variables": 81, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1082, + "stderr_bytes_observed": 0, + "external_seconds": 0.013940167613327503, + "started_utc": "2026-09-06T04:09:52.110036+00:00", + "stdout_file": "assignment_medium_9-r2-after.stdout", + "stderr_file": "assignment_medium_9-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003150167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000232875, + "solve_seconds": 0.003150167, + "driver_seconds": 0.003401292, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "variables": 81, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1082, + "stderr_bytes_observed": 0, + "external_seconds": 0.011796625331044197, + "started_utc": "2026-09-06T04:09:52.132744+00:00", + "stdout_file": "assignment_medium_9-r2-before.stdout", + "stderr_file": "assignment_medium_9-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003241208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.75e-05, + "solve_seconds": 0.003241208, + "driver_seconds": 0.003355333, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "variables": 256, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1765, + "stderr_bytes_observed": 0, + "external_seconds": 3.1635700836777687, + "started_utc": "2026-09-06T04:09:52.152229+00:00", + "stdout_file": "assignment_large_16-r2-after.stdout", + "stderr_file": "assignment_large_16-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.152091042, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00042475, + "solve_seconds": 3.152091042, + "driver_seconds": 3.152615959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "variables": 256, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1766, + "stderr_bytes_observed": 0, + "external_seconds": 3.138057249598205, + "started_utc": "2026-09-06T04:09:55.327550+00:00", + "stdout_file": "assignment_large_16-r2-before.stdout", + "stderr_file": "assignment_large_16-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.120898459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000302167, + "solve_seconds": 3.120898459, + "driver_seconds": 3.121260042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "after", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2767, + "stderr_bytes_observed": 0, + "external_seconds": 10.01333041768521, + "started_utc": "2026-09-06T04:09:58.474040+00:00", + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.002009708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0004525, + "solve_seconds": 10.002009708, + "driver_seconds": 10.002511084, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "before", + "repetition": 2, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2753, + "stderr_bytes_observed": 0, + "external_seconds": 10.025324125774205, + "started_utc": "2026-09-06T04:10:08.497021+00:00", + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.0023235, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000204666, + "solve_seconds": 10.0023235, + "driver_seconds": 10.002566, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + } + ], + "integrity": { + "frozen_unchanged": true, + "measurement_source_unchanged": true, + "runtime_source_unchanged": true, + "driver_unchanged": true, + "preserved_manifest_unchanged": true, + "libraries_unchanged": true + }, + "finished_utc": "2026-09-06T04:10:18.582287+00:00", + "elapsed_seconds": 150.13075070921332 + }, + "summary": { + "schema_version": 1, + "comparison_valid": true, + "elapsed_seconds": 150.13075070921332, + "required_runs": 52, + "recorded_runs": 52, + "repetitions": 2, + "solver_seconds": 10, + "primary_measure": "largest_tested_proved_variables", + "provenance": { + "driver_name": "optimize-native-benchmark", + "driver_sha256": "fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4", + "source_head": "f76dd776af77d2b416d58ea164099b8fdca22dc5", + "runtime_source_sha256": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_capacity_scaling.py": "41facae2d729d8b80ae720d89114e9f3bbe9857ae53ee4ad94627b576d0a72c4", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f" + }, + "frozen_manifest_sha256": "ce41bc1e75e35c6dbe708b65ff3f97904533aa66c9f57b1e10d9534b55ff13d3", + "frozen_protocol_sha256": "530ab6fb7e7592f040755398434dd88c461b4628eddeaf4ea3e0b4ac631fbd89", + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 779, + "stderr_bytes_observed": 98249, + "external_seconds": 0.21873362455517054, + "started_utc": "2026-09-06T04:07:48.620105+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.054594083689153194, + "started_utc": "2026-09-06T04:07:48.858808+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + } + }, + "cases": [ + { + "id": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "variables": 8, + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "stress": false, + "objective": -337, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000116916, + 0.005084792 + ], + "external_seconds": [ + 0.009522708132863045, + 0.024055415764451027 + ], + "median_internal_seconds": 0.002600854, + "median_external_seconds": 0.016789061948657036, + "objectives": [ + -337, + -337 + ], + "bounds": [ + -337, + -337 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.00013125, + 0.00080275 + ], + "external_seconds": [ + 0.011597124859690666, + 0.011250750161707401 + ], + "median_internal_seconds": 0.00046699999999999997, + "median_external_seconds": 0.011423937510699034, + "objectives": [ + -337, + -337 + ], + "bounds": [ + -337, + -337 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.6402367863535934, + "median_paired_external_seconds_ratio_after_before": 0.8427701437335884 + }, + { + "id": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "variables": 32, + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "stress": false, + "objective": -1096, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.347881084, + 0.349930084 + ], + "external_seconds": [ + 0.3573359167203307, + 0.3591633327305317 + ], + "median_internal_seconds": 0.348905584, + "median_external_seconds": 0.3582496247254312, + "objectives": [ + -1096, + -1096 + ], + "bounds": [ + -1096, + -1096 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000312667, + 0.000315083 + ], + "external_seconds": [ + 0.01230200007557869, + 0.008893999271094799 + ], + "median_internal_seconds": 0.000313875, + "median_external_seconds": 0.010597999673336744, + "objectives": [ + -1096, + -1096 + ], + "bounds": [ + -1096, + -1096 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.0008995962619602853, + "median_paired_external_seconds_ratio_after_before": 0.029595047492720288 + }, + { + "id": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "variables": 128, + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "stress": false, + "objective": -4318, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.005454416, + 10.001522709 + ], + "external_seconds": [ + 10.020563625730574, + 10.012786542065442 + ], + "median_internal_seconds": 10.0034885625, + "median_external_seconds": 10.016675083898008, + "objectives": [ + -2471, + -2485 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.014345209, + 0.002915083 + ], + "external_seconds": [ + 0.08776045776903629, + 0.014147999696433544 + ], + "median_internal_seconds": 0.008630146, + "median_external_seconds": 0.05095422873273492, + "objectives": [ + -4318, + -4318 + ], + "bounds": [ + -4318, + -4318 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "variables": 384, + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "stress": false, + "objective": -13832, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000380167, + 10.000534 + ], + "external_seconds": [ + 10.011808041483164, + 10.012417333200574 + ], + "median_internal_seconds": 10.000457083499999, + "median_external_seconds": 10.012112687341869, + "objectives": [ + -8545, + -8545 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.028283625, + 0.024979709 + ], + "external_seconds": [ + 0.048019083216786385, + 0.03675775043666363 + ], + "median_internal_seconds": 0.026631666999999998, + "median_external_seconds": 0.042388416826725006, + "objectives": [ + -13832, + -13832 + ], + "bounds": [ + -13832, + -13832 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "variables": 8, + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "stress": false, + "objective": -62, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000299, + 0.000625875 + ], + "external_seconds": [ + 0.010899749584496021, + 0.011910666711628437 + ], + "median_internal_seconds": 0.0004624375, + "median_external_seconds": 0.01140520814806223, + "objectives": [ + -62, + -62 + ], + "bounds": [ + -62, + -62 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000113292, + 0.002279125 + ], + "external_seconds": [ + 0.009227416478097439, + 0.021788625046610832 + ], + "median_internal_seconds": 0.0011962085, + "median_external_seconds": 0.015508020762354136, + "objectives": [ + -62, + -62 + ], + "bounds": [ + -62, + -62 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 2.0102024536885814, + "median_paired_external_seconds_ratio_after_before": 1.337954282648152 + }, + { + "id": "capacity_correlated_small_32", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "variables": 32, + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "stress": false, + "objective": -312, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 7.732421208, + 7.743891041 + ], + "external_seconds": [ + 7.741252458654344, + 7.752690874971449 + ], + "median_internal_seconds": 7.7381561245, + "median_external_seconds": 7.746971666812897, + "objectives": [ + -312, + -312 + ], + "bounds": [ + -312, + -312 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000571167, + 0.000291333 + ], + "external_seconds": [ + 0.015935375355184078, + 0.011299584060907364 + ], + "median_internal_seconds": 0.00043125, + "median_external_seconds": 0.013617479708045721, + "objectives": [ + -312, + -312 + ], + "bounds": [ + -312, + -312 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 5.5743761889840136e-05, + "median_paired_external_seconds_ratio_after_before": 0.0017580028564452154 + }, + { + "id": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "variables": 128, + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "stress": false, + "objective": -1211, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000127958, + 10.000133917 + ], + "external_seconds": [ + 10.01025962550193, + 10.010992375202477 + ], + "median_internal_seconds": 10.0001309375, + "median_external_seconds": 10.010626000352204, + "objectives": [ + -1043, + -1043 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.006207459, + 0.003199667 + ], + "external_seconds": [ + 0.03148612566292286, + 0.014725000597536564 + ], + "median_internal_seconds": 0.004703563, + "median_external_seconds": 0.02310556313022971, + "objectives": [ + -1211, + -1211 + ], + "bounds": [ + -1211, + -1211 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_correlated_large_384", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "variables": 384, + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "stress": false, + "objective": -3648, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000571375, + 10.000235167 + ], + "external_seconds": [ + 10.014845707453787, + 10.011801375076175 + ], + "median_internal_seconds": 10.000403271, + "median_external_seconds": 10.013323541264981, + "objectives": [ + -3070, + -3070 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.028517875, + 0.026443667 + ], + "external_seconds": [ + 0.046651833690702915, + 0.03874254133552313 + ], + "median_internal_seconds": 0.027480771, + "median_external_seconds": 0.04269718751311302, + "objectives": [ + -3648, + -3648 + ], + "bounds": [ + -3648, + -3648 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "assignment_sanity_3", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "variables": 9, + "dimensions": { + "variables": 9, + "rows": 12, + "nonzeros": 36 + }, + "stress": false, + "objective": 87, + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000289833, + 0.000376708 + ], + "external_seconds": [ + 0.009033124893903732, + 0.011355416849255562 + ], + "median_internal_seconds": 0.0003332705, + "median_external_seconds": 0.010194270871579647, + "objectives": [ + 87, + 87 + ], + "bounds": [ + 87, + 87 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000118459, + 0.000522125 + ], + "external_seconds": [ + 0.008583208546042442, + 0.011468167416751385 + ], + "median_internal_seconds": 0.000320292, + "median_external_seconds": 0.010025687981396914, + "objectives": [ + 87, + 87 + ], + "bounds": [ + 87, + 87 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.8973675728560924, + "median_paired_external_seconds_ratio_after_before": 0.9800609224372785 + }, + { + "id": "assignment_small_5", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "variables": 25, + "dimensions": { + "variables": 25, + "rows": 20, + "nonzeros": 100 + }, + "stress": false, + "objective": 162, + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000245916, + 0.000237375 + ], + "external_seconds": [ + 0.008847500197589397, + 0.009153416380286217 + ], + "median_internal_seconds": 0.0002416455, + "median_external_seconds": 0.009000458288937807, + "objectives": [ + 162, + 162 + ], + "bounds": [ + 162, + 162 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000228291, + 0.000287208 + ], + "external_seconds": [ + 0.009011249989271164, + 0.009130832739174366 + ], + "median_internal_seconds": 0.0002577495, + "median_external_seconds": 0.009071041364222765, + "objectives": [ + 162, + 162 + ], + "bounds": [ + 162, + 162 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.069131417432331, + "median_paired_external_seconds_ratio_after_before": 1.0080203964345544 + }, + { + "id": "assignment_medium_9", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "variables": 81, + "dimensions": { + "variables": 81, + "rows": 36, + "nonzeros": 324 + }, + "stress": false, + "objective": 146, + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003171084, + 0.003241208 + ], + "external_seconds": [ + 0.011296583339571953, + 0.011796625331044197 + ], + "median_internal_seconds": 0.003206146, + "median_external_seconds": 0.011546604335308075, + "objectives": [ + 146, + 146 + ], + "bounds": [ + 146, + 146 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003316208, + 0.003150167 + ], + "external_seconds": [ + 0.011218416504561901, + 0.013940167613327503 + ], + "median_internal_seconds": 0.0032331875, + "median_external_seconds": 0.012579292058944702, + "objectives": [ + 146, + 146 + ], + "bounds": [ + 146, + 146 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.0088380952844442, + "median_paired_external_seconds_ratio_after_before": 1.0873942904537077 + }, + { + "id": "assignment_large_16", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "variables": 256, + "dimensions": { + "variables": 256, + "rows": 64, + "nonzeros": 1024 + }, + "stress": false, + "objective": 145, + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 3.025276, + 3.120898459 + ], + "external_seconds": [ + 3.034988207742572, + 3.138057249598205 + ], + "median_internal_seconds": 3.0730872295, + "median_external_seconds": 3.0865227286703885, + "objectives": [ + 145, + 145 + ], + "bounds": [ + 145, + 145 + ] + }, + "after": { + "attempts": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 2.981603375, + 3.152091042 + ], + "external_seconds": [ + 2.992917542345822, + 3.1635700836777687 + ], + "median_internal_seconds": 3.0668472085, + "median_external_seconds": 3.0782438130117953, + "objectives": [ + 145, + 145 + ], + "bounds": [ + 145, + 145 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9977794151583015, + "median_paired_external_seconds_ratio_after_before": 0.9971341244981242 + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "variables": 512, + "dimensions": { + "variables": 512, + "rows": 1, + "nonzeros": 512 + }, + "stress": true, + "objective": -18731, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "before": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000616167, + 10.0023235 + ], + "external_seconds": [ + 10.013550084084272, + 10.025324125774205 + ], + "median_internal_seconds": 10.0014698335, + "median_external_seconds": 10.019437104929239, + "objectives": [ + -11574, + -11574 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "attempts": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001320292, + 10.002009708 + ], + "external_seconds": [ + 10.02298937458545, + 10.01333041768521 + ], + "median_internal_seconds": 10.001665, + "median_external_seconds": 10.01815989613533, + "objectives": [ + -11574, + -11574 + ], + "bounds": [ + null, + null + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + } + ], + "families": [ + { + "family": "capacity_uncorrelated", + "tested_variables": [ + 8, + 32, + 128, + 384, + 512 + ], + "before": { + "largest_tested_proved_variables": 32, + "proved_tiers": 2, + "total_tiers": 5, + "larger_tested_unproved_variables": [ + 128, + 384, + 512 + ] + }, + "after": { + "largest_tested_proved_variables": 384, + "proved_tiers": 4, + "total_tiers": 5, + "larger_tested_unproved_variables": [ + 512 + ] + }, + "ratio_of_largest_tested_proved_variables": 12.0 + }, + { + "family": "capacity_correlated", + "tested_variables": [ + 8, + 32, + 128, + 384 + ], + "before": { + "largest_tested_proved_variables": 32, + "proved_tiers": 2, + "total_tiers": 4, + "larger_tested_unproved_variables": [ + 128, + 384 + ] + }, + "after": { + "largest_tested_proved_variables": 384, + "proved_tiers": 4, + "total_tiers": 4, + "larger_tested_unproved_variables": [] + }, + "ratio_of_largest_tested_proved_variables": 12.0 + }, + { + "family": "assignment", + "tested_variables": [ + 9, + 25, + 81, + 256 + ], + "before": { + "largest_tested_proved_variables": 256, + "proved_tiers": 4, + "total_tiers": 4, + "larger_tested_unproved_variables": [] + }, + "after": { + "largest_tested_proved_variables": 256, + "proved_tiers": 4, + "total_tiers": 4, + "larger_tested_unproved_variables": [] + }, + "ratio_of_largest_tested_proved_variables": 1.0 + } + ], + "caveats": [ + "One nested seeded instance per size, repeated twice; repetitions are not independent input samples.", + "Largest tested size is an observed ladder result, not the true solver capacity.", + "Only independently verified optimal results within the internal 10-second allowance count as proved.", + "All failures and capped solves remain in the denominator; no solve-time ratio uses a censored baseline.", + "Capacity and table size also affect the pseudo-polynomial DP; variable count alone is not its complexity.", + "The separate 512-variable stress case crosses the implementation table cap and must remain visible.", + "Internal solve times are primary; external times include process startup, input parsing and model construction." + ] + }, + "frozen_models": [ + { + "id": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "seed": 20260906, + "n": 8, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "reference": { + "status": "optimal", + "objective": -337, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 1418, + "input_sha256": "3532382f5f607bf594a9ee2969c8db318e5185d37d5c89c2d00b354cf8d28b28" + } + }, + { + "id": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "seed": 20260906, + "n": 32, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "reference": { + "status": "optimal", + "objective": -1096, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 22948, + "input_sha256": "129ce1700ffbb57f5114067131155e1ff7d61595a4f53abbb481357a21eeabfa" + } + }, + { + "id": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "seed": 20260906, + "n": 128, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "reference": { + "status": "optimal", + "objective": -4318, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 406196, + "input_sha256": "54d982cd0b01e854dc7b784fdc1169e6cfafda8cd64eff6eba27ad134d060066" + } + }, + { + "id": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "seed": 20260906, + "n": 384, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "reference": { + "status": "optimal", + "objective": -13832, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 3741802, + "input_sha256": "2e01bc33e2af812ae5ace6b1f03370919953f916b9a4fd78b059bb8311f79da0" + } + }, + { + "id": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "seed": 20260907, + "n": 8, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 8, + "rows": 1, + "nonzeros": 8 + }, + "reference": { + "status": "optimal", + "objective": -62, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 835, + "input_sha256": "224d725d608edb4090706db1b5aac0aafdf5b0cfa468dfe54e8a1ff1b66a3b55" + } + }, + { + "id": "capacity_correlated_small_32", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "seed": 20260907, + "n": 32, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 32, + "rows": 1, + "nonzeros": 32 + }, + "reference": { + "status": "optimal", + "objective": -312, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 10217, + "input_sha256": "85d128437540b3d05475d2781a2bdbd4bc2c0eebfc939c2db8e3c1d865eee7bb" + } + }, + { + "id": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "seed": 20260907, + "n": 128, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 128, + "rows": 1, + "nonzeros": 128 + }, + "reference": { + "status": "optimal", + "objective": -1211, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 162198, + "input_sha256": "16ae1b9c1f18deb10b7f8d1d122f12d8cb72440483f97d96ff50e44fb612065b" + } + }, + { + "id": "capacity_correlated_large_384", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "seed": 20260907, + "n": 384, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "variables": 384, + "rows": 1, + "nonzeros": 384 + }, + "reference": { + "status": "optimal", + "objective": -3648, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 1556577, + "input_sha256": "1dde254629e93f90cec642e057b4610a07c7829f40ae188ff3b3282c67a27bcb" + } + }, + { + "id": "assignment_sanity_3", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "seed": 20260908, + "n": 9, + "c": [ + 32, + 25, + 46, + 56, + 78, + 26, + 36, + 64, + 23 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 3, + 1 + ], + [ + 6, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 3, + -1 + ], + [ + 6, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 4, + 1 + ], + [ + 7, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 4, + -1 + ], + [ + 7, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 5, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 5, + -1 + ], + [ + 8, + -1 + ] + ] + } + ], + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "variables": 9, + "rows": 12, + "nonzeros": 36 + }, + "reference": { + "status": "optimal", + "objective": 87, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 12, + "input_sha256": "13e90d7bbba3d98cbf029ee965e3b17f8a282baaa9a9cba9176dc76b4929c7a4" + } + }, + { + "id": "assignment_small_5", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "seed": 20260908, + "n": 25, + "c": [ + 32, + 25, + 46, + 17, + 25, + 56, + 78, + 26, + 29, + 97, + 36, + 64, + 23, + 65, + 34, + 97, + 68, + 44, + 98, + 44, + 41, + 68, + 59, + 39, + 77 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 5, + 1 + ], + [ + 10, + 1 + ], + [ + 15, + 1 + ], + [ + 20, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 5, + -1 + ], + [ + 10, + -1 + ], + [ + 15, + -1 + ], + [ + 20, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 6, + 1 + ], + [ + 11, + 1 + ], + [ + 16, + 1 + ], + [ + 21, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 6, + -1 + ], + [ + 11, + -1 + ], + [ + 16, + -1 + ], + [ + 21, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 7, + 1 + ], + [ + 12, + 1 + ], + [ + 17, + 1 + ], + [ + 22, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 7, + -1 + ], + [ + 12, + -1 + ], + [ + 17, + -1 + ], + [ + 22, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 8, + 1 + ], + [ + 13, + 1 + ], + [ + 18, + 1 + ], + [ + 23, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 8, + -1 + ], + [ + 13, + -1 + ], + [ + 18, + -1 + ], + [ + 23, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 9, + 1 + ], + [ + 14, + 1 + ], + [ + 19, + 1 + ], + [ + 24, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 9, + -1 + ], + [ + 14, + -1 + ], + [ + 19, + -1 + ], + [ + 24, + -1 + ] + ] + } + ], + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "variables": 25, + "rows": 20, + "nonzeros": 100 + }, + "reference": { + "status": "optimal", + "objective": 162, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 80, + "input_sha256": "bce2b7a675ef398a461f98a90557b91b74bb9dc7f38964319608ede9bb67c1b0" + } + }, + { + "id": "assignment_medium_9", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "seed": 20260908, + "n": 81, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 9, + 1 + ], + [ + 18, + 1 + ], + [ + 27, + 1 + ], + [ + 36, + 1 + ], + [ + 45, + 1 + ], + [ + 54, + 1 + ], + [ + 63, + 1 + ], + [ + 72, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 9, + -1 + ], + [ + 18, + -1 + ], + [ + 27, + -1 + ], + [ + 36, + -1 + ], + [ + 45, + -1 + ], + [ + 54, + -1 + ], + [ + 63, + -1 + ], + [ + 72, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 10, + 1 + ], + [ + 19, + 1 + ], + [ + 28, + 1 + ], + [ + 37, + 1 + ], + [ + 46, + 1 + ], + [ + 55, + 1 + ], + [ + 64, + 1 + ], + [ + 73, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 10, + -1 + ], + [ + 19, + -1 + ], + [ + 28, + -1 + ], + [ + 37, + -1 + ], + [ + 46, + -1 + ], + [ + 55, + -1 + ], + [ + 64, + -1 + ], + [ + 73, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 11, + 1 + ], + [ + 20, + 1 + ], + [ + 29, + 1 + ], + [ + 38, + 1 + ], + [ + 47, + 1 + ], + [ + 56, + 1 + ], + [ + 65, + 1 + ], + [ + 74, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 11, + -1 + ], + [ + 20, + -1 + ], + [ + 29, + -1 + ], + [ + 38, + -1 + ], + [ + 47, + -1 + ], + [ + 56, + -1 + ], + [ + 65, + -1 + ], + [ + 74, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 12, + 1 + ], + [ + 21, + 1 + ], + [ + 30, + 1 + ], + [ + 39, + 1 + ], + [ + 48, + 1 + ], + [ + 57, + 1 + ], + [ + 66, + 1 + ], + [ + 75, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 12, + -1 + ], + [ + 21, + -1 + ], + [ + 30, + -1 + ], + [ + 39, + -1 + ], + [ + 48, + -1 + ], + [ + 57, + -1 + ], + [ + 66, + -1 + ], + [ + 75, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 13, + 1 + ], + [ + 22, + 1 + ], + [ + 31, + 1 + ], + [ + 40, + 1 + ], + [ + 49, + 1 + ], + [ + 58, + 1 + ], + [ + 67, + 1 + ], + [ + 76, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 13, + -1 + ], + [ + 22, + -1 + ], + [ + 31, + -1 + ], + [ + 40, + -1 + ], + [ + 49, + -1 + ], + [ + 58, + -1 + ], + [ + 67, + -1 + ], + [ + 76, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 14, + 1 + ], + [ + 23, + 1 + ], + [ + 32, + 1 + ], + [ + 41, + 1 + ], + [ + 50, + 1 + ], + [ + 59, + 1 + ], + [ + 68, + 1 + ], + [ + 77, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 14, + -1 + ], + [ + 23, + -1 + ], + [ + 32, + -1 + ], + [ + 41, + -1 + ], + [ + 50, + -1 + ], + [ + 59, + -1 + ], + [ + 68, + -1 + ], + [ + 77, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 15, + 1 + ], + [ + 24, + 1 + ], + [ + 33, + 1 + ], + [ + 42, + 1 + ], + [ + 51, + 1 + ], + [ + 60, + 1 + ], + [ + 69, + 1 + ], + [ + 78, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 15, + -1 + ], + [ + 24, + -1 + ], + [ + 33, + -1 + ], + [ + 42, + -1 + ], + [ + 51, + -1 + ], + [ + 60, + -1 + ], + [ + 69, + -1 + ], + [ + 78, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 16, + 1 + ], + [ + 25, + 1 + ], + [ + 34, + 1 + ], + [ + 43, + 1 + ], + [ + 52, + 1 + ], + [ + 61, + 1 + ], + [ + 70, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 16, + -1 + ], + [ + 25, + -1 + ], + [ + 34, + -1 + ], + [ + 43, + -1 + ], + [ + 52, + -1 + ], + [ + 61, + -1 + ], + [ + 70, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 17, + 1 + ], + [ + 26, + 1 + ], + [ + 35, + 1 + ], + [ + 44, + 1 + ], + [ + 53, + 1 + ], + [ + 62, + 1 + ], + [ + 71, + 1 + ], + [ + 80, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 17, + -1 + ], + [ + 26, + -1 + ], + [ + 35, + -1 + ], + [ + 44, + -1 + ], + [ + 53, + -1 + ], + [ + 62, + -1 + ], + [ + 71, + -1 + ], + [ + 80, + -1 + ] + ] + } + ], + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "variables": 81, + "rows": 36, + "nonzeros": 324 + }, + "reference": { + "status": "optimal", + "objective": 146, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 2304, + "input_sha256": "d579b817bd55c3ac1303eae47165e42072022ae3459f62ef6d7e038a2cddeb91" + } + }, + { + "id": "assignment_large_16", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "seed": 20260908, + "n": 256, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 16, + 1 + ], + [ + 32, + 1 + ], + [ + 48, + 1 + ], + [ + 64, + 1 + ], + [ + 80, + 1 + ], + [ + 96, + 1 + ], + [ + 112, + 1 + ], + [ + 128, + 1 + ], + [ + 144, + 1 + ], + [ + 160, + 1 + ], + [ + 176, + 1 + ], + [ + 192, + 1 + ], + [ + 208, + 1 + ], + [ + 224, + 1 + ], + [ + 240, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 16, + -1 + ], + [ + 32, + -1 + ], + [ + 48, + -1 + ], + [ + 64, + -1 + ], + [ + 80, + -1 + ], + [ + 96, + -1 + ], + [ + 112, + -1 + ], + [ + 128, + -1 + ], + [ + 144, + -1 + ], + [ + 160, + -1 + ], + [ + 176, + -1 + ], + [ + 192, + -1 + ], + [ + 208, + -1 + ], + [ + 224, + -1 + ], + [ + 240, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 17, + 1 + ], + [ + 33, + 1 + ], + [ + 49, + 1 + ], + [ + 65, + 1 + ], + [ + 81, + 1 + ], + [ + 97, + 1 + ], + [ + 113, + 1 + ], + [ + 129, + 1 + ], + [ + 145, + 1 + ], + [ + 161, + 1 + ], + [ + 177, + 1 + ], + [ + 193, + 1 + ], + [ + 209, + 1 + ], + [ + 225, + 1 + ], + [ + 241, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 17, + -1 + ], + [ + 33, + -1 + ], + [ + 49, + -1 + ], + [ + 65, + -1 + ], + [ + 81, + -1 + ], + [ + 97, + -1 + ], + [ + 113, + -1 + ], + [ + 129, + -1 + ], + [ + 145, + -1 + ], + [ + 161, + -1 + ], + [ + 177, + -1 + ], + [ + 193, + -1 + ], + [ + 209, + -1 + ], + [ + 225, + -1 + ], + [ + 241, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 18, + 1 + ], + [ + 34, + 1 + ], + [ + 50, + 1 + ], + [ + 66, + 1 + ], + [ + 82, + 1 + ], + [ + 98, + 1 + ], + [ + 114, + 1 + ], + [ + 130, + 1 + ], + [ + 146, + 1 + ], + [ + 162, + 1 + ], + [ + 178, + 1 + ], + [ + 194, + 1 + ], + [ + 210, + 1 + ], + [ + 226, + 1 + ], + [ + 242, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 18, + -1 + ], + [ + 34, + -1 + ], + [ + 50, + -1 + ], + [ + 66, + -1 + ], + [ + 82, + -1 + ], + [ + 98, + -1 + ], + [ + 114, + -1 + ], + [ + 130, + -1 + ], + [ + 146, + -1 + ], + [ + 162, + -1 + ], + [ + 178, + -1 + ], + [ + 194, + -1 + ], + [ + 210, + -1 + ], + [ + 226, + -1 + ], + [ + 242, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 19, + 1 + ], + [ + 35, + 1 + ], + [ + 51, + 1 + ], + [ + 67, + 1 + ], + [ + 83, + 1 + ], + [ + 99, + 1 + ], + [ + 115, + 1 + ], + [ + 131, + 1 + ], + [ + 147, + 1 + ], + [ + 163, + 1 + ], + [ + 179, + 1 + ], + [ + 195, + 1 + ], + [ + 211, + 1 + ], + [ + 227, + 1 + ], + [ + 243, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 19, + -1 + ], + [ + 35, + -1 + ], + [ + 51, + -1 + ], + [ + 67, + -1 + ], + [ + 83, + -1 + ], + [ + 99, + -1 + ], + [ + 115, + -1 + ], + [ + 131, + -1 + ], + [ + 147, + -1 + ], + [ + 163, + -1 + ], + [ + 179, + -1 + ], + [ + 195, + -1 + ], + [ + 211, + -1 + ], + [ + 227, + -1 + ], + [ + 243, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 20, + 1 + ], + [ + 36, + 1 + ], + [ + 52, + 1 + ], + [ + 68, + 1 + ], + [ + 84, + 1 + ], + [ + 100, + 1 + ], + [ + 116, + 1 + ], + [ + 132, + 1 + ], + [ + 148, + 1 + ], + [ + 164, + 1 + ], + [ + 180, + 1 + ], + [ + 196, + 1 + ], + [ + 212, + 1 + ], + [ + 228, + 1 + ], + [ + 244, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 20, + -1 + ], + [ + 36, + -1 + ], + [ + 52, + -1 + ], + [ + 68, + -1 + ], + [ + 84, + -1 + ], + [ + 100, + -1 + ], + [ + 116, + -1 + ], + [ + 132, + -1 + ], + [ + 148, + -1 + ], + [ + 164, + -1 + ], + [ + 180, + -1 + ], + [ + 196, + -1 + ], + [ + 212, + -1 + ], + [ + 228, + -1 + ], + [ + 244, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 21, + 1 + ], + [ + 37, + 1 + ], + [ + 53, + 1 + ], + [ + 69, + 1 + ], + [ + 85, + 1 + ], + [ + 101, + 1 + ], + [ + 117, + 1 + ], + [ + 133, + 1 + ], + [ + 149, + 1 + ], + [ + 165, + 1 + ], + [ + 181, + 1 + ], + [ + 197, + 1 + ], + [ + 213, + 1 + ], + [ + 229, + 1 + ], + [ + 245, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 21, + -1 + ], + [ + 37, + -1 + ], + [ + 53, + -1 + ], + [ + 69, + -1 + ], + [ + 85, + -1 + ], + [ + 101, + -1 + ], + [ + 117, + -1 + ], + [ + 133, + -1 + ], + [ + 149, + -1 + ], + [ + 165, + -1 + ], + [ + 181, + -1 + ], + [ + 197, + -1 + ], + [ + 213, + -1 + ], + [ + 229, + -1 + ], + [ + 245, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 54, + 1 + ], + [ + 70, + 1 + ], + [ + 86, + 1 + ], + [ + 102, + 1 + ], + [ + 118, + 1 + ], + [ + 134, + 1 + ], + [ + 150, + 1 + ], + [ + 166, + 1 + ], + [ + 182, + 1 + ], + [ + 198, + 1 + ], + [ + 214, + 1 + ], + [ + 230, + 1 + ], + [ + 246, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 22, + -1 + ], + [ + 38, + -1 + ], + [ + 54, + -1 + ], + [ + 70, + -1 + ], + [ + 86, + -1 + ], + [ + 102, + -1 + ], + [ + 118, + -1 + ], + [ + 134, + -1 + ], + [ + 150, + -1 + ], + [ + 166, + -1 + ], + [ + 182, + -1 + ], + [ + 198, + -1 + ], + [ + 214, + -1 + ], + [ + 230, + -1 + ], + [ + 246, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 23, + 1 + ], + [ + 39, + 1 + ], + [ + 55, + 1 + ], + [ + 71, + 1 + ], + [ + 87, + 1 + ], + [ + 103, + 1 + ], + [ + 119, + 1 + ], + [ + 135, + 1 + ], + [ + 151, + 1 + ], + [ + 167, + 1 + ], + [ + 183, + 1 + ], + [ + 199, + 1 + ], + [ + 215, + 1 + ], + [ + 231, + 1 + ], + [ + 247, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 23, + -1 + ], + [ + 39, + -1 + ], + [ + 55, + -1 + ], + [ + 71, + -1 + ], + [ + 87, + -1 + ], + [ + 103, + -1 + ], + [ + 119, + -1 + ], + [ + 135, + -1 + ], + [ + 151, + -1 + ], + [ + 167, + -1 + ], + [ + 183, + -1 + ], + [ + 199, + -1 + ], + [ + 215, + -1 + ], + [ + 231, + -1 + ], + [ + 247, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 24, + 1 + ], + [ + 40, + 1 + ], + [ + 56, + 1 + ], + [ + 72, + 1 + ], + [ + 88, + 1 + ], + [ + 104, + 1 + ], + [ + 120, + 1 + ], + [ + 136, + 1 + ], + [ + 152, + 1 + ], + [ + 168, + 1 + ], + [ + 184, + 1 + ], + [ + 200, + 1 + ], + [ + 216, + 1 + ], + [ + 232, + 1 + ], + [ + 248, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 24, + -1 + ], + [ + 40, + -1 + ], + [ + 56, + -1 + ], + [ + 72, + -1 + ], + [ + 88, + -1 + ], + [ + 104, + -1 + ], + [ + 120, + -1 + ], + [ + 136, + -1 + ], + [ + 152, + -1 + ], + [ + 168, + -1 + ], + [ + 184, + -1 + ], + [ + 200, + -1 + ], + [ + 216, + -1 + ], + [ + 232, + -1 + ], + [ + 248, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 25, + 1 + ], + [ + 41, + 1 + ], + [ + 57, + 1 + ], + [ + 73, + 1 + ], + [ + 89, + 1 + ], + [ + 105, + 1 + ], + [ + 121, + 1 + ], + [ + 137, + 1 + ], + [ + 153, + 1 + ], + [ + 169, + 1 + ], + [ + 185, + 1 + ], + [ + 201, + 1 + ], + [ + 217, + 1 + ], + [ + 233, + 1 + ], + [ + 249, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 25, + -1 + ], + [ + 41, + -1 + ], + [ + 57, + -1 + ], + [ + 73, + -1 + ], + [ + 89, + -1 + ], + [ + 105, + -1 + ], + [ + 121, + -1 + ], + [ + 137, + -1 + ], + [ + 153, + -1 + ], + [ + 169, + -1 + ], + [ + 185, + -1 + ], + [ + 201, + -1 + ], + [ + 217, + -1 + ], + [ + 233, + -1 + ], + [ + 249, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 26, + 1 + ], + [ + 42, + 1 + ], + [ + 58, + 1 + ], + [ + 74, + 1 + ], + [ + 90, + 1 + ], + [ + 106, + 1 + ], + [ + 122, + 1 + ], + [ + 138, + 1 + ], + [ + 154, + 1 + ], + [ + 170, + 1 + ], + [ + 186, + 1 + ], + [ + 202, + 1 + ], + [ + 218, + 1 + ], + [ + 234, + 1 + ], + [ + 250, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 26, + -1 + ], + [ + 42, + -1 + ], + [ + 58, + -1 + ], + [ + 74, + -1 + ], + [ + 90, + -1 + ], + [ + 106, + -1 + ], + [ + 122, + -1 + ], + [ + 138, + -1 + ], + [ + 154, + -1 + ], + [ + 170, + -1 + ], + [ + 186, + -1 + ], + [ + 202, + -1 + ], + [ + 218, + -1 + ], + [ + 234, + -1 + ], + [ + 250, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 27, + 1 + ], + [ + 43, + 1 + ], + [ + 59, + 1 + ], + [ + 75, + 1 + ], + [ + 91, + 1 + ], + [ + 107, + 1 + ], + [ + 123, + 1 + ], + [ + 139, + 1 + ], + [ + 155, + 1 + ], + [ + 171, + 1 + ], + [ + 187, + 1 + ], + [ + 203, + 1 + ], + [ + 219, + 1 + ], + [ + 235, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 27, + -1 + ], + [ + 43, + -1 + ], + [ + 59, + -1 + ], + [ + 75, + -1 + ], + [ + 91, + -1 + ], + [ + 107, + -1 + ], + [ + 123, + -1 + ], + [ + 139, + -1 + ], + [ + 155, + -1 + ], + [ + 171, + -1 + ], + [ + 187, + -1 + ], + [ + 203, + -1 + ], + [ + 219, + -1 + ], + [ + 235, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 28, + 1 + ], + [ + 44, + 1 + ], + [ + 60, + 1 + ], + [ + 76, + 1 + ], + [ + 92, + 1 + ], + [ + 108, + 1 + ], + [ + 124, + 1 + ], + [ + 140, + 1 + ], + [ + 156, + 1 + ], + [ + 172, + 1 + ], + [ + 188, + 1 + ], + [ + 204, + 1 + ], + [ + 220, + 1 + ], + [ + 236, + 1 + ], + [ + 252, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 28, + -1 + ], + [ + 44, + -1 + ], + [ + 60, + -1 + ], + [ + 76, + -1 + ], + [ + 92, + -1 + ], + [ + 108, + -1 + ], + [ + 124, + -1 + ], + [ + 140, + -1 + ], + [ + 156, + -1 + ], + [ + 172, + -1 + ], + [ + 188, + -1 + ], + [ + 204, + -1 + ], + [ + 220, + -1 + ], + [ + 236, + -1 + ], + [ + 252, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 29, + 1 + ], + [ + 45, + 1 + ], + [ + 61, + 1 + ], + [ + 77, + 1 + ], + [ + 93, + 1 + ], + [ + 109, + 1 + ], + [ + 125, + 1 + ], + [ + 141, + 1 + ], + [ + 157, + 1 + ], + [ + 173, + 1 + ], + [ + 189, + 1 + ], + [ + 205, + 1 + ], + [ + 221, + 1 + ], + [ + 237, + 1 + ], + [ + 253, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 29, + -1 + ], + [ + 45, + -1 + ], + [ + 61, + -1 + ], + [ + 77, + -1 + ], + [ + 93, + -1 + ], + [ + 109, + -1 + ], + [ + 125, + -1 + ], + [ + 141, + -1 + ], + [ + 157, + -1 + ], + [ + 173, + -1 + ], + [ + 189, + -1 + ], + [ + 205, + -1 + ], + [ + 221, + -1 + ], + [ + 237, + -1 + ], + [ + 253, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 30, + 1 + ], + [ + 46, + 1 + ], + [ + 62, + 1 + ], + [ + 78, + 1 + ], + [ + 94, + 1 + ], + [ + 110, + 1 + ], + [ + 126, + 1 + ], + [ + 142, + 1 + ], + [ + 158, + 1 + ], + [ + 174, + 1 + ], + [ + 190, + 1 + ], + [ + 206, + 1 + ], + [ + 222, + 1 + ], + [ + 238, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 30, + -1 + ], + [ + 46, + -1 + ], + [ + 62, + -1 + ], + [ + 78, + -1 + ], + [ + 94, + -1 + ], + [ + 110, + -1 + ], + [ + 126, + -1 + ], + [ + 142, + -1 + ], + [ + 158, + -1 + ], + [ + 174, + -1 + ], + [ + 190, + -1 + ], + [ + 206, + -1 + ], + [ + 222, + -1 + ], + [ + 238, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 31, + 1 + ], + [ + 47, + 1 + ], + [ + 63, + 1 + ], + [ + 79, + 1 + ], + [ + 95, + 1 + ], + [ + 111, + 1 + ], + [ + 127, + 1 + ], + [ + 143, + 1 + ], + [ + 159, + 1 + ], + [ + 175, + 1 + ], + [ + 191, + 1 + ], + [ + 207, + 1 + ], + [ + 223, + 1 + ], + [ + 239, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 31, + -1 + ], + [ + 47, + -1 + ], + [ + 63, + -1 + ], + [ + 79, + -1 + ], + [ + 95, + -1 + ], + [ + 111, + -1 + ], + [ + 127, + -1 + ], + [ + 143, + -1 + ], + [ + 159, + -1 + ], + [ + 175, + -1 + ], + [ + 191, + -1 + ], + [ + 207, + -1 + ], + [ + 223, + -1 + ], + [ + 239, + -1 + ], + [ + 255, + -1 + ] + ] + } + ], + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "variables": 256, + "rows": 64, + "nonzeros": 1024 + }, + "reference": { + "status": "optimal", + "objective": 145, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 524288, + "input_sha256": "ac896fe1f45b41ee98243c39f2303d3596b6376b4af6118d8e9b0f8b9dee58f5" + } + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "seed": 20260906, + "n": 512, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62, + -4, + -73, + -82, + -60, + -16, + -32, + -95, + -41, + -42, + -65, + -53, + -11, + -59, + -52, + -48, + -60, + -89, + -41, + -73, + -97, + -75, + -94, + -89, + -18, + -37, + -7, + -33, + -59, + -52, + -41, + -11, + -44, + -92, + -55, + -28, + -39, + -98, + -57, + -100, + -93, + -58, + -65, + -66, + -99, + -45, + -97, + -89, + -71, + -45, + -28, + -10, + -35, + -83, + -91, + -77, + -60, + -37, + -72, + -40, + -3, + -76, + -15, + -67, + -45 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ], + [ + 448, + -14 + ], + [ + 449, + -4 + ], + [ + 450, + -11 + ], + [ + 451, + -22 + ], + [ + 452, + -16 + ], + [ + 453, + -29 + ], + [ + 454, + -20 + ], + [ + 455, + -21 + ], + [ + 456, + -15 + ], + [ + 457, + -13 + ], + [ + 458, + -28 + ], + [ + 459, + -28 + ], + [ + 460, + -22 + ], + [ + 461, + -24 + ], + [ + 462, + -6 + ], + [ + 463, + -1 + ], + [ + 464, + -29 + ], + [ + 465, + -10 + ], + [ + 466, + -6 + ], + [ + 467, + -10 + ], + [ + 468, + -13 + ], + [ + 469, + -3 + ], + [ + 470, + -3 + ], + [ + 471, + -22 + ], + [ + 472, + -8 + ], + [ + 473, + -26 + ], + [ + 474, + -19 + ], + [ + 475, + -3 + ], + [ + 476, + -9 + ], + [ + 477, + -12 + ], + [ + 478, + -5 + ], + [ + 479, + -24 + ], + [ + 480, + -4 + ], + [ + 481, + -22 + ], + [ + 482, + -13 + ], + [ + 483, + -3 + ], + [ + 484, + -2 + ], + [ + 485, + -19 + ], + [ + 486, + -27 + ], + [ + 487, + -16 + ], + [ + 488, + -5 + ], + [ + 489, + -19 + ], + [ + 490, + -4 + ], + [ + 491, + -19 + ], + [ + 492, + -5 + ], + [ + 493, + -23 + ], + [ + 494, + -24 + ], + [ + 495, + -15 + ], + [ + 496, + -4 + ], + [ + 497, + -28 + ], + [ + 498, + -29 + ], + [ + 499, + -13 + ], + [ + 500, + -25 + ], + [ + 501, + -19 + ], + [ + 502, + -30 + ], + [ + 503, + -10 + ], + [ + 504, + -28 + ], + [ + 505, + -9 + ], + [ + 506, + -3 + ], + [ + 507, + -4 + ], + [ + 508, + -14 + ], + [ + 509, + -19 + ], + [ + 510, + -7 + ], + [ + 511, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "kind": "binary", + "dimensions": { + "variables": 512, + "rows": 1, + "nonzeros": 512 + }, + "reference": { + "status": "optimal", + "objective": -18731, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 6672300, + "input_sha256": "3ed2df4ae33b74b7e423e7c2b518fafcb65e4615e4cc7d034c9d8e171a841e08" + } + } + ], + "validation": { + "new_generator_and_runner_tests": { + "passed": 18, + "total": 18, + "seconds": 1.43 + }, + "solver_product_unchanged_from_algorithm_checkpoint": true, + "all_five_runtime_library_hashes_match_previous_candidate": true, + "driver_change": "Admission ceiling5s to10s; same newly frozen binary for both cohorts; prior study driver retained unchanged." + } +} diff --git a/docs/solver-parity/checkpoints/category-scaling.json b/docs/solver-parity/checkpoints/category-scaling.json new file mode 100644 index 0000000000..dc7d96cee6 --- /dev/null +++ b/docs/solver-parity/checkpoints/category-scaling.json @@ -0,0 +1,122644 @@ +{ + "schema_version": 1, + "source_commit": "272d360d02b7c4ed1b511d82219bd11c3b0c7394", + "families": [ + { + "id": "knapsack", + "name": "Knapsack", + "detail": "Both random and correlated profits", + "role": "target", + "before_max": 32, + "after_max": 384, + "expansion": 12.0, + "cases": [ + { + "id": "knapsack-sanity", + "tier": "sanity", + "variables": 8, + "dimensions": "8 items \u00b7 1 rows \u00b7 8 nonzeros \u00b7 both profit variants", + "size_label": "8 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 0.3576245, + "min_solve_ms": 0.114209, + "max_solve_ms": 0.405833, + "median_wall_ms": 10.437187738716602 + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 0.2132295, + "min_solve_ms": 0.106833, + "max_solve_ms": 2.460583, + "median_wall_ms": 12.10687542334199 + } + }, + { + "id": "knapsack-small", + "tier": "small", + "variables": 32, + "dimensions": "32 items \u00b7 1 rows \u00b7 32 nonzeros \u00b7 both profit variants", + "size_label": "32 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 4074.7669579999997, + "min_solve_ms": 328.621083, + "max_solve_ms": 8215.772416, + "median_wall_ms": 4088.6768749915063 + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 0.3257915, + "min_solve_ms": 0.28075, + "max_solve_ms": 2.595459, + "median_wall_ms": 9.718791116029024 + } + }, + { + "id": "knapsack-medium", + "tier": "medium", + "variables": 128, + "dimensions": "128 items \u00b7 1 rows \u00b7 128 nonzeros \u00b7 both profit variants", + "size_label": "128 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 4, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 5.269333, + "min_solve_ms": 2.937167, + "max_solve_ms": 7.701875, + "median_wall_ms": 23.56806304305792 + } + }, + { + "id": "knapsack-large", + "tier": "large", + "variables": 384, + "dimensions": "384 items \u00b7 1 rows \u00b7 384 nonzeros \u00b7 both profit variants", + "size_label": "384 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 4, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 30.1279995, + "min_solve_ms": 29.407249999999998, + "max_solve_ms": 30.781875, + "median_wall_ms": 53.55202034115791 + } + }, + { + "id": "knapsack-cap_overflow", + "tier": "boundary", + "variables": 512, + "dimensions": "512 items \u00b7 1 rows \u00b7 512 nonzeros \u00b7 random-profit stress only", + "size_label": "512 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ] + }, + { + "id": "assignment", + "name": "Assignment", + "detail": "One task per worker; random costs", + "role": "control", + "before_max": 256, + "after_max": 256, + "expansion": 1.0, + "cases": [ + { + "id": "assignment-sanity", + "tier": "sanity", + "variables": 9, + "dimensions": "3 workers / tasks \u00b7 12 rows \u00b7 36 nonzeros", + "size_label": "3 workers / tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.601167, + "min_solve_ms": 0.410125, + "max_solve_ms": 0.7922089999999999, + "median_wall_ms": 12.594978790730238 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2.1664585, + "min_solve_ms": 0.12191700000000001, + "max_solve_ms": 4.211, + "median_wall_ms": 15.891166403889656 + } + }, + { + "id": "assignment-small", + "tier": "small", + "variables": 25, + "dimensions": "5 workers / tasks \u00b7 20 rows \u00b7 100 nonzeros", + "size_label": "5 workers / tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.259479, + "min_solve_ms": 0.258708, + "max_solve_ms": 0.26025000000000004, + "median_wall_ms": 11.365770362317562 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.265021, + "min_solve_ms": 0.25116700000000003, + "max_solve_ms": 0.278875, + "median_wall_ms": 11.097124312072992 + } + }, + { + "id": "assignment-medium", + "tier": "medium", + "variables": 81, + "dimensions": "9 workers / tasks \u00b7 36 rows \u00b7 324 nonzeros", + "size_label": "9 workers / tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.3299165, + "min_solve_ms": 3.251458, + "max_solve_ms": 3.408375, + "median_wall_ms": 14.480541460216045 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.2011875, + "min_solve_ms": 3.166875, + "max_solve_ms": 3.2355, + "median_wall_ms": 15.89899929240346 + } + }, + { + "id": "assignment-large", + "tier": "large", + "variables": 256, + "dimensions": "16 workers / tasks \u00b7 64 rows \u00b7 1024 nonzeros", + "size_label": "16 workers / tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3145.031604, + "min_solve_ms": 3046.719, + "max_solve_ms": 3243.344208, + "median_wall_ms": 3156.622729729861 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3212.8101875, + "min_solve_ms": 3053.2733749999998, + "max_solve_ms": 3372.347, + "median_wall_ms": 3229.1960837319493 + } + } + ] + }, + { + "id": "facility_location", + "name": "Facility location", + "detail": "Opening facilities and serving customers", + "role": "control", + "before_max": 104, + "after_max": 104, + "expansion": 1.0, + "cases": [ + { + "id": "facility_location-sanity", + "tier": "sanity", + "variables": 8, + "dimensions": "2 facilities / 3 customers \u00b7 12 rows \u00b7 24 nonzeros", + "size_label": "2 facilities / 3 customers", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.33868750000000003, + "min_solve_ms": 0.304792, + "max_solve_ms": 0.372583, + "median_wall_ms": 12.20614556223154 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.33066700000000004, + "min_solve_ms": 0.304209, + "max_solve_ms": 0.357125, + "median_wall_ms": 11.991686653345823 + } + }, + { + "id": "facility_location-small", + "tier": "small", + "variables": 28, + "dimensions": "4 facilities / 6 customers \u00b7 36 rows \u00b7 96 nonzeros", + "size_label": "4 facilities / 6 customers", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.2851875, + "min_solve_ms": 0.265292, + "max_solve_ms": 0.305083, + "median_wall_ms": 9.596416261047125 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.2916045, + "min_solve_ms": 0.274167, + "max_solve_ms": 0.309042, + "median_wall_ms": 9.714020881801844 + } + }, + { + "id": "facility_location-medium", + "tier": "medium", + "variables": 104, + "dimensions": "8 facilities / 12 customers \u00b7 120 rows \u00b7 384 nonzeros", + "size_label": "8 facilities / 12 customers", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 87.0331665, + "min_solve_ms": 85.250042, + "max_solve_ms": 88.816291, + "median_wall_ms": 97.77670772746205 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 84.79831250000001, + "min_solve_ms": 83.335208, + "max_solve_ms": 86.26141700000001, + "median_wall_ms": 95.35164572298527 + } + }, + { + "id": "facility_location-large", + "tier": "large", + "variables": 300, + "dimensions": "12 facilities / 24 customers \u00b7 336 rows \u00b7 1152 nonzeros", + "size_label": "12 facilities / 24 customers", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ] + }, + { + "id": "bin_packing", + "name": "Bin packing", + "detail": "Pack weighted items into the fewest bins", + "role": "control", + "before_max": 102, + "after_max": 102, + "expansion": 1.0, + "cases": [ + { + "id": "bin_packing-sanity", + "tier": "sanity", + "variables": 15, + "dimensions": "4 items / 3 candidate bins \u00b7 25 rows \u00b7 67 nonzeros", + "size_label": "4 items / 3 candidate bins", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.8817914999999998, + "min_solve_ms": 0.6627500000000001, + "max_solve_ms": 3.1008329999999997, + "median_wall_ms": 18.5691867955029 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.473292, + "min_solve_ms": 0.404125, + "max_solve_ms": 2.542459, + "median_wall_ms": 17.396250274032354 + } + }, + { + "id": "bin_packing-small", + "tier": "small", + "variables": 36, + "dimensions": "8 items / 4 candidate bins \u00b7 55 rows \u00b7 170 nonzeros", + "size_label": "8 items / 4 candidate bins", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.21818749999999998, + "min_solve_ms": 0.207958, + "max_solve_ms": 0.22841699999999998, + "median_wall_ms": 11.130230035632849 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.223917, + "min_solve_ms": 0.207667, + "max_solve_ms": 0.24016700000000002, + "median_wall_ms": 10.958645958453417 + } + }, + { + "id": "bin_packing-medium", + "tier": "medium", + "variables": 65, + "dimensions": "12 items / 5 candidate bins \u00b7 93 rows \u00b7 313 nonzeros", + "size_label": "12 items / 5 candidate bins", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.2349585, + "min_solve_ms": 1.0234580000000002, + "max_solve_ms": 1.446459, + "median_wall_ms": 13.829958159476519 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.04775, + "min_solve_ms": 1.019, + "max_solve_ms": 1.0765, + "median_wall_ms": 11.919541750103235 + } + }, + { + "id": "bin_packing-large", + "tier": "large", + "variables": 102, + "dimensions": "16 items / 6 candidate bins \u00b7 139 rows \u00b7 496 nonzeros", + "size_label": "16 items / 6 candidate bins", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 867.061521, + "min_solve_ms": 827.072834, + "max_solve_ms": 907.050208, + "median_wall_ms": 878.6074793897569 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 822.9748125, + "min_solve_ms": 821.687708, + "max_solve_ms": 824.2619169999999, + "median_wall_ms": 834.0479792095721 + } + } + ] + }, + { + "id": "production", + "name": "Production planning", + "detail": "Meet demand across periods with inventory", + "role": "control", + "before_max": 48, + "after_max": 48, + "expansion": 1.0, + "cases": [ + { + "id": "production-sanity", + "tier": "sanity", + "variables": 24, + "dimensions": "3 periods \u00b7 14 rows \u00b7 174 nonzeros", + "size_label": "3 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.1764375, + "min_solve_ms": 0.168458, + "max_solve_ms": 0.184417, + "median_wall_ms": 9.652875363826752 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.188625, + "min_solve_ms": 0.171208, + "max_solve_ms": 0.206042, + "median_wall_ms": 9.831750765442848 + } + }, + { + "id": "production-small", + "tier": "small", + "variables": 48, + "dimensions": "6 periods \u00b7 26 rows \u00b7 474 nonzeros", + "size_label": "6 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.538875, + "min_solve_ms": 0.5297919999999999, + "max_solve_ms": 0.547958, + "median_wall_ms": 9.788750670850277 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.6881875, + "min_solve_ms": 0.61925, + "max_solve_ms": 0.7571249999999999, + "median_wall_ms": 14.27381206303835 + } + }, + { + "id": "production-medium", + "tier": "medium", + "variables": 96, + "dimensions": "12 periods \u00b7 50 rows \u00b7 1452 nonzeros", + "size_label": "12 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "production-large", + "tier": "large", + "variables": 192, + "dimensions": "24 periods \u00b7 98 rows \u00b7 4920 nonzeros", + "size_label": "24 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ] + }, + { + "id": "native_tsp", + "name": "Routing", + "detail": "Minimum-cost tour through every city", + "role": "control", + "before_max": 32, + "after_max": 32, + "expansion": 1.0, + "cases": [ + { + "id": "native_tsp-sanity", + "tier": "sanity", + "variables": 8, + "dimensions": "4 cities \u00b7 4 cities \u00b7 8 model variables including cost columns", + "size_label": "4 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2.7029375, + "min_solve_ms": 1.967, + "max_solve_ms": 3.438875, + "median_wall_ms": 17.218729481101036 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.55475, + "min_solve_ms": 1.7986250000000001, + "max_solve_ms": 5.310874999999999, + "median_wall_ms": 18.229312263429165 + } + }, + { + "id": "native_tsp-small", + "tier": "small", + "variables": 16, + "dimensions": "8 cities \u00b7 8 cities \u00b7 16 model variables including cost columns", + "size_label": "8 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.7630625, + "min_solve_ms": 0.731208, + "max_solve_ms": 0.794917, + "median_wall_ms": 11.063187383115292 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.8678955, + "min_solve_ms": 0.8401660000000001, + "max_solve_ms": 0.895625, + "median_wall_ms": 12.108291499316692 + } + }, + { + "id": "native_tsp-medium", + "tier": "medium", + "variables": 24, + "dimensions": "12 cities \u00b7 12 cities \u00b7 24 model variables including cost columns", + "size_label": "12 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 7.769875000000001, + "min_solve_ms": 7.5083329999999995, + "max_solve_ms": 8.031417000000001, + "median_wall_ms": 18.07462517172098 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 7.7034375, + "min_solve_ms": 7.6055, + "max_solve_ms": 7.801375, + "median_wall_ms": 18.178437370806932 + } + }, + { + "id": "native_tsp-large", + "tier": "large", + "variables": 32, + "dimensions": "16 cities \u00b7 16 cities \u00b7 32 model variables including cost columns", + "size_label": "16 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 54.399333, + "min_solve_ms": 54.126083, + "max_solve_ms": 54.672582999999996, + "median_wall_ms": 64.34029154479504 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 54.457979, + "min_solve_ms": 54.440458, + "max_solve_ms": 54.475500000000004, + "median_wall_ms": 65.51991682499647 + } + } + ] + }, + { + "id": "weighted_queens", + "name": "Weighted queens", + "detail": "Non-attacking queens with minimum placement cost", + "role": "control", + "before_max": 48, + "after_max": 48, + "expansion": 1.0, + "cases": [ + { + "id": "weighted_queens-sanity", + "tier": "sanity", + "variables": 16, + "dimensions": "4 queens \u00b7 4 queens \u00b7 16 model variables including diagonal/cost columns", + "size_label": "4 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.5691665, + "min_solve_ms": 0.451625, + "max_solve_ms": 0.686708, + "median_wall_ms": 9.990062564611435 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.10325, + "min_solve_ms": 0.782333, + "max_solve_ms": 1.424167, + "median_wall_ms": 11.771979741752148 + } + }, + { + "id": "weighted_queens-small", + "tier": "small", + "variables": 32, + "dimensions": "8 queens \u00b7 8 queens \u00b7 32 model variables including diagonal/cost columns", + "size_label": "8 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.9434165000000001, + "min_solve_ms": 0.9011250000000001, + "max_solve_ms": 0.985708, + "median_wall_ms": 9.626270737498999 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.0012285, + "min_solve_ms": 0.920041, + "max_solve_ms": 1.082416, + "median_wall_ms": 12.240666896104813 + } + }, + { + "id": "weighted_queens-medium", + "tier": "medium", + "variables": 40, + "dimensions": "10 queens \u00b7 10 queens \u00b7 40 model variables including diagonal/cost columns", + "size_label": "10 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.597417, + "min_solve_ms": 1.4023340000000002, + "max_solve_ms": 1.7925, + "median_wall_ms": 17.060291953384876 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1.573375, + "min_solve_ms": 1.542417, + "max_solve_ms": 1.604333, + "median_wall_ms": 12.303811963647604 + } + }, + { + "id": "weighted_queens-large", + "tier": "large", + "variables": 48, + "dimensions": "12 queens \u00b7 12 queens \u00b7 48 model variables including diagonal/cost columns", + "size_label": "12 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.9842085, + "min_solve_ms": 3.90475, + "max_solve_ms": 4.063667, + "median_wall_ms": 14.46341723203659 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.981104, + "min_solve_ms": 3.81625, + "max_solve_ms": 4.145958, + "median_wall_ms": 14.82266653329134 + } + } + ] + } + ], + "cases": 33, + "runs": 132, + "repetitions": 2, + "seconds": 10, + "elapsed_seconds": 277.43554375041276, + "evidence": { + "source_commit": "272d360d02b7c4ed1b511d82219bd11c3b0c7394", + "files": { + "report": { + "path": "build/category-scaling/results/report.json", + "sha256": "bdb0b1ced8721ee50385c6d7614637024be748f114dc4e6b36f4626dbfc40763" + }, + "summary": { + "path": "build/category-scaling/results/summary.json", + "sha256": "cceb8df734319fcadeee6a023c954a22228c4dcdda8563701074cc6b0c22bf0a" + }, + "manifest": { + "path": "build/category-scaling/frozen/manifest.json", + "sha256": "855c2630073be58b62682532d53f9a58314e7638ca242fbc8b3004a902b10e11" + } + } + }, + "report": { + "schema_version": 1, + "started_utc": "2026-09-06T04:39:57.428690+00:00", + "expected_runs": 132, + "protocol": { + "schema_version": 1, + "purpose": "sampled_category_capacity_within_ten_second_solver_budget", + "selection": "Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.", + "planned": [ + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102 + }, + { + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24 + }, + { + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48 + }, + { + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96 + }, + { + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512 + } + ], + "repetitions": 2, + "expected_measured_runs": 132, + "loader_probes": 2, + "backend": "Native", + "guarantee": "Exact", + "route": "native", + "threads": 1, + "random_seed": 0, + "primal_start": false, + "relative_gap": 0, + "absolute_gap": 0, + "solver_seconds": 10, + "process_seconds": 11, + "whole_seconds": 1500, + "ordering": "First repeat before/after per case; second after/before per case.", + "capacity_rule": "Largest sampled main group with every variant independently verified Optimal within internal solve_seconds <= 10 in both repetitions. Knapsack requires both distributions; other categories have one variant.", + "boundary_rule": "The 512-variable uncorrelated stress point is a separate single-variant group. Largest-any-group statistics retain its stress and variant_count; it cannot increase the all-variant main maximum.", + "reference_rule": "Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima." + }, + "frozen_manifest": { + "schema_version": 1, + "ready": true, + "created_utc": "2026-09-06T04:39:26.424558+00:00", + "protocol_sha256": "e4ae53b25fea192a8a596107bf4f005fa2b6d492137656f5c08f38c6db91dc1e", + "protocol": { + "schema_version": 1, + "purpose": "sampled_category_capacity_within_ten_second_solver_budget", + "selection": "Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.", + "planned": [ + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128 + }, + { + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81 + }, + { + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104 + }, + { + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65 + }, + { + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102 + }, + { + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24 + }, + { + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48 + }, + { + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96 + }, + { + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24 + }, + { + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40 + }, + { + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48 + }, + { + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512 + } + ], + "repetitions": 2, + "expected_measured_runs": 132, + "loader_probes": 2, + "backend": "Native", + "guarantee": "Exact", + "route": "native", + "threads": 1, + "random_seed": 0, + "primal_start": false, + "relative_gap": 0, + "absolute_gap": 0, + "solver_seconds": 10, + "process_seconds": 11, + "whole_seconds": 1500, + "ordering": "First repeat before/after per case; second after/before per case.", + "capacity_rule": "Largest sampled main group with every variant independently verified Optimal within internal solve_seconds <= 10 in both repetitions. Knapsack requires both distributions; other categories have one variant.", + "boundary_rule": "The 512-variable uncorrelated stress point is a separate single-variant group. Largest-any-group statistics retain its stress and variant_count; it cannot increase the all-variant main maximum.", + "reference_rule": "Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima." + }, + "sources": { + "experiments/optimize/benchmark_category_scaling.py": "3e2db304f0e6ffc52458f2700490bbe5cbde32177e2a235278296f771c63df19", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "records": [ + { + "id": "capacity_uncorrelated_sanity_8", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -337, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "3532382f5f607bf594a9ee2969c8db318e5185d37d5c89c2d00b354cf8d28b28", + "json": "models/capacity_uncorrelated_sanity_8.json", + "txt": "models/capacity_uncorrelated_sanity_8.txt", + "json_sha256": "c8e55c6df2d2efb1463c13647edbc4de45fc5e0bf4fd6fd30db8e931ce4198a2", + "txt_sha256": "ea9569a056bb6fad19798ad3bb6a18ea93003f9cff5ea6106c2ea429237949bb" + }, + { + "id": "capacity_uncorrelated_small_32", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "size_unit": "binary variables", + "input_variables": 32, + "model_variables": 32, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -1096, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "129ce1700ffbb57f5114067131155e1ff7d61595a4f53abbb481357a21eeabfa", + "json": "models/capacity_uncorrelated_small_32.json", + "txt": "models/capacity_uncorrelated_small_32.txt", + "json_sha256": "a527d0f48ada7bd02099ded83370a7a8b7037ee2d6bd8c55570ca6fe22bca753", + "txt_sha256": "5b6423445e33a99cb177f60c3c7b80f7f0f688564cdacc442b134541dc056097" + }, + { + "id": "capacity_uncorrelated_medium_128", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "size_unit": "binary variables", + "input_variables": 128, + "model_variables": 128, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -4318, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "54d982cd0b01e854dc7b784fdc1169e6cfafda8cd64eff6eba27ad134d060066", + "json": "models/capacity_uncorrelated_medium_128.json", + "txt": "models/capacity_uncorrelated_medium_128.txt", + "json_sha256": "6f5b172fd0a9eeb4c8405727467b5430558d57fcd010a10d7de0b9616e63c992", + "txt_sha256": "b59b0bdd0661616462e4b441fb08559f8bc487cf5d876a3e688b9a91512056ee" + }, + { + "id": "capacity_uncorrelated_large_384", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "size_unit": "binary variables", + "input_variables": 384, + "model_variables": 384, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "seed": 20260906, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -13832, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "2e01bc33e2af812ae5ace6b1f03370919953f916b9a4fd78b059bb8311f79da0", + "json": "models/capacity_uncorrelated_large_384.json", + "txt": "models/capacity_uncorrelated_large_384.txt", + "json_sha256": "d20cab4b0b6837d1f5cbc2c58226838b329d555a0e90bbd0c53d10b45624beb7", + "txt_sha256": "9680c130459aeefd7e563978d5df20a8d7aa209abf752bb7f18a8bd169f962b2" + }, + { + "id": "capacity_correlated_sanity_8", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -62, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "224d725d608edb4090706db1b5aac0aafdf5b0cfa468dfe54e8a1ff1b66a3b55", + "json": "models/capacity_correlated_sanity_8.json", + "txt": "models/capacity_correlated_sanity_8.txt", + "json_sha256": "ab98577f4edbb27d96c4a62b6c07b47863f61b4a75c453c16a7e0e18c3e74a86", + "txt_sha256": "70e2d975656b662443415ce774e45acb9a04121b7ef6476ace1c52dc705f6648" + }, + { + "id": "capacity_correlated_small_32", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "size_unit": "binary variables", + "input_variables": 32, + "model_variables": 32, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -312, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "85d128437540b3d05475d2781a2bdbd4bc2c0eebfc939c2db8e3c1d865eee7bb", + "json": "models/capacity_correlated_small_32.json", + "txt": "models/capacity_correlated_small_32.txt", + "json_sha256": "b2e8e85c3c9dc0f9c939c330903bc86015f40a822e7c29f0a722033dbbf3dbb8", + "txt_sha256": "808a2c747faa0a6eb81bfee59ae4b11a16cc9081f900710e086155f2ae6e254d" + }, + { + "id": "capacity_correlated_medium_128", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "size_unit": "binary variables", + "input_variables": 128, + "model_variables": 128, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -1211, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "16ae1b9c1f18deb10b7f8d1d122f12d8cb72440483f97d96ff50e44fb612065b", + "json": "models/capacity_correlated_medium_128.json", + "txt": "models/capacity_correlated_medium_128.txt", + "json_sha256": "b40f813f251581d432be0de4ad57e0f70b0b3e64f236e6909165175097324717", + "txt_sha256": "4f7a15880322d7f346b1b9a8d2c13dd19c47d29caf27b08a3cda91b0be629e37" + }, + { + "id": "capacity_correlated_large_384", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "size_unit": "binary variables", + "input_variables": 384, + "model_variables": 384, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "seed": 20260907, + "stress": false, + "kind": "binary", + "route": "native", + "objective": -3648, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "semantic_sha256": "1dde254629e93f90cec642e057b4610a07c7829f40ae188ff3b3282c67a27bcb", + "json": "models/capacity_correlated_large_384.json", + "txt": "models/capacity_correlated_large_384.txt", + "json_sha256": "24a1712673182121e88a616926eaf420b19ee7a56a81022e3bda7ccb3861695f", + "txt_sha256": "b86e4f1a27ef7f0760a266be7dc49697c67cd5459a320536931b611b175a643c" + }, + { + "id": "assignment_sanity_3", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "size_unit": "binary variables", + "input_variables": 9, + "model_variables": 9, + "dimensions": { + "input_variables": 9, + "variables": 9, + "rows": 12, + "nonzeros": 36, + "globals": 0 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 87, + "reference_method": "exact subset-column assignment dynamic programming", + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "semantic_sha256": "13e90d7bbba3d98cbf029ee965e3b17f8a282baaa9a9cba9176dc76b4929c7a4", + "json": "models/assignment_sanity_3.json", + "txt": "models/assignment_sanity_3.txt", + "json_sha256": "2995010a49aa7e2900aeebcf18d7e4b107bf5176997baa8c46fb5d45d1e570fd", + "txt_sha256": "2e0e10a7d87c2f4fe5717d1a6b7016c133770a4c9014a36a0eacdfcfbf5fbf22" + }, + { + "id": "assignment_small_5", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "size_unit": "binary variables", + "input_variables": 25, + "model_variables": 25, + "dimensions": { + "input_variables": 25, + "variables": 25, + "rows": 20, + "nonzeros": 100, + "globals": 0 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 162, + "reference_method": "exact subset-column assignment dynamic programming", + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "semantic_sha256": "bce2b7a675ef398a461f98a90557b91b74bb9dc7f38964319608ede9bb67c1b0", + "json": "models/assignment_small_5.json", + "txt": "models/assignment_small_5.txt", + "json_sha256": "194f7616940891a5a5475f543b842ebcde967945723c7abc583241f535194a5f", + "txt_sha256": "e9ad1f0dee2e81a2c58103ca6563609605281e644e8864aa50347e61a30fe816" + }, + { + "id": "assignment_medium_9", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "size_unit": "binary variables", + "input_variables": 81, + "model_variables": 81, + "dimensions": { + "input_variables": 81, + "variables": 81, + "rows": 36, + "nonzeros": 324, + "globals": 0 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 146, + "reference_method": "exact subset-column assignment dynamic programming", + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "semantic_sha256": "d579b817bd55c3ac1303eae47165e42072022ae3459f62ef6d7e038a2cddeb91", + "json": "models/assignment_medium_9.json", + "txt": "models/assignment_medium_9.txt", + "json_sha256": "cf2f97a210909036ac05b4cde5660c9e8d2167c19edd9b8596344032706e0b1c", + "txt_sha256": "d1b5e8c23fbf175fe7ad5cad95fbfbbc1a324e96603876dd5c73d49981d9a58b" + }, + { + "id": "assignment_large_16", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "size_unit": "binary variables", + "input_variables": 256, + "model_variables": 256, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 64, + "nonzeros": 1024, + "globals": 0 + }, + "seed": 20260908, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 145, + "reference_method": "exact subset-column assignment dynamic programming", + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "semantic_sha256": "ac896fe1f45b41ee98243c39f2303d3596b6376b4af6118d8e9b0f8b9dee58f5", + "json": "models/assignment_large_16.json", + "txt": "models/assignment_large_16.txt", + "json_sha256": "0ad8f89c6268749c0d5bff122e779d171c317dc24652a41b6b9b0558d0fe1dba", + "txt_sha256": "4e8cd3f1666029007ce8f8859394ba317ec7ec664124615fd5e51fc93fc9a289" + }, + { + "id": "facility_location_sanity_2x3", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "sanity", + "tier_size": 2, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 12, + "nonzeros": 24, + "globals": 0 + }, + "seed": 20260909, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 90, + "reference_method": "exhaustive binary enumeration", + "parameters": { + "facilities": 2, + "customers": 3, + "opening_costs": [ + 17, + 26 + ], + "assignment_costs": [ + [ + 17, + 18 + ], + [ + 44, + 19 + ], + [ + 16, + 27 + ] + ] + }, + "semantic_sha256": "17c7fa71e72f30425716d11ad18753f9e3341c397d8d3893620c4b1790137850", + "json": "models/facility_location_sanity_2x3.json", + "txt": "models/facility_location_sanity_2x3.txt", + "json_sha256": "a6cd17319f31c19480c9cccc8e942852283c2124d9aafe2c013d9f48e47b1cf4", + "txt_sha256": "0de556c8443f771b1c2488c3e4522c1ba04f76ccd82f692c23479b730a98af3a" + }, + { + "id": "facility_location_small_4x6", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "small", + "tier_size": 4, + "size_unit": "binary variables", + "input_variables": 28, + "model_variables": 28, + "dimensions": { + "input_variables": 28, + "variables": 28, + "rows": 36, + "nonzeros": 96, + "globals": 0 + }, + "seed": 20260909, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 147, + "reference_method": "enumerate facility subsets and independently assign each customer", + "parameters": { + "facilities": 4, + "customers": 6, + "opening_costs": [ + 17, + 26, + 23, + 47 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18 + ], + [ + 44, + 19, + 28, + 33 + ], + [ + 16, + 27, + 8, + 9 + ], + [ + 16, + 15, + 30, + 31 + ], + [ + 51, + 26, + 35, + 40 + ], + [ + 29, + 16, + 19, + 20 + ] + ] + }, + "semantic_sha256": "07e68db7fee951b27d0cf63e161b7d2daf4bc48b1b5393b5a5cd0a8fe4240922", + "json": "models/facility_location_small_4x6.json", + "txt": "models/facility_location_small_4x6.txt", + "json_sha256": "fd7267cac9bbe88645d452c6a45c24bf7cbbc33272232ab07ec9470267c882ac", + "txt_sha256": "8f25f40abf2512804e1a49d645cf08f4b6af316c4833eee7ac03fd1465bb4203" + }, + { + "id": "facility_location_medium_8x12", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "medium", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 104, + "model_variables": 104, + "dimensions": { + "input_variables": 104, + "variables": 104, + "rows": 120, + "nonzeros": 384, + "globals": 0 + }, + "seed": 20260909, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 224, + "reference_method": "enumerate facility subsets and independently assign each customer", + "parameters": { + "facilities": 8, + "customers": 12, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ] + ] + }, + "semantic_sha256": "928140e2e9893325b644a6af14c33368ac46a7507d425cde3ff81bafe25f4ecb", + "json": "models/facility_location_medium_8x12.json", + "txt": "models/facility_location_medium_8x12.txt", + "json_sha256": "f5ffcfc003eaf4a89e934f8d9acb085be5462b9780bb6a4dda6ce6a2ac6d6b31", + "txt_sha256": "d6356d0818b36d7f20c67bd200724020afcf6a555377f0370e8e105645e36b27" + }, + { + "id": "facility_location_large_12x24", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "large", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 300, + "model_variables": 300, + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 336, + "nonzeros": 1152, + "globals": 0 + }, + "seed": 20260909, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 350, + "reference_method": "enumerate facility subsets and independently assign each customer", + "parameters": { + "facilities": 12, + "customers": 24, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ] + ] + }, + "semantic_sha256": "890a6ac857a11d448218a88a8261ede25db5fffe2f1b09b5911f4e2f32751594", + "json": "models/facility_location_large_12x24.json", + "txt": "models/facility_location_large_12x24.txt", + "json_sha256": "f6a49c572c6e148a12a37b48c468ffc2adcb00c5286ab98e8e6d00fdb8923e66", + "txt_sha256": "6559cee8a28138dbf741000c629fa3e2765bc6d38642235f99ef2da3912540a1" + }, + { + "id": "bin_packing_sanity_4x3", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "sanity", + "tier_size": 4, + "size_unit": "binary variables", + "input_variables": 15, + "model_variables": 15, + "dimensions": { + "input_variables": 15, + "variables": 15, + "rows": 25, + "nonzeros": 67, + "globals": 0 + }, + "seed": 20260910, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 3, + "reference_method": "exact item-subset minimum-bin/last-load dynamic programming", + "parameters": { + "items": 4, + "bins": 3, + "weights": [ + 3, + 6, + 3, + 4 + ], + "capacity": 8, + "symmetry": "enabled bins form a prefix" + }, + "semantic_sha256": "87fa6a45752ab98bf7db8c56044c3cceb497f2c40767f4d355a6e08eeb406910", + "json": "models/bin_packing_sanity_4x3.json", + "txt": "models/bin_packing_sanity_4x3.txt", + "json_sha256": "49e7cb4192940daf4d99a38630292c5136d058cfa010170dccb23d37356f8108", + "txt_sha256": "81256181a8b1039c0d4dd904c2d8c4eaf31c0e52ce4cc04f66352c7bf3fa2b08" + }, + { + "id": "bin_packing_small_8x4", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "small", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 36, + "model_variables": 36, + "dimensions": { + "input_variables": 36, + "variables": 36, + "rows": 55, + "nonzeros": 170, + "globals": 0 + }, + "seed": 20260910, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 3, + "reference_method": "exact item-subset minimum-bin/last-load dynamic programming", + "parameters": { + "items": 8, + "bins": 4, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2 + ], + "capacity": 13, + "symmetry": "enabled bins form a prefix" + }, + "semantic_sha256": "859c4d0974b28da8471a9ab3029d4c843398ae1e1038291b5093e559e889d9c2", + "json": "models/bin_packing_small_8x4.json", + "txt": "models/bin_packing_small_8x4.txt", + "json_sha256": "810be456760751e89ef08c7a7d68da4d8ed7fd860ffb91ed7e4836ebff66ea60", + "txt_sha256": "b858bbc7b58482f0929278718f091a71624a97f7c1bfdf3db74d433c0319121a" + }, + { + "id": "bin_packing_medium_12x5", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "medium", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 65, + "model_variables": 65, + "dimensions": { + "input_variables": 65, + "variables": 65, + "rows": 93, + "nonzeros": 313, + "globals": 0 + }, + "seed": 20260910, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 4, + "reference_method": "exact item-subset minimum-bin/last-load dynamic programming", + "parameters": { + "items": 12, + "bins": 5, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4 + ], + "capacity": 14, + "symmetry": "enabled bins form a prefix" + }, + "semantic_sha256": "e70ea21351e0179f5ae66b23abcfabde77c3df413a8d3e36f08cabcf10c8276e", + "json": "models/bin_packing_medium_12x5.json", + "txt": "models/bin_packing_medium_12x5.txt", + "json_sha256": "f735707af9c4e3d76d6b22fe8d134a131bd14c98198725d0505f5ab964278fa9", + "txt_sha256": "7721ca00b8c26cdcb57b828c4a2cccc73d59e53b6c4d62e86226ab77766148df" + }, + { + "id": "bin_packing_large_16x6", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "large", + "tier_size": 16, + "size_unit": "binary variables", + "input_variables": 102, + "model_variables": 102, + "dimensions": { + "input_variables": 102, + "variables": 102, + "rows": 139, + "nonzeros": 496, + "globals": 0 + }, + "seed": 20260910, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 5, + "reference_method": "exact item-subset minimum-bin/last-load dynamic programming", + "parameters": { + "items": 16, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10 + ], + "capacity": 18, + "symmetry": "enabled bins form a prefix" + }, + "semantic_sha256": "e6a1cc8b111513fd0b3b9d52e0cf480933921118dc6ba063edda39c57540b6bd", + "json": "models/bin_packing_large_16x6.json", + "txt": "models/bin_packing_large_16x6.txt", + "json_sha256": "0205fe3d43ae10d55f9ef5620ca2b0fbe1d56c63a997e569318b0a13043558a4", + "txt_sha256": "d538c983783ee5d86b07eb018f797508410b687242f61d1c7d0857059c664e6d" + }, + { + "id": "production_sanity_3x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "sanity", + "tier_size": 3, + "size_unit": "binary variables", + "input_variables": 24, + "model_variables": 24, + "dimensions": { + "input_variables": 24, + "variables": 24, + "rows": 14, + "nonzeros": 174, + "globals": 0 + }, + "seed": 20260911, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 267, + "reference_method": "inventory-state production dynamic program", + "parameters": { + "periods": 3, + "options": 8, + "demands": [ + 7, + 5, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ] + ], + "objective_constant": -102 + }, + "semantic_sha256": "7ba207493c51540e62184782e7af4e97d305f8f56075c1154e6a20a22ebd73be", + "json": "models/production_sanity_3x8.json", + "txt": "models/production_sanity_3x8.txt", + "json_sha256": "9c528054c4ecaab9e85c67fe0cb285063d5fcb83b4ecf9e002026692e9aa242f", + "txt_sha256": "9f178fd4ff178a39b45d7a2117cc80cb3175e86209bdf77e3ad0deb224bca1bb" + }, + { + "id": "production_small_6x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "small", + "tier_size": 6, + "size_unit": "binary variables", + "input_variables": 48, + "model_variables": 48, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 26, + "nonzeros": 474, + "globals": 0 + }, + "seed": 20260911, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 484, + "reference_method": "inventory-state production dynamic program", + "parameters": { + "periods": 6, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ] + ], + "objective_constant": -273 + }, + "semantic_sha256": "6f7837d053b7c7578a0b2ce91a5032b7bbff092e766e2c4ceefe631a845811d1", + "json": "models/production_small_6x8.json", + "txt": "models/production_small_6x8.txt", + "json_sha256": "2ab31caf618af5ec9651b6d807b36a969e0823d2576dc7103521ad317c23d873", + "txt_sha256": "be37c1e132cdd71a4ade9f6b65fc49f1a5dc7c1efe62aabb83a686f3f6bcefc0" + }, + { + "id": "production_medium_12x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "medium", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 96, + "model_variables": 96, + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "seed": 20260911, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 1447, + "reference_method": "inventory-state production dynamic program", + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945 + }, + "semantic_sha256": "97f01ce9954fc18a2d3b9148ac7a15c74a8a78037014be75733b766e3a28fb1e", + "json": "models/production_medium_12x8.json", + "txt": "models/production_medium_12x8.txt", + "json_sha256": "966c25336722de1f228271cc6c3f36e2088eaff96413fa7c5adfacba53a7c9c5", + "txt_sha256": "766f8af6b209308f8c82f23a8473f99e66ba425dfb8621a08d0cb04418045b0a" + }, + { + "id": "production_large_24x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "large", + "tier_size": 24, + "size_unit": "binary variables", + "input_variables": 192, + "model_variables": 192, + "dimensions": { + "input_variables": 192, + "variables": 192, + "rows": 98, + "nonzeros": 4920, + "globals": 0 + }, + "seed": 20260911, + "stress": false, + "kind": "binary", + "route": "native", + "objective": 4600, + "reference_method": "inventory-state production dynamic program", + "parameters": { + "periods": 24, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ] + ], + "objective_constant": -3618 + }, + "semantic_sha256": "35c5418635d83b3eac338da87c092c26a57bc0cd136e872d33cda6a5b8f71bdb", + "json": "models/production_large_24x8.json", + "txt": "models/production_large_24x8.txt", + "json_sha256": "360660325fa78d53530607a5186865bc112cf66a5fcb8bcebf744e4b6a28b386", + "txt_sha256": "ab783a3301e11e387509adabb2d6461c867f597aabe9ac11c8498d381165a3c9" + }, + { + "id": "native_tsp_sanity_4", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "sanity", + "tier_size": 4, + "size_unit": "cities", + "input_variables": 4, + "model_variables": 8, + "dimensions": { + "input_variables": 4, + "variables": 8, + "rows": 0, + "nonzeros": 0, + "globals": 5 + }, + "seed": 20260912, + "stress": false, + "kind": "native_tsp", + "route": "native", + "objective": 320, + "reference_method": "Held-Karp subset dynamic programming", + "parameters": { + "size": 4 + }, + "semantic_sha256": "16216a261f3ada8f67cf191dfebc2197e649a015d72b395900b615803660705e", + "json": "models/native_tsp_sanity_4.json", + "txt": "models/native_tsp_sanity_4.txt", + "json_sha256": "fcac6eead61f9554496b4092d0bb1cc917a280b7dd478edd9c4986b22e2f5c8c", + "txt_sha256": "8fedd985b6d585d69a2ccdc1ec439979edc40d871e1e0c863a884844efb0602a" + }, + { + "id": "native_tsp_small_8", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "small", + "tier_size": 8, + "size_unit": "cities", + "input_variables": 8, + "model_variables": 16, + "dimensions": { + "input_variables": 8, + "variables": 16, + "rows": 0, + "nonzeros": 0, + "globals": 9 + }, + "seed": 20260912, + "stress": false, + "kind": "native_tsp", + "route": "native", + "objective": 384, + "reference_method": "Held-Karp subset dynamic programming", + "parameters": { + "size": 8 + }, + "semantic_sha256": "553b7cad0c48f3fbfe1e11145fe80783f0fb4a2fc2f0be6137b059e1c87c771c", + "json": "models/native_tsp_small_8.json", + "txt": "models/native_tsp_small_8.txt", + "json_sha256": "4478fc0910d2ce0fd2e7efa4e324f1f3f2b48d605831adf17a33e26ed6251710", + "txt_sha256": "34f7e33d40d96ef95d7013a6605a5c49c726842d78c6f78ef90cd742b86b4665" + }, + { + "id": "native_tsp_medium_12", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "medium", + "tier_size": 12, + "size_unit": "cities", + "input_variables": 12, + "model_variables": 24, + "dimensions": { + "input_variables": 12, + "variables": 24, + "rows": 0, + "nonzeros": 0, + "globals": 13 + }, + "seed": 20260912, + "stress": false, + "kind": "native_tsp", + "route": "native", + "objective": 408, + "reference_method": "Held-Karp subset dynamic programming", + "parameters": { + "size": 12 + }, + "semantic_sha256": "35d70d8b475c28c80bba2d5c1521089bdb090ca663c1ee2d43302f13f2495043", + "json": "models/native_tsp_medium_12.json", + "txt": "models/native_tsp_medium_12.txt", + "json_sha256": "c5b64191b11a64bd4aab78099d6515c5d9103ef916c3f1b39d0fad134801962e", + "txt_sha256": "f28fc364212ea7842dac1d5098706596d6a0f76aa27033d6123ac8ab5f5e67fb" + }, + { + "id": "native_tsp_large_16", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "large", + "tier_size": 16, + "size_unit": "cities", + "input_variables": 16, + "model_variables": 32, + "dimensions": { + "input_variables": 16, + "variables": 32, + "rows": 0, + "nonzeros": 0, + "globals": 17 + }, + "seed": 20260912, + "stress": false, + "kind": "native_tsp", + "route": "native", + "objective": 436, + "reference_method": "Held-Karp subset dynamic programming", + "parameters": { + "size": 16 + }, + "semantic_sha256": "23c97335db33f8a3cffb741ccc6b12145639d74d62bc00d02569fc9e445fd532", + "json": "models/native_tsp_large_16.json", + "txt": "models/native_tsp_large_16.txt", + "json_sha256": "0d29f65e63c6a4ebc73f3bf8674da9bda4e81dd15dcf8835c5e7f46abcfb461c", + "txt_sha256": "3ea0e6d39fe10c3f3f27d4d03c536036a771ae1a2a052702ca4648ed8e4e6492" + }, + { + "id": "weighted_queens_sanity_4", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "sanity", + "tier_size": 4, + "size_unit": "queens", + "input_variables": 4, + "model_variables": 16, + "dimensions": { + "input_variables": 4, + "variables": 16, + "rows": 8, + "nonzeros": 16, + "globals": 7 + }, + "seed": 20260913, + "stress": false, + "kind": "weighted_queens", + "route": "native", + "objective": 105, + "reference_method": "independent exhaustive weighted-queen enumeration", + "parameters": { + "size": 4 + }, + "semantic_sha256": "53dddd3cbc73922244e8a6fa69ab3a093a8f110c32aa6e822635d2eaab5c7a7c", + "json": "models/weighted_queens_sanity_4.json", + "txt": "models/weighted_queens_sanity_4.txt", + "json_sha256": "a7543357f370029acb5071ec55aa61ddd6e9ece5cfb57d2001da4e2582ab1bc5", + "txt_sha256": "e8f5bf4ea9b03a94959955f39c79e966d94007893c428200848b44e9c5a2470a" + }, + { + "id": "weighted_queens_small_8", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "small", + "tier_size": 8, + "size_unit": "queens", + "input_variables": 8, + "model_variables": 32, + "dimensions": { + "input_variables": 8, + "variables": 32, + "rows": 16, + "nonzeros": 32, + "globals": 11 + }, + "seed": 20260913, + "stress": false, + "kind": "weighted_queens", + "route": "native", + "objective": 121, + "reference_method": "independent exhaustive weighted-queen enumeration", + "parameters": { + "size": 8 + }, + "semantic_sha256": "b20ba5edeb26a6073657b57f6551579877d8b9f12eaa1034655f5f95447cd5e4", + "json": "models/weighted_queens_small_8.json", + "txt": "models/weighted_queens_small_8.txt", + "json_sha256": "5ec8730d2c88cf042883d831380f225344bbcac7e79fb924c68a149687eab186", + "txt_sha256": "fe2c7c3ddc3cfb7d55f1f462e614d325a61a1a6062307a405037182ca581c510" + }, + { + "id": "weighted_queens_medium_10", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "medium", + "tier_size": 10, + "size_unit": "queens", + "input_variables": 10, + "model_variables": 40, + "dimensions": { + "input_variables": 10, + "variables": 40, + "rows": 20, + "nonzeros": 40, + "globals": 13 + }, + "seed": 20260913, + "stress": false, + "kind": "weighted_queens", + "route": "native", + "objective": 86, + "reference_method": "independent exhaustive weighted-queen enumeration", + "parameters": { + "size": 10 + }, + "semantic_sha256": "415344ef0c9dc28f66ad7289445e4958bef68951a2f43e4f74f64cbceb0636c9", + "json": "models/weighted_queens_medium_10.json", + "txt": "models/weighted_queens_medium_10.txt", + "json_sha256": "8785b38fc132bb0a967b5398045d7b391600e0557e790f8e9b334b3c598221e2", + "txt_sha256": "9d03c6693aaf7858d3fed367c23342034e4c58083b8b0a861a8feca503330892" + }, + { + "id": "weighted_queens_large_12", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "large", + "tier_size": 12, + "size_unit": "queens", + "input_variables": 12, + "model_variables": 48, + "dimensions": { + "input_variables": 12, + "variables": 48, + "rows": 24, + "nonzeros": 48, + "globals": 15 + }, + "seed": 20260913, + "stress": false, + "kind": "weighted_queens", + "route": "native", + "objective": 98, + "reference_method": "independent exhaustive weighted-queen enumeration", + "parameters": { + "size": 12 + }, + "semantic_sha256": "9f540b65a5d678a300b22f149ae1cc387921b1a3708c19c480ac02e0a97cfdf8", + "json": "models/weighted_queens_large_12.json", + "txt": "models/weighted_queens_large_12.txt", + "json_sha256": "694261d6c66676e0a9072f6c8366ee94f7c6ae06935304f3ea1fe8fc2e1d3ed8", + "txt_sha256": "54882e539a49f6fbad775422f801a03194cc224560b7dfa52f8c8b662b1b2384" + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "size_unit": "binary variables", + "input_variables": 512, + "model_variables": 512, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "seed": 20260906, + "stress": true, + "kind": "binary", + "route": "native", + "objective": -18731, + "reference_method": "exact minimum-weight-by-profit dynamic programming", + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "semantic_sha256": "3ed2df4ae33b74b7e423e7c2b518fafcb65e4615e4cc7d034c9d8e171a841e08", + "json": "models/capacity_uncorrelated_cap_overflow_512.json", + "txt": "models/capacity_uncorrelated_cap_overflow_512.txt", + "json_sha256": "37b66ff33c6dd547892b1c2c13f890aa9926a85e1d51e2f04d14869464204504", + "txt_sha256": "fe96761d0760f264dd4cab0063ad2a0b263a0f4ed1065a6162c6255c4a4c9207" + } + ], + "generation_seconds": 2.8915764167904854 + }, + "provenance": { + "driver_name": "optimize-native-benchmark", + "driver_sha256": "fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4", + "source_head": "272d360d02b7c4ed1b511d82219bd11c3b0c7394", + "runtime_source_sha256": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_category_scaling.py": "3e2db304f0e6ffc52458f2700490bbe5cbde32177e2a235278296f771c63df19", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "frozen_manifest_sha256": "855c2630073be58b62682532d53f9a58314e7638ca242fbc8b3004a902b10e11", + "frozen_protocol_sha256": "e4ae53b25fea192a8a596107bf4f005fa2b6d492137656f5c08f38c6db91dc1e", + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98249, + "external_seconds": 0.2081547500565648, + "started_utc": "2026-09-06T04:39:57.436042+00:00", + "invocation_offset_start_seconds": 0.1788182919844985, + "invocation_offset_end_seconds": 0.3872119998559356, + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + } + }, + "comparison_valid": true, + "loader_probes": [ + { + "cohort": "before", + "status": "validated", + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98249, + "external_seconds": 0.2081547500565648, + "started_utc": "2026-09-06T04:39:57.436042+00:00", + "invocation_offset_start_seconds": 0.1788182919844985, + "invocation_offset_end_seconds": 0.3872119998559356, + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + }, + { + "cohort": "after", + "status": "validated", + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + ], + "records": [ + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.011187375523149967, + "started_utc": "2026-09-06T04:39:57.819569+00:00", + "invocation_offset_start_seconds": 0.562344167381525, + "invocation_offset_end_seconds": 0.5737074166536331, + "stdout_file": "capacity_uncorrelated_sanity_8-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000114209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.0334e-05, + "solve_seconds": 0.000114209, + "driver_seconds": 0.000171625, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.011965125799179077, + "started_utc": "2026-09-06T04:39:57.835503+00:00", + "invocation_offset_start_seconds": 0.5782860424369574, + "invocation_offset_end_seconds": 0.5904307924211025, + "stdout_file": "capacity_uncorrelated_sanity_8-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000112167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.2458e-05, + "solve_seconds": 0.000112167, + "driver_seconds": 0.0001715, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 872, + "stderr_bytes_observed": 0, + "external_seconds": 0.3595742080360651, + "started_utc": "2026-09-06T04:39:57.852421+00:00", + "invocation_offset_start_seconds": 0.5951995421200991, + "invocation_offset_end_seconds": 0.954880042001605, + "stdout_file": "capacity_uncorrelated_small_32-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.341726333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.525e-05, + "solve_seconds": 0.341726333, + "driver_seconds": 0.341829292, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 867, + "stderr_bytes_observed": 0, + "external_seconds": 0.009770541451871395, + "started_utc": "2026-09-06T04:39:58.217894+00:00", + "invocation_offset_start_seconds": 0.9606677498668432, + "invocation_offset_end_seconds": 0.9705381253734231, + "stdout_file": "capacity_uncorrelated_small_32-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00028075, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.075e-05, + "solve_seconds": 0.00028075, + "driver_seconds": 0.000348792, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1227, + "stderr_bytes_observed": 0, + "external_seconds": 10.013179457746446, + "started_utc": "2026-09-06T04:39:58.233156+00:00", + "invocation_offset_start_seconds": 0.9759289575740695, + "invocation_offset_end_seconds": 10.989363792352378, + "stdout_file": "capacity_uncorrelated_medium_128-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -2471, + "best_bound": null, + "absolute_primal_gap_to_oracle": 1847, + "solve_seconds": 10.001552, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -2471, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 7.0333e-05, + "solve_seconds": 10.001552, + "driver_seconds": 10.001676958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1274, + "stderr_bytes_observed": 0, + "external_seconds": 0.0354841249063611, + "started_utc": "2026-09-06T04:40:08.256302+00:00", + "invocation_offset_start_seconds": 10.9990163333714, + "invocation_offset_end_seconds": 11.034639375284314, + "stdout_file": "capacity_uncorrelated_medium_128-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -4318, + "best_bound": -4318, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.007701875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000335, + "solve_seconds": 0.007701875, + "driver_seconds": 0.00807375, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2260, + "stderr_bytes_observed": 0, + "external_seconds": 10.01396679226309, + "started_utc": "2026-09-06T04:40:08.298003+00:00", + "invocation_offset_start_seconds": 11.040709249675274, + "invocation_offset_end_seconds": 21.0549056250602, + "stdout_file": "capacity_uncorrelated_large_384-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -8545, + "best_bound": null, + "absolute_primal_gap_to_oracle": 5287, + "solve_seconds": 10.000409209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -8545, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0003105, + "solve_seconds": 10.000409209, + "driver_seconds": 10.000761, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2287, + "stderr_bytes_observed": 0, + "external_seconds": 0.0554231246933341, + "started_utc": "2026-09-06T04:40:18.318766+00:00", + "invocation_offset_start_seconds": 21.061409291811287, + "invocation_offset_end_seconds": 21.116917874664068, + "stdout_file": "capacity_uncorrelated_large_384-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -13832, + "best_bound": -13832, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.02940725, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000177083, + "solve_seconds": 0.02940725, + "driver_seconds": 0.029608833, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 0, + "external_seconds": 0.012003792449831963, + "started_utc": "2026-09-06T04:40:18.380223+00:00", + "invocation_offset_start_seconds": 21.122879792004824, + "invocation_offset_end_seconds": 21.13494833279401, + "stdout_file": "capacity_correlated_sanity_8-r1-before.stdout", + "stderr_file": "capacity_correlated_sanity_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000405833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000176542, + "solve_seconds": 0.000405833, + "driver_seconds": 0.000607375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 765, + "stderr_bytes_observed": 0, + "external_seconds": 0.009426292032003403, + "started_utc": "2026-09-06T04:40:18.397327+00:00", + "invocation_offset_start_seconds": 21.139965750277042, + "invocation_offset_end_seconds": 21.149491917341948, + "stdout_file": "capacity_correlated_sanity_8-r1-after.stdout", + "stderr_file": "capacity_correlated_sanity_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000106833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 3.9208e-05, + "solve_seconds": 0.000106833, + "driver_seconds": 0.000163, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 870, + "stderr_bytes_observed": 0, + "external_seconds": 8.226140749640763, + "started_utc": "2026-09-06T04:40:18.411540+00:00", + "invocation_offset_start_seconds": 21.15418233256787, + "invocation_offset_end_seconds": 29.380540542304516, + "stdout_file": "capacity_correlated_small_32-r1-before.stdout", + "stderr_file": "capacity_correlated_small_32-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 8.215772416, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000209166, + "solve_seconds": 8.215772416, + "driver_seconds": 8.216025458, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 877, + "stderr_bytes_observed": 0, + "external_seconds": 0.022679916583001614, + "started_utc": "2026-09-06T04:40:26.644512+00:00", + "invocation_offset_start_seconds": 29.387099541723728, + "invocation_offset_end_seconds": 29.409883707761765, + "stdout_file": "capacity_correlated_small_32-r1-after.stdout", + "stderr_file": "capacity_correlated_small_32-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002595459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.3833e-05, + "solve_seconds": 0.002595459, + "driver_seconds": 0.002715375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1236, + "stderr_bytes_observed": 0, + "external_seconds": 10.011547040194273, + "started_utc": "2026-09-06T04:40:26.672370+00:00", + "invocation_offset_start_seconds": 29.414956082589924, + "invocation_offset_end_seconds": 39.428868000395596, + "stdout_file": "capacity_correlated_medium_128-r1-before.stdout", + "stderr_file": "capacity_correlated_medium_128-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -1043, + "best_bound": null, + "absolute_primal_gap_to_oracle": 168, + "solve_seconds": 10.000169209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1043, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000301459, + "solve_seconds": 10.000169209, + "driver_seconds": 10.000517417, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1262, + "stderr_bytes_observed": 0, + "external_seconds": 0.032611084170639515, + "started_utc": "2026-09-06T04:40:36.700069+00:00", + "invocation_offset_start_seconds": 39.442619792185724, + "invocation_offset_end_seconds": 39.475320000201464, + "stdout_file": "capacity_correlated_medium_128-r1-after.stdout", + "stderr_file": "capacity_correlated_medium_128-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1211, + "best_bound": -1211, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.006717208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00027775, + "solve_seconds": 0.006717208, + "driver_seconds": 0.007018584, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2242, + "stderr_bytes_observed": 0, + "external_seconds": 10.013345709070563, + "started_utc": "2026-09-06T04:40:36.741560+00:00", + "invocation_offset_start_seconds": 39.484082125127316, + "invocation_offset_end_seconds": 49.49767479207367, + "stdout_file": "capacity_correlated_large_384-r1-before.stdout", + "stderr_file": "capacity_correlated_large_384-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -3070, + "best_bound": null, + "absolute_primal_gap_to_oracle": 578, + "solve_seconds": 10.000460041, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3070, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00038675, + "solve_seconds": 10.000460041, + "driver_seconds": 10.000887542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2287, + "stderr_bytes_observed": 0, + "external_seconds": 0.054739249870181084, + "started_utc": "2026-09-06T04:40:46.770770+00:00", + "invocation_offset_start_seconds": 49.51322662457824, + "invocation_offset_end_seconds": 49.56808354239911, + "stdout_file": "capacity_correlated_large_384-r1-after.stdout", + "stderr_file": "capacity_correlated_large_384-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -3648, + "best_bound": -3648, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.030781875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0003225, + "solve_seconds": 0.030781875, + "driver_seconds": 0.031132709, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.012123375199735165, + "started_utc": "2026-09-06T04:40:46.841076+00:00", + "invocation_offset_start_seconds": 49.58352779224515, + "invocation_offset_end_seconds": 49.59578774962574, + "stdout_file": "assignment_sanity_3-r1-before.stdout", + "stderr_file": "assignment_sanity_3-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000792209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000246083, + "solve_seconds": 0.000792209, + "driver_seconds": 0.00105875, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 793, + "stderr_bytes_observed": 0, + "external_seconds": 0.00951125007122755, + "started_utc": "2026-09-06T04:40:46.870286+00:00", + "invocation_offset_start_seconds": 49.61274420842528, + "invocation_offset_end_seconds": 49.622379874810576, + "stdout_file": "assignment_sanity_3-r1-after.stdout", + "stderr_file": "assignment_sanity_3-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000121917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.625e-05, + "solve_seconds": 0.000121917, + "driver_seconds": 0.00018575, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.01303112506866455, + "started_utc": "2026-09-06T04:40:46.888392+00:00", + "invocation_offset_start_seconds": 49.6308476254344, + "invocation_offset_end_seconds": 49.64401166699827, + "stdout_file": "assignment_small_5-r1-before.stdout", + "stderr_file": "assignment_small_5-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000258708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000374291, + "solve_seconds": 0.000258708, + "driver_seconds": 0.000652291, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 849, + "stderr_bytes_observed": 0, + "external_seconds": 0.01004749909043312, + "started_utc": "2026-09-06T04:40:46.911262+00:00", + "invocation_offset_start_seconds": 49.65371491666883, + "invocation_offset_end_seconds": 49.66387895774096, + "stdout_file": "assignment_small_5-r1-after.stdout", + "stderr_file": "assignment_small_5-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000251167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.425e-05, + "solve_seconds": 0.000251167, + "driver_seconds": 0.000333875, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1082, + "stderr_bytes_observed": 0, + "external_seconds": 0.014980957843363285, + "started_utc": "2026-09-06T04:40:46.933682+00:00", + "invocation_offset_start_seconds": 49.67613629158586, + "invocation_offset_end_seconds": 49.69123087543994, + "stdout_file": "assignment_medium_9-r1-before.stdout", + "stderr_file": "assignment_medium_9-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003408375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000278958, + "solve_seconds": 0.003408375, + "driver_seconds": 0.003710416, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1061, + "stderr_bytes_observed": 0, + "external_seconds": 0.017613583244383335, + "started_utc": "2026-09-06T04:40:46.965714+00:00", + "invocation_offset_start_seconds": 49.708164958283305, + "invocation_offset_end_seconds": 49.72593591734767, + "stdout_file": "assignment_medium_9-r1-after.stdout", + "stderr_file": "assignment_medium_9-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003166875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000133917, + "solve_seconds": 0.003166875, + "driver_seconds": 0.0033205, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1777, + "stderr_bytes_observed": 0, + "external_seconds": 3.2565808752551675, + "started_utc": "2026-09-06T04:40:46.994320+00:00", + "invocation_offset_start_seconds": 49.73677704203874, + "invocation_offset_end_seconds": 52.99357295781374, + "stdout_file": "assignment_large_16-r1-before.stdout", + "stderr_file": "assignment_large_16-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.243344208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000490791, + "solve_seconds": 3.243344208, + "driver_seconds": 3.244201875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1760, + "stderr_bytes_observed": 0, + "external_seconds": 3.3932000007480383, + "started_utc": "2026-09-06T04:40:50.267018+00:00", + "invocation_offset_start_seconds": 53.00945941731334, + "invocation_offset_end_seconds": 56.40292416699231, + "stdout_file": "assignment_large_16-r1-after.stdout", + "stderr_file": "assignment_large_16-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.372347, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000190625, + "solve_seconds": 3.372347, + "driver_seconds": 3.372583375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_sanity_2x3", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 90, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 778, + "stderr_bytes_observed": 0, + "external_seconds": 0.014764624647796154, + "started_utc": "2026-09-06T04:40:53.675233+00:00", + "invocation_offset_start_seconds": 56.41765187494457, + "invocation_offset_end_seconds": 56.43257125001401, + "stdout_file": "facility_location_sanity_2x3-r1-before.stdout", + "stderr_file": "facility_location_sanity_2x3-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_sanity_2x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 90, + "best_bound": 90, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000304792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 12, + "model_globals": 0, + "objective": 90, + "best_bound": 90, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000309084, + "solve_seconds": 0.000304792, + "driver_seconds": 0.000633417, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_sanity_2x3", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 90, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 789, + "stderr_bytes_observed": 0, + "external_seconds": 0.011998165398836136, + "started_utc": "2026-09-06T04:40:53.698824+00:00", + "invocation_offset_start_seconds": 56.44123141746968, + "invocation_offset_end_seconds": 56.4533782498911, + "stdout_file": "facility_location_sanity_2x3-r1-after.stdout", + "stderr_file": "facility_location_sanity_2x3-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_sanity_2x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 90, + "best_bound": 90, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000357125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 12, + "model_globals": 0, + "objective": 90, + "best_bound": 90, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.3833e-05, + "solve_seconds": 0.000357125, + "driver_seconds": 0.000461292, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_small_4x6", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 147, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 849, + "stderr_bytes_observed": 0, + "external_seconds": 0.009150374680757523, + "started_utc": "2026-09-06T04:40:53.720004+00:00", + "invocation_offset_start_seconds": 56.462411208078265, + "invocation_offset_end_seconds": 56.47168962471187, + "stdout_file": "facility_location_small_4x6-r1-before.stdout", + "stderr_file": "facility_location_small_4x6-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_small_4x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 147, + "best_bound": 147, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000305083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 28, + "model_rows": 36, + "model_globals": 0, + "objective": 147, + "best_bound": 147, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00028425, + "solve_seconds": 0.000305083, + "driver_seconds": 0.000606958, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_small_4x6", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 147, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 872, + "stderr_bytes_observed": 0, + "external_seconds": 0.009619041346013546, + "started_utc": "2026-09-06T04:40:53.745477+00:00", + "invocation_offset_start_seconds": 56.48788404185325, + "invocation_offset_end_seconds": 56.49766366742551, + "stdout_file": "facility_location_small_4x6-r1-after.stdout", + "stderr_file": "facility_location_small_4x6-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_small_4x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 147, + "best_bound": 147, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000274167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 28, + "model_rows": 36, + "model_globals": 0, + "objective": 147, + "best_bound": 147, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.4792e-05, + "solve_seconds": 0.000274167, + "driver_seconds": 0.000356042, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_medium_8x12", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 224, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1174, + "stderr_bytes_observed": 0, + "external_seconds": 0.09906833246350288, + "started_utc": "2026-09-06T04:40:53.763600+00:00", + "invocation_offset_start_seconds": 56.50600462500006, + "invocation_offset_end_seconds": 56.60524120833725, + "stdout_file": "facility_location_medium_8x12-r1-before.stdout", + "stderr_file": "facility_location_medium_8x12-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_medium_8x12.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 224, + "best_bound": 224, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.088816291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 104, + "model_rows": 120, + "model_globals": 0, + "objective": 224, + "best_bound": 224, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000345291, + "solve_seconds": 0.088816291, + "driver_seconds": 0.089185541, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_medium_8x12", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 224, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1163, + "stderr_bytes_observed": 0, + "external_seconds": 0.096862499602139, + "started_utc": "2026-09-06T04:40:53.869976+00:00", + "invocation_offset_start_seconds": 56.61238770838827, + "invocation_offset_end_seconds": 56.70943441707641, + "stdout_file": "facility_location_medium_8x12-r1-after.stdout", + "stderr_file": "facility_location_medium_8x12-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_medium_8x12.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 224, + "best_bound": 224, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.086261417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 104, + "model_rows": 120, + "model_globals": 0, + "objective": 224, + "best_bound": 224, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000104708, + "solve_seconds": 0.086261417, + "driver_seconds": 0.086391333, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_large_12x24", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 350, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1924, + "stderr_bytes_observed": 0, + "external_seconds": 10.011875458061695, + "started_utc": "2026-09-06T04:40:53.974303+00:00", + "invocation_offset_start_seconds": 56.71670699957758, + "invocation_offset_end_seconds": 66.72877987474203, + "stdout_file": "facility_location_large_12x24-r1-before.stdout", + "stderr_file": "facility_location_large_12x24-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_large_12x24.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 435, + "best_bound": null, + "absolute_primal_gap_to_oracle": 85, + "solve_seconds": 10.00020375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000499625, + "solve_seconds": 10.00020375, + "driver_seconds": 10.000749041, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_large_12x24", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 350, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1918, + "stderr_bytes_observed": 0, + "external_seconds": 10.022922250442207, + "started_utc": "2026-09-06T04:41:03.996593+00:00", + "invocation_offset_start_seconds": 66.73893654160202, + "invocation_offset_end_seconds": 76.76213250029832, + "stdout_file": "facility_location_large_12x24-r1-after.stdout", + "stderr_file": "facility_location_large_12x24-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_large_12x24.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 435, + "best_bound": null, + "absolute_primal_gap_to_oracle": 85, + "solve_seconds": 10.001564458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00033025, + "solve_seconds": 10.001564458, + "driver_seconds": 10.001936875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_sanity_4x3", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 804, + "stderr_bytes_observed": 0, + "external_seconds": 0.02498279046267271, + "started_utc": "2026-09-06T04:41:14.030476+00:00", + "invocation_offset_start_seconds": 76.77275229245424, + "invocation_offset_end_seconds": 76.79788216669112, + "stdout_file": "bin_packing_sanity_4x3-r1-before.stdout", + "stderr_file": "bin_packing_sanity_4x3-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_sanity_4x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003100833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 15, + "model_rows": 25, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000242917, + "solve_seconds": 0.003100833, + "driver_seconds": 0.003376375, + "assignment": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_sanity_4x3", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 816, + "stderr_bytes_observed": 0, + "external_seconds": 0.012268874794244766, + "started_utc": "2026-09-06T04:41:14.063904+00:00", + "invocation_offset_start_seconds": 76.80617737490684, + "invocation_offset_end_seconds": 76.81856233347207, + "stdout_file": "bin_packing_sanity_4x3-r1-after.stdout", + "stderr_file": "bin_packing_sanity_4x3-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_sanity_4x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000404125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 15, + "model_rows": 25, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.6083e-05, + "solve_seconds": 0.000404125, + "driver_seconds": 0.000518541, + "assignment": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_small_8x4", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 889, + "stderr_bytes_observed": 0, + "external_seconds": 0.012555875815451145, + "started_utc": "2026-09-06T04:41:14.084353+00:00", + "invocation_offset_start_seconds": 76.82662658300251, + "invocation_offset_end_seconds": 76.83940191660076, + "stdout_file": "bin_packing_small_8x4-r1-before.stdout", + "stderr_file": "bin_packing_small_8x4-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_small_8x4.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000228417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 55, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000330083, + "solve_seconds": 0.000228417, + "driver_seconds": 0.000578792, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_small_8x4", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 865, + "stderr_bytes_observed": 0, + "external_seconds": 0.009702292270958424, + "started_utc": "2026-09-06T04:41:14.105430+00:00", + "invocation_offset_start_seconds": 76.8477005828172, + "invocation_offset_end_seconds": 76.85758520849049, + "stdout_file": "bin_packing_small_8x4-r1-after.stdout", + "stderr_file": "bin_packing_small_8x4-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_small_8x4.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000207667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 55, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.475e-05, + "solve_seconds": 0.000207667, + "driver_seconds": 0.000311167, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_medium_12x5", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 4, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 994, + "stderr_bytes_observed": 0, + "external_seconds": 0.01445983350276947, + "started_utc": "2026-09-06T04:41:14.123163+00:00", + "invocation_offset_start_seconds": 76.8654345003888, + "invocation_offset_end_seconds": 76.88002204243094, + "stdout_file": "bin_packing_medium_12x5-r1-before.stdout", + "stderr_file": "bin_packing_medium_12x5-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_medium_12x5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 4, + "best_bound": 4, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001446459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 65, + "model_rows": 93, + "model_globals": 0, + "objective": 4, + "best_bound": 4, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000512334, + "solve_seconds": 0.001446459, + "driver_seconds": 0.001983042, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_medium_12x5", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 4, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1014, + "stderr_bytes_observed": 0, + "external_seconds": 0.01221737451851368, + "started_utc": "2026-09-06T04:41:14.145789+00:00", + "invocation_offset_start_seconds": 76.88806079234928, + "invocation_offset_end_seconds": 76.90043883305043, + "stdout_file": "bin_packing_medium_12x5-r1-after.stdout", + "stderr_file": "bin_packing_medium_12x5-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_medium_12x5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 4, + "best_bound": 4, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001019, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 65, + "model_rows": 93, + "model_globals": 0, + "objective": 4, + "best_bound": 4, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.5292e-05, + "solve_seconds": 0.001019, + "driver_seconds": 0.001131458, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_large_16x6", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 5, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.8383529167622328, + "started_utc": "2026-09-06T04:41:14.166020+00:00", + "invocation_offset_start_seconds": 76.90829574968666, + "invocation_offset_end_seconds": 77.74679379165173, + "stdout_file": "bin_packing_large_16x6-r1-before.stdout", + "stderr_file": "bin_packing_large_16x6-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_large_16x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 5, + "best_bound": 5, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.827072834, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000575792, + "solve_seconds": 0.827072834, + "driver_seconds": 0.82768725, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_large_16x6", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 5, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.835252083837986, + "started_utc": "2026-09-06T04:41:15.012554+00:00", + "invocation_offset_start_seconds": 77.75481908302754, + "invocation_offset_end_seconds": 78.59096245840192, + "stdout_file": "bin_packing_large_16x6-r1-after.stdout", + "stderr_file": "bin_packing_large_16x6-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_large_16x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 5, + "best_bound": 5, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.824261917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000134584, + "solve_seconds": 0.824261917, + "driver_seconds": 0.82443575, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_sanity_3x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 267, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 856, + "stderr_bytes_observed": 0, + "external_seconds": 0.009633750654757023, + "started_utc": "2026-09-06T04:41:15.856925+00:00", + "invocation_offset_start_seconds": 78.5991885419935, + "invocation_offset_end_seconds": 78.6089683752507, + "stdout_file": "production_sanity_3x8-r1-before.stdout", + "stderr_file": "production_sanity_3x8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_sanity_3x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 267, + "best_bound": 267, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000184417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 24, + "model_rows": 14, + "model_globals": 0, + "objective": 267, + "best_bound": 267, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000271, + "solve_seconds": 0.000184417, + "driver_seconds": 0.000475125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_sanity_3x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 267, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 845, + "stderr_bytes_observed": 0, + "external_seconds": 0.009296083822846413, + "started_utc": "2026-09-06T04:41:15.874221+00:00", + "invocation_offset_start_seconds": 78.61647833324969, + "invocation_offset_end_seconds": 78.62590125016868, + "stdout_file": "production_sanity_3x8-r1-after.stdout", + "stderr_file": "production_sanity_3x8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_sanity_3x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 267, + "best_bound": 267, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000171208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 24, + "model_rows": 14, + "model_globals": 0, + "objective": 267, + "best_bound": 267, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.9625e-05, + "solve_seconds": 0.000171208, + "driver_seconds": 0.000248459, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_small_6x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 484, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 952, + "stderr_bytes_observed": 0, + "external_seconds": 0.009663917124271393, + "started_utc": "2026-09-06T04:41:15.890912+00:00", + "invocation_offset_start_seconds": 78.63316924963146, + "invocation_offset_end_seconds": 78.64293225016445, + "stdout_file": "production_small_6x8-r1-before.stdout", + "stderr_file": "production_small_6x8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_small_6x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 484, + "best_bound": 484, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000547958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000273334, + "solve_seconds": 0.000547958, + "driver_seconds": 0.000842, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_small_6x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 484, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 952, + "stderr_bytes_observed": 0, + "external_seconds": 0.01630358211696148, + "started_utc": "2026-09-06T04:41:15.909478+00:00", + "invocation_offset_start_seconds": 78.6517387079075, + "invocation_offset_end_seconds": 78.66817741747946, + "stdout_file": "production_small_6x8-r1-after.stdout", + "stderr_file": "production_small_6x8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_small_6x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 484, + "best_bound": 484, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000757125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.5209e-05, + "solve_seconds": 0.000757125, + "driver_seconds": 0.000873792, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_medium_12x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 1447, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1094, + "stderr_bytes_observed": 0, + "external_seconds": 10.012133125215769, + "started_utc": "2026-09-06T04:41:15.933989+00:00", + "invocation_offset_start_seconds": 78.67624579183757, + "invocation_offset_end_seconds": 88.6885091252625, + "stdout_file": "production_medium_12x8-r1-before.stdout", + "stderr_file": "production_medium_12x8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_medium_12x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 1459, + "best_bound": null, + "absolute_primal_gap_to_oracle": 12, + "solve_seconds": 10.00158675, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000374209, + "solve_seconds": 10.00158675, + "driver_seconds": 10.002005375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_medium_12x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 1447, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1095, + "stderr_bytes_observed": 0, + "external_seconds": 10.021155749447644, + "started_utc": "2026-09-06T04:41:25.955549+00:00", + "invocation_offset_start_seconds": 88.6977412076667, + "invocation_offset_end_seconds": 98.71899779234082, + "stdout_file": "production_medium_12x8-r1-after.stdout", + "stderr_file": "production_medium_12x8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_medium_12x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 1459, + "best_bound": null, + "absolute_primal_gap_to_oracle": 12, + "solve_seconds": 10.001561375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000397958, + "solve_seconds": 10.001561375, + "driver_seconds": 10.001989875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_large_24x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 4600, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1480, + "stderr_bytes_observed": 0, + "external_seconds": 10.019765458069742, + "started_utc": "2026-09-06T04:41:35.985684+00:00", + "invocation_offset_start_seconds": 98.72781012486666, + "invocation_offset_end_seconds": 108.74775179196149, + "stdout_file": "production_large_24x8-r1-before.stdout", + "stderr_file": "production_large_24x8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_large_24x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 5037, + "best_bound": null, + "absolute_primal_gap_to_oracle": 437, + "solve_seconds": 10.001679291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 192, + "model_rows": 98, + "model_globals": 0, + "objective": 5037, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000879125, + "solve_seconds": 10.001679291, + "driver_seconds": 10.002594083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_large_24x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 4600, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1486, + "stderr_bytes_observed": 0, + "external_seconds": 10.02236270904541, + "started_utc": "2026-09-06T04:41:46.018473+00:00", + "invocation_offset_start_seconds": 108.76053508277982, + "invocation_offset_end_seconds": 118.78308883309364, + "stdout_file": "production_large_24x8-r1-after.stdout", + "stderr_file": "production_large_24x8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_large_24x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 5037, + "best_bound": null, + "absolute_primal_gap_to_oracle": 437, + "solve_seconds": 10.001655125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 192, + "model_rows": 98, + "model_globals": 0, + "objective": 5037, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000786875, + "solve_seconds": 10.001655125, + "driver_seconds": 10.002475208, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_sanity_4", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 320, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 778, + "stderr_bytes_observed": 0, + "external_seconds": 0.021328375674784184, + "started_utc": "2026-09-06T04:41:56.054276+00:00", + "invocation_offset_start_seconds": 118.79627025034279, + "invocation_offset_end_seconds": 118.81771145761013, + "stdout_file": "native_tsp_sanity_4-r1-before.stdout", + "stderr_file": "native_tsp_sanity_4-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_sanity_4.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 320, + "best_bound": 320, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003438875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 14, + "model_columns": 8, + "model_rows": 0, + "model_globals": 5, + "objective": 320, + "best_bound": 320, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000394958, + "solve_seconds": 0.003438875, + "driver_seconds": 0.003860541, + "assignment": [ + 2, + 3, + 1, + 0 + ], + "full_values": [ + 2, + 3, + 1, + 0, + 93, + 87, + 65, + 75 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_sanity_4", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 320, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 789, + "stderr_bytes_observed": 0, + "external_seconds": 0.012150917202234268, + "started_utc": "2026-09-06T04:41:56.083437+00:00", + "invocation_offset_start_seconds": 118.82543074991554, + "invocation_offset_end_seconds": 118.8377268332988, + "stdout_file": "native_tsp_sanity_4-r1-after.stdout", + "stderr_file": "native_tsp_sanity_4-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_sanity_4.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 320, + "best_bound": 320, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001798625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 14, + "model_columns": 8, + "model_rows": 0, + "model_globals": 5, + "objective": 320, + "best_bound": 320, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.4834e-05, + "solve_seconds": 0.001798625, + "driver_seconds": 0.001902959, + "assignment": [ + 2, + 3, + 1, + 0 + ], + "full_values": [ + 2, + 3, + 1, + 0, + 93, + 87, + 65, + 75 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_small_8", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 384, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 798, + "stderr_bytes_observed": 0, + "external_seconds": 0.012096666730940342, + "started_utc": "2026-09-06T04:41:56.103677+00:00", + "invocation_offset_start_seconds": 118.84567616693676, + "invocation_offset_end_seconds": 118.857849791646, + "stdout_file": "native_tsp_small_8-r1-before.stdout", + "stderr_file": "native_tsp_small_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_small_8.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 384, + "best_bound": 384, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000794917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 26, + "model_columns": 16, + "model_rows": 0, + "model_globals": 9, + "objective": 384, + "best_bound": 384, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000366375, + "solve_seconds": 0.000794917, + "driver_seconds": 0.001181875, + "assignment": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1 + ], + "full_values": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1, + 68, + 65, + 28, + 33, + 10, + 63, + 66, + 51 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_small_8", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 384, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 820, + "stderr_bytes_observed": 0, + "external_seconds": 0.012197458185255527, + "started_utc": "2026-09-06T04:41:56.123534+00:00", + "invocation_offset_start_seconds": 118.86552579235286, + "invocation_offset_end_seconds": 118.87783020827919, + "stdout_file": "native_tsp_small_8-r1-after.stdout", + "stderr_file": "native_tsp_small_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_small_8.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 384, + "best_bound": 384, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000840166, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 26, + "model_columns": 16, + "model_rows": 0, + "model_globals": 9, + "objective": 384, + "best_bound": 384, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.9e-05, + "solve_seconds": 0.000840166, + "driver_seconds": 0.000918583, + "assignment": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1 + ], + "full_values": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1, + 68, + 65, + 28, + 33, + 10, + 63, + 66, + 51 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_medium_12", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 408, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 850, + "stderr_bytes_observed": 0, + "external_seconds": 0.019124125130474567, + "started_utc": "2026-09-06T04:41:56.143366+00:00", + "invocation_offset_start_seconds": 118.88535462506115, + "invocation_offset_end_seconds": 118.90464016702026, + "stdout_file": "native_tsp_medium_12-r1-before.stdout", + "stderr_file": "native_tsp_medium_12-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_medium_12.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 408, + "best_bound": 408, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.008031417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 408, + "best_bound": 408, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000271041, + "solve_seconds": 0.008031417, + "driver_seconds": 0.008331541, + "assignment": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3 + ], + "full_values": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3, + 66, + 38, + 62, + 10, + 5, + 24, + 28, + 51, + 18, + 66, + 20, + 20 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_medium_12", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 408, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 850, + "stderr_bytes_observed": 0, + "external_seconds": 0.01716654095798731, + "started_utc": "2026-09-06T04:41:56.170741+00:00", + "invocation_offset_start_seconds": 118.91273437533528, + "invocation_offset_end_seconds": 118.93006808310747, + "stdout_file": "native_tsp_medium_12-r1-after.stdout", + "stderr_file": "native_tsp_medium_12-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_medium_12.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 408, + "best_bound": 408, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.007801375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 408, + "best_bound": 408, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.7667e-05, + "solve_seconds": 0.007801375, + "driver_seconds": 0.007922917, + "assignment": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3 + ], + "full_values": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3, + 66, + 38, + 62, + 10, + 5, + 24, + 28, + 51, + 18, + 66, + 20, + 20 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_large_16", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 436, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 884, + "stderr_bytes_observed": 0, + "external_seconds": 0.06414049956947565, + "started_utc": "2026-09-06T04:41:56.195883+00:00", + "invocation_offset_start_seconds": 118.93787533324212, + "invocation_offset_end_seconds": 119.00258095841855, + "stdout_file": "native_tsp_large_16-r1-before.stdout", + "stderr_file": "native_tsp_large_16-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_large_16.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 436, + "best_bound": 436, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.054126083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00034, + "solve_seconds": 0.054126083, + "driver_seconds": 0.054493625, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_large_16", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 436, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 864, + "stderr_bytes_observed": 0, + "external_seconds": 0.0653088754042983, + "started_utc": "2026-09-06T04:41:56.269019+00:00", + "invocation_offset_start_seconds": 119.01101037487388, + "invocation_offset_end_seconds": 119.07687279209495, + "stdout_file": "native_tsp_large_16-r1-after.stdout", + "stderr_file": "native_tsp_large_16-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_large_16.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 436, + "best_bound": 436, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0544755, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000105542, + "solve_seconds": 0.0544755, + "driver_seconds": 0.054600375, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_sanity_4", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 105, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 793, + "stderr_bytes_observed": 0, + "external_seconds": 0.010531292296946049, + "started_utc": "2026-09-06T04:41:56.343510+00:00", + "invocation_offset_start_seconds": 119.08550050016493, + "invocation_offset_end_seconds": 119.09617895819247, + "stdout_file": "weighted_queens_sanity_4-r1-before.stdout", + "stderr_file": "weighted_queens_sanity_4-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_sanity_4.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 105, + "best_bound": 105, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000451625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 32, + "model_columns": 16, + "model_rows": 8, + "model_globals": 7, + "objective": 105, + "best_bound": 105, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000195083, + "solve_seconds": 0.000451625, + "driver_seconds": 0.000668208, + "assignment": [ + 2, + 0, + 3, + 1 + ], + "full_values": [ + 2, + 0, + 3, + 1, + 2, + 2, + 1, + -1, + 5, + 1, + 4, + -2, + 13, + 35, + 17, + 40 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_sanity_4", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 105, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 802, + "stderr_bytes_observed": 0, + "external_seconds": 0.012104875408113003, + "started_utc": "2026-09-06T04:41:56.362471+00:00", + "invocation_offset_start_seconds": 119.10446299985051, + "invocation_offset_end_seconds": 119.11667854245752, + "stdout_file": "weighted_queens_sanity_4-r1-after.stdout", + "stderr_file": "weighted_queens_sanity_4-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_sanity_4.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 105, + "best_bound": 105, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001424167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 32, + "model_columns": 16, + "model_rows": 8, + "model_globals": 7, + "objective": 105, + "best_bound": 105, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000103667, + "solve_seconds": 0.001424167, + "driver_seconds": 0.001555209, + "assignment": [ + 2, + 0, + 3, + 1 + ], + "full_values": [ + 2, + 0, + 3, + 1, + 2, + 2, + 1, + -1, + 5, + 1, + 4, + -2, + 13, + 35, + 17, + 40 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_small_8", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 121, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 850, + "stderr_bytes_observed": 0, + "external_seconds": 0.009669416584074497, + "started_utc": "2026-09-06T04:41:56.382842+00:00", + "invocation_offset_start_seconds": 119.12483229208738, + "invocation_offset_end_seconds": 119.13458816707134, + "stdout_file": "weighted_queens_small_8-r1-before.stdout", + "stderr_file": "weighted_queens_small_8-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_small_8.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 121, + "best_bound": 121, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000901125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 60, + "model_columns": 32, + "model_rows": 16, + "model_globals": 11, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000155333, + "solve_seconds": 0.000901125, + "driver_seconds": 0.001075625, + "assignment": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3 + ], + "full_values": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3, + 4, + 4, + 7, + 5, + 3, + -1, + 8, + 2, + 6, + -2, + 5, + -5, + 13, + 1, + 10, + -4, + 24, + 4, + 8, + 3, + 34, + 10, + 4, + 34 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_small_8", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 121, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.012167458422482014, + "started_utc": "2026-09-06T04:41:56.401271+00:00", + "invocation_offset_start_seconds": 119.14326429180801, + "invocation_offset_end_seconds": 119.15555641707033, + "stdout_file": "weighted_queens_small_8-r1-after.stdout", + "stderr_file": "weighted_queens_small_8-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_small_8.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 121, + "best_bound": 121, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000920041, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 60, + "model_columns": 32, + "model_rows": 16, + "model_globals": 11, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.2209e-05, + "solve_seconds": 0.000920041, + "driver_seconds": 0.001022042, + "assignment": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3 + ], + "full_values": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3, + 4, + 4, + 7, + 5, + 3, + -1, + 8, + 2, + 6, + -2, + 5, + -5, + 13, + 1, + 10, + -4, + 24, + 4, + 8, + 3, + 34, + 10, + 4, + 34 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_medium_10", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 86, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 845, + "stderr_bytes_observed": 0, + "external_seconds": 0.014651000499725342, + "started_utc": "2026-09-06T04:41:56.421871+00:00", + "invocation_offset_start_seconds": 119.16386183258146, + "invocation_offset_end_seconds": 119.17867441661656, + "stdout_file": "weighted_queens_medium_10-r1-before.stdout", + "stderr_file": "weighted_queens_medium_10-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_medium_10.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 86, + "best_bound": 86, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0017925, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 40, + "model_rows": 20, + "model_globals": 13, + "objective": 86, + "best_bound": 86, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000205916, + "solve_seconds": 0.0017925, + "driver_seconds": 0.00202075, + "assignment": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9 + ], + "full_values": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9, + 3, + 3, + 7, + 5, + 2, + -2, + 8, + 2, + 12, + 4, + 6, + -4, + 13, + 1, + 11, + -3, + 10, + -6, + 18, + 0, + 15, + 4, + 28, + 3, + 1, + 22, + 4, + 5, + 2, + 2 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_medium_10", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 86, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 879, + "stderr_bytes_observed": 0, + "external_seconds": 0.012085999362170696, + "started_utc": "2026-09-06T04:41:56.444433+00:00", + "invocation_offset_start_seconds": 119.18642241694033, + "invocation_offset_end_seconds": 119.19863525032997, + "stdout_file": "weighted_queens_medium_10-r1-after.stdout", + "stderr_file": "weighted_queens_medium_10-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_medium_10.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 86, + "best_bound": 86, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001604333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 40, + "model_rows": 20, + "model_globals": 13, + "objective": 86, + "best_bound": 86, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.2875e-05, + "solve_seconds": 0.001604333, + "driver_seconds": 0.001711875, + "assignment": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9 + ], + "full_values": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9, + 3, + 3, + 7, + 5, + 2, + -2, + 8, + 2, + 12, + 4, + 6, + -4, + 13, + 1, + 11, + -3, + 10, + -6, + 18, + 0, + 15, + 4, + 28, + 3, + 1, + 22, + 4, + 5, + 2, + 2 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_large_12", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 98, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 907, + "stderr_bytes_observed": 0, + "external_seconds": 0.014042125083506107, + "started_utc": "2026-09-06T04:41:56.465235+00:00", + "invocation_offset_start_seconds": 119.2072250423953, + "invocation_offset_end_seconds": 119.22137083299458, + "stdout_file": "weighted_queens_large_12-r1-before.stdout", + "stderr_file": "weighted_queens_large_12-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_large_12.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 98, + "best_bound": 98, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00390475, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000166125, + "solve_seconds": 0.00390475, + "driver_seconds": 0.004095583, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_large_12", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 98, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 907, + "stderr_bytes_observed": 0, + "external_seconds": 0.014582375064492226, + "started_utc": "2026-09-06T04:41:56.487385+00:00", + "invocation_offset_start_seconds": 119.22937075048685, + "invocation_offset_end_seconds": 119.24407470785081, + "stdout_file": "weighted_queens_large_12-r1-after.stdout", + "stderr_file": "weighted_queens_large_12-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_large_12.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 98, + "best_bound": 98, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00381625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.9292e-05, + "solve_seconds": 0.00381625, + "driver_seconds": 0.003924208, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "before", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2765, + "stderr_bytes_observed": 0, + "external_seconds": 10.015895958058536, + "started_utc": "2026-09-06T04:41:56.510837+00:00", + "invocation_offset_start_seconds": 119.252829791978, + "invocation_offset_end_seconds": 129.2689943332225, + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r1-before.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r1-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.0015135, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000423625, + "solve_seconds": 10.0015135, + "driver_seconds": 10.002020333, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "after", + "repetition": 1, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2773, + "stderr_bytes_observed": 0, + "external_seconds": 10.026984041556716, + "started_utc": "2026-09-06T04:42:06.538202+00:00", + "invocation_offset_start_seconds": 129.280128874816, + "invocation_offset_end_seconds": 139.30727099999785, + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r1-after.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r1-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.0021745, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000209625, + "solve_seconds": 10.0021745, + "driver_seconds": 10.00242775, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 792, + "stderr_bytes_observed": 0, + "external_seconds": 0.012248625047504902, + "started_utc": "2026-09-06T04:42:16.577840+00:00", + "invocation_offset_start_seconds": 139.31970358267426, + "invocation_offset_end_seconds": 139.33205729164183, + "stdout_file": "capacity_uncorrelated_sanity_8-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000314292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000307791, + "solve_seconds": 0.000314292, + "driver_seconds": 0.00064625, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -337, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 781, + "stderr_bytes_observed": 0, + "external_seconds": 0.009686999954283237, + "started_utc": "2026-09-06T04:42:16.600464+00:00", + "invocation_offset_start_seconds": 139.34232270810753, + "invocation_offset_end_seconds": 139.3521044580266, + "stdout_file": "capacity_uncorrelated_sanity_8-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_sanity_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -337, + "best_bound": -337, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000370416, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.8667e-05, + "solve_seconds": 0.000370416, + "driver_seconds": 0.000464792, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 880, + "stderr_bytes_observed": 0, + "external_seconds": 0.009454750455915928, + "started_utc": "2026-09-06T04:42:16.620389+00:00", + "invocation_offset_start_seconds": 139.36224849987775, + "invocation_offset_end_seconds": 139.37180520780385, + "stdout_file": "capacity_uncorrelated_small_32-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00031175, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000259833, + "solve_seconds": 0.00031175, + "driver_seconds": 0.00059125, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1096, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 877, + "stderr_bytes_observed": 0, + "external_seconds": 0.33775358367711306, + "started_utc": "2026-09-06T04:42:16.639770+00:00", + "invocation_offset_start_seconds": 139.3816290423274, + "invocation_offset_end_seconds": 139.72067237459123, + "stdout_file": "capacity_uncorrelated_small_32-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_small_32-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1096, + "best_bound": -1096, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.328621083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.825e-05, + "solve_seconds": 0.328621083, + "driver_seconds": 0.328697458, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1264, + "stderr_bytes_observed": 0, + "external_seconds": 0.012258082628250122, + "started_utc": "2026-09-06T04:42:16.989563+00:00", + "invocation_offset_start_seconds": 139.73141883313656, + "invocation_offset_end_seconds": 139.74377512466162, + "stdout_file": "capacity_uncorrelated_medium_128-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -4318, + "best_bound": -4318, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002937167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000259208, + "solve_seconds": 0.002937167, + "driver_seconds": 0.003224083, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -4318, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1221, + "stderr_bytes_observed": 0, + "external_seconds": 10.011040499433875, + "started_utc": "2026-09-06T04:42:17.013087+00:00", + "invocation_offset_start_seconds": 139.75494441669434, + "invocation_offset_end_seconds": 149.76652037538588, + "stdout_file": "capacity_uncorrelated_medium_128-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_medium_128-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -2485, + "best_bound": null, + "absolute_primal_gap_to_oracle": 1833, + "solve_seconds": 10.000137, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -2485, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 5.8792e-05, + "solve_seconds": 10.000137, + "driver_seconds": 10.000245625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2289, + "stderr_bytes_observed": 0, + "external_seconds": 0.04959545750170946, + "started_utc": "2026-09-06T04:42:27.035249+00:00", + "invocation_offset_start_seconds": 149.7770378747955, + "invocation_offset_end_seconds": 149.82673924975097, + "stdout_file": "capacity_uncorrelated_large_384-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -13832, + "best_bound": -13832, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.030220541, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000453, + "solve_seconds": 0.030220541, + "driver_seconds": 0.030702042, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -13832, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2260, + "stderr_bytes_observed": 0, + "external_seconds": 10.011788583360612, + "started_utc": "2026-09-06T04:42:27.095284+00:00", + "invocation_offset_start_seconds": 149.83707250002772, + "invocation_offset_end_seconds": 159.84907274972647, + "stdout_file": "capacity_uncorrelated_large_384-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_large_384-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -8545, + "best_bound": null, + "absolute_primal_gap_to_oracle": 5287, + "solve_seconds": 10.00046175, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -8545, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000170167, + "solve_seconds": 10.00046175, + "driver_seconds": 10.000662375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 788, + "stderr_bytes_observed": 0, + "external_seconds": 0.02209770865738392, + "started_utc": "2026-09-06T04:42:37.118942+00:00", + "invocation_offset_start_seconds": 159.86066554207355, + "invocation_offset_end_seconds": 159.8828864172101, + "stdout_file": "capacity_correlated_sanity_8-r2-after.stdout", + "stderr_file": "capacity_correlated_sanity_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002460583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000245458, + "solve_seconds": 0.002460583, + "driver_seconds": 0.002737708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -62, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 0, + "external_seconds": 0.009595084004104137, + "started_utc": "2026-09-06T04:42:37.151118+00:00", + "invocation_offset_start_seconds": 159.89283958263695, + "invocation_offset_end_seconds": 159.90251045767218, + "stdout_file": "capacity_correlated_sanity_8-r2-before.stdout", + "stderr_file": "capacity_correlated_sanity_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -62, + "best_bound": -62, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000344833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -62, + "best_bound": -62, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.2125e-05, + "solve_seconds": 0.000344833, + "driver_seconds": 0.000462417, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 853, + "stderr_bytes_observed": 0, + "external_seconds": 0.009667040780186653, + "started_utc": "2026-09-06T04:42:37.170730+00:00", + "invocation_offset_start_seconds": 159.91245504189283, + "invocation_offset_end_seconds": 159.92223700042814, + "stdout_file": "capacity_correlated_small_32-r2-after.stdout", + "stderr_file": "capacity_correlated_small_32-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000339833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000357, + "solve_seconds": 0.000339833, + "driver_seconds": 0.000716334, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_small_32", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 32, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -312, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 881, + "stderr_bytes_observed": 0, + "external_seconds": 7.817779541946948, + "started_utc": "2026-09-06T04:42:37.190155+00:00", + "invocation_offset_start_seconds": 159.93187612481415, + "invocation_offset_end_seconds": 167.74987708311528, + "stdout_file": "capacity_correlated_small_32-r2-before.stdout", + "stderr_file": "capacity_correlated_small_32-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_small_32.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -312, + "best_bound": -312, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 7.807807583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.9292e-05, + "solve_seconds": 7.807807583, + "driver_seconds": 7.807893167, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1274, + "stderr_bytes_observed": 0, + "external_seconds": 0.014525041915476322, + "started_utc": "2026-09-06T04:42:45.018368+00:00", + "invocation_offset_start_seconds": 167.7600385416299, + "invocation_offset_end_seconds": 167.7746722502634, + "stdout_file": "capacity_correlated_medium_128-r2-after.stdout", + "stderr_file": "capacity_correlated_medium_128-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -1211, + "best_bound": -1211, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003821458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000391083, + "solve_seconds": 0.003821458, + "driver_seconds": 0.004240708, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 128, + "model_variables": 128, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -1211, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1219, + "stderr_bytes_observed": 0, + "external_seconds": 10.010634582489729, + "started_utc": "2026-09-06T04:42:45.042394+00:00", + "invocation_offset_start_seconds": 167.7840617503971, + "invocation_offset_end_seconds": 177.79486216697842, + "stdout_file": "capacity_correlated_medium_128-r2-before.stdout", + "stderr_file": "capacity_correlated_medium_128-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_medium_128.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -1043, + "best_bound": null, + "absolute_primal_gap_to_oracle": 168, + "solve_seconds": 10.000135583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1043, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000114083, + "solve_seconds": 10.000135583, + "driver_seconds": 10.000289625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2296, + "stderr_bytes_observed": 0, + "external_seconds": 0.05236479081213474, + "started_utc": "2026-09-06T04:42:55.075907+00:00", + "invocation_offset_start_seconds": 177.81751049961895, + "invocation_offset_end_seconds": 177.86999791674316, + "stdout_file": "capacity_correlated_large_384-r2-after.stdout", + "stderr_file": "capacity_correlated_large_384-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": -3648, + "best_bound": -3648, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.030035458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000302083, + "solve_seconds": 0.030035458, + "driver_seconds": 0.030364583, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_correlated_large_384", + "family": "capacity_correlated", + "category": "knapsack", + "variant": "correlated", + "input_variables": 384, + "model_variables": 384, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -3648, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2243, + "stderr_bytes_observed": 0, + "external_seconds": 10.01223108265549, + "started_utc": "2026-09-06T04:42:55.162526+00:00", + "invocation_offset_start_seconds": 177.9041326669976, + "invocation_offset_end_seconds": 187.91726154182106, + "stdout_file": "capacity_correlated_large_384-r2-before.stdout", + "stderr_file": "capacity_correlated_large_384-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_correlated_large_384.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -3070, + "best_bound": null, + "absolute_primal_gap_to_oracle": 578, + "solve_seconds": 10.000373708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3070, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000155041, + "solve_seconds": 10.000373708, + "driver_seconds": 10.00055975, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 791, + "stderr_bytes_observed": 0, + "external_seconds": 0.02227108273655176, + "started_utc": "2026-09-06T04:43:05.187467+00:00", + "invocation_offset_start_seconds": 187.92900241725147, + "invocation_offset_end_seconds": 187.95135520771146, + "stdout_file": "assignment_sanity_3-r2-after.stdout", + "stderr_file": "assignment_sanity_3-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.004211, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000348584, + "solve_seconds": 0.004211, + "driver_seconds": 0.004582459, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_sanity_3", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 9, + "model_variables": 9, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 87, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 793, + "stderr_bytes_observed": 0, + "external_seconds": 0.013066582381725311, + "started_utc": "2026-09-06T04:43:05.219862+00:00", + "invocation_offset_start_seconds": 187.96140012517571, + "invocation_offset_end_seconds": 187.9746005004272, + "stdout_file": "assignment_sanity_3-r2-before.stdout", + "stderr_file": "assignment_sanity_3-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_sanity_3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 87, + "best_bound": 87, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000410125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 9, + "model_rows": 12, + "model_globals": 0, + "objective": 87, + "best_bound": 87, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.1083e-05, + "solve_seconds": 0.000410125, + "driver_seconds": 0.000516041, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.012146749533712864, + "started_utc": "2026-09-06T04:43:05.244784+00:00", + "invocation_offset_start_seconds": 187.98631904181093, + "invocation_offset_end_seconds": 187.998587124981, + "stdout_file": "assignment_small_5-r2-after.stdout", + "stderr_file": "assignment_small_5-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000278875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000291417, + "solve_seconds": 0.000278875, + "driver_seconds": 0.000596875, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_small_5", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 25, + "model_variables": 25, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 162, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.009700415655970573, + "started_utc": "2026-09-06T04:43:05.267170+00:00", + "invocation_offset_start_seconds": 188.00870641693473, + "invocation_offset_end_seconds": 188.01856833323836, + "stdout_file": "assignment_small_5-r2-before.stdout", + "stderr_file": "assignment_small_5-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_small_5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 162, + "best_bound": 162, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00026025, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 25, + "model_rows": 20, + "model_globals": 0, + "objective": 162, + "best_bound": 162, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.9417e-05, + "solve_seconds": 0.00026025, + "driver_seconds": 0.000361, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1060, + "stderr_bytes_observed": 0, + "external_seconds": 0.014184415340423584, + "started_utc": "2026-09-06T04:43:05.287275+00:00", + "invocation_offset_start_seconds": 188.02880708314478, + "invocation_offset_end_seconds": 188.04311516694725, + "stdout_file": "assignment_medium_9-r2-after.stdout", + "stderr_file": "assignment_medium_9-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0032355, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000223666, + "solve_seconds": 0.0032355, + "driver_seconds": 0.00348125, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_medium_9", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 81, + "model_variables": 81, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 146, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1062, + "stderr_bytes_observed": 0, + "external_seconds": 0.013980125077068806, + "started_utc": "2026-09-06T04:43:05.312301+00:00", + "invocation_offset_start_seconds": 188.05383733287454, + "invocation_offset_end_seconds": 188.06793595757335, + "stdout_file": "assignment_medium_9-r2-before.stdout", + "stderr_file": "assignment_medium_9-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_medium_9.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 146, + "best_bound": 146, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.003251458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 81, + "model_rows": 36, + "model_globals": 0, + "objective": 146, + "best_bound": 146, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.2792e-05, + "solve_seconds": 0.003251458, + "driver_seconds": 0.003366417, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1777, + "stderr_bytes_observed": 0, + "external_seconds": 3.0651921667158604, + "started_utc": "2026-09-06T04:43:05.337093+00:00", + "invocation_offset_start_seconds": 188.07862820848823, + "invocation_offset_end_seconds": 191.1439600829035, + "stdout_file": "assignment_large_16-r2-after.stdout", + "stderr_file": "assignment_large_16-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.053273375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000383875, + "solve_seconds": 3.053273375, + "driver_seconds": 3.05369875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "assignment_large_16", + "family": "assignment", + "category": "assignment", + "variant": "single", + "input_variables": 256, + "model_variables": 256, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1767, + "stderr_bytes_observed": 0, + "external_seconds": 3.0566645842045546, + "started_utc": "2026-09-06T04:43:08.414828+00:00", + "invocation_offset_start_seconds": 191.15634420793504, + "invocation_offset_end_seconds": 194.21311100013554, + "stdout_file": "assignment_large_16-r2-before.stdout", + "stderr_file": "assignment_large_16-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/assignment_large_16.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 145, + "best_bound": 145, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 3.046719, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000182959, + "solve_seconds": 3.046719, + "driver_seconds": 3.046927459, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_sanity_2x3", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 90, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 778, + "stderr_bytes_observed": 0, + "external_seconds": 0.01198520790785551, + "started_utc": "2026-09-06T04:43:11.483209+00:00", + "invocation_offset_start_seconds": 194.2247025417164, + "invocation_offset_end_seconds": 194.23678958322853, + "stdout_file": "facility_location_sanity_2x3-r2-after.stdout", + "stderr_file": "facility_location_sanity_2x3-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_sanity_2x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 90, + "best_bound": 90, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000304209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 12, + "model_globals": 0, + "objective": 90, + "best_bound": 90, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000364042, + "solve_seconds": 0.000304209, + "driver_seconds": 0.00069125, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_sanity_2x3", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 8, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 90, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 789, + "stderr_bytes_observed": 0, + "external_seconds": 0.009647666476666927, + "started_utc": "2026-09-06T04:43:11.506261+00:00", + "invocation_offset_start_seconds": 194.24775420781225, + "invocation_offset_end_seconds": 194.25749983265996, + "stdout_file": "facility_location_sanity_2x3-r2-before.stdout", + "stderr_file": "facility_location_sanity_2x3-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_sanity_2x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 90, + "best_bound": 90, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000372583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 12, + "model_globals": 0, + "objective": 90, + "best_bound": 90, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000100291, + "solve_seconds": 0.000372583, + "driver_seconds": 0.000492291, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_small_4x6", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 147, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.009809000417590141, + "started_utc": "2026-09-06T04:43:11.526901+00:00", + "invocation_offset_start_seconds": 194.26840079203248, + "invocation_offset_end_seconds": 194.2783082081005, + "stdout_file": "facility_location_small_4x6-r2-after.stdout", + "stderr_file": "facility_location_small_4x6-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_small_4x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 147, + "best_bound": 147, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000309042, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 28, + "model_rows": 36, + "model_globals": 0, + "objective": 147, + "best_bound": 147, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00030875, + "solve_seconds": 0.000309042, + "driver_seconds": 0.000645625, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_small_4x6", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 28, + "model_variables": 28, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 147, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 872, + "stderr_bytes_observed": 0, + "external_seconds": 0.010042457841336727, + "started_utc": "2026-09-06T04:43:11.548878+00:00", + "invocation_offset_start_seconds": 194.29037316702306, + "invocation_offset_end_seconds": 194.30054400023073, + "stdout_file": "facility_location_small_4x6-r2-before.stdout", + "stderr_file": "facility_location_small_4x6-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_small_4x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 147, + "best_bound": 147, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000265292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 28, + "model_rows": 36, + "model_globals": 0, + "objective": 147, + "best_bound": 147, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.075e-05, + "solve_seconds": 0.000265292, + "driver_seconds": 0.000343625, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_medium_8x12", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 224, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1174, + "stderr_bytes_observed": 0, + "external_seconds": 0.09384079184383154, + "started_utc": "2026-09-06T04:43:11.570278+00:00", + "invocation_offset_start_seconds": 194.31177254207432, + "invocation_offset_end_seconds": 194.4057252081111, + "stdout_file": "facility_location_medium_8x12-r2-after.stdout", + "stderr_file": "facility_location_medium_8x12-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_medium_8x12.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 224, + "best_bound": 224, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.083335208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 104, + "model_rows": 120, + "model_globals": 0, + "objective": 224, + "best_bound": 224, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000398, + "solve_seconds": 0.083335208, + "driver_seconds": 0.083768291, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_medium_8x12", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 104, + "model_variables": 104, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 224, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1163, + "stderr_bytes_observed": 0, + "external_seconds": 0.09648508299142122, + "started_utc": "2026-09-06T04:43:11.675394+00:00", + "invocation_offset_start_seconds": 194.41688904166222, + "invocation_offset_end_seconds": 194.5135494172573, + "stdout_file": "facility_location_medium_8x12-r2-before.stdout", + "stderr_file": "facility_location_medium_8x12-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_medium_8x12.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 224, + "best_bound": 224, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.085250042, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 104, + "model_rows": 120, + "model_globals": 0, + "objective": 224, + "best_bound": 224, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000141125, + "solve_seconds": 0.085250042, + "driver_seconds": 0.085418583, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_large_12x24", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 350, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1918, + "stderr_bytes_observed": 0, + "external_seconds": 10.011073582805693, + "started_utc": "2026-09-06T04:43:11.784074+00:00", + "invocation_offset_start_seconds": 194.52556779235601, + "invocation_offset_end_seconds": 204.53673337493092, + "stdout_file": "facility_location_large_12x24-r2-after.stdout", + "stderr_file": "facility_location_large_12x24-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_large_12x24.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 435, + "best_bound": null, + "absolute_primal_gap_to_oracle": 85, + "solve_seconds": 10.000771875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000477791, + "solve_seconds": 10.000771875, + "driver_seconds": 10.001283583, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "facility_location_large_12x24", + "family": "facility_location", + "category": "facility_location", + "variant": "single", + "input_variables": 300, + "model_variables": 300, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 350, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1918, + "stderr_bytes_observed": 0, + "external_seconds": 10.021124249324203, + "started_utc": "2026-09-06T04:43:21.808333+00:00", + "invocation_offset_start_seconds": 204.54975979216397, + "invocation_offset_end_seconds": 214.5710467500612, + "stdout_file": "facility_location_large_12x24-r2-before.stdout", + "stderr_file": "facility_location_large_12x24-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/facility_location_large_12x24.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 435, + "best_bound": null, + "absolute_primal_gap_to_oracle": 85, + "solve_seconds": 10.001515209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000310584, + "solve_seconds": 10.001515209, + "driver_seconds": 10.001867875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_sanity_4x3", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 780, + "stderr_bytes_observed": 0, + "external_seconds": 0.022523625753819942, + "started_utc": "2026-09-06T04:43:31.843081+00:00", + "invocation_offset_start_seconds": 214.5844444166869, + "invocation_offset_end_seconds": 214.6071138754487, + "stdout_file": "bin_packing_sanity_4x3-r2-after.stdout", + "stderr_file": "bin_packing_sanity_4x3-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_sanity_4x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.002542459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 15, + "model_rows": 25, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000233, + "solve_seconds": 0.002542459, + "driver_seconds": 0.002799958, + "assignment": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_sanity_4x3", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 15, + "model_variables": 15, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 816, + "stderr_bytes_observed": 0, + "external_seconds": 0.012155583128333092, + "started_utc": "2026-09-06T04:43:31.876906+00:00", + "invocation_offset_start_seconds": 214.61826870776713, + "invocation_offset_end_seconds": 214.6305635003373, + "stdout_file": "bin_packing_sanity_4x3-r2-before.stdout", + "stderr_file": "bin_packing_sanity_4x3-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_sanity_4x3.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00066275, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 15, + "model_rows": 25, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.6292e-05, + "solve_seconds": 0.00066275, + "driver_seconds": 0.00077225, + "assignment": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_small_8x4", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 900, + "stderr_bytes_observed": 0, + "external_seconds": 0.01221499964594841, + "started_utc": "2026-09-06T04:43:31.900107+00:00", + "invocation_offset_start_seconds": 214.6414662497118, + "invocation_offset_end_seconds": 214.65384758263826, + "stdout_file": "bin_packing_small_8x4-r2-after.stdout", + "stderr_file": "bin_packing_small_8x4-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_small_8x4.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000240167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 55, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000303125, + "solve_seconds": 0.000240167, + "driver_seconds": 0.000564916, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_small_8x4", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 36, + "model_variables": 36, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 3, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 889, + "stderr_bytes_observed": 0, + "external_seconds": 0.009704584255814552, + "started_utc": "2026-09-06T04:43:31.923957+00:00", + "invocation_offset_start_seconds": 214.66531483270228, + "invocation_offset_end_seconds": 214.6751544168219, + "stdout_file": "bin_packing_small_8x4-r2-before.stdout", + "stderr_file": "bin_packing_small_8x4-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_small_8x4.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000207958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 36, + "model_rows": 55, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.5375e-05, + "solve_seconds": 0.000207958, + "driver_seconds": 0.000302209, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_medium_12x5", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 4, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 991, + "stderr_bytes_observed": 0, + "external_seconds": 0.011621708981692791, + "started_utc": "2026-09-06T04:43:31.946695+00:00", + "invocation_offset_start_seconds": 214.68805437535048, + "invocation_offset_end_seconds": 214.699810417369, + "stdout_file": "bin_packing_medium_12x5-r2-after.stdout", + "stderr_file": "bin_packing_medium_12x5-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_medium_12x5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 4, + "best_bound": 4, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0010765, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 65, + "model_rows": 93, + "model_globals": 0, + "objective": 4, + "best_bound": 4, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000389167, + "solve_seconds": 0.0010765, + "driver_seconds": 0.001491417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_medium_12x5", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 65, + "model_variables": 65, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 4, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1014, + "stderr_bytes_observed": 0, + "external_seconds": 0.013200082816183567, + "started_utc": "2026-09-06T04:43:31.970484+00:00", + "invocation_offset_start_seconds": 214.71184291690588, + "invocation_offset_end_seconds": 214.725163041614, + "stdout_file": "bin_packing_medium_12x5-r2-before.stdout", + "stderr_file": "bin_packing_medium_12x5-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_medium_12x5.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 4, + "best_bound": 4, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001023458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 65, + "model_rows": 93, + "model_globals": 0, + "objective": 4, + "best_bound": 4, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.7834e-05, + "solve_seconds": 0.001023458, + "driver_seconds": 0.001141709, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_large_16x6", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 5, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1149, + "stderr_bytes_observed": 0, + "external_seconds": 0.8328438745811582, + "started_utc": "2026-09-06T04:43:31.996018+00:00", + "invocation_offset_start_seconds": 214.7373753748834, + "invocation_offset_end_seconds": 215.5703718746081, + "stdout_file": "bin_packing_large_16x6-r2-after.stdout", + "stderr_file": "bin_packing_large_16x6-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_large_16x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 5, + "best_bound": 5, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.821687708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000463917, + "solve_seconds": 0.821687708, + "driver_seconds": 0.822203, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "bin_packing_large_16x6", + "family": "bin_packing", + "category": "bin_packing", + "variant": "single", + "input_variables": 102, + "model_variables": 102, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 5, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1160, + "stderr_bytes_observed": 0, + "external_seconds": 0.918862042017281, + "started_utc": "2026-09-06T04:43:32.841550+00:00", + "invocation_offset_start_seconds": 215.58291483297944, + "invocation_offset_end_seconds": 216.50200300011784, + "stdout_file": "bin_packing_large_16x6-r2-before.stdout", + "stderr_file": "bin_packing_large_16x6-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/bin_packing_large_16x6.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 5, + "best_bound": 5, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.907050208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00012875, + "solve_seconds": 0.907050208, + "driver_seconds": 0.907213708, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_sanity_3x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 267, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 823, + "stderr_bytes_observed": 0, + "external_seconds": 0.010367417708039284, + "started_utc": "2026-09-06T04:43:33.772980+00:00", + "invocation_offset_start_seconds": 216.51432887464762, + "invocation_offset_end_seconds": 216.52486724965274, + "stdout_file": "production_sanity_3x8-r2-after.stdout", + "stderr_file": "production_sanity_3x8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_sanity_3x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 267, + "best_bound": 267, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000206042, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 24, + "model_rows": 14, + "model_globals": 0, + "objective": 267, + "best_bound": 267, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000230208, + "solve_seconds": 0.000206042, + "driver_seconds": 0.000457792, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_sanity_3x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 24, + "model_variables": 24, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 267, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 845, + "stderr_bytes_observed": 0, + "external_seconds": 0.00967200007289648, + "started_utc": "2026-09-06T04:43:33.795994+00:00", + "invocation_offset_start_seconds": 216.53733945824206, + "invocation_offset_end_seconds": 216.54714508261532, + "stdout_file": "production_sanity_3x8-r2-before.stdout", + "stderr_file": "production_sanity_3x8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_sanity_3x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 267, + "best_bound": 267, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000168458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 24, + "model_rows": 14, + "model_globals": 0, + "objective": 267, + "best_bound": 267, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.3084e-05, + "solve_seconds": 0.000168458, + "driver_seconds": 0.000247459, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_small_6x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 484, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 952, + "stderr_bytes_observed": 0, + "external_seconds": 0.012244042009115219, + "started_utc": "2026-09-06T04:43:33.817802+00:00", + "invocation_offset_start_seconds": 216.5591515833512, + "invocation_offset_end_seconds": 216.5714959995821, + "stdout_file": "production_small_6x8-r2-after.stdout", + "stderr_file": "production_small_6x8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_small_6x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 484, + "best_bound": 484, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00061925, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000264958, + "solve_seconds": 0.00061925, + "driver_seconds": 0.000905292, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_small_6x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 48, + "model_variables": 48, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 484, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 930, + "stderr_bytes_observed": 0, + "external_seconds": 0.009913584217429161, + "started_utc": "2026-09-06T04:43:33.842891+00:00", + "invocation_offset_start_seconds": 216.58423833269626, + "invocation_offset_end_seconds": 216.5942781670019, + "stdout_file": "production_small_6x8-r2-before.stdout", + "stderr_file": "production_small_6x8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_small_6x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 484, + "best_bound": 484, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000529792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000121916, + "solve_seconds": 0.000529792, + "driver_seconds": 0.000669833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_medium_12x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 1447, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1101, + "stderr_bytes_observed": 0, + "external_seconds": 10.013472874648869, + "started_utc": "2026-09-06T04:43:33.865937+00:00", + "invocation_offset_start_seconds": 216.60728970821947, + "invocation_offset_end_seconds": 226.62092766724527, + "stdout_file": "production_medium_12x8-r2-after.stdout", + "stderr_file": "production_medium_12x8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_medium_12x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 1459, + "best_bound": null, + "absolute_primal_gap_to_oracle": 12, + "solve_seconds": 10.001522208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000380792, + "solve_seconds": 10.001522208, + "driver_seconds": 10.001941042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_medium_12x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 96, + "model_variables": 96, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 1447, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1101, + "stderr_bytes_observed": 0, + "external_seconds": 10.021079082973301, + "started_utc": "2026-09-06T04:43:43.893710+00:00", + "invocation_offset_start_seconds": 226.63499120809138, + "invocation_offset_end_seconds": 236.65625487547368, + "stdout_file": "production_medium_12x8-r2-before.stdout", + "stderr_file": "production_medium_12x8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_medium_12x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 1459, + "best_bound": null, + "absolute_primal_gap_to_oracle": 12, + "solve_seconds": 10.001651667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000357125, + "solve_seconds": 10.001651667, + "driver_seconds": 10.002036708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_large_24x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 4600, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1486, + "stderr_bytes_observed": 0, + "external_seconds": 10.0216080006212, + "started_utc": "2026-09-06T04:43:53.928957+00:00", + "invocation_offset_start_seconds": 236.67017016746104, + "invocation_offset_end_seconds": 246.69198950007558, + "stdout_file": "production_large_24x8-r2-after.stdout", + "stderr_file": "production_large_24x8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/production_large_24x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 5037, + "best_bound": null, + "absolute_primal_gap_to_oracle": 437, + "solve_seconds": 10.000809584, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 192, + "model_rows": 98, + "model_globals": 0, + "objective": 5037, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000840791, + "solve_seconds": 10.000809584, + "driver_seconds": 10.001687875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "production_large_24x8", + "family": "production", + "category": "production", + "variant": "single", + "input_variables": 192, + "model_variables": 192, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": 4600, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1492, + "stderr_bytes_observed": 0, + "external_seconds": 10.026840792037547, + "started_utc": "2026-09-06T04:44:03.979382+00:00", + "invocation_offset_start_seconds": 246.72053375001997, + "invocation_offset_end_seconds": 256.74760875012726, + "stdout_file": "production_large_24x8-r2-before.stdout", + "stderr_file": "production_large_24x8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/production_large_24x8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": 5037, + "best_bound": null, + "absolute_primal_gap_to_oracle": 437, + "solve_seconds": 10.0008635, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 192, + "model_rows": 98, + "model_globals": 0, + "objective": 5037, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000861958, + "solve_seconds": 10.0008635, + "driver_seconds": 10.001769833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_sanity_4", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 320, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 789, + "stderr_bytes_observed": 0, + "external_seconds": 0.02430770732462406, + "started_utc": "2026-09-06T04:44:14.025209+00:00", + "invocation_offset_start_seconds": 256.76629295758903, + "invocation_offset_end_seconds": 256.79069458320737, + "stdout_file": "native_tsp_sanity_4-r2-after.stdout", + "stderr_file": "native_tsp_sanity_4-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_sanity_4.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 320, + "best_bound": 320, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.005310875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 14, + "model_columns": 8, + "model_rows": 0, + "model_globals": 5, + "objective": 320, + "best_bound": 320, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000317708, + "solve_seconds": 0.005310875, + "driver_seconds": 0.005658958, + "assignment": [ + 2, + 3, + 1, + 0 + ], + "full_values": [ + 2, + 3, + 1, + 0, + 93, + 87, + 65, + 75 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_sanity_4", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 4, + "model_variables": 8, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 320, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 765, + "stderr_bytes_observed": 0, + "external_seconds": 0.013109083287417889, + "started_utc": "2026-09-06T04:44:14.061283+00:00", + "invocation_offset_start_seconds": 256.8023629579693, + "invocation_offset_end_seconds": 256.81562683265656, + "stdout_file": "native_tsp_sanity_4-r2-before.stdout", + "stderr_file": "native_tsp_sanity_4-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_sanity_4.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 320, + "best_bound": 320, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001967, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 14, + "model_columns": 8, + "model_rows": 0, + "model_globals": 5, + "objective": 320, + "best_bound": 320, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000103167, + "solve_seconds": 0.001967, + "driver_seconds": 0.002095875, + "assignment": [ + 2, + 3, + 1, + 0 + ], + "full_values": [ + 2, + 3, + 1, + 0, + 93, + 87, + 65, + 75 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_small_8", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 384, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 819, + "stderr_bytes_observed": 0, + "external_seconds": 0.012019124813377857, + "started_utc": "2026-09-06T04:44:14.086883+00:00", + "invocation_offset_start_seconds": 256.82796429190785, + "invocation_offset_end_seconds": 256.8401061249897, + "stdout_file": "native_tsp_small_8-r2-after.stdout", + "stderr_file": "native_tsp_small_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_small_8.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 384, + "best_bound": 384, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000895625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 26, + "model_columns": 16, + "model_rows": 0, + "model_globals": 9, + "objective": 384, + "best_bound": 384, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000336833, + "solve_seconds": 0.000895625, + "driver_seconds": 0.001255917, + "assignment": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1 + ], + "full_values": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1, + 68, + 65, + 28, + 33, + 10, + 63, + 66, + 51 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_small_8", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 8, + "model_variables": 16, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 384, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 820, + "stderr_bytes_observed": 0, + "external_seconds": 0.010029708035290241, + "started_utc": "2026-09-06T04:44:14.110994+00:00", + "invocation_offset_start_seconds": 256.8520737923682, + "invocation_offset_end_seconds": 256.86238337494433, + "stdout_file": "native_tsp_small_8-r2-before.stdout", + "stderr_file": "native_tsp_small_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_small_8.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 384, + "best_bound": 384, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000731208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 26, + "model_columns": 16, + "model_rows": 0, + "model_globals": 9, + "objective": 384, + "best_bound": 384, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.8917e-05, + "solve_seconds": 0.000731208, + "driver_seconds": 0.000811292, + "assignment": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1 + ], + "full_values": [ + 4, + 2, + 6, + 5, + 3, + 7, + 0, + 1, + 68, + 65, + 28, + 33, + 10, + 63, + 66, + 51 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_medium_12", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 408, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 850, + "stderr_bytes_observed": 0, + "external_seconds": 0.019190333783626556, + "started_utc": "2026-09-06T04:44:14.133397+00:00", + "invocation_offset_start_seconds": 256.87447958346456, + "invocation_offset_end_seconds": 256.8937824172899, + "stdout_file": "native_tsp_medium_12-r2-after.stdout", + "stderr_file": "native_tsp_medium_12-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_medium_12.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 408, + "best_bound": 408, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0076055, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 408, + "best_bound": 408, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000266042, + "solve_seconds": 0.0076055, + "driver_seconds": 0.007893125, + "assignment": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3 + ], + "full_values": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3, + 66, + 38, + 62, + 10, + 5, + 24, + 28, + 51, + 18, + 66, + 20, + 20 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_medium_12", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 12, + "model_variables": 24, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 408, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 850, + "stderr_bytes_observed": 0, + "external_seconds": 0.017025125212967396, + "started_utc": "2026-09-06T04:44:14.165595+00:00", + "invocation_offset_start_seconds": 256.90667766705155, + "invocation_offset_end_seconds": 256.92385970801115, + "stdout_file": "native_tsp_medium_12-r2-before.stdout", + "stderr_file": "native_tsp_medium_12-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_medium_12.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 408, + "best_bound": 408, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.007508333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 408, + "best_bound": 408, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.9e-05, + "solve_seconds": 0.007508333, + "driver_seconds": 0.007594792, + "assignment": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3 + ], + "full_values": [ + 6, + 8, + 10, + 4, + 9, + 11, + 2, + 1, + 5, + 0, + 7, + 3, + 66, + 38, + 62, + 10, + 5, + 24, + 28, + 51, + 18, + 66, + 20, + 20 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_large_16", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 436, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 873, + "stderr_bytes_observed": 0, + "external_seconds": 0.06573095824569464, + "started_utc": "2026-09-06T04:44:14.194865+00:00", + "invocation_offset_start_seconds": 256.93594320770353, + "invocation_offset_end_seconds": 257.002872957848, + "stdout_file": "native_tsp_large_16-r2-after.stdout", + "stderr_file": "native_tsp_large_16-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_large_16.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 436, + "best_bound": 436, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.054440458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000314417, + "solve_seconds": 0.054440458, + "driver_seconds": 0.054783917, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "native_tsp_large_16", + "family": "native_tsp", + "category": "native_tsp", + "variant": "single", + "input_variables": 16, + "model_variables": 32, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 436, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 884, + "stderr_bytes_observed": 0, + "external_seconds": 0.06454008352011442, + "started_utc": "2026-09-06T04:44:14.273992+00:00", + "invocation_offset_start_seconds": 257.01507104188204, + "invocation_offset_end_seconds": 257.07975495792925, + "stdout_file": "native_tsp_large_16-r2-before.stdout", + "stderr_file": "native_tsp_large_16-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/native_tsp_large_16.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 436, + "best_bound": 436, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.054672583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.3375e-05, + "solve_seconds": 0.054672583, + "driver_seconds": 0.054801792, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_sanity_4", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16, + "tier": "sanity", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 105, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 814, + "stderr_bytes_observed": 0, + "external_seconds": 0.011439084075391293, + "started_utc": "2026-09-06T04:44:14.351267+00:00", + "invocation_offset_start_seconds": 257.0923447916284, + "invocation_offset_end_seconds": 257.103882917203, + "stdout_file": "weighted_queens_sanity_4-r2-after.stdout", + "stderr_file": "weighted_queens_sanity_4-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_sanity_4.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 105, + "best_bound": 105, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000782333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 32, + "model_columns": 16, + "model_rows": 8, + "model_globals": 7, + "objective": 105, + "best_bound": 105, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000226583, + "solve_seconds": 0.000782333, + "driver_seconds": 0.001031708, + "assignment": [ + 2, + 0, + 3, + 1 + ], + "full_values": [ + 2, + 0, + 3, + 1, + 2, + 2, + 1, + -1, + 5, + 1, + 4, + -2, + 13, + 35, + 17, + 40 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_sanity_4", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 4, + "model_variables": 16, + "tier": "sanity", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 105, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 804, + "stderr_bytes_observed": 0, + "external_seconds": 0.009448832832276821, + "started_utc": "2026-09-06T04:44:14.375137+00:00", + "invocation_offset_start_seconds": 257.1162151666358, + "invocation_offset_end_seconds": 257.1257893331349, + "stdout_file": "weighted_queens_sanity_4-r2-before.stdout", + "stderr_file": "weighted_queens_sanity_4-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_sanity_4.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 105, + "best_bound": 105, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000686708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 32, + "model_columns": 16, + "model_rows": 8, + "model_globals": 7, + "objective": 105, + "best_bound": 105, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.6708e-05, + "solve_seconds": 0.000686708, + "driver_seconds": 0.000756458, + "assignment": [ + 2, + 0, + 3, + 1 + ], + "full_values": [ + 2, + 0, + 3, + 1, + 2, + 2, + 1, + -1, + 5, + 1, + 4, + -2, + 13, + 35, + 17, + 40 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_small_8", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 121, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 849, + "stderr_bytes_observed": 0, + "external_seconds": 0.012313875369727612, + "started_utc": "2026-09-06T04:44:14.396830+00:00", + "invocation_offset_start_seconds": 257.1379103753716, + "invocation_offset_end_seconds": 257.15033112466335, + "stdout_file": "weighted_queens_small_8-r2-after.stdout", + "stderr_file": "weighted_queens_small_8-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_small_8.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 121, + "best_bound": 121, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001082416, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 60, + "model_columns": 32, + "model_rows": 16, + "model_globals": 11, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000215084, + "solve_seconds": 0.001082416, + "driver_seconds": 0.001318917, + "assignment": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3 + ], + "full_values": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3, + 4, + 4, + 7, + 5, + 3, + -1, + 8, + 2, + 6, + -2, + 5, + -5, + 13, + 1, + 10, + -4, + 24, + 4, + 8, + 3, + 34, + 10, + 4, + 34 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_small_8", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 8, + "model_variables": 32, + "tier": "small", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 121, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 860, + "stderr_bytes_observed": 0, + "external_seconds": 0.0095831248909235, + "started_utc": "2026-09-06T04:44:14.421534+00:00", + "invocation_offset_start_seconds": 257.16261270828545, + "invocation_offset_end_seconds": 257.1723477495834, + "stdout_file": "weighted_queens_small_8-r2-before.stdout", + "stderr_file": "weighted_queens_small_8-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_small_8.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 121, + "best_bound": 121, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000985708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 60, + "model_columns": 32, + "model_rows": 16, + "model_globals": 11, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.475e-05, + "solve_seconds": 0.000985708, + "driver_seconds": 0.001082833, + "assignment": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3 + ], + "full_values": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3, + 4, + 4, + 7, + 5, + 3, + -1, + 8, + 2, + 6, + -2, + 5, + -5, + 13, + 1, + 10, + -4, + 24, + 4, + 8, + 3, + 34, + 10, + 4, + 34 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_medium_10", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40, + "tier": "medium", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 86, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 879, + "stderr_bytes_observed": 0, + "external_seconds": 0.012521624565124512, + "started_utc": "2026-09-06T04:44:14.443931+00:00", + "invocation_offset_start_seconds": 257.1850128751248, + "invocation_offset_end_seconds": 257.1976573327556, + "stdout_file": "weighted_queens_medium_10-r2-after.stdout", + "stderr_file": "weighted_queens_medium_10-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_medium_10.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 86, + "best_bound": 86, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001542417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 40, + "model_rows": 20, + "model_globals": 13, + "objective": 86, + "best_bound": 86, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000269458, + "solve_seconds": 0.001542417, + "driver_seconds": 0.001833041, + "assignment": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9 + ], + "full_values": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9, + 3, + 3, + 7, + 5, + 2, + -2, + 8, + 2, + 12, + 4, + 6, + -4, + 13, + 1, + 11, + -3, + 10, + -6, + 18, + 0, + 15, + 4, + 28, + 3, + 1, + 22, + 4, + 5, + 2, + 2 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_medium_10", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 10, + "model_variables": 40, + "tier": "medium", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 86, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 869, + "stderr_bytes_observed": 0, + "external_seconds": 0.01946958340704441, + "started_utc": "2026-09-06T04:44:14.468865+00:00", + "invocation_offset_start_seconds": 257.20994437485933, + "invocation_offset_end_seconds": 257.2295862082392, + "stdout_file": "weighted_queens_medium_10-r2-before.stdout", + "stderr_file": "weighted_queens_medium_10-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_medium_10.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 86, + "best_bound": 86, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001402334, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 40, + "model_rows": 20, + "model_globals": 13, + "objective": 86, + "best_bound": 86, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.45e-05, + "solve_seconds": 0.001402334, + "driver_seconds": 0.001494916, + "assignment": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9 + ], + "full_values": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9, + 3, + 3, + 7, + 5, + 2, + -2, + 8, + 2, + 12, + 4, + 6, + -4, + 13, + 1, + 11, + -3, + 10, + -6, + 18, + 0, + 15, + 4, + 28, + 3, + 1, + 22, + 4, + 5, + 2, + 2 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_large_12", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48, + "tier": "large", + "stress": false, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 98, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 907, + "stderr_bytes_observed": 0, + "external_seconds": 0.015062958002090454, + "started_utc": "2026-09-06T04:44:14.501689+00:00", + "invocation_offset_start_seconds": 257.24276804178953, + "invocation_offset_end_seconds": 257.257958333008, + "stdout_file": "weighted_queens_large_12-r2-after.stdout", + "stderr_file": "weighted_queens_large_12-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_large_12.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 98, + "best_bound": 98, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.004145958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000384792, + "solve_seconds": 0.004145958, + "driver_seconds": 0.004550792, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "weighted_queens_large_12", + "family": "weighted_queens", + "category": "weighted_queens", + "variant": "single", + "input_variables": 12, + "model_variables": 48, + "tier": "large", + "stress": false, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": true, + "proved_within_limit": true, + "witness_checked": true, + "expected_objective": 98, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 897, + "stderr_bytes_observed": 0, + "external_seconds": 0.014884709380567074, + "started_utc": "2026-09-06T04:44:14.529484+00:00", + "invocation_offset_start_seconds": 257.27056737523526, + "invocation_offset_end_seconds": 257.2856016671285, + "stdout_file": "weighted_queens_large_12-r2-before.stdout", + "stderr_file": "weighted_queens_large_12-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/weighted_queens_large_12.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "10" + ], + "status": "optimal", + "objective": 98, + "best_bound": 98, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.004063667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.0625e-05, + "solve_seconds": 0.004063667, + "driver_seconds": 0.004164917, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "after", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2767, + "stderr_bytes_observed": 0, + "external_seconds": 10.01319620758295, + "started_utc": "2026-09-06T04:44:14.557051+00:00", + "invocation_offset_start_seconds": 257.298127874732, + "invocation_offset_end_seconds": 267.3115335833281, + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r2-after.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r2-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.001951334, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000300583, + "solve_seconds": 10.001951334, + "driver_seconds": 10.002287958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "case": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "category": "knapsack", + "variant": "uncorrelated", + "input_variables": 512, + "model_variables": 512, + "tier": "cap_overflow", + "stress": true, + "cohort": "before", + "repetition": 2, + "attempted": true, + "completed": false, + "proved_within_limit": false, + "witness_checked": true, + "expected_objective": -18731, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2761, + "stderr_bytes_observed": 0, + "external_seconds": 10.023528499528766, + "started_utc": "2026-09-06T04:44:24.584838+00:00", + "invocation_offset_start_seconds": 267.325848958455, + "invocation_offset_end_seconds": 277.3495562495664, + "stdout_file": "capacity_uncorrelated_cap_overflow_512-r2-before.stdout", + "stderr_file": "capacity_uncorrelated_cap_overflow_512-r2-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_cap_overflow_512.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ], + "status": "time_limit", + "objective": -11574, + "best_bound": null, + "absolute_primal_gap_to_oracle": 7157, + "solve_seconds": 10.001378459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00028575, + "solve_seconds": 10.001378459, + "driver_seconds": 10.001701958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + } + ], + "integrity": { + "frozen_unchanged": true, + "measurement_source_unchanged": true, + "runtime_source_unchanged": true, + "driver_unchanged": true, + "preserved_manifest_unchanged": true, + "libraries_unchanged": true + }, + "finished_utc": "2026-09-06T04:44:34.694595+00:00", + "elapsed_seconds": 277.43554375041276 + }, + "summary": { + "schema_version": 1, + "comparison_valid": true, + "elapsed_seconds": 277.43554375041276, + "required_runs": 132, + "recorded_runs": 132, + "repetitions": 2, + "solver_seconds": 10, + "primary_measure": "largest_main_group_proved_model_variables", + "provenance": { + "driver_name": "optimize-native-benchmark", + "driver_sha256": "fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4", + "source_head": "272d360d02b7c4ed1b511d82219bd11c3b0c7394", + "runtime_source_sha256": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_category_scaling.py": "3e2db304f0e6ffc52458f2700490bbe5cbde32177e2a235278296f771c63df19", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/optimize/native_benchmark.cpp": "15e73b36588841eb4eed27bbe6f9855da929259d1d95b66956424fab81aca83f", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "frozen_manifest_sha256": "855c2630073be58b62682532d53f9a58314e7638ca242fbc8b3004a902b10e11", + "frozen_protocol_sha256": "e4ae53b25fea192a8a596107bf4f005fa2b6d492137656f5c08f38c6db91dc1e", + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98249, + "external_seconds": 0.2081547500565648, + "started_utc": "2026-09-06T04:39:57.436042+00:00", + "invocation_offset_start_seconds": 0.1788182919844985, + "invocation_offset_end_seconds": 0.3872119998559356, + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + } + }, + "cases": [ + { + "id": "capacity_uncorrelated_sanity_8", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -337, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000114209, + 0.000370416 + ], + "external_seconds": [ + 0.011187375523149967, + 0.009686999954283237 + ], + "median_internal_seconds": 0.0002423125, + "median_external_seconds": 0.010437187738716602, + "objectives": [ + -337, + -337 + ], + "bounds": [ + -337, + -337 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000112167, + 0.000314292 + ], + "external_seconds": [ + 0.011965125799179077, + 0.012248625047504902 + ], + "median_internal_seconds": 0.00021322949999999998, + "median_external_seconds": 0.01210687542334199, + "objectives": [ + -337, + -337 + ], + "bounds": [ + -337, + -337 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9153021825860762, + "median_paired_external_seconds_ratio_after_before": 1.1669799085346955 + }, + { + "id": "capacity_uncorrelated_small_32", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "size_unit": "binary variables", + "input_variables": 32, + "model_variables": 32, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -1096, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.341726333, + 0.328621083 + ], + "external_seconds": [ + 0.3595742080360651, + 0.33775358367711306 + ], + "median_internal_seconds": 0.335173708, + "median_external_seconds": 0.3486638958565891, + "objectives": [ + -1096, + -1096 + ], + "bounds": [ + -1096, + -1096 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.00028075, + 0.00031175 + ], + "external_seconds": [ + 0.009770541451871395, + 0.009454750455915928 + ], + "median_internal_seconds": 0.00029625, + "median_external_seconds": 0.009612645953893661, + "objectives": [ + -1096, + -1096 + ], + "bounds": [ + -1096, + -1096 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.0008851124144449302, + "median_paired_external_seconds_ratio_after_before": 0.027582786990411317 + }, + { + "id": "capacity_uncorrelated_medium_128", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "size_unit": "binary variables", + "input_variables": 128, + "model_variables": 128, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -4318, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001552, + 10.000137 + ], + "external_seconds": [ + 10.013179457746446, + 10.011040499433875 + ], + "median_internal_seconds": 10.0008445, + "median_external_seconds": 10.01210997859016, + "objectives": [ + -2471, + -2485 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.007701875, + 0.002937167 + ], + "external_seconds": [ + 0.0354841249063611, + 0.012258082628250122 + ], + "median_internal_seconds": 0.005319521000000001, + "median_external_seconds": 0.023871103767305613, + "objectives": [ + -4318, + -4318 + ], + "bounds": [ + -4318, + -4318 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_uncorrelated_large_384", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "size_unit": "binary variables", + "input_variables": 384, + "model_variables": 384, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -13832, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000409209, + 10.00046175 + ], + "external_seconds": [ + 10.01396679226309, + 10.011788583360612 + ], + "median_internal_seconds": 10.0004354795, + "median_external_seconds": 10.012877687811852, + "objectives": [ + -8545, + -8545 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.02940725, + 0.030220541 + ], + "external_seconds": [ + 0.0554231246933341, + 0.04959545750170946 + ], + "median_internal_seconds": 0.0298138955, + "median_external_seconds": 0.05250929109752178, + "objectives": [ + -13832, + -13832 + ], + "bounds": [ + -13832, + -13832 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_correlated_sanity_8", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -62, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000405833, + 0.000344833 + ], + "external_seconds": [ + 0.012003792449831963, + 0.009595084004104137 + ], + "median_internal_seconds": 0.000375333, + "median_external_seconds": 0.01079943822696805, + "objectives": [ + -62, + -62 + ], + "bounds": [ + -62, + -62 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000106833, + 0.002460583 + ], + "external_seconds": [ + 0.009426292032003403, + 0.02209770865738392 + ], + "median_internal_seconds": 0.0012837080000000002, + "median_external_seconds": 0.01576200034469366, + "objectives": [ + -62, + -62 + ], + "bounds": [ + -62, + -62 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 3.699411209729502, + "median_paired_external_seconds_ratio_after_before": 1.5441500751627038 + }, + { + "id": "capacity_correlated_small_32", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "size_unit": "binary variables", + "input_variables": 32, + "model_variables": 32, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -312, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 8.215772416, + 7.807807583 + ], + "external_seconds": [ + 8.226140749640763, + 7.817779541946948 + ], + "median_internal_seconds": 8.0117899995, + "median_external_seconds": 8.021960145793855, + "objectives": [ + -312, + -312 + ], + "bounds": [ + -312, + -312 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.002595459, + 0.000339833 + ], + "external_seconds": [ + 0.022679916583001614, + 0.009667040780186653 + ], + "median_internal_seconds": 0.001467646, + "median_external_seconds": 0.016173478681594133, + "objectives": [ + -312, + -312 + ], + "bounds": [ + -312, + -312 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.0001797182555985159, + "median_paired_external_seconds_ratio_after_before": 0.001996799933993551 + }, + { + "id": "capacity_correlated_medium_128", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "size_unit": "binary variables", + "input_variables": 128, + "model_variables": 128, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -1211, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000169209, + 10.000135583 + ], + "external_seconds": [ + 10.011547040194273, + 10.010634582489729 + ], + "median_internal_seconds": 10.000152396, + "median_external_seconds": 10.011090811342001, + "objectives": [ + -1043, + -1043 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.006717208, + 0.003821458 + ], + "external_seconds": [ + 0.032611084170639515, + 0.014525041915476322 + ], + "median_internal_seconds": 0.005269332999999999, + "median_external_seconds": 0.02356806304305792, + "objectives": [ + -1211, + -1211 + ], + "bounds": [ + -1211, + -1211 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "capacity_correlated_large_384", + "category": "knapsack", + "variant": "correlated", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "size_unit": "binary variables", + "input_variables": 384, + "model_variables": 384, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": -3648, + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.000460041, + 10.000373708 + ], + "external_seconds": [ + 10.013345709070563, + 10.01223108265549 + ], + "median_internal_seconds": 10.0004168745, + "median_external_seconds": 10.012788395863026, + "objectives": [ + -3070, + -3070 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.030781875, + 0.030035458 + ], + "external_seconds": [ + 0.054739249870181084, + 0.05236479081213474 + ], + "median_internal_seconds": 0.0304086665, + "median_external_seconds": 0.05355202034115791, + "objectives": [ + -3648, + -3648 + ], + "bounds": [ + -3648, + -3648 + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "assignment_sanity_3", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "size_unit": "binary variables", + "input_variables": 9, + "model_variables": 9, + "dimensions": { + "input_variables": 9, + "variables": 9, + "rows": 12, + "nonzeros": 36, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 87, + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000792209, + 0.000410125 + ], + "external_seconds": [ + 0.012123375199735165, + 0.013066582381725311 + ], + "median_internal_seconds": 0.000601167, + "median_external_seconds": 0.012594978790730238, + "objectives": [ + 87, + 87 + ], + "bounds": [ + 87, + 87 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000121917, + 0.004211 + ], + "external_seconds": [ + 0.00951125007122755, + 0.02227108273655176 + ], + "median_internal_seconds": 0.0021664585, + "median_external_seconds": 0.015891166403889656, + "objectives": [ + 87, + 87 + ], + "bounds": [ + 87, + 87 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 5.21074816796798, + "median_paired_external_seconds_ratio_after_before": 1.244484359166733 + }, + { + "id": "assignment_small_5", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "size_unit": "binary variables", + "input_variables": 25, + "model_variables": 25, + "dimensions": { + "input_variables": 25, + "variables": 25, + "rows": 20, + "nonzeros": 100, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 162, + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000258708, + 0.00026025 + ], + "external_seconds": [ + 0.01303112506866455, + 0.009700415655970573 + ], + "median_internal_seconds": 0.000259479, + "median_external_seconds": 0.011365770362317562, + "objectives": [ + 162, + 162 + ], + "bounds": [ + 162, + 162 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000251167, + 0.000278875 + ], + "external_seconds": [ + 0.01004749909043312, + 0.012146749533712864 + ], + "median_internal_seconds": 0.000265021, + "median_external_seconds": 0.011097124312072992, + "objectives": [ + 162, + 162 + ], + "bounds": [ + 162, + 162 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.0212085546893432, + "median_paired_external_seconds_ratio_after_before": 1.0116135297626545 + }, + { + "id": "assignment_medium_9", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "size_unit": "binary variables", + "input_variables": 81, + "model_variables": 81, + "dimensions": { + "input_variables": 81, + "variables": 81, + "rows": 36, + "nonzeros": 324, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 146, + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003408375, + 0.003251458 + ], + "external_seconds": [ + 0.014980957843363285, + 0.013980125077068806 + ], + "median_internal_seconds": 0.0033299165, + "median_external_seconds": 0.014480541460216045, + "objectives": [ + 146, + 146 + ], + "bounds": [ + 146, + 146 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003166875, + 0.0032355 + ], + "external_seconds": [ + 0.017613583244383335, + 0.014184415340423584 + ], + "median_internal_seconds": 0.0032011875, + "median_external_seconds": 0.01589899929240346, + "objectives": [ + 146, + 146 + ], + "bounds": [ + 146, + 146 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9621185842059743, + "median_paired_external_seconds_ratio_after_before": 1.0951721769069198 + }, + { + "id": "assignment_large_16", + "category": "assignment", + "variant": "single", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "size_unit": "binary variables", + "input_variables": 256, + "model_variables": 256, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 64, + "nonzeros": 1024, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 145, + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 3.243344208, + 3.046719 + ], + "external_seconds": [ + 3.2565808752551675, + 3.0566645842045546 + ], + "median_internal_seconds": 3.1450316039999997, + "median_external_seconds": 3.156622729729861, + "objectives": [ + 145, + 145 + ], + "bounds": [ + 145, + 145 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 3.372347, + 3.053273375 + ], + "external_seconds": [ + 3.3932000007480383, + 3.0651921667158604 + ], + "median_internal_seconds": 3.2128101874999997, + "median_external_seconds": 3.2291960837319493, + "objectives": [ + 145, + 145 + ], + "bounds": [ + 145, + 145 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.0209629561420264, + "median_paired_external_seconds_ratio_after_before": 1.0223707696157345 + }, + { + "id": "facility_location_sanity_2x3", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "sanity", + "tier_size": 2, + "size_unit": "binary variables", + "input_variables": 8, + "model_variables": 8, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 12, + "nonzeros": 24, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 90, + "parameters": { + "facilities": 2, + "customers": 3, + "opening_costs": [ + 17, + 26 + ], + "assignment_costs": [ + [ + 17, + 18 + ], + [ + 44, + 19 + ], + [ + 16, + 27 + ] + ] + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000304792, + 0.000372583 + ], + "external_seconds": [ + 0.014764624647796154, + 0.009647666476666927 + ], + "median_internal_seconds": 0.0003386875, + "median_external_seconds": 0.01220614556223154, + "objectives": [ + 90, + 90 + ], + "bounds": [ + 90, + 90 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000357125, + 0.000304209 + ], + "external_seconds": [ + 0.011998165398836136, + 0.01198520790785551 + ], + "median_internal_seconds": 0.000330667, + "median_external_seconds": 0.011991686653345823, + "objectives": [ + 90, + 90 + ], + "bounds": [ + 90, + 90 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9940936143199309, + "median_paired_external_seconds_ratio_after_before": 1.0274600408048422 + }, + { + "id": "facility_location_small_4x6", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "small", + "tier_size": 4, + "size_unit": "binary variables", + "input_variables": 28, + "model_variables": 28, + "dimensions": { + "input_variables": 28, + "variables": 28, + "rows": 36, + "nonzeros": 96, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 147, + "parameters": { + "facilities": 4, + "customers": 6, + "opening_costs": [ + 17, + 26, + 23, + 47 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18 + ], + [ + 44, + 19, + 28, + 33 + ], + [ + 16, + 27, + 8, + 9 + ], + [ + 16, + 15, + 30, + 31 + ], + [ + 51, + 26, + 35, + 40 + ], + [ + 29, + 16, + 19, + 20 + ] + ] + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000305083, + 0.000265292 + ], + "external_seconds": [ + 0.009150374680757523, + 0.010042457841336727 + ], + "median_internal_seconds": 0.00028518749999999996, + "median_external_seconds": 0.009596416261047125, + "objectives": [ + 147, + 147 + ], + "bounds": [ + 147, + 147 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000274167, + 0.000309042 + ], + "external_seconds": [ + 0.009619041346013546, + 0.009809000417590141 + ], + "median_internal_seconds": 0.0002916045, + "median_external_seconds": 0.009714020881801844, + "objectives": [ + 147, + 147 + ], + "bounds": [ + 147, + 147 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.0317881334663865, + "median_paired_external_seconds_ratio_after_before": 1.0139856313957591 + }, + { + "id": "facility_location_medium_8x12", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "medium", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 104, + "model_variables": 104, + "dimensions": { + "input_variables": 104, + "variables": 104, + "rows": 120, + "nonzeros": 384, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 224, + "parameters": { + "facilities": 8, + "customers": 12, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ] + ] + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.088816291, + 0.085250042 + ], + "external_seconds": [ + 0.09906833246350288, + 0.09648508299142122 + ], + "median_internal_seconds": 0.08703316650000001, + "median_external_seconds": 0.09777670772746205, + "objectives": [ + 224, + 224 + ], + "bounds": [ + 224, + 224 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.086261417, + 0.083335208 + ], + "external_seconds": [ + 0.096862499602139, + 0.09384079184383154 + ], + "median_internal_seconds": 0.0847983125, + "median_external_seconds": 0.09535164572298527, + "objectives": [ + 224, + 224 + ], + "bounds": [ + 224, + 224 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9743863944330724, + "median_paired_external_seconds_ratio_after_before": 0.9751640055763736 + }, + { + "id": "facility_location_large_12x24", + "category": "facility_location", + "variant": "single", + "family": "facility_location", + "tier": "large", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 300, + "model_variables": 300, + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 336, + "nonzeros": 1152, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 350, + "parameters": { + "facilities": 12, + "customers": 24, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ] + ] + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.00020375, + 10.001515209 + ], + "external_seconds": [ + 10.011875458061695, + 10.021124249324203 + ], + "median_internal_seconds": 10.0008594795, + "median_external_seconds": 10.016499853692949, + "objectives": [ + 435, + 435 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001564458, + 10.000771875 + ], + "external_seconds": [ + 10.022922250442207, + 10.011073582805693 + ], + "median_internal_seconds": 10.001168166500001, + "median_external_seconds": 10.01699791662395, + "objectives": [ + 435, + 435 + ], + "bounds": [ + null, + null + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "bin_packing_sanity_4x3", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "sanity", + "tier_size": 4, + "size_unit": "binary variables", + "input_variables": 15, + "model_variables": 15, + "dimensions": { + "input_variables": 15, + "variables": 15, + "rows": 25, + "nonzeros": 67, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 3, + "parameters": { + "items": 4, + "bins": 3, + "weights": [ + 3, + 6, + 3, + 4 + ], + "capacity": 8, + "symmetry": "enabled bins form a prefix" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003100833, + 0.00066275 + ], + "external_seconds": [ + 0.02498279046267271, + 0.012155583128333092 + ], + "median_internal_seconds": 0.0018817915, + "median_external_seconds": 0.0185691867955029, + "objectives": [ + 3, + 3 + ], + "bounds": [ + 3, + 3 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000404125, + 0.002542459 + ], + "external_seconds": [ + 0.012268874794244766, + 0.022523625753819942 + ], + "median_internal_seconds": 0.001473292, + "median_external_seconds": 0.017396250274032354, + "objectives": [ + 3, + 3 + ], + "bounds": [ + 3, + 3 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.983277106274677, + "median_paired_external_seconds_ratio_after_before": 1.1720189751430223 + }, + { + "id": "bin_packing_small_8x4", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "small", + "tier_size": 8, + "size_unit": "binary variables", + "input_variables": 36, + "model_variables": 36, + "dimensions": { + "input_variables": 36, + "variables": 36, + "rows": 55, + "nonzeros": 170, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 3, + "parameters": { + "items": 8, + "bins": 4, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2 + ], + "capacity": 13, + "symmetry": "enabled bins form a prefix" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000228417, + 0.000207958 + ], + "external_seconds": [ + 0.012555875815451145, + 0.009704584255814552 + ], + "median_internal_seconds": 0.0002181875, + "median_external_seconds": 0.011130230035632849, + "objectives": [ + 3, + 3 + ], + "bounds": [ + 3, + 3 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000207667, + 0.000240167 + ], + "external_seconds": [ + 0.009702292270958424, + 0.01221499964594841 + ], + "median_internal_seconds": 0.00022391700000000002, + "median_external_seconds": 0.010958645958453417, + "objectives": [ + 3, + 3 + ], + "bounds": [ + 3, + 3 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.032019805143598, + "median_paired_external_seconds_ratio_after_before": 1.0157063435842202 + }, + { + "id": "bin_packing_medium_12x5", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "medium", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 65, + "model_variables": 65, + "dimensions": { + "input_variables": 65, + "variables": 65, + "rows": 93, + "nonzeros": 313, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 4, + "parameters": { + "items": 12, + "bins": 5, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4 + ], + "capacity": 14, + "symmetry": "enabled bins form a prefix" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.001446459, + 0.001023458 + ], + "external_seconds": [ + 0.01445983350276947, + 0.013200082816183567 + ], + "median_internal_seconds": 0.0012349585000000001, + "median_external_seconds": 0.013829958159476519, + "objectives": [ + 4, + 4 + ], + "bounds": [ + 4, + 4 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.001019, + 0.0010765 + ], + "external_seconds": [ + 0.01221737451851368, + 0.011621708981692791 + ], + "median_internal_seconds": 0.00104775, + "median_external_seconds": 0.011919541750103235, + "objectives": [ + 4, + 4 + ], + "bounds": [ + 4, + 4 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.8781526333058909, + "median_paired_external_seconds_ratio_after_before": 0.8626725190677671 + }, + { + "id": "bin_packing_large_16x6", + "category": "bin_packing", + "variant": "single", + "family": "bin_packing", + "tier": "large", + "tier_size": 16, + "size_unit": "binary variables", + "input_variables": 102, + "model_variables": 102, + "dimensions": { + "input_variables": 102, + "variables": 102, + "rows": 139, + "nonzeros": 496, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 5, + "parameters": { + "items": 16, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10 + ], + "capacity": 18, + "symmetry": "enabled bins form a prefix" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.827072834, + 0.907050208 + ], + "external_seconds": [ + 0.8383529167622328, + 0.918862042017281 + ], + "median_internal_seconds": 0.867061521, + "median_external_seconds": 0.8786074793897569, + "objectives": [ + 5, + 5 + ], + "bounds": [ + 5, + 5 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.824261917, + 0.821687708 + ], + "external_seconds": [ + 0.835252083837986, + 0.8328438745811582 + ], + "median_internal_seconds": 0.8229748125, + "median_external_seconds": 0.8340479792095721, + "objectives": [ + 5, + 5 + ], + "bounds": [ + 5, + 5 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.951245680801434, + "median_paired_external_seconds_ratio_after_before": 0.9513437398625513 + }, + { + "id": "production_sanity_3x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "sanity", + "tier_size": 3, + "size_unit": "binary variables", + "input_variables": 24, + "model_variables": 24, + "dimensions": { + "input_variables": 24, + "variables": 24, + "rows": 14, + "nonzeros": 174, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 267, + "parameters": { + "periods": 3, + "options": 8, + "demands": [ + 7, + 5, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ] + ], + "objective_constant": -102 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000184417, + 0.000168458 + ], + "external_seconds": [ + 0.009633750654757023, + 0.00967200007289648 + ], + "median_internal_seconds": 0.0001764375, + "median_external_seconds": 0.009652875363826752, + "objectives": [ + 267, + 267 + ], + "bounds": [ + 267, + 267 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000171208, + 0.000206042 + ], + "external_seconds": [ + 0.009296083822846413, + 0.010367417708039284 + ], + "median_internal_seconds": 0.000188625, + "median_external_seconds": 0.009831750765442848, + "objectives": [ + 267, + 267 + ], + "bounds": [ + 267, + 267 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.075740169153176, + "median_paired_external_seconds_ratio_after_before": 1.018424841970074 + }, + { + "id": "production_small_6x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "small", + "tier_size": 6, + "size_unit": "binary variables", + "input_variables": 48, + "model_variables": 48, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 26, + "nonzeros": 474, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 484, + "parameters": { + "periods": 6, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ] + ], + "objective_constant": -273 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000547958, + 0.000529792 + ], + "external_seconds": [ + 0.009663917124271393, + 0.009913584217429161 + ], + "median_internal_seconds": 0.000538875, + "median_external_seconds": 0.009788750670850277, + "objectives": [ + 484, + 484 + ], + "bounds": [ + 484, + 484 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000757125, + 0.00061925 + ], + "external_seconds": [ + 0.01630358211696148, + 0.012244042009115219 + ], + "median_internal_seconds": 0.0006881875, + "median_external_seconds": 0.01427381206303835, + "objectives": [ + 484, + 484 + ], + "bounds": [ + 484, + 484 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.2752879043324707, + "median_paired_external_seconds_ratio_after_before": 1.46106726828576 + }, + { + "id": "production_medium_12x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "medium", + "tier_size": 12, + "size_unit": "binary variables", + "input_variables": 96, + "model_variables": 96, + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 1447, + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.00158675, + 10.001651667 + ], + "external_seconds": [ + 10.012133125215769, + 10.021079082973301 + ], + "median_internal_seconds": 10.0016192085, + "median_external_seconds": 10.016606104094535, + "objectives": [ + 1459, + 1459 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001561375, + 10.001522208 + ], + "external_seconds": [ + 10.021155749447644, + 10.013472874648869 + ], + "median_internal_seconds": 10.0015417915, + "median_external_seconds": 10.017314312048256, + "objectives": [ + 1459, + 1459 + ], + "bounds": [ + null, + null + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "production_large_24x8", + "category": "production", + "variant": "single", + "family": "production", + "tier": "large", + "tier_size": 24, + "size_unit": "binary variables", + "input_variables": 192, + "model_variables": 192, + "dimensions": { + "input_variables": 192, + "variables": 192, + "rows": 98, + "nonzeros": 4920, + "globals": 0 + }, + "stress": false, + "kind": "binary", + "objective": 4600, + "parameters": { + "periods": 24, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ] + ], + "objective_constant": -3618 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001679291, + 10.0008635 + ], + "external_seconds": [ + 10.019765458069742, + 10.026840792037547 + ], + "median_internal_seconds": 10.0012713955, + "median_external_seconds": 10.023303125053644, + "objectives": [ + 5037, + 5037 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.001655125, + 10.000809584 + ], + "external_seconds": [ + 10.02236270904541, + 10.0216080006212 + ], + "median_internal_seconds": 10.0012323545, + "median_external_seconds": 10.021985354833305, + "objectives": [ + 5037, + 5037 + ], + "bounds": [ + null, + null + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + }, + { + "id": "native_tsp_sanity_4", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "sanity", + "tier_size": 4, + "size_unit": "cities", + "input_variables": 4, + "model_variables": 8, + "dimensions": { + "input_variables": 4, + "variables": 8, + "rows": 0, + "nonzeros": 0, + "globals": 5 + }, + "stress": false, + "kind": "native_tsp", + "objective": 320, + "parameters": { + "size": 4 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.003438875, + 0.001967 + ], + "external_seconds": [ + 0.021328375674784184, + 0.013109083287417889 + ], + "median_internal_seconds": 0.0027029375, + "median_external_seconds": 0.017218729481101036, + "objectives": [ + 320, + 320 + ], + "bounds": [ + 320, + 320 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.001798625, + 0.005310875 + ], + "external_seconds": [ + 0.012150917202234268, + 0.02430770732462406 + ], + "median_internal_seconds": 0.0035547499999999998, + "median_external_seconds": 0.018229312263429165, + "objectives": [ + 320, + 320 + ], + "bounds": [ + 320, + 320 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.6115072215325175, + "median_paired_external_seconds_ratio_after_before": 1.2119855521716039 + }, + { + "id": "native_tsp_small_8", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "small", + "tier_size": 8, + "size_unit": "cities", + "input_variables": 8, + "model_variables": 16, + "dimensions": { + "input_variables": 8, + "variables": 16, + "rows": 0, + "nonzeros": 0, + "globals": 9 + }, + "stress": false, + "kind": "native_tsp", + "objective": 384, + "parameters": { + "size": 8 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000794917, + 0.000731208 + ], + "external_seconds": [ + 0.012096666730940342, + 0.010029708035290241 + ], + "median_internal_seconds": 0.0007630625000000001, + "median_external_seconds": 0.011063187383115292, + "objectives": [ + 384, + 384 + ], + "bounds": [ + 384, + 384 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000840166, + 0.000895625 + ], + "external_seconds": [ + 0.012197458185255527, + 0.012019124813377857 + ], + "median_internal_seconds": 0.0008678955, + "median_external_seconds": 0.012108291499316692, + "objectives": [ + 384, + 384 + ], + "bounds": [ + 384, + 384 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.1408897997786305, + "median_paired_external_seconds_ratio_after_before": 1.103342289670033 + }, + { + "id": "native_tsp_medium_12", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "medium", + "tier_size": 12, + "size_unit": "cities", + "input_variables": 12, + "model_variables": 24, + "dimensions": { + "input_variables": 12, + "variables": 24, + "rows": 0, + "nonzeros": 0, + "globals": 13 + }, + "stress": false, + "kind": "native_tsp", + "objective": 408, + "parameters": { + "size": 12 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.008031417, + 0.007508333 + ], + "external_seconds": [ + 0.019124125130474567, + 0.017025125212967396 + ], + "median_internal_seconds": 0.007769875000000001, + "median_external_seconds": 0.01807462517172098, + "objectives": [ + 408, + 408 + ], + "bounds": [ + 408, + 408 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.007801375, + 0.0076055 + ], + "external_seconds": [ + 0.01716654095798731, + 0.019190333783626556 + ], + "median_internal_seconds": 0.0077034375, + "median_external_seconds": 0.018178437370806932, + "objectives": [ + 408, + 408 + ], + "bounds": [ + 408, + 408 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9921492275818726, + "median_paired_external_seconds_ratio_after_before": 1.0124076115351315 + }, + { + "id": "native_tsp_large_16", + "category": "native_tsp", + "variant": "single", + "family": "native_tsp", + "tier": "large", + "tier_size": 16, + "size_unit": "cities", + "input_variables": 16, + "model_variables": 32, + "dimensions": { + "input_variables": 16, + "variables": 32, + "rows": 0, + "nonzeros": 0, + "globals": 17 + }, + "stress": false, + "kind": "native_tsp", + "objective": 436, + "parameters": { + "size": 16 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.054126083, + 0.054672583 + ], + "external_seconds": [ + 0.06414049956947565, + 0.06454008352011442 + ], + "median_internal_seconds": 0.054399332999999994, + "median_external_seconds": 0.06434029154479504, + "objectives": [ + 436, + 436 + ], + "bounds": [ + 436, + 436 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.0544755, + 0.054440458 + ], + "external_seconds": [ + 0.0653088754042983, + 0.06573095824569464 + ], + "median_internal_seconds": 0.054457979000000004, + "median_external_seconds": 0.06551991682499647, + "objectives": [ + 436, + 436 + ], + "bounds": [ + 436, + 436 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.0011049413199447, + "median_paired_external_seconds_ratio_after_before": 1.018333795106984 + }, + { + "id": "weighted_queens_sanity_4", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "sanity", + "tier_size": 4, + "size_unit": "queens", + "input_variables": 4, + "model_variables": 16, + "dimensions": { + "input_variables": 4, + "variables": 16, + "rows": 8, + "nonzeros": 16, + "globals": 7 + }, + "stress": false, + "kind": "weighted_queens", + "objective": 105, + "parameters": { + "size": 4 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000451625, + 0.000686708 + ], + "external_seconds": [ + 0.010531292296946049, + 0.009448832832276821 + ], + "median_internal_seconds": 0.0005691665, + "median_external_seconds": 0.009990062564611435, + "objectives": [ + 105, + 105 + ], + "bounds": [ + 105, + 105 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.001424167, + 0.000782333 + ], + "external_seconds": [ + 0.012104875408113003, + 0.011439084075391293 + ], + "median_internal_seconds": 0.00110325, + "median_external_seconds": 0.011771979741752148, + "objectives": [ + 105, + 105 + ], + "bounds": [ + 105, + 105 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 2.146339751325087, + "median_paired_external_seconds_ratio_after_before": 1.1800271836236513 + }, + { + "id": "weighted_queens_small_8", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "small", + "tier_size": 8, + "size_unit": "queens", + "input_variables": 8, + "model_variables": 32, + "dimensions": { + "input_variables": 8, + "variables": 32, + "rows": 16, + "nonzeros": 32, + "globals": 11 + }, + "stress": false, + "kind": "weighted_queens", + "objective": 121, + "parameters": { + "size": 8 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000901125, + 0.000985708 + ], + "external_seconds": [ + 0.009669416584074497, + 0.0095831248909235 + ], + "median_internal_seconds": 0.0009434165, + "median_external_seconds": 0.009626270737498999, + "objectives": [ + 121, + 121 + ], + "bounds": [ + 121, + 121 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.000920041, + 0.001082416 + ], + "external_seconds": [ + 0.012167458422482014, + 0.012313875369727612 + ], + "median_internal_seconds": 0.0010012285, + "median_external_seconds": 0.012240666896104813, + "objectives": [ + 121, + 121 + ], + "bounds": [ + 121, + 121 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 1.059550864601214, + "median_paired_external_seconds_ratio_after_before": 1.2716493513877056 + }, + { + "id": "weighted_queens_medium_10", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "medium", + "tier_size": 10, + "size_unit": "queens", + "input_variables": 10, + "model_variables": 40, + "dimensions": { + "input_variables": 10, + "variables": 40, + "rows": 20, + "nonzeros": 40, + "globals": 13 + }, + "stress": false, + "kind": "weighted_queens", + "objective": 86, + "parameters": { + "size": 10 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.0017925, + 0.001402334 + ], + "external_seconds": [ + 0.014651000499725342, + 0.01946958340704441 + ], + "median_internal_seconds": 0.001597417, + "median_external_seconds": 0.017060291953384876, + "objectives": [ + 86, + 86 + ], + "bounds": [ + 86, + 86 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.001604333, + 0.001542417 + ], + "external_seconds": [ + 0.012085999362170696, + 0.012521624565124512 + ], + "median_internal_seconds": 0.0015733750000000001, + "median_external_seconds": 0.012303811963647604, + "objectives": [ + 86, + 86 + ], + "bounds": [ + 86, + 86 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9974590668858995, + "median_paired_external_seconds_ratio_after_before": 0.7340321650705147 + }, + { + "id": "weighted_queens_large_12", + "category": "weighted_queens", + "variant": "single", + "family": "weighted_queens", + "tier": "large", + "tier_size": 12, + "size_unit": "queens", + "input_variables": 12, + "model_variables": 48, + "dimensions": { + "input_variables": 12, + "variables": 48, + "rows": 24, + "nonzeros": 48, + "globals": 15 + }, + "stress": false, + "kind": "weighted_queens", + "objective": 98, + "parameters": { + "size": 12 + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.00390475, + 0.004063667 + ], + "external_seconds": [ + 0.014042125083506107, + 0.014884709380567074 + ], + "median_internal_seconds": 0.0039842085, + "median_external_seconds": 0.01446341723203659, + "objectives": [ + 98, + 98 + ], + "bounds": [ + 98, + 98 + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ], + "internal_seconds": [ + 0.00381625, + 0.004145958 + ], + "external_seconds": [ + 0.014582375064492226, + 0.015062958002090454 + ], + "median_internal_seconds": 0.003981104, + "median_external_seconds": 0.01482266653329134, + "objectives": [ + 98, + 98 + ], + "bounds": [ + 98, + 98 + ] + }, + "median_paired_solve_seconds_ratio_after_before": 0.9987928628692075, + "median_paired_external_seconds_ratio_after_before": 1.025224402007443 + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "category": "knapsack", + "variant": "uncorrelated", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "size_unit": "binary variables", + "input_variables": 512, + "model_variables": 512, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "stress": true, + "kind": "binary", + "objective": -18731, + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.0015135, + 10.001378459 + ], + "external_seconds": [ + 10.015895958058536, + 10.023528499528766 + ], + "median_internal_seconds": 10.0014459795, + "median_external_seconds": 10.01971222879365, + "objectives": [ + -11574, + -11574 + ], + "bounds": [ + null, + null + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "attempted_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ], + "internal_seconds": [ + 10.0021745, + 10.001951334 + ], + "external_seconds": [ + 10.026984041556716, + 10.01319620758295 + ], + "median_internal_seconds": 10.002062917, + "median_external_seconds": 10.020090124569833, + "objectives": [ + -11574, + -11574 + ], + "bounds": [ + null, + null + ] + }, + "median_paired_solve_seconds_ratio_after_before": null, + "median_paired_external_seconds_ratio_after_before": null + } + ], + "categories": [ + { + "category": "knapsack", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 2, + "variants": [ + "correlated", + "uncorrelated" + ], + "cases": [ + "capacity_uncorrelated_sanity_8", + "capacity_correlated_sanity_8" + ], + "input_variables": 8, + "model_variables": 8, + "before": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 2, + "variants": [ + "correlated", + "uncorrelated" + ], + "cases": [ + "capacity_uncorrelated_small_32", + "capacity_correlated_small_32" + ], + "input_variables": 32, + "model_variables": 32, + "before": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 2, + "variants": [ + "correlated", + "uncorrelated" + ], + "cases": [ + "capacity_uncorrelated_medium_128", + "capacity_correlated_medium_128" + ], + "input_variables": 128, + "model_variables": 128, + "before": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit", + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 2, + "variants": [ + "correlated", + "uncorrelated" + ], + "cases": [ + "capacity_uncorrelated_large_384", + "capacity_correlated_large_384" + ], + "input_variables": 384, + "model_variables": 384, + "before": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit", + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 4, + "recorded_runs": 4, + "proved": 4, + "proved_all": true, + "statuses": [ + "optimal", + "optimal", + "optimal", + "optimal" + ] + } + } + ], + "stress_groups": [ + { + "tier": "cap_overflow", + "stress": true, + "variant_count": 1, + "variants": [ + "uncorrelated" + ], + "cases": [ + "capacity_uncorrelated_cap_overflow_512" + ], + "input_variables": 512, + "model_variables": 512, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + } + } + ], + "before": { + "largest_main_group_proved_model_variables": 32, + "largest_any_sampled_group_proved_model_variables": 32, + "largest_any_sampled_group_variant_count": 2, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 2, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [ + 128, + 384 + ] + }, + "after": { + "largest_main_group_proved_model_variables": 384, + "largest_any_sampled_group_proved_model_variables": 384, + "largest_any_sampled_group_variant_count": 2, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "ratio_of_largest_main_group_proved_model_variables": 12.0 + }, + { + "category": "assignment", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "assignment_sanity_3" + ], + "input_variables": 9, + "model_variables": 9, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "assignment_small_5" + ], + "input_variables": 25, + "model_variables": 25, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "assignment_medium_9" + ], + "input_variables": 81, + "model_variables": 81, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "assignment_large_16" + ], + "input_variables": 256, + "model_variables": 256, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 256, + "largest_any_sampled_group_proved_model_variables": 256, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "after": { + "largest_main_group_proved_model_variables": 256, + "largest_any_sampled_group_proved_model_variables": 256, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + }, + { + "category": "facility_location", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "facility_location_sanity_2x3" + ], + "input_variables": 8, + "model_variables": 8, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "facility_location_small_4x6" + ], + "input_variables": 28, + "model_variables": 28, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "facility_location_medium_8x12" + ], + "input_variables": 104, + "model_variables": 104, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "facility_location_large_12x24" + ], + "input_variables": 300, + "model_variables": 300, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 104, + "largest_any_sampled_group_proved_model_variables": 104, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 3, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [ + 300 + ] + }, + "after": { + "largest_main_group_proved_model_variables": 104, + "largest_any_sampled_group_proved_model_variables": 104, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 3, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [ + 300 + ] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + }, + { + "category": "bin_packing", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "bin_packing_sanity_4x3" + ], + "input_variables": 15, + "model_variables": 15, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "bin_packing_small_8x4" + ], + "input_variables": 36, + "model_variables": 36, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "bin_packing_medium_12x5" + ], + "input_variables": 65, + "model_variables": 65, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "bin_packing_large_16x6" + ], + "input_variables": 102, + "model_variables": 102, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 102, + "largest_any_sampled_group_proved_model_variables": 102, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "after": { + "largest_main_group_proved_model_variables": 102, + "largest_any_sampled_group_proved_model_variables": 102, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + }, + { + "category": "production", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "production_sanity_3x8" + ], + "input_variables": 24, + "model_variables": 24, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "production_small_6x8" + ], + "input_variables": 48, + "model_variables": 48, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "production_medium_12x8" + ], + "input_variables": 96, + "model_variables": 96, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "production_large_24x8" + ], + "input_variables": 192, + "model_variables": 192, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 0, + "proved_all": false, + "statuses": [ + "time_limit", + "time_limit" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 48, + "largest_any_sampled_group_proved_model_variables": 48, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 2, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [ + 96, + 192 + ] + }, + "after": { + "largest_main_group_proved_model_variables": 48, + "largest_any_sampled_group_proved_model_variables": 48, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 2, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [ + 96, + 192 + ] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + }, + { + "category": "native_tsp", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "native_tsp_sanity_4" + ], + "input_variables": 4, + "model_variables": 8, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "native_tsp_small_8" + ], + "input_variables": 8, + "model_variables": 16, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "native_tsp_medium_12" + ], + "input_variables": 12, + "model_variables": 24, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "native_tsp_large_16" + ], + "input_variables": 16, + "model_variables": 32, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 32, + "largest_any_sampled_group_proved_model_variables": 32, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "after": { + "largest_main_group_proved_model_variables": 32, + "largest_any_sampled_group_proved_model_variables": 32, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + }, + { + "category": "weighted_queens", + "main_groups": [ + { + "tier": "sanity", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "weighted_queens_sanity_4" + ], + "input_variables": 4, + "model_variables": 16, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "small", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "weighted_queens_small_8" + ], + "input_variables": 8, + "model_variables": 32, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "medium", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "weighted_queens_medium_10" + ], + "input_variables": 10, + "model_variables": 40, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + }, + { + "tier": "large", + "stress": false, + "variant_count": 1, + "variants": [ + "single" + ], + "cases": [ + "weighted_queens_large_12" + ], + "input_variables": 12, + "model_variables": 48, + "before": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + }, + "after": { + "required_runs": 2, + "recorded_runs": 2, + "proved": 2, + "proved_all": true, + "statuses": [ + "optimal", + "optimal" + ] + } + } + ], + "stress_groups": [], + "before": { + "largest_main_group_proved_model_variables": 48, + "largest_any_sampled_group_proved_model_variables": 48, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "after": { + "largest_main_group_proved_model_variables": 48, + "largest_any_sampled_group_proved_model_variables": 48, + "largest_any_sampled_group_variant_count": 1, + "largest_any_sampled_group_stress": false, + "proved_main_groups": 4, + "total_main_groups": 4, + "larger_main_groups_unproved_model_variables": [] + }, + "ratio_of_largest_main_group_proved_model_variables": 1.0 + } + ], + "caveats": [ + "One seeded instance per variant/size, repeated twice; repetitions are not independent samples.", + "Largest sampled size is an observed ladder result, not the true solver capacity.", + "Every variant and repetition must prove the independently checked optimum within 10 seconds.", + "The knapsack stress group has only one variant; it is separate from the two-variant main ladder.", + "Model variables include auxiliary columns; input variables, cities/queens and dimensions remain explicit.", + "No cross-category capacity ratio or pooled variable count is defined.", + "All failures and capped solves remain in the denominator; no time ratio uses a censored solve.", + "Internal solve times are primary; external times also include startup, parsing and model construction.", + "Capacity, constraints and formulation affect complexity; variable count alone does not." + ] + }, + "frozen_models": [ + { + "id": "capacity_uncorrelated_sanity_8", + "family": "capacity_uncorrelated", + "tier": "sanity", + "tier_size": 8, + "seed": 20260906, + "n": 8, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -337, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 1418, + "input_sha256": "3532382f5f607bf594a9ee2969c8db318e5185d37d5c89c2d00b354cf8d28b28" + }, + "category": "knapsack", + "variant": "uncorrelated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 8 + }, + { + "id": "capacity_uncorrelated_small_32", + "family": "capacity_uncorrelated", + "tier": "small", + "tier_size": 32, + "seed": 20260906, + "n": 32, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -1096, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 22948, + "input_sha256": "129ce1700ffbb57f5114067131155e1ff7d61595a4f53abbb481357a21eeabfa" + }, + "category": "knapsack", + "variant": "uncorrelated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 32 + }, + { + "id": "capacity_uncorrelated_medium_128", + "family": "capacity_uncorrelated", + "tier": "medium", + "tier_size": 128, + "seed": 20260906, + "n": 128, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -4318, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 406196, + "input_sha256": "54d982cd0b01e854dc7b784fdc1169e6cfafda8cd64eff6eba27ad134d060066" + }, + "category": "knapsack", + "variant": "uncorrelated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 128 + }, + { + "id": "capacity_uncorrelated_large_384", + "family": "capacity_uncorrelated", + "tier": "large", + "tier_size": 384, + "seed": 20260906, + "n": 384, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -13832, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 3741802, + "input_sha256": "2e01bc33e2af812ae5ace6b1f03370919953f916b9a4fd78b059bb8311f79da0" + }, + "category": "knapsack", + "variant": "uncorrelated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 384 + }, + { + "id": "capacity_correlated_sanity_8", + "family": "capacity_correlated", + "tier": "sanity", + "tier_size": 8, + "seed": 20260907, + "n": 8, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -62, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 835, + "input_sha256": "224d725d608edb4090706db1b5aac0aafdf5b0cfa468dfe54e8a1ff1b66a3b55" + }, + "category": "knapsack", + "variant": "correlated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 8 + }, + { + "id": "capacity_correlated_small_32", + "family": "capacity_correlated", + "tier": "small", + "tier_size": 32, + "seed": 20260907, + "n": 32, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -312, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 10217, + "input_sha256": "85d128437540b3d05475d2781a2bdbd4bc2c0eebfc939c2db8e3c1d865eee7bb" + }, + "category": "knapsack", + "variant": "correlated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 32 + }, + { + "id": "capacity_correlated_medium_128", + "family": "capacity_correlated", + "tier": "medium", + "tier_size": 128, + "seed": 20260907, + "n": 128, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -1211, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 162198, + "input_sha256": "16ae1b9c1f18deb10b7f8d1d122f12d8cb72440483f97d96ff50e44fb612065b" + }, + "category": "knapsack", + "variant": "correlated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 128 + }, + { + "id": "capacity_correlated_large_384", + "family": "capacity_correlated", + "tier": "large", + "tier_size": 384, + "seed": 20260907, + "n": 384, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "kind": "binary", + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -3648, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 1556577, + "input_sha256": "1dde254629e93f90cec642e057b4610a07c7829f40ae188ff3b3282c67a27bcb" + }, + "category": "knapsack", + "variant": "correlated", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 384 + }, + { + "id": "assignment_sanity_3", + "family": "assignment", + "tier": "sanity", + "tier_size": 3, + "seed": 20260908, + "n": 9, + "c": [ + 32, + 25, + 46, + 56, + 78, + 26, + 36, + 64, + 23 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 3, + 1 + ], + [ + 6, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 3, + -1 + ], + [ + 6, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 4, + 1 + ], + [ + 7, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 4, + -1 + ], + [ + 7, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 5, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 5, + -1 + ], + [ + 8, + -1 + ] + ] + } + ], + "parameters": { + "size": 3, + "costs": [ + [ + 32, + 25, + 46 + ], + [ + 56, + 78, + 26 + ], + [ + 36, + 64, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "input_variables": 9, + "variables": 9, + "rows": 12, + "nonzeros": 36, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": 87, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 12, + "input_sha256": "13e90d7bbba3d98cbf029ee965e3b17f8a282baaa9a9cba9176dc76b4929c7a4" + }, + "category": "assignment", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 9 + }, + { + "id": "assignment_small_5", + "family": "assignment", + "tier": "small", + "tier_size": 5, + "seed": 20260908, + "n": 25, + "c": [ + 32, + 25, + 46, + 17, + 25, + 56, + 78, + 26, + 29, + 97, + 36, + 64, + 23, + 65, + 34, + 97, + 68, + 44, + 98, + 44, + 41, + 68, + 59, + 39, + 77 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 5, + 1 + ], + [ + 10, + 1 + ], + [ + 15, + 1 + ], + [ + 20, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 5, + -1 + ], + [ + 10, + -1 + ], + [ + 15, + -1 + ], + [ + 20, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 6, + 1 + ], + [ + 11, + 1 + ], + [ + 16, + 1 + ], + [ + 21, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 6, + -1 + ], + [ + 11, + -1 + ], + [ + 16, + -1 + ], + [ + 21, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 7, + 1 + ], + [ + 12, + 1 + ], + [ + 17, + 1 + ], + [ + 22, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 7, + -1 + ], + [ + 12, + -1 + ], + [ + 17, + -1 + ], + [ + 22, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 8, + 1 + ], + [ + 13, + 1 + ], + [ + 18, + 1 + ], + [ + 23, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 8, + -1 + ], + [ + 13, + -1 + ], + [ + 18, + -1 + ], + [ + 23, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 9, + 1 + ], + [ + 14, + 1 + ], + [ + 19, + 1 + ], + [ + 24, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 9, + -1 + ], + [ + 14, + -1 + ], + [ + 19, + -1 + ], + [ + 24, + -1 + ] + ] + } + ], + "parameters": { + "size": 5, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25 + ], + [ + 56, + 78, + 26, + 29, + 97 + ], + [ + 36, + 64, + 23, + 65, + 34 + ], + [ + 97, + 68, + 44, + 98, + 44 + ], + [ + 41, + 68, + 59, + 39, + 77 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "input_variables": 25, + "variables": 25, + "rows": 20, + "nonzeros": 100, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": 162, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 80, + "input_sha256": "bce2b7a675ef398a461f98a90557b91b74bb9dc7f38964319608ede9bb67c1b0" + }, + "category": "assignment", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 25 + }, + { + "id": "assignment_medium_9", + "family": "assignment", + "tier": "medium", + "tier_size": 9, + "seed": 20260908, + "n": 81, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 9, + 1 + ], + [ + 18, + 1 + ], + [ + 27, + 1 + ], + [ + 36, + 1 + ], + [ + 45, + 1 + ], + [ + 54, + 1 + ], + [ + 63, + 1 + ], + [ + 72, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 9, + -1 + ], + [ + 18, + -1 + ], + [ + 27, + -1 + ], + [ + 36, + -1 + ], + [ + 45, + -1 + ], + [ + 54, + -1 + ], + [ + 63, + -1 + ], + [ + 72, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 10, + 1 + ], + [ + 19, + 1 + ], + [ + 28, + 1 + ], + [ + 37, + 1 + ], + [ + 46, + 1 + ], + [ + 55, + 1 + ], + [ + 64, + 1 + ], + [ + 73, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 10, + -1 + ], + [ + 19, + -1 + ], + [ + 28, + -1 + ], + [ + 37, + -1 + ], + [ + 46, + -1 + ], + [ + 55, + -1 + ], + [ + 64, + -1 + ], + [ + 73, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 11, + 1 + ], + [ + 20, + 1 + ], + [ + 29, + 1 + ], + [ + 38, + 1 + ], + [ + 47, + 1 + ], + [ + 56, + 1 + ], + [ + 65, + 1 + ], + [ + 74, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 11, + -1 + ], + [ + 20, + -1 + ], + [ + 29, + -1 + ], + [ + 38, + -1 + ], + [ + 47, + -1 + ], + [ + 56, + -1 + ], + [ + 65, + -1 + ], + [ + 74, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 12, + 1 + ], + [ + 21, + 1 + ], + [ + 30, + 1 + ], + [ + 39, + 1 + ], + [ + 48, + 1 + ], + [ + 57, + 1 + ], + [ + 66, + 1 + ], + [ + 75, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 12, + -1 + ], + [ + 21, + -1 + ], + [ + 30, + -1 + ], + [ + 39, + -1 + ], + [ + 48, + -1 + ], + [ + 57, + -1 + ], + [ + 66, + -1 + ], + [ + 75, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 13, + 1 + ], + [ + 22, + 1 + ], + [ + 31, + 1 + ], + [ + 40, + 1 + ], + [ + 49, + 1 + ], + [ + 58, + 1 + ], + [ + 67, + 1 + ], + [ + 76, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 13, + -1 + ], + [ + 22, + -1 + ], + [ + 31, + -1 + ], + [ + 40, + -1 + ], + [ + 49, + -1 + ], + [ + 58, + -1 + ], + [ + 67, + -1 + ], + [ + 76, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 14, + 1 + ], + [ + 23, + 1 + ], + [ + 32, + 1 + ], + [ + 41, + 1 + ], + [ + 50, + 1 + ], + [ + 59, + 1 + ], + [ + 68, + 1 + ], + [ + 77, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 14, + -1 + ], + [ + 23, + -1 + ], + [ + 32, + -1 + ], + [ + 41, + -1 + ], + [ + 50, + -1 + ], + [ + 59, + -1 + ], + [ + 68, + -1 + ], + [ + 77, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 15, + 1 + ], + [ + 24, + 1 + ], + [ + 33, + 1 + ], + [ + 42, + 1 + ], + [ + 51, + 1 + ], + [ + 60, + 1 + ], + [ + 69, + 1 + ], + [ + 78, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 15, + -1 + ], + [ + 24, + -1 + ], + [ + 33, + -1 + ], + [ + 42, + -1 + ], + [ + 51, + -1 + ], + [ + 60, + -1 + ], + [ + 69, + -1 + ], + [ + 78, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 16, + 1 + ], + [ + 25, + 1 + ], + [ + 34, + 1 + ], + [ + 43, + 1 + ], + [ + 52, + 1 + ], + [ + 61, + 1 + ], + [ + 70, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 16, + -1 + ], + [ + 25, + -1 + ], + [ + 34, + -1 + ], + [ + 43, + -1 + ], + [ + 52, + -1 + ], + [ + 61, + -1 + ], + [ + 70, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 17, + 1 + ], + [ + 26, + 1 + ], + [ + 35, + 1 + ], + [ + 44, + 1 + ], + [ + 53, + 1 + ], + [ + 62, + 1 + ], + [ + 71, + 1 + ], + [ + 80, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 17, + -1 + ], + [ + 26, + -1 + ], + [ + 35, + -1 + ], + [ + 44, + -1 + ], + [ + 53, + -1 + ], + [ + 62, + -1 + ], + [ + 71, + -1 + ], + [ + 80, + -1 + ] + ] + } + ], + "parameters": { + "size": 9, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "input_variables": 81, + "variables": 81, + "rows": 36, + "nonzeros": 324, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": 146, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 2304, + "input_sha256": "d579b817bd55c3ac1303eae47165e42072022ae3459f62ef6d7e038a2cddeb91" + }, + "category": "assignment", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 81 + }, + { + "id": "assignment_large_16", + "family": "assignment", + "tier": "large", + "tier_size": 16, + "seed": 20260908, + "n": 256, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 16, + 1 + ], + [ + 32, + 1 + ], + [ + 48, + 1 + ], + [ + 64, + 1 + ], + [ + 80, + 1 + ], + [ + 96, + 1 + ], + [ + 112, + 1 + ], + [ + 128, + 1 + ], + [ + 144, + 1 + ], + [ + 160, + 1 + ], + [ + 176, + 1 + ], + [ + 192, + 1 + ], + [ + 208, + 1 + ], + [ + 224, + 1 + ], + [ + 240, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 16, + -1 + ], + [ + 32, + -1 + ], + [ + 48, + -1 + ], + [ + 64, + -1 + ], + [ + 80, + -1 + ], + [ + 96, + -1 + ], + [ + 112, + -1 + ], + [ + 128, + -1 + ], + [ + 144, + -1 + ], + [ + 160, + -1 + ], + [ + 176, + -1 + ], + [ + 192, + -1 + ], + [ + 208, + -1 + ], + [ + 224, + -1 + ], + [ + 240, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 17, + 1 + ], + [ + 33, + 1 + ], + [ + 49, + 1 + ], + [ + 65, + 1 + ], + [ + 81, + 1 + ], + [ + 97, + 1 + ], + [ + 113, + 1 + ], + [ + 129, + 1 + ], + [ + 145, + 1 + ], + [ + 161, + 1 + ], + [ + 177, + 1 + ], + [ + 193, + 1 + ], + [ + 209, + 1 + ], + [ + 225, + 1 + ], + [ + 241, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 17, + -1 + ], + [ + 33, + -1 + ], + [ + 49, + -1 + ], + [ + 65, + -1 + ], + [ + 81, + -1 + ], + [ + 97, + -1 + ], + [ + 113, + -1 + ], + [ + 129, + -1 + ], + [ + 145, + -1 + ], + [ + 161, + -1 + ], + [ + 177, + -1 + ], + [ + 193, + -1 + ], + [ + 209, + -1 + ], + [ + 225, + -1 + ], + [ + 241, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 18, + 1 + ], + [ + 34, + 1 + ], + [ + 50, + 1 + ], + [ + 66, + 1 + ], + [ + 82, + 1 + ], + [ + 98, + 1 + ], + [ + 114, + 1 + ], + [ + 130, + 1 + ], + [ + 146, + 1 + ], + [ + 162, + 1 + ], + [ + 178, + 1 + ], + [ + 194, + 1 + ], + [ + 210, + 1 + ], + [ + 226, + 1 + ], + [ + 242, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 18, + -1 + ], + [ + 34, + -1 + ], + [ + 50, + -1 + ], + [ + 66, + -1 + ], + [ + 82, + -1 + ], + [ + 98, + -1 + ], + [ + 114, + -1 + ], + [ + 130, + -1 + ], + [ + 146, + -1 + ], + [ + 162, + -1 + ], + [ + 178, + -1 + ], + [ + 194, + -1 + ], + [ + 210, + -1 + ], + [ + 226, + -1 + ], + [ + 242, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 19, + 1 + ], + [ + 35, + 1 + ], + [ + 51, + 1 + ], + [ + 67, + 1 + ], + [ + 83, + 1 + ], + [ + 99, + 1 + ], + [ + 115, + 1 + ], + [ + 131, + 1 + ], + [ + 147, + 1 + ], + [ + 163, + 1 + ], + [ + 179, + 1 + ], + [ + 195, + 1 + ], + [ + 211, + 1 + ], + [ + 227, + 1 + ], + [ + 243, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 19, + -1 + ], + [ + 35, + -1 + ], + [ + 51, + -1 + ], + [ + 67, + -1 + ], + [ + 83, + -1 + ], + [ + 99, + -1 + ], + [ + 115, + -1 + ], + [ + 131, + -1 + ], + [ + 147, + -1 + ], + [ + 163, + -1 + ], + [ + 179, + -1 + ], + [ + 195, + -1 + ], + [ + 211, + -1 + ], + [ + 227, + -1 + ], + [ + 243, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 20, + 1 + ], + [ + 36, + 1 + ], + [ + 52, + 1 + ], + [ + 68, + 1 + ], + [ + 84, + 1 + ], + [ + 100, + 1 + ], + [ + 116, + 1 + ], + [ + 132, + 1 + ], + [ + 148, + 1 + ], + [ + 164, + 1 + ], + [ + 180, + 1 + ], + [ + 196, + 1 + ], + [ + 212, + 1 + ], + [ + 228, + 1 + ], + [ + 244, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 20, + -1 + ], + [ + 36, + -1 + ], + [ + 52, + -1 + ], + [ + 68, + -1 + ], + [ + 84, + -1 + ], + [ + 100, + -1 + ], + [ + 116, + -1 + ], + [ + 132, + -1 + ], + [ + 148, + -1 + ], + [ + 164, + -1 + ], + [ + 180, + -1 + ], + [ + 196, + -1 + ], + [ + 212, + -1 + ], + [ + 228, + -1 + ], + [ + 244, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 21, + 1 + ], + [ + 37, + 1 + ], + [ + 53, + 1 + ], + [ + 69, + 1 + ], + [ + 85, + 1 + ], + [ + 101, + 1 + ], + [ + 117, + 1 + ], + [ + 133, + 1 + ], + [ + 149, + 1 + ], + [ + 165, + 1 + ], + [ + 181, + 1 + ], + [ + 197, + 1 + ], + [ + 213, + 1 + ], + [ + 229, + 1 + ], + [ + 245, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 21, + -1 + ], + [ + 37, + -1 + ], + [ + 53, + -1 + ], + [ + 69, + -1 + ], + [ + 85, + -1 + ], + [ + 101, + -1 + ], + [ + 117, + -1 + ], + [ + 133, + -1 + ], + [ + 149, + -1 + ], + [ + 165, + -1 + ], + [ + 181, + -1 + ], + [ + 197, + -1 + ], + [ + 213, + -1 + ], + [ + 229, + -1 + ], + [ + 245, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 54, + 1 + ], + [ + 70, + 1 + ], + [ + 86, + 1 + ], + [ + 102, + 1 + ], + [ + 118, + 1 + ], + [ + 134, + 1 + ], + [ + 150, + 1 + ], + [ + 166, + 1 + ], + [ + 182, + 1 + ], + [ + 198, + 1 + ], + [ + 214, + 1 + ], + [ + 230, + 1 + ], + [ + 246, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 22, + -1 + ], + [ + 38, + -1 + ], + [ + 54, + -1 + ], + [ + 70, + -1 + ], + [ + 86, + -1 + ], + [ + 102, + -1 + ], + [ + 118, + -1 + ], + [ + 134, + -1 + ], + [ + 150, + -1 + ], + [ + 166, + -1 + ], + [ + 182, + -1 + ], + [ + 198, + -1 + ], + [ + 214, + -1 + ], + [ + 230, + -1 + ], + [ + 246, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 23, + 1 + ], + [ + 39, + 1 + ], + [ + 55, + 1 + ], + [ + 71, + 1 + ], + [ + 87, + 1 + ], + [ + 103, + 1 + ], + [ + 119, + 1 + ], + [ + 135, + 1 + ], + [ + 151, + 1 + ], + [ + 167, + 1 + ], + [ + 183, + 1 + ], + [ + 199, + 1 + ], + [ + 215, + 1 + ], + [ + 231, + 1 + ], + [ + 247, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 23, + -1 + ], + [ + 39, + -1 + ], + [ + 55, + -1 + ], + [ + 71, + -1 + ], + [ + 87, + -1 + ], + [ + 103, + -1 + ], + [ + 119, + -1 + ], + [ + 135, + -1 + ], + [ + 151, + -1 + ], + [ + 167, + -1 + ], + [ + 183, + -1 + ], + [ + 199, + -1 + ], + [ + 215, + -1 + ], + [ + 231, + -1 + ], + [ + 247, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 24, + 1 + ], + [ + 40, + 1 + ], + [ + 56, + 1 + ], + [ + 72, + 1 + ], + [ + 88, + 1 + ], + [ + 104, + 1 + ], + [ + 120, + 1 + ], + [ + 136, + 1 + ], + [ + 152, + 1 + ], + [ + 168, + 1 + ], + [ + 184, + 1 + ], + [ + 200, + 1 + ], + [ + 216, + 1 + ], + [ + 232, + 1 + ], + [ + 248, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 24, + -1 + ], + [ + 40, + -1 + ], + [ + 56, + -1 + ], + [ + 72, + -1 + ], + [ + 88, + -1 + ], + [ + 104, + -1 + ], + [ + 120, + -1 + ], + [ + 136, + -1 + ], + [ + 152, + -1 + ], + [ + 168, + -1 + ], + [ + 184, + -1 + ], + [ + 200, + -1 + ], + [ + 216, + -1 + ], + [ + 232, + -1 + ], + [ + 248, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 25, + 1 + ], + [ + 41, + 1 + ], + [ + 57, + 1 + ], + [ + 73, + 1 + ], + [ + 89, + 1 + ], + [ + 105, + 1 + ], + [ + 121, + 1 + ], + [ + 137, + 1 + ], + [ + 153, + 1 + ], + [ + 169, + 1 + ], + [ + 185, + 1 + ], + [ + 201, + 1 + ], + [ + 217, + 1 + ], + [ + 233, + 1 + ], + [ + 249, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 25, + -1 + ], + [ + 41, + -1 + ], + [ + 57, + -1 + ], + [ + 73, + -1 + ], + [ + 89, + -1 + ], + [ + 105, + -1 + ], + [ + 121, + -1 + ], + [ + 137, + -1 + ], + [ + 153, + -1 + ], + [ + 169, + -1 + ], + [ + 185, + -1 + ], + [ + 201, + -1 + ], + [ + 217, + -1 + ], + [ + 233, + -1 + ], + [ + 249, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 26, + 1 + ], + [ + 42, + 1 + ], + [ + 58, + 1 + ], + [ + 74, + 1 + ], + [ + 90, + 1 + ], + [ + 106, + 1 + ], + [ + 122, + 1 + ], + [ + 138, + 1 + ], + [ + 154, + 1 + ], + [ + 170, + 1 + ], + [ + 186, + 1 + ], + [ + 202, + 1 + ], + [ + 218, + 1 + ], + [ + 234, + 1 + ], + [ + 250, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 26, + -1 + ], + [ + 42, + -1 + ], + [ + 58, + -1 + ], + [ + 74, + -1 + ], + [ + 90, + -1 + ], + [ + 106, + -1 + ], + [ + 122, + -1 + ], + [ + 138, + -1 + ], + [ + 154, + -1 + ], + [ + 170, + -1 + ], + [ + 186, + -1 + ], + [ + 202, + -1 + ], + [ + 218, + -1 + ], + [ + 234, + -1 + ], + [ + 250, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 27, + 1 + ], + [ + 43, + 1 + ], + [ + 59, + 1 + ], + [ + 75, + 1 + ], + [ + 91, + 1 + ], + [ + 107, + 1 + ], + [ + 123, + 1 + ], + [ + 139, + 1 + ], + [ + 155, + 1 + ], + [ + 171, + 1 + ], + [ + 187, + 1 + ], + [ + 203, + 1 + ], + [ + 219, + 1 + ], + [ + 235, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 27, + -1 + ], + [ + 43, + -1 + ], + [ + 59, + -1 + ], + [ + 75, + -1 + ], + [ + 91, + -1 + ], + [ + 107, + -1 + ], + [ + 123, + -1 + ], + [ + 139, + -1 + ], + [ + 155, + -1 + ], + [ + 171, + -1 + ], + [ + 187, + -1 + ], + [ + 203, + -1 + ], + [ + 219, + -1 + ], + [ + 235, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 28, + 1 + ], + [ + 44, + 1 + ], + [ + 60, + 1 + ], + [ + 76, + 1 + ], + [ + 92, + 1 + ], + [ + 108, + 1 + ], + [ + 124, + 1 + ], + [ + 140, + 1 + ], + [ + 156, + 1 + ], + [ + 172, + 1 + ], + [ + 188, + 1 + ], + [ + 204, + 1 + ], + [ + 220, + 1 + ], + [ + 236, + 1 + ], + [ + 252, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 28, + -1 + ], + [ + 44, + -1 + ], + [ + 60, + -1 + ], + [ + 76, + -1 + ], + [ + 92, + -1 + ], + [ + 108, + -1 + ], + [ + 124, + -1 + ], + [ + 140, + -1 + ], + [ + 156, + -1 + ], + [ + 172, + -1 + ], + [ + 188, + -1 + ], + [ + 204, + -1 + ], + [ + 220, + -1 + ], + [ + 236, + -1 + ], + [ + 252, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 29, + 1 + ], + [ + 45, + 1 + ], + [ + 61, + 1 + ], + [ + 77, + 1 + ], + [ + 93, + 1 + ], + [ + 109, + 1 + ], + [ + 125, + 1 + ], + [ + 141, + 1 + ], + [ + 157, + 1 + ], + [ + 173, + 1 + ], + [ + 189, + 1 + ], + [ + 205, + 1 + ], + [ + 221, + 1 + ], + [ + 237, + 1 + ], + [ + 253, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 29, + -1 + ], + [ + 45, + -1 + ], + [ + 61, + -1 + ], + [ + 77, + -1 + ], + [ + 93, + -1 + ], + [ + 109, + -1 + ], + [ + 125, + -1 + ], + [ + 141, + -1 + ], + [ + 157, + -1 + ], + [ + 173, + -1 + ], + [ + 189, + -1 + ], + [ + 205, + -1 + ], + [ + 221, + -1 + ], + [ + 237, + -1 + ], + [ + 253, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 30, + 1 + ], + [ + 46, + 1 + ], + [ + 62, + 1 + ], + [ + 78, + 1 + ], + [ + 94, + 1 + ], + [ + 110, + 1 + ], + [ + 126, + 1 + ], + [ + 142, + 1 + ], + [ + 158, + 1 + ], + [ + 174, + 1 + ], + [ + 190, + 1 + ], + [ + 206, + 1 + ], + [ + 222, + 1 + ], + [ + 238, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 30, + -1 + ], + [ + 46, + -1 + ], + [ + 62, + -1 + ], + [ + 78, + -1 + ], + [ + 94, + -1 + ], + [ + 110, + -1 + ], + [ + 126, + -1 + ], + [ + 142, + -1 + ], + [ + 158, + -1 + ], + [ + 174, + -1 + ], + [ + 190, + -1 + ], + [ + 206, + -1 + ], + [ + 222, + -1 + ], + [ + 238, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 31, + 1 + ], + [ + 47, + 1 + ], + [ + 63, + 1 + ], + [ + 79, + 1 + ], + [ + 95, + 1 + ], + [ + 111, + 1 + ], + [ + 127, + 1 + ], + [ + 143, + 1 + ], + [ + 159, + 1 + ], + [ + 175, + 1 + ], + [ + 191, + 1 + ], + [ + 207, + 1 + ], + [ + 223, + 1 + ], + [ + 239, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 31, + -1 + ], + [ + 47, + -1 + ], + [ + 63, + -1 + ], + [ + 79, + -1 + ], + [ + 95, + -1 + ], + [ + 111, + -1 + ], + [ + 127, + -1 + ], + [ + 143, + -1 + ], + [ + 159, + -1 + ], + [ + 175, + -1 + ], + [ + 191, + -1 + ], + [ + 207, + -1 + ], + [ + 223, + -1 + ], + [ + 239, + -1 + ], + [ + 255, + -1 + ] + ] + } + ], + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "kind": "binary", + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 64, + "nonzeros": 1024, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": 145, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": 524288, + "input_sha256": "ac896fe1f45b41ee98243c39f2303d3596b6376b4af6118d8e9b0f8b9dee58f5" + }, + "category": "assignment", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "modelled_variables": 256 + }, + { + "n": 8, + "c": [ + 17, + 26, + 17, + 18, + 44, + 19, + 16, + 27 + ], + "rows": [ + { + "a": [ + [ + 2, + 1 + ], + [ + 3, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 3, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 2, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 3, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 4, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 5, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 6, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 7, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 2, + "customers": 3, + "opening_costs": [ + 17, + 26 + ], + "assignment_costs": [ + [ + 17, + 18 + ], + [ + 44, + 19 + ], + [ + 16, + 27 + ] + ] + }, + "family": "facility_location", + "kind": "binary", + "id": "facility_location_sanity_2x3", + "tier": "sanity", + "tier_size": 2, + "seed": 20260909, + "category": "facility_location", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 12, + "nonzeros": 24, + "globals": 0 + }, + "modelled_variables": 8, + "reference": { + "status": "optimal", + "objective": 90, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "method": "exhaustive binary enumeration", + "input_sha256": "17c7fa71e72f30425716d11ad18753f9e3341c397d8d3893620c4b1790137850" + } + }, + { + "n": 28, + "c": [ + 17, + 26, + 23, + 47, + 17, + 18, + 17, + 18, + 44, + 19, + 28, + 33, + 16, + 27, + 8, + 9, + 16, + 15, + 30, + 31, + 51, + 26, + 35, + 40, + 29, + 16, + 19, + 20 + ], + "rows": [ + { + "a": [ + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 4, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 5, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 6, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 7, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 4, + "customers": 6, + "opening_costs": [ + 17, + 26, + 23, + 47 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18 + ], + [ + 44, + 19, + 28, + 33 + ], + [ + 16, + 27, + 8, + 9 + ], + [ + 16, + 15, + 30, + 31 + ], + [ + 51, + 26, + 35, + 40 + ], + [ + 29, + 16, + 19, + 20 + ] + ] + }, + "family": "facility_location", + "kind": "binary", + "id": "facility_location_small_4x6", + "tier": "small", + "tier_size": 4, + "seed": 20260909, + "category": "facility_location", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 28, + "variables": 28, + "rows": 36, + "nonzeros": 96, + "globals": 0 + }, + "modelled_variables": 28, + "reference": { + "status": "optimal", + "objective": 147, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "method": "enumerate facility subsets and independently assign each customer", + "input_sha256": "07e68db7fee951b27d0cf63e161b7d2daf4bc48b1b5393b5a5cd0a8fe4240922" + } + }, + { + "n": 104, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ], + "rows": [ + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 8, + "customers": 12, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ] + ] + }, + "family": "facility_location", + "kind": "binary", + "id": "facility_location_medium_8x12", + "tier": "medium", + "tier_size": 8, + "seed": 20260909, + "category": "facility_location", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 104, + "variables": 104, + "rows": 120, + "nonzeros": 384, + "globals": 0 + }, + "modelled_variables": 104, + "reference": { + "status": "optimal", + "objective": 224, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "enumerate facility subsets and independently assign each customer", + "input_sha256": "928140e2e9893325b644a6af14c33368ac46a7507d425cde3ff81bafe25f4ecb" + } + }, + { + "n": 300, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ], + "rows": [ + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 12, + "customers": 24, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ] + ] + }, + "family": "facility_location", + "kind": "binary", + "id": "facility_location_large_12x24", + "tier": "large", + "tier_size": 12, + "seed": 20260909, + "category": "facility_location", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 336, + "nonzeros": 1152, + "globals": 0 + }, + "modelled_variables": 300, + "reference": { + "status": "optimal", + "objective": 350, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "enumerate facility subsets and independently assign each customer", + "input_sha256": "890a6ac857a11d448218a88a8261ede25db5fffe2f1b09b5911f4e2f32751594" + } + }, + { + "n": 15, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 12, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 13, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 14, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 12, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 13, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 14, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 12, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 13, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 14, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 12, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 13, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 14, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 3, + -6 + ], + [ + 6, + -3 + ], + [ + 9, + -4 + ], + [ + 12, + 8 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 4, + -6 + ], + [ + 7, + -3 + ], + [ + 10, + -4 + ], + [ + 13, + 8 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 5, + -6 + ], + [ + 8, + -3 + ], + [ + 11, + -4 + ], + [ + 14, + 8 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 4, + "bins": 3, + "weights": [ + 3, + 6, + 3, + 4 + ], + "capacity": 8, + "symmetry": "enabled bins form a prefix" + }, + "family": "bin_packing", + "kind": "binary", + "id": "bin_packing_sanity_4x3", + "tier": "sanity", + "tier_size": 4, + "seed": 20260910, + "category": "bin_packing", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 15, + "variables": 15, + "rows": 25, + "nonzeros": 67, + "globals": 0 + }, + "modelled_variables": 15, + "reference": { + "status": "optimal", + "objective": 3, + "assignment": [ + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 + ], + "method": "exact item-subset minimum-bin/last-load dynamic programming", + "input_sha256": "87fa6a45752ab98bf7db8c56044c3cceb497f2c40767f4d355a6e08eeb406910" + } + }, + { + "n": 36, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 32, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 33, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 34, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 35, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 4, + -6 + ], + [ + 8, + -3 + ], + [ + 12, + -4 + ], + [ + 16, + -7 + ], + [ + 20, + -7 + ], + [ + 24, + -6 + ], + [ + 28, + -2 + ], + [ + 32, + 13 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 5, + -6 + ], + [ + 9, + -3 + ], + [ + 13, + -4 + ], + [ + 17, + -7 + ], + [ + 21, + -7 + ], + [ + 25, + -6 + ], + [ + 29, + -2 + ], + [ + 33, + 13 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 6, + -6 + ], + [ + 10, + -3 + ], + [ + 14, + -4 + ], + [ + 18, + -7 + ], + [ + 22, + -7 + ], + [ + 26, + -6 + ], + [ + 30, + -2 + ], + [ + 34, + 13 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 7, + -6 + ], + [ + 11, + -3 + ], + [ + 15, + -4 + ], + [ + 19, + -7 + ], + [ + 23, + -7 + ], + [ + 27, + -6 + ], + [ + 31, + -2 + ], + [ + 35, + 13 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 8, + "bins": 4, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2 + ], + "capacity": 13, + "symmetry": "enabled bins form a prefix" + }, + "family": "bin_packing", + "kind": "binary", + "id": "bin_packing_small_8x4", + "tier": "small", + "tier_size": 8, + "seed": 20260910, + "category": "bin_packing", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 36, + "variables": 36, + "rows": 55, + "nonzeros": 170, + "globals": 0 + }, + "modelled_variables": 36, + "reference": { + "status": "optimal", + "objective": 3, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "method": "exact item-subset minimum-bin/last-load dynamic programming", + "input_sha256": "859c4d0974b28da8471a9ab3029d4c843398ae1e1038291b5093e559e889d9c2" + } + }, + { + "n": 65, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 60, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 61, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 62, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 63, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 64, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 5, + -6 + ], + [ + 10, + -3 + ], + [ + 15, + -4 + ], + [ + 20, + -7 + ], + [ + 25, + -7 + ], + [ + 30, + -6 + ], + [ + 35, + -2 + ], + [ + 40, + -3 + ], + [ + 45, + -4 + ], + [ + 50, + -4 + ], + [ + 55, + -4 + ], + [ + 60, + 14 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 6, + -6 + ], + [ + 11, + -3 + ], + [ + 16, + -4 + ], + [ + 21, + -7 + ], + [ + 26, + -7 + ], + [ + 31, + -6 + ], + [ + 36, + -2 + ], + [ + 41, + -3 + ], + [ + 46, + -4 + ], + [ + 51, + -4 + ], + [ + 56, + -4 + ], + [ + 61, + 14 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 7, + -6 + ], + [ + 12, + -3 + ], + [ + 17, + -4 + ], + [ + 22, + -7 + ], + [ + 27, + -7 + ], + [ + 32, + -6 + ], + [ + 37, + -2 + ], + [ + 42, + -3 + ], + [ + 47, + -4 + ], + [ + 52, + -4 + ], + [ + 57, + -4 + ], + [ + 62, + 14 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 8, + -6 + ], + [ + 13, + -3 + ], + [ + 18, + -4 + ], + [ + 23, + -7 + ], + [ + 28, + -7 + ], + [ + 33, + -6 + ], + [ + 38, + -2 + ], + [ + 43, + -3 + ], + [ + 48, + -4 + ], + [ + 53, + -4 + ], + [ + 58, + -4 + ], + [ + 63, + 14 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 9, + -6 + ], + [ + 14, + -3 + ], + [ + 19, + -4 + ], + [ + 24, + -7 + ], + [ + 29, + -7 + ], + [ + 34, + -6 + ], + [ + 39, + -2 + ], + [ + 44, + -3 + ], + [ + 49, + -4 + ], + [ + 54, + -4 + ], + [ + 59, + -4 + ], + [ + 64, + 14 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 12, + "bins": 5, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4 + ], + "capacity": 14, + "symmetry": "enabled bins form a prefix" + }, + "family": "bin_packing", + "kind": "binary", + "id": "bin_packing_medium_12x5", + "tier": "medium", + "tier_size": 12, + "seed": 20260910, + "category": "bin_packing", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 65, + "variables": 65, + "rows": 93, + "nonzeros": 313, + "globals": 0 + }, + "modelled_variables": 65, + "reference": { + "status": "optimal", + "objective": 4, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0 + ], + "method": "exact item-subset minimum-bin/last-load dynamic programming", + "input_sha256": "e70ea21351e0179f5ae66b23abcfabde77c3df413a8d3e36f08cabcf10c8276e" + } + }, + { + "n": 102, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 16, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10 + ], + "capacity": 18, + "symmetry": "enabled bins form a prefix" + }, + "family": "bin_packing", + "kind": "binary", + "id": "bin_packing_large_16x6", + "tier": "large", + "tier_size": 16, + "seed": 20260910, + "category": "bin_packing", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 102, + "variables": 102, + "rows": 139, + "nonzeros": 496, + "globals": 0 + }, + "modelled_variables": 102, + "reference": { + "status": "optimal", + "objective": 5, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "method": "exact item-subset minimum-bin/last-load dynamic programming", + "input_sha256": "e6a1cc8b111513fd0b3b9d52e0cf480933921118dc6ba063edda39c57540b6bd" + } + }, + { + "n": 24, + "c": [ + 0, + 30, + 41, + 52, + 63, + 79, + 95, + 111, + 0, + 36, + 54, + 72, + 90, + 113, + 136, + 159, + 0, + 21, + 32, + 43, + 54, + 70, + 86, + 102 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -15 + } + ], + "parameters": { + "periods": 3, + "options": 8, + "demands": [ + 7, + 5, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ] + ], + "objective_constant": -102 + }, + "family": "production", + "kind": "binary", + "id": "production_sanity_3x8", + "tier": "sanity", + "tier_size": 3, + "seed": 20260911, + "category": "production", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 24, + "variables": 24, + "rows": 14, + "nonzeros": 174, + "globals": 0 + }, + "modelled_variables": 24, + "reference": { + "status": "optimal", + "objective": 267, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "method": "inventory-state production dynamic program", + "input_sha256": "7ba207493c51540e62184782e7af4e97d305f8f56075c1154e6a20a22ebd73be" + } + }, + { + "n": 48, + "c": [ + 0, + 39, + 59, + 79, + 99, + 124, + 149, + 174, + 0, + 45, + 72, + 99, + 126, + 158, + 190, + 222, + 0, + 30, + 50, + 70, + 90, + 115, + 140, + 165, + 0, + 29, + 49, + 69, + 89, + 114, + 139, + 164, + 0, + 25, + 33, + 41, + 49, + 62, + 75, + 88, + 0, + 28, + 43, + 58, + 73, + 93, + 113, + 133 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -21 + } + ], + "parameters": { + "periods": 6, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ] + ], + "objective_constant": -273 + }, + "family": "production", + "kind": "binary", + "id": "production_small_6x8", + "tier": "small", + "tier_size": 6, + "seed": 20260911, + "category": "production", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 26, + "nonzeros": 474, + "globals": 0 + }, + "modelled_variables": 48, + "reference": { + "status": "optimal", + "objective": 484, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "inventory-state production dynamic program", + "input_sha256": "6f7837d053b7c7578a0b2ce91a5032b7bbff092e766e2c4ceefe631a845811d1" + } + }, + { + "n": 96, + "c": [ + 0, + 57, + 95, + 133, + 171, + 214, + 257, + 300, + 0, + 63, + 108, + 153, + 198, + 248, + 298, + 348, + 0, + 48, + 86, + 124, + 162, + 205, + 248, + 291, + 0, + 47, + 85, + 123, + 161, + 204, + 247, + 290, + 0, + 43, + 69, + 95, + 121, + 152, + 183, + 214, + 0, + 46, + 79, + 112, + 145, + 183, + 221, + 259, + 0, + 34, + 62, + 90, + 118, + 151, + 184, + 217, + 0, + 38, + 64, + 90, + 116, + 147, + 178, + 209, + 0, + 26, + 42, + 58, + 74, + 95, + 116, + 137, + 0, + 25, + 45, + 65, + 85, + 110, + 135, + 160, + 0, + 25, + 34, + 43, + 52, + 66, + 80, + 94, + 0, + 26, + 41, + 56, + 71, + 91, + 111, + 131 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -48 + } + ], + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945 + }, + "family": "production", + "kind": "binary", + "id": "production_medium_12x8", + "tier": "medium", + "tier_size": 12, + "seed": 20260911, + "category": "production", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "modelled_variables": 96, + "reference": { + "status": "optimal", + "objective": 1447, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "inventory-state production dynamic program", + "input_sha256": "97f01ce9954fc18a2d3b9148ac7a15c74a8a78037014be75733b766e3a28fb1e" + } + }, + { + "n": 192, + "c": [ + 0, + 93, + 167, + 241, + 315, + 394, + 473, + 552, + 0, + 99, + 180, + 261, + 342, + 428, + 514, + 600, + 0, + 84, + 158, + 232, + 306, + 385, + 464, + 543, + 0, + 83, + 157, + 231, + 305, + 384, + 463, + 542, + 0, + 79, + 141, + 203, + 265, + 332, + 399, + 466, + 0, + 82, + 151, + 220, + 289, + 363, + 437, + 511, + 0, + 70, + 134, + 198, + 262, + 331, + 400, + 469, + 0, + 74, + 136, + 198, + 260, + 327, + 394, + 461, + 0, + 62, + 114, + 166, + 218, + 275, + 332, + 389, + 0, + 61, + 117, + 173, + 229, + 290, + 351, + 412, + 0, + 61, + 106, + 151, + 196, + 246, + 296, + 346, + 0, + 62, + 113, + 164, + 215, + 271, + 327, + 383, + 0, + 60, + 100, + 140, + 180, + 225, + 270, + 315, + 0, + 65, + 110, + 155, + 200, + 250, + 300, + 350, + 0, + 43, + 76, + 109, + 142, + 180, + 218, + 256, + 0, + 54, + 92, + 130, + 168, + 211, + 254, + 297, + 0, + 42, + 71, + 100, + 129, + 163, + 197, + 231, + 0, + 40, + 70, + 100, + 130, + 165, + 200, + 235, + 0, + 40, + 65, + 90, + 115, + 145, + 175, + 205, + 0, + 36, + 60, + 84, + 108, + 137, + 166, + 195, + 0, + 37, + 59, + 81, + 103, + 130, + 157, + 184, + 0, + 24, + 41, + 58, + 75, + 97, + 119, + 141, + 0, + 20, + 33, + 46, + 59, + 77, + 95, + 113, + 0, + 25, + 38, + 51, + 64, + 82, + 100, + 118 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -94 + } + ], + "parameters": { + "periods": 24, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ] + ], + "objective_constant": -3618 + }, + "family": "production", + "kind": "binary", + "id": "production_large_24x8", + "tier": "large", + "tier_size": 24, + "seed": 20260911, + "category": "production", + "variant": "single", + "stress": false, + "size_unit": "binary variables", + "dimensions": { + "input_variables": 192, + "variables": 192, + "rows": 98, + "nonzeros": 4920, + "globals": 0 + }, + "modelled_variables": 192, + "reference": { + "status": "optimal", + "objective": 4600, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "method": "inventory-state production dynamic program", + "input_sha256": "35c5418635d83b3eac338da87c092c26a57bc0cd136e872d33cda6a5b8f71bdb" + } + }, + { + "family": "native_tsp", + "kind": "native_tsp", + "id": "native_tsp_sanity_4", + "tier": "sanity", + "tier_size": 4, + "seed": 20260912, + "n": 4, + "size": 4, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75 + ], + [ + 109, + 0, + 65, + 87 + ], + [ + 93, + 65, + 0, + 151 + ], + [ + 75, + 87, + 151, + 0 + ] + ], + "parameters": { + "size": 4 + }, + "category": "native_tsp", + "variant": "single", + "stress": false, + "size_unit": "cities", + "dimensions": { + "input_variables": 4, + "variables": 8, + "rows": 0, + "nonzeros": 0, + "globals": 5 + }, + "modelled_variables": 8, + "reference": { + "status": "optimal", + "objective": 320, + "assignment": [ + 3, + 2, + 0, + 1 + ], + "method": "Held-Karp subset dynamic programming", + "input_sha256": "16216a261f3ada8f67cf191dfebc2197e649a015d72b395900b615803660705e" + } + }, + { + "family": "native_tsp", + "kind": "native_tsp", + "id": "native_tsp_small_8", + "tier": "small", + "tier_size": 8, + "seed": 20260912, + "n": 8, + "size": 8, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0 + ] + ], + "parameters": { + "size": 8 + }, + "category": "native_tsp", + "variant": "single", + "stress": false, + "size_unit": "cities", + "dimensions": { + "input_variables": 8, + "variables": 16, + "rows": 0, + "nonzeros": 0, + "globals": 9 + }, + "modelled_variables": 16, + "reference": { + "status": "optimal", + "objective": 384, + "assignment": [ + 6, + 7, + 1, + 4, + 0, + 3, + 2, + 5 + ], + "method": "Held-Karp subset dynamic programming", + "input_sha256": "553b7cad0c48f3fbfe1e11145fe80783f0fb4a2fc2f0be6137b059e1c87c771c" + } + }, + { + "family": "native_tsp", + "kind": "native_tsp", + "id": "native_tsp_medium_12", + "tier": "medium", + "tier_size": 12, + "seed": 20260912, + "n": 12, + "size": 12, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0 + ] + ], + "parameters": { + "size": 12 + }, + "category": "native_tsp", + "variant": "single", + "stress": false, + "size_unit": "cities", + "dimensions": { + "input_variables": 12, + "variables": 24, + "rows": 0, + "nonzeros": 0, + "globals": 13 + }, + "modelled_variables": 24, + "reference": { + "status": "optimal", + "objective": 408, + "assignment": [ + 9, + 7, + 6, + 11, + 3, + 8, + 0, + 10, + 1, + 4, + 2, + 5 + ], + "method": "Held-Karp subset dynamic programming", + "input_sha256": "35d70d8b475c28c80bba2d5c1521089bdb090ca663c1ee2d43302f13f2495043" + } + }, + { + "family": "native_tsp", + "kind": "native_tsp", + "id": "native_tsp_large_16", + "tier": "large", + "tier_size": 16, + "seed": 20260912, + "n": 16, + "size": 16, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0 + ] + ], + "parameters": { + "size": 16 + }, + "category": "native_tsp", + "variant": "single", + "stress": false, + "size_unit": "cities", + "dimensions": { + "input_variables": 16, + "variables": 32, + "rows": 0, + "nonzeros": 0, + "globals": 17 + }, + "modelled_variables": 32, + "reference": { + "status": "optimal", + "objective": 436, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "method": "Held-Karp subset dynamic programming", + "input_sha256": "23c97335db33f8a3cffb741ccc6b12145639d74d62bc00d02569fc9e445fd532" + } + }, + { + "family": "weighted_queens", + "kind": "weighted_queens", + "id": "weighted_queens_sanity_4", + "tier": "sanity", + "tier_size": 4, + "seed": 20260913, + "n": 4, + "size": 4, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15 + ], + [ + 35, + 45, + 9, + 45 + ], + [ + 28, + 8, + 46, + 17 + ], + [ + 14, + 40, + 34, + 33 + ] + ], + "parameters": { + "size": 4 + }, + "category": "weighted_queens", + "variant": "single", + "stress": false, + "size_unit": "queens", + "dimensions": { + "input_variables": 4, + "variables": 16, + "rows": 8, + "nonzeros": 16, + "globals": 7 + }, + "modelled_variables": 16, + "reference": { + "status": "optimal", + "objective": 105, + "assignment": [ + 2, + 0, + 3, + 1 + ], + "method": "independent exhaustive weighted-queen enumeration", + "input_sha256": "53dddd3cbc73922244e8a6fa69ab3a093a8f110c32aa6e822635d2eaab5c7a7c" + } + }, + { + "family": "weighted_queens", + "kind": "weighted_queens", + "id": "weighted_queens_small_8", + "tier": "small", + "tier_size": 8, + "seed": 20260913, + "n": 8, + "size": 8, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2 + ] + ], + "parameters": { + "size": 8 + }, + "category": "weighted_queens", + "variant": "single", + "stress": false, + "size_unit": "queens", + "dimensions": { + "input_variables": 8, + "variables": 32, + "rows": 16, + "nonzeros": 32, + "globals": 11 + }, + "modelled_variables": 32, + "reference": { + "status": "optimal", + "objective": 121, + "assignment": [ + 4, + 6, + 1, + 5, + 2, + 0, + 7, + 3 + ], + "method": "independent exhaustive weighted-queen enumeration", + "input_sha256": "b20ba5edeb26a6073657b57f6551579877d8b9f12eaa1034655f5f95447cd5e4" + } + }, + { + "family": "weighted_queens", + "kind": "weighted_queens", + "id": "weighted_queens_medium_10", + "tier": "medium", + "tier_size": 10, + "seed": 20260913, + "n": 10, + "size": 10, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2 + ] + ], + "parameters": { + "size": 10 + }, + "category": "weighted_queens", + "variant": "single", + "stress": false, + "size_unit": "queens", + "dimensions": { + "input_variables": 10, + "variables": 40, + "rows": 20, + "nonzeros": 40, + "globals": 13 + }, + "modelled_variables": 40, + "reference": { + "status": "optimal", + "objective": 86, + "assignment": [ + 3, + 6, + 0, + 5, + 8, + 1, + 7, + 4, + 2, + 9 + ], + "method": "independent exhaustive weighted-queen enumeration", + "input_sha256": "415344ef0c9dc28f66ad7289445e4958bef68951a2f43e4f74f64cbceb0636c9" + } + }, + { + "family": "weighted_queens", + "kind": "weighted_queens", + "id": "weighted_queens_large_12", + "tier": "large", + "tier_size": 12, + "seed": 20260913, + "n": 12, + "size": 12, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10 + ] + ], + "parameters": { + "size": 12 + }, + "category": "weighted_queens", + "variant": "single", + "stress": false, + "size_unit": "queens", + "dimensions": { + "input_variables": 12, + "variables": 48, + "rows": 24, + "nonzeros": 48, + "globals": 15 + }, + "modelled_variables": 48, + "reference": { + "status": "optimal", + "objective": 98, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "method": "independent exhaustive weighted-queen enumeration", + "input_sha256": "9f540b65a5d678a300b22f149ae1cc387921b1a3708c19c480ac02e0a97cfdf8" + } + }, + { + "id": "capacity_uncorrelated_cap_overflow_512", + "family": "capacity_uncorrelated", + "tier": "cap_overflow", + "tier_size": 512, + "seed": 20260906, + "n": 512, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62, + -4, + -73, + -82, + -60, + -16, + -32, + -95, + -41, + -42, + -65, + -53, + -11, + -59, + -52, + -48, + -60, + -89, + -41, + -73, + -97, + -75, + -94, + -89, + -18, + -37, + -7, + -33, + -59, + -52, + -41, + -11, + -44, + -92, + -55, + -28, + -39, + -98, + -57, + -100, + -93, + -58, + -65, + -66, + -99, + -45, + -97, + -89, + -71, + -45, + -28, + -10, + -35, + -83, + -91, + -77, + -60, + -37, + -72, + -40, + -3, + -76, + -15, + -67, + -45 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ], + [ + 448, + -14 + ], + [ + 449, + -4 + ], + [ + 450, + -11 + ], + [ + 451, + -22 + ], + [ + 452, + -16 + ], + [ + 453, + -29 + ], + [ + 454, + -20 + ], + [ + 455, + -21 + ], + [ + 456, + -15 + ], + [ + 457, + -13 + ], + [ + 458, + -28 + ], + [ + 459, + -28 + ], + [ + 460, + -22 + ], + [ + 461, + -24 + ], + [ + 462, + -6 + ], + [ + 463, + -1 + ], + [ + 464, + -29 + ], + [ + 465, + -10 + ], + [ + 466, + -6 + ], + [ + 467, + -10 + ], + [ + 468, + -13 + ], + [ + 469, + -3 + ], + [ + 470, + -3 + ], + [ + 471, + -22 + ], + [ + 472, + -8 + ], + [ + 473, + -26 + ], + [ + 474, + -19 + ], + [ + 475, + -3 + ], + [ + 476, + -9 + ], + [ + 477, + -12 + ], + [ + 478, + -5 + ], + [ + 479, + -24 + ], + [ + 480, + -4 + ], + [ + 481, + -22 + ], + [ + 482, + -13 + ], + [ + 483, + -3 + ], + [ + 484, + -2 + ], + [ + 485, + -19 + ], + [ + 486, + -27 + ], + [ + 487, + -16 + ], + [ + 488, + -5 + ], + [ + 489, + -19 + ], + [ + 490, + -4 + ], + [ + 491, + -19 + ], + [ + 492, + -5 + ], + [ + 493, + -23 + ], + [ + 494, + -24 + ], + [ + 495, + -15 + ], + [ + 496, + -4 + ], + [ + 497, + -28 + ], + [ + 498, + -29 + ], + [ + 499, + -13 + ], + [ + 500, + -25 + ], + [ + 501, + -19 + ], + [ + 502, + -30 + ], + [ + 503, + -10 + ], + [ + 504, + -28 + ], + [ + 505, + -9 + ], + [ + 506, + -3 + ], + [ + 507, + -4 + ], + [ + 508, + -14 + ], + [ + 509, + -19 + ], + [ + 510, + -7 + ], + [ + 511, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "kind": "binary", + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "reference": { + "status": "optimal", + "objective": -18731, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": 6672300, + "input_sha256": "3ed2df4ae33b74b7e423e7c2b518fafcb65e4615e4cc7d034c9d8e171a841e08" + }, + "category": "knapsack", + "variant": "uncorrelated", + "stress": true, + "size_unit": "binary variables", + "modelled_variables": 512 + } + ], + "validation": { + "category_generator_tests": 8, + "category_runner_tests": 9, + "solver_changed": false, + "solver_regressions": "Previously recorded accepted product; no algorithm or ABI change in this study." + } +} diff --git a/docs/solver-parity/checkpoints/configured.json b/docs/solver-parity/checkpoints/configured.json new file mode 100644 index 0000000000..a93b09aa25 --- /dev/null +++ b/docs/solver-parity/checkpoints/configured.json @@ -0,0 +1,737086 @@ +{ + "projection": { + "schema_version": 1, + "families": [ + { + "id": "knapsack", + "name": "Knapsack", + "detail": "Both random and correlated profits \u00b7 Exact capacity DP; LP + reliability above its cap", + "role": "target", + "cases": [ + { + "id": "knapsack-32", + "tier": "adaptive", + "variables": 32, + "size_label": "32 items", + "dimensions": "32 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.29247900000000004, + "min_solve_ms": 0.28175, + "max_solve_ms": 0.30320800000000003, + "median_wall_ms": 9.646937499837804 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.582104, + "min_solve_ms": 0.30725, + "max_solve_ms": 0.856958, + "median_wall_ms": 11.028646000340814 + } + }, + { + "id": "knapsack-64", + "tier": "adaptive", + "variables": 64, + "size_label": "64 items", + "dimensions": "64 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.8656874999999999, + "min_solve_ms": 0.848542, + "max_solve_ms": 0.882833, + "median_wall_ms": 10.715875000187225 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 0.815, + "min_solve_ms": 0.809667, + "max_solve_ms": 0.820333, + "median_wall_ms": 12.494271000377921 + } + }, + { + "id": "knapsack-128", + "tier": "adaptive", + "variables": 128, + "size_label": "128 items", + "dimensions": "128 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2.8776455, + "min_solve_ms": 2.856833, + "max_solve_ms": 2.898458, + "median_wall_ms": 11.84179200026847 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2.8330830000000002, + "min_solve_ms": 2.831416, + "max_solve_ms": 2.83475, + "median_wall_ms": 12.322041499828629 + } + }, + { + "id": "knapsack-256", + "tier": "adaptive", + "variables": 256, + "size_label": "256 items", + "dimensions": "256 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 10.965229, + "min_solve_ms": 10.819833, + "max_solve_ms": 11.110625, + "median_wall_ms": 22.221563000130118 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 11.141833499999999, + "min_solve_ms": 10.938666999999999, + "max_solve_ms": 11.344999999999999, + "median_wall_ms": 22.36816650020046 + } + }, + { + "id": "knapsack-384", + "tier": "adaptive", + "variables": 384, + "size_label": "384 items", + "dimensions": "384 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 26.486250000000002, + "min_solve_ms": 24.584000000000003, + "max_solve_ms": 28.3885, + "median_wall_ms": 37.127500000224245 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 24.8880205, + "min_solve_ms": 24.725458, + "max_solve_ms": 25.050583, + "median_wall_ms": 36.56895800031634 + } + }, + { + "id": "knapsack-400", + "tier": "adaptive", + "variables": 400, + "size_label": "400 items", + "dimensions": "400 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 26.920082999999998, + "min_solve_ms": 26.590791, + "max_solve_ms": 27.249375, + "median_wall_ms": 38.65602100040633 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 26.661646499999996, + "min_solve_ms": 26.398083999999997, + "max_solve_ms": 26.925209, + "median_wall_ms": 37.94045800032109 + } + }, + { + "id": "knapsack-404", + "tier": "adaptive", + "variables": 404, + "size_label": "404 items", + "dimensions": "404 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 27.2713335, + "min_solve_ms": 27.197792, + "max_solve_ms": 27.344875000000002, + "median_wall_ms": 38.618666500497056 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 27.196541500000002, + "min_solve_ms": 27.158125000000002, + "max_solve_ms": 27.234958, + "median_wall_ms": 37.94137500017314 + } + }, + { + "id": "knapsack-406", + "tier": "adaptive", + "variables": 406, + "size_label": "406 items", + "dimensions": "406 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 27.389375, + "min_solve_ms": 27.203374999999998, + "max_solve_ms": 27.908416, + "median_wall_ms": 37.77052100031142 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 27.298812499999997, + "min_solve_ms": 27.160332999999998, + "max_solve_ms": 27.437292, + "median_wall_ms": 37.800125000103435 + } + }, + { + "id": "knapsack-407", + "tier": "adaptive", + "variables": 407, + "size_label": "407 items", + "dimensions": "407 items", + "eligible": true, + "variant_count": 2, + "before": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 27.6682705, + "min_solve_ms": 27.36075, + "max_solve_ms": 27.93225, + "median_wall_ms": 37.70145850012341 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 27.489354, + "min_solve_ms": 27.352208, + "max_solve_ms": 27.6265, + "median_wall_ms": 38.14085400017575 + } + }, + { + "id": "knapsack-408", + "tier": "adaptive", + "variables": 408, + "size_label": "408 items", + "dimensions": "408 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 4, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1078.437438, + "min_solve_ms": 370.39604199999997, + "max_solve_ms": 1786.478834, + "median_wall_ms": 1091.641166000045 + } + }, + { + "id": "knapsack-416", + "tier": "adaptive", + "variables": 416, + "size_label": "416 items", + "dimensions": "416 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-448", + "tier": "adaptive", + "variables": 448, + "size_label": "448 items", + "dimensions": "448 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "knapsack-511", + "tier": "adaptive", + "variables": 511, + "size_label": "511 items", + "dimensions": "511 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 1991.8291665, + "min_solve_ms": 638.706416, + "max_solve_ms": 3295.617417, + "median_wall_ms": 2004.2150409999522 + } + }, + { + "id": "knapsack-512", + "tier": "adaptive", + "variables": 512, + "size_label": "512 items", + "dimensions": "512 items", + "eligible": false, + "variant_count": 2, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 4, + "attempts": 4, + "status": "solved", + "median_solve_ms": 1935.597875, + "min_solve_ms": 622.251667, + "max_solve_ms": 3259.3044999999997, + "median_wall_ms": 1948.0193120002696 + } + } + ], + "configuration": { + "route": "native", + "outside_dp_route": "lp-reliability", + "label": "Exact capacity DP; LP + reliability above its cap", + "rationale": "Preserve the fast DP on admitted models. Larger tables use updated checked LP bounds, verified covers and bounded reliability branching." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "407 items", + "next": "Next tested failure: 408 items (0/4 completed).", + "reversals": 0, + "confirmed_size": 407, + "next_failure_size": 408 + }, + "before_max": 407, + "after_boundary": { + "label": "512 items", + "next": "Search ceiling reached; the upper limit is still unknown.", + "reversals": 0, + "confirmed_size": 512, + "next_failure_size": null + }, + "after_max": 512, + "mechanisms": { + "lp_calls": 127995, + "cuts": 29, + "probes": 1280, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 1.257985257985258 + }, + { + "id": "assignment", + "name": "Assignment", + "detail": "One task per worker \u00b7 Checked LP bounds at the root", + "role": "target", + "cases": [ + { + "id": "assignment-16", + "tier": "adaptive", + "variables": 256, + "size_label": "16 tasks", + "dimensions": "16 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3024.2315, + "min_solve_ms": 3014.6944169999997, + "max_solve_ms": 3033.768583, + "median_wall_ms": 3036.256417000459 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 34.762166, + "min_solve_ms": 34.762166, + "max_solve_ms": 34.762166, + "median_wall_ms": 48.48054099966248 + } + }, + { + "id": "assignment-17", + "tier": "adaptive", + "variables": 289, + "size_label": "17 tasks", + "dimensions": "17 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 6949.738625, + "min_solve_ms": 6942.326042000001, + "max_solve_ms": 6957.151208, + "median_wall_ms": 6962.242437500208 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 44.166333, + "min_solve_ms": 44.166333, + "max_solve_ms": 44.166333, + "median_wall_ms": 56.371874999967986 + } + }, + { + "id": "assignment-18", + "tier": "adaptive", + "variables": 324, + "size_label": "18 tasks", + "dimensions": "18 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 32.008458, + "min_solve_ms": 32.008458, + "max_solve_ms": 32.008458, + "median_wall_ms": 44.056875000023865 + } + }, + { + "id": "assignment-20", + "tier": "adaptive", + "variables": 400, + "size_label": "20 tasks", + "dimensions": "20 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "assignment-24", + "tier": "adaptive", + "variables": 576, + "size_label": "24 tasks", + "dimensions": "24 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 412.178333, + "min_solve_ms": 412.178333, + "max_solve_ms": 412.178333, + "median_wall_ms": 426.3188330005505 + } + }, + { + "id": "assignment-28", + "tier": "adaptive", + "variables": 784, + "size_label": "28 tasks", + "dimensions": "28 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 8016.6783749999995, + "min_solve_ms": 8016.6783749999995, + "max_solve_ms": 8016.6783749999995, + "median_wall_ms": 8030.9564589997535 + } + }, + { + "id": "assignment-30", + "tier": "adaptive", + "variables": 900, + "size_label": "30 tasks", + "dimensions": "30 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 4602.231646, + "min_solve_ms": 4546.650167, + "max_solve_ms": 4657.813125, + "median_wall_ms": 4616.27916649968 + } + }, + { + "id": "assignment-31", + "tier": "adaptive", + "variables": 961, + "size_label": "31 tasks", + "dimensions": "31 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 8862.5216455, + "min_solve_ms": 8858.807083, + "max_solve_ms": 8866.236208, + "median_wall_ms": 8876.960125499863 + } + }, + { + "id": "assignment-32", + "tier": "adaptive", + "variables": 1024, + "size_label": "32 tasks", + "dimensions": "32 tasks", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "configuration": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "17 tasks", + "next": "Next tested failure: 18 tasks (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "before_max": 289, + "after_boundary": { + "label": "31 tasks", + "next": "Next tested failure: 32 tasks (0/2 completed).", + "reversals": 0, + "confirmed_size": 31, + "next_failure_size": 32 + }, + "after_max": 961, + "mechanisms": { + "lp_calls": 11, + "cuts": 0, + "probes": 0, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 3.3252595155709344 + }, + { + "id": "facility_location", + "name": "Facility location", + "detail": "Two customers per candidate site \u00b7 Checked LP bounds updated during search", + "role": "target", + "cases": [ + { + "id": "facility_location-7", + "tier": "adaptive", + "variables": 105, + "size_label": "7 sites", + "dimensions": "7 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 411.80997949999994, + "min_solve_ms": 410.45433399999996, + "max_solve_ms": 413.165625, + "median_wall_ms": 426.43016650026766 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 5.36, + "min_solve_ms": 5.36, + "max_solve_ms": 5.36, + "median_wall_ms": 17.531416999190697 + } + }, + { + "id": "facility_location-8", + "tier": "adaptive", + "variables": 136, + "size_label": "8 sites", + "dimensions": "8 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2691.9734584999997, + "min_solve_ms": 2686.181417, + "max_solve_ms": 2697.7655, + "median_wall_ms": 2704.3412294997324 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 11.244458, + "min_solve_ms": 11.244458, + "max_solve_ms": 11.244458, + "median_wall_ms": 26.602332999573264 + } + }, + { + "id": "facility_location-9", + "tier": "adaptive", + "variables": 171, + "size_label": "9 sites", + "dimensions": "9 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 7.289667, + "min_solve_ms": 7.289667, + "max_solve_ms": 7.289667, + "median_wall_ms": 19.773666000219237 + } + }, + { + "id": "facility_location-10", + "tier": "adaptive", + "variables": 210, + "size_label": "10 sites", + "dimensions": "10 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "facility_location-12", + "tier": "adaptive", + "variables": 300, + "size_label": "12 sites", + "dimensions": "12 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "facility_location-15", + "tier": "adaptive", + "variables": 465, + "size_label": "15 sites", + "dimensions": "15 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 65.994625, + "min_solve_ms": 65.922125, + "max_solve_ms": 66.067125, + "median_wall_ms": 79.446020999967 + } + }, + { + "id": "facility_location-16", + "tier": "adaptive", + "variables": 528, + "size_label": "16 sites", + "dimensions": "16 sites", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 61.3700005, + "min_solve_ms": 60.817167, + "max_solve_ms": 61.922834, + "median_wall_ms": 74.21749950026424 + } + } + ], + "configuration": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "8 sites", + "next": "Next tested failure: 9 sites (0/2 completed).", + "reversals": 0, + "confirmed_size": 8, + "next_failure_size": 9 + }, + "before_max": 136, + "after_boundary": { + "label": "16 sites", + "next": "Search ceiling reached; the upper limit is still unknown.", + "reversals": 0, + "confirmed_size": 16, + "next_failure_size": null + }, + "after_max": 528, + "mechanisms": { + "lp_calls": 1824, + "cuts": 0, + "probes": 0, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 3.8823529411764706 + }, + { + "id": "bin_packing", + "name": "Bin packing", + "detail": "Weighted items; candidate bins grow with size \u00b7 Checked LP bounds at the root", + "role": "target", + "cases": [ + { + "id": "bin_packing-16", + "tier": "adaptive", + "variables": 102, + "size_label": "16 items", + "dimensions": "16 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 802.7596045, + "min_solve_ms": 801.821125, + "max_solve_ms": 803.698084, + "median_wall_ms": 816.1280415001784 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 1.85575, + "min_solve_ms": 1.85575, + "max_solve_ms": 1.85575, + "median_wall_ms": 18.11958300004335 + } + }, + { + "id": "bin_packing-17", + "tier": "adaptive", + "variables": 108, + "size_label": "17 items", + "dimensions": "17 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 2901.693958, + "min_solve_ms": 2897.1851659999998, + "max_solve_ms": 2906.20275, + "median_wall_ms": 2915.781457999856 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 1.848541, + "min_solve_ms": 1.848541, + "max_solve_ms": 1.848541, + "median_wall_ms": 18.060082999909355 + } + }, + { + "id": "bin_packing-18", + "tier": "adaptive", + "variables": 114, + "size_label": "18 items", + "dimensions": "18 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 4.628958, + "min_solve_ms": 4.628958, + "max_solve_ms": 4.628958, + "median_wall_ms": 17.01629099989077 + } + }, + { + "id": "bin_packing-20", + "tier": "adaptive", + "variables": 147, + "size_label": "20 items", + "dimensions": "20 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "bin_packing-24", + "tier": "adaptive", + "variables": 200, + "size_label": "24 items", + "dimensions": "24 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 6478.602417, + "min_solve_ms": 6478.602417, + "max_solve_ms": 6478.602417, + "median_wall_ms": 6492.253749999691 + } + }, + { + "id": "bin_packing-28", + "tier": "adaptive", + "variables": 290, + "size_label": "28 items", + "dimensions": "28 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 3.788084, + "min_solve_ms": 3.788084, + "max_solve_ms": 3.788084, + "median_wall_ms": 26.15908300049341 + } + }, + { + "id": "bin_packing-29", + "tier": "adaptive", + "variables": 300, + "size_label": "29 items", + "dimensions": "29 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3.289771, + "min_solve_ms": 3.2433750000000003, + "max_solve_ms": 3.336167, + "median_wall_ms": 16.15652099962972 + } + }, + { + "id": "bin_packing-30", + "tier": "adaptive", + "variables": 310, + "size_label": "30 items", + "dimensions": "30 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 4.8135835, + "min_solve_ms": 4.794375, + "max_solve_ms": 4.8327919999999995, + "median_wall_ms": 16.958354499820416 + } + }, + { + "id": "bin_packing-31", + "tier": "adaptive", + "variables": 352, + "size_label": "31 items", + "dimensions": "31 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "bin_packing-32", + "tier": "adaptive", + "variables": 363, + "size_label": "32 items", + "dimensions": "32 items", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "configuration": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "17 items", + "next": "Next tested failure: 18 items (0/2 completed).", + "reversals": 0, + "confirmed_size": 17, + "next_failure_size": 18 + }, + "before_max": 108, + "after_boundary": { + "label": "30 items", + "next": "Next tested failure: 31 items (0/2 completed).", + "reversals": 0, + "confirmed_size": 30, + "next_failure_size": 31 + }, + "after_max": 310, + "mechanisms": { + "lp_calls": 12, + "cuts": 0, + "probes": 0, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 2.8703703703703702 + }, + { + "id": "production", + "name": "Production planning", + "detail": "Eight quantity options per period \u00b7 Updated LP bounds, covers and reliability branching", + "role": "target", + "cases": [ + { + "id": "production-6", + "tier": "adaptive", + "variables": 48, + "size_label": "6 periods", + "dimensions": "6 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 0.523458, + "min_solve_ms": 0.523458, + "max_solve_ms": 0.523458, + "median_wall_ms": 13.678124999387364 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 8.730708, + "min_solve_ms": 8.730708, + "max_solve_ms": 8.730708, + "median_wall_ms": 87.56758300023648 + } + }, + { + "id": "production-9", + "tier": "adaptive", + "variables": 72, + "size_label": "9 periods", + "dimensions": "9 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 54.790209, + "min_solve_ms": 54.790209, + "max_solve_ms": 54.790209, + "median_wall_ms": 68.90587499947287 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 23.441125, + "min_solve_ms": 23.441125, + "max_solve_ms": 23.441125, + "median_wall_ms": 36.692957999548526 + } + }, + { + "id": "production-10", + "tier": "adaptive", + "variables": 80, + "size_label": "10 periods", + "dimensions": "10 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 1170.514459, + "min_solve_ms": 1167.2698340000002, + "max_solve_ms": 1173.759084, + "median_wall_ms": 1187.4533334998887 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 31.420458, + "min_solve_ms": 31.420458, + "max_solve_ms": 31.420458, + "median_wall_ms": 43.171040999368415 + } + }, + { + "id": "production-11", + "tier": "adaptive", + "variables": 88, + "size_label": "11 periods", + "dimensions": "11 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3837.8207295, + "min_solve_ms": 3833.3235, + "max_solve_ms": 3842.317959, + "median_wall_ms": 3851.6615835001176 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 33.637833, + "min_solve_ms": 33.637833, + "max_solve_ms": 33.637833, + "median_wall_ms": 45.884707999903185 + } + }, + { + "id": "production-12", + "tier": "adaptive", + "variables": 96, + "size_label": "12 periods", + "dimensions": "12 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 44.861875000000005, + "min_solve_ms": 44.861875000000005, + "max_solve_ms": 44.861875000000005, + "median_wall_ms": 58.6785420000524 + } + }, + { + "id": "production-24", + "tier": "adaptive", + "variables": 192, + "size_label": "24 periods", + "dimensions": "24 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 737.804708, + "min_solve_ms": 737.804708, + "max_solve_ms": 737.804708, + "median_wall_ms": 753.5379169994485 + } + }, + { + "id": "production-27", + "tier": "adaptive", + "variables": 216, + "size_label": "27 periods", + "dimensions": "27 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 5334.074896, + "min_solve_ms": 5330.102250000001, + "max_solve_ms": 5338.047542, + "median_wall_ms": 5349.123604000397 + } + }, + { + "id": "production-28", + "tier": "adaptive", + "variables": 224, + "size_label": "28 periods", + "dimensions": "28 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9564.9822705, + "min_solve_ms": 9547.965832999998, + "max_solve_ms": 9581.998708000001, + "median_wall_ms": 9577.999166999689 + } + }, + { + "id": "production-29", + "tier": "adaptive", + "variables": 232, + "size_label": "29 periods", + "dimensions": "29 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "production-30", + "tier": "adaptive", + "variables": 240, + "size_label": "30 periods", + "dimensions": "30 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "production-36", + "tier": "adaptive", + "variables": 288, + "size_label": "36 periods", + "dimensions": "36 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "production-48", + "tier": "adaptive", + "variables": 384, + "size_label": "48 periods", + "dimensions": "48 periods", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 0, + "status": "not_tested", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "configuration": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "11 periods", + "next": "Next tested failure: 12 periods (0/2 completed).", + "reversals": 0, + "confirmed_size": 11, + "next_failure_size": 12 + }, + "before_max": 88, + "after_boundary": { + "label": "28 periods", + "next": "Next tested failure: 29 periods (0/2 completed).", + "reversals": 0, + "confirmed_size": 28, + "next_failure_size": 29 + }, + "after_max": 224, + "mechanisms": { + "lp_calls": 369563, + "cuts": 45, + "probes": 1920, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 2.5454545454545454 + }, + { + "id": "native_tsp", + "name": "Routing", + "detail": "Minimum-cost tour through all cities \u00b7 Native circuit and table constraints", + "role": "control", + "cases": [ + { + "id": "native_tsp-16", + "tier": "adaptive", + "variables": 32, + "size_label": "16 cities", + "dimensions": "16 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 53.515916, + "min_solve_ms": 53.515916, + "max_solve_ms": 53.515916, + "median_wall_ms": 66.21591600014654 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 54.756541999999996, + "min_solve_ms": 54.756541999999996, + "max_solve_ms": 54.756541999999996, + "median_wall_ms": 68.49058300031174 + } + }, + { + "id": "native_tsp-20", + "tier": "adaptive", + "variables": 40, + "size_label": "20 cities", + "dimensions": "20 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3161.236, + "min_solve_ms": 3157.481083, + "max_solve_ms": 3164.990917, + "median_wall_ms": 3174.1660625002623 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 3160.4241665, + "min_solve_ms": 3158.837958, + "max_solve_ms": 3162.010375, + "median_wall_ms": 3173.632354500114 + } + }, + { + "id": "native_tsp-21", + "tier": "adaptive", + "variables": 42, + "size_label": "21 cities", + "dimensions": "21 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9529.061000000002, + "min_solve_ms": 9501.285125, + "max_solve_ms": 9556.836875, + "median_wall_ms": 9541.696916499859 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 9496.014458000001, + "min_solve_ms": 9492.514541, + "max_solve_ms": 9499.514375, + "median_wall_ms": 9509.464417000345 + } + }, + { + "id": "native_tsp-22", + "tier": "adaptive", + "variables": 44, + "size_label": "22 cities", + "dimensions": "22 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "native_tsp-24", + "tier": "adaptive", + "variables": 48, + "size_label": "24 cities", + "dimensions": "24 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + }, + { + "id": "native_tsp-32", + "tier": "adaptive", + "variables": 64, + "size_label": "32 cities", + "dimensions": "32 cities", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 1, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "configuration": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "21 cities", + "next": "Next tested failure: 22 cities (0/2 completed).", + "reversals": 0, + "confirmed_size": 21, + "next_failure_size": 22 + }, + "before_max": 42, + "after_boundary": { + "label": "21 cities", + "next": "Next tested failure: 22 cities (0/2 completed).", + "reversals": 0, + "confirmed_size": 21, + "next_failure_size": 22 + }, + "after_max": 42, + "mechanisms": { + "lp_calls": 0, + "cuts": 0, + "probes": 0, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 1.0 + }, + { + "id": "weighted_queens", + "name": "Weighted queens", + "detail": "Minimum-cost non-attacking placement \u00b7 Native distinct and table constraints", + "role": "control", + "cases": [ + { + "id": "weighted_queens-12", + "tier": "adaptive", + "variables": 48, + "size_label": "12 queens", + "dimensions": "12 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 4.132917, + "min_solve_ms": 4.132917, + "max_solve_ms": 4.132917, + "median_wall_ms": 16.38849999926606 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 4.8076669999999995, + "min_solve_ms": 4.8076669999999995, + "max_solve_ms": 4.8076669999999995, + "median_wall_ms": 17.67266600018047 + } + }, + { + "id": "weighted_queens-18", + "tier": "adaptive", + "variables": 72, + "size_label": "18 queens", + "dimensions": "18 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 656.011041, + "min_solve_ms": 656.011041, + "max_solve_ms": 656.011041, + "median_wall_ms": 669.1820830001234 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 654.761291, + "min_solve_ms": 654.761291, + "max_solve_ms": 654.761291, + "median_wall_ms": 668.0794579997382 + } + }, + { + "id": "weighted_queens-21", + "tier": "adaptive", + "variables": 84, + "size_label": "21 queens", + "dimensions": "21 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 6150.616792, + "min_solve_ms": 6150.616792, + "max_solve_ms": 6150.616792, + "median_wall_ms": 6163.893958999324 + }, + "after": { + "completed": 1, + "attempts": 1, + "status": "solved", + "median_solve_ms": 6165.4135, + "min_solve_ms": 6165.4135, + "max_solve_ms": 6165.4135, + "median_wall_ms": 6177.090041999691 + } + }, + { + "id": "weighted_queens-22", + "tier": "adaptive", + "variables": 88, + "size_label": "22 queens", + "dimensions": "22 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 6647.664812499999, + "min_solve_ms": 6641.742833, + "max_solve_ms": 6653.586791999999, + "median_wall_ms": 6661.181458499868 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 6654.831375, + "min_solve_ms": 6644.579000000001, + "max_solve_ms": 6665.08375, + "median_wall_ms": 6668.874541999685 + } + }, + { + "id": "weighted_queens-23", + "tier": "adaptive", + "variables": 92, + "size_label": "23 queens", + "dimensions": "23 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 8838.566833500001, + "min_solve_ms": 8830.469917, + "max_solve_ms": 8846.66375, + "median_wall_ms": 8853.046875000473 + }, + "after": { + "completed": 2, + "attempts": 2, + "status": "solved", + "median_solve_ms": 8840.5456665, + "min_solve_ms": 8815.511, + "max_solve_ms": 8865.580333, + "median_wall_ms": 8852.600708500177 + } + }, + { + "id": "weighted_queens-24", + "tier": "adaptive", + "variables": 96, + "size_label": "24 queens", + "dimensions": "24 queens", + "eligible": false, + "variant_count": 1, + "before": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + }, + "after": { + "completed": 0, + "attempts": 2, + "status": "limited", + "median_solve_ms": null, + "min_solve_ms": null, + "max_solve_ms": null, + "median_wall_ms": null + } + } + ], + "configuration": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + }, + "capacity_note": "Largest size confirmed in both repetitions, including every knapsack variant. Untested sizes remain unknown.", + "before_boundary": { + "label": "23 queens", + "next": "Next tested failure: 24 queens (0/2 completed).", + "reversals": 0, + "confirmed_size": 23, + "next_failure_size": 24 + }, + "before_max": 92, + "after_boundary": { + "label": "23 queens", + "next": "Next tested failure: 24 queens (0/2 completed).", + "reversals": 0, + "confirmed_size": 23, + "next_failure_size": 24 + }, + "after_max": 92, + "mechanisms": { + "lp_calls": 0, + "cuts": 0, + "probes": 0, + "neighborhood_attempts": 0, + "neighborhood_improvements": 0 + }, + "expansion": 1.0 + } + ], + "runs": 176, + "cases": 78, + "elapsed_seconds": 794.2761814589994, + "clock_anomalies": [], + "seconds": 10, + "source_commit": "28352689d26032e02b4a1200aa5614ef7df66401", + "evidence": { + "report": "build/configured-bench/results/report.json", + "sha256": "bfee579b52949d53f4b90241456be32d48eed4e1e31407d81f46aef731b3147d", + "source_commit": "28352689d26032e02b4a1200aa5614ef7df66401", + "pilot_report": "build/configured-bench/pilot/report.json", + "pilot_sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8" + }, + "cohort_labels": { + "before": "Previous settings", + "after": "Configured" + }, + "configured": true, + "policy": { + "schema_version": 1, + "purpose": "Explicit benchmark presets for the accepted current native solver", + "selected_from_pilot": { + "report": "build/configured-bench/pilot/report.json", + "sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8", + "runs": 42 + }, + "selection_rule": "Choose effective settings from the structural audit and exploratory pilot; prefer simpler configurations when optional work adds overhead. Frozen before adaptive measurement. No per-instance fastest-route selection.", + "families": { + "knapsack": { + "route": "native", + "outside_dp_route": "lp-reliability", + "label": "Exact capacity DP; LP + reliability above its cap", + "rationale": "Preserve the fast DP on admitted models. Larger tables use updated checked LP bounds, verified covers and bounded reliability branching." + }, + "assignment": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "facility_location": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "bin_packing": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "production": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "native_tsp": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "weighted_queens": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + } + }, + "excluded": { + "neighborhoods": "The bounded radius-four candidate was measured, but did not improve total pilot solve time; every attempt and result remains in the pilot.", + "presolve": "The existing original-model postsolve API does not transfer optimal status or global bound, so proof-preserving composition is not claimed.", + "learning": "No production learning runtime has been implemented.", + "numerical_backend": "This comparison remains native Gecode; it does not substitute the numerical HiGHS MILP route." + } + } + }, + "report": { + "protocol": { + "seconds": 10, + "capture_seconds": 11, + "whole_seconds": 2400, + "max_attempts": 480, + "max_sizes_per_category": 32, + "limits": { + "knapsack": [ + 8, + 32, + 512 + ], + "assignment": [ + 3, + 16, + 32 + ], + "facility_location": [ + 2, + 8, + 16 + ], + "bin_packing": [ + 4, + 16, + 32 + ], + "production": [ + 3, + 6, + 48 + ], + "native_tsp": [ + 4, + 16, + 96 + ], + "weighted_queens": [ + 4, + 12, + 32 + ] + }, + "pilot": false, + "pilot_cases": null, + "candidate_routes": null, + "policy": { + "schema_version": 1, + "purpose": "Explicit benchmark presets for the accepted current native solver", + "selected_from_pilot": { + "report": "build/configured-bench/pilot/report.json", + "sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8", + "runs": 42 + }, + "selection_rule": "Choose effective settings from the structural audit and exploratory pilot; prefer simpler configurations when optional work adds overhead. Frozen before adaptive measurement. No per-instance fastest-route selection.", + "families": { + "knapsack": { + "route": "native", + "outside_dp_route": "lp-reliability", + "label": "Exact capacity DP; LP + reliability above its cap", + "rationale": "Preserve the fast DP on admitted models. Larger tables use updated checked LP bounds, verified covers and bounded reliability branching." + }, + "assignment": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "facility_location": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "bin_packing": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "production": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "native_tsp": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "weighted_queens": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + } + }, + "excluded": { + "neighborhoods": "The bounded radius-four candidate was measured, but did not improve total pilot solve time; every attempt and result remains in the pilot.", + "presolve": "The existing original-model postsolve API does not transfer optimal status or global bound, so proof-preserving composition is not claimed.", + "learning": "No production learning runtime has been implemented.", + "numerical_backend": "This comparison remains native Gecode; it does not substitute the numerical HiGHS MILP route." + } + }, + "cohort_labels": { + "before": "Previous settings", + "after": "Configured" + }, + "selection": "Pilot is exploratory and preserves every candidate. Adaptive policy is fixed before timing; independent doubling/bisection and adjacent two-repeat confirmation.", + "optimality": "Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.", + "capacity": "Largest sampled size with all variants passing both repetitions. Untested sizes remain unknown.", + "timing": "Steady-clock wall time around the entire owning solve call; ten seconds per solve. No supplied starts.", + "generalization": "Policy selection and adaptive measurement reuse seeded families; this is not an independent holdout." + }, + "provenance": { + "source_head": "28352689d26032e02b4a1200aa5614ef7df66401", + "sources": { + "experiments/optimize/benchmark_configured.py": "aef5f4e10ed667381bab3edba42fdf1d691260a777d751fb8fe794de67cae49c", + "experiments/optimize/configured_benchmark.cpp": "a1d2207ab84955d84e8fee90972a6baf6dd371b93256767a4cc97308fc930229", + "experiments/optimize/build_configured_benchmark.py": "722c04a8ff1e3804b90cac3caacb9fdd12cd900f7297abccf2c78795ecf14ea4", + "build/configured-bench/build.local.json": "28fea13fd66d92bbf10465eb72c5a2a67922322e3565358206969637482a2fe0", + "experiments/optimize/benchmark_boundaries.py": "fe6cae5ba528a8d11072d7fffc72e0b0041590d8eb8cb8d7fe16603d78d7af5a", + "experiments/optimize/boundary_instances.py": "e1a7ec77414b1f6902c6d4dd255acf400cd7cccc491ad3519a6642a73a990561", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676", + "experiments/optimize/configured-policy.json": "13202755c91be7bd6bddb332f06a26b49cb3f310a44c2ee5e39437d4d70b8339" + }, + "runtime_sources": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "driver_sha256": "2d2df4b80262962bd596be55c3b8a0a0f0a4a967fe3f21f9a68d0b343666270b", + "expected_libraries": { + "before": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + }, + "driver_build": { + "source_sha256": "a1d2207ab84955d84e8fee90972a6baf6dd371b93256767a4cc97308fc930229", + "binary_sha256": "2d2df4b80262962bd596be55c3b8a0a0f0a4a967fe3f21f9a68d0b343666270b", + "compiler_flags_sha256": "91b7101668f12e009f893c9910e7e22e155f6c21905de9ae73ded7c656af6178", + "link_metadata_sha256": "8f2472c3651f9a6ded2526fc9b5f015b572336310a0f82c9f2887c725aad246c" + }, + "comparison": "Same accepted current solver libraries; ordinary settings versus selected explicit settings.", + "before_loaded": [ + [ + "libgecodeint.6.4.0.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.6.4.0.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + ], + [ + "libgecodesearch.6.4.0.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.6.4.0.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "after_loaded": [ + [ + "libgecodeint.6.4.0.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.6.4.0.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + ], + [ + "libgecodesearch.6.4.0.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.6.4.0.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "integrity": { + "sources_unchanged": true, + "runtime_sources_unchanged": true, + "driver_unchanged": true, + "models_unchanged": true, + "libraries_unchanged": true + } + }, + "started_utc": "2026-09-06T06:30:27.187960+00:00", + "elapsed_seconds": 794.2761814589994, + "complete": true, + "models": [ + { + "id": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_8", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 8, + "natural_size": 8, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 8, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "input_variables": 8, + "model_variables": 8, + "modelled_variables": 8, + "size_unit": "items" + }, + "json_sha256": "0fa6b80ec5f7fba53d7b94a6f7498c8faf91295bc00c57057d71fab478bee544", + "txt_sha256": "ea9569a056bb6fad19798ad3bb6a18ea93003f9cff5ea6106c2ea429237949bb" + }, + { + "id": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_32", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "input_variables": 32, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "items" + }, + "json_sha256": "68f4f3c3731d7ae1ff950121f94f4e06199e51c83534b61504263a0cc7a3eb7e", + "txt_sha256": "5b6423445e33a99cb177f60c3c7b80f7f0f688564cdacc442b134541dc056097" + }, + { + "id": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_32", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12 + ], + "rows": [ + { + "b": -192, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12 + ], + "capacities": [ + 192 + ], + "capacity": 192, + "table_cells": 6369, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 32, + "variables": 32, + "rows": 1, + "nonzeros": 32, + "globals": 0 + }, + "input_variables": 32, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "items" + }, + "json_sha256": "b6232a57b70dba325e6563a1aee75446eee18411fa7d5e780cfafa881057aca3", + "txt_sha256": "808a2c747faa0a6eb81bfee59ae4b11a16cc9081f900710e086155f2ae6e254d" + }, + { + "id": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_64", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 64, + "natural_size": 64, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 64, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3 + ], + "rows": [ + { + "b": -384, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3 + ], + "capacities": [ + 384 + ], + "capacity": 384, + "table_cells": 25025, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 64, + "variables": 64, + "rows": 1, + "nonzeros": 64, + "globals": 0 + }, + "input_variables": 64, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "items" + }, + "json_sha256": "65f7351e58abb43c31baf38c6719c0278d500080f4b631b876492ff648c8196b", + "txt_sha256": "ef3322161a34e50ede9cd8c376f74c448923373ebb9b7019191326efb057230b" + }, + { + "id": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_64", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 64, + "natural_size": 64, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 64, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39 + ], + "rows": [ + { + "b": -384, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39 + ], + "capacities": [ + 384 + ], + "capacity": 384, + "table_cells": 25025, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 64, + "variables": 64, + "rows": 1, + "nonzeros": 64, + "globals": 0 + }, + "input_variables": 64, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "items" + }, + "json_sha256": "3adb570b20946142807b3eb72f328b00ade0990ab834099624dbe1014d4fe1a1", + "txt_sha256": "60b91651118c216161a9948301c93fa5efa6eb55a5d8e6054b200cc3921ab731" + }, + { + "id": "knapsack-128-uncorrelated", + "category": "knapsack", + "size": 128, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_128", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 128, + "natural_size": 128, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 128, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "input_variables": 128, + "model_variables": 128, + "modelled_variables": 128, + "size_unit": "items" + }, + "json_sha256": "2edf8bc3053748744319133d898fd49e8ccda206ac296d2e8d0842686b818e50", + "txt_sha256": "b59b0bdd0661616462e4b441fb08559f8bc487cf5d876a3e688b9a91512056ee" + }, + { + "id": "knapsack-128-correlated", + "category": "knapsack", + "size": 128, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_128", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 128, + "natural_size": 128, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 128, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16 + ], + "rows": [ + { + "b": -768, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16 + ], + "capacities": [ + 768 + ], + "capacity": 768, + "table_cells": 99201, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 128, + "variables": 128, + "rows": 1, + "nonzeros": 128, + "globals": 0 + }, + "input_variables": 128, + "model_variables": 128, + "modelled_variables": 128, + "size_unit": "items" + }, + "json_sha256": "3c43b8193591f13fd83e3ca532e6f285f269e568963f87270898417d501c192f", + "txt_sha256": "4f7a15880322d7f346b1b9a8d2c13dd19c47d29caf27b08a3cda91b0be629e37" + }, + { + "id": "knapsack-256-uncorrelated", + "category": "knapsack", + "size": 256, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_256", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 256, + "natural_size": 256, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40 + ], + "rows": [ + { + "b": -1536, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40 + ], + "capacities": [ + 1536 + ], + "capacity": 1536, + "table_cells": 395009, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 1, + "nonzeros": 256, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "items" + }, + "json_sha256": "5cc1a6ed0bddb12b585dc9a16543643216f46a68702bbe090227d0fc8fa85797", + "txt_sha256": "73ff2822311101bd220315e2d2a3583e0648478148b93401489b0ad7102c0f5e" + }, + { + "id": "knapsack-256-correlated", + "category": "knapsack", + "size": 256, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_256", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 256, + "natural_size": 256, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30 + ], + "rows": [ + { + "b": -1536, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30 + ], + "capacities": [ + 1536 + ], + "capacity": 1536, + "table_cells": 395009, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 1, + "nonzeros": 256, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "items" + }, + "json_sha256": "26012002c95dcf9ba83d47c1f71ab65dd20562bcc78a2aaf71c334a1986f2a52", + "txt_sha256": "a2d7ba329b600de8285c0c09e0a71a76ca4736ce6a3062916946d8a9bb358b99" + }, + { + "id": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_512", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 512, + "natural_size": 512, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 512, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62, + -4, + -73, + -82, + -60, + -16, + -32, + -95, + -41, + -42, + -65, + -53, + -11, + -59, + -52, + -48, + -60, + -89, + -41, + -73, + -97, + -75, + -94, + -89, + -18, + -37, + -7, + -33, + -59, + -52, + -41, + -11, + -44, + -92, + -55, + -28, + -39, + -98, + -57, + -100, + -93, + -58, + -65, + -66, + -99, + -45, + -97, + -89, + -71, + -45, + -28, + -10, + -35, + -83, + -91, + -77, + -60, + -37, + -72, + -40, + -3, + -76, + -15, + -67, + -45 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ], + [ + 448, + -14 + ], + [ + 449, + -4 + ], + [ + 450, + -11 + ], + [ + 451, + -22 + ], + [ + 452, + -16 + ], + [ + 453, + -29 + ], + [ + 454, + -20 + ], + [ + 455, + -21 + ], + [ + 456, + -15 + ], + [ + 457, + -13 + ], + [ + 458, + -28 + ], + [ + 459, + -28 + ], + [ + 460, + -22 + ], + [ + 461, + -24 + ], + [ + 462, + -6 + ], + [ + 463, + -1 + ], + [ + 464, + -29 + ], + [ + 465, + -10 + ], + [ + 466, + -6 + ], + [ + 467, + -10 + ], + [ + 468, + -13 + ], + [ + 469, + -3 + ], + [ + 470, + -3 + ], + [ + 471, + -22 + ], + [ + 472, + -8 + ], + [ + 473, + -26 + ], + [ + 474, + -19 + ], + [ + 475, + -3 + ], + [ + 476, + -9 + ], + [ + 477, + -12 + ], + [ + 478, + -5 + ], + [ + 479, + -24 + ], + [ + 480, + -4 + ], + [ + 481, + -22 + ], + [ + 482, + -13 + ], + [ + 483, + -3 + ], + [ + 484, + -2 + ], + [ + 485, + -19 + ], + [ + 486, + -27 + ], + [ + 487, + -16 + ], + [ + 488, + -5 + ], + [ + 489, + -19 + ], + [ + 490, + -4 + ], + [ + 491, + -19 + ], + [ + 492, + -5 + ], + [ + 493, + -23 + ], + [ + 494, + -24 + ], + [ + 495, + -15 + ], + [ + 496, + -4 + ], + [ + 497, + -28 + ], + [ + 498, + -29 + ], + [ + 499, + -13 + ], + [ + 500, + -25 + ], + [ + 501, + -19 + ], + [ + 502, + -30 + ], + [ + 503, + -10 + ], + [ + 504, + -28 + ], + [ + 505, + -9 + ], + [ + 506, + -3 + ], + [ + 507, + -4 + ], + [ + 508, + -14 + ], + [ + 509, + -19 + ], + [ + 510, + -7 + ], + [ + 511, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7, + 24 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67, + 45 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 512, + "model_variables": 512, + "modelled_variables": 512, + "size_unit": "items" + }, + "json_sha256": "1e985ae702c5bc0508fd63f900b0db1ff05f6cfeca79f0bb02191b4db14d6c00", + "txt_sha256": "fe96761d0760f264dd4cab0063ad2a0b263a0f4ed1065a6162c6255c4a4c9207" + }, + { + "id": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_512", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 512, + "natural_size": 512, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 512, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11, + -11, + -20, + -31, + -13, + -8, + -12, + -24, + -13, + -16, + -18, + -34, + -5, + -23, + -20, + -12, + -18, + -9, + -11, + -4, + -32, + -14, + -20, + -38, + -5, + -21, + -15, + -7, + -15, + -15, + -15, + -10, + -14, + -15, + -36, + -19, + -16, + -17, + -21, + -30, + -11, + -6, + -22, + -34, + -27, + -28, + -5, + -11, + -20, + -14, + -27, + -34, + -16, + -19, + -14, + -20, + -12, + -19, + -8, + -31, + -40, + -27, + -19, + -16, + -11, + -33, + -11, + -16, + -32, + -31, + -22, + -15, + -7, + -31, + -18, + -35, + -11, + -32, + -20, + -16, + -18, + -37, + -6, + -7, + -12, + -31, + -19, + -8, + -30, + -32, + -39, + -16, + -36, + -24, + -36, + -9, + -17 + ], + "rows": [ + { + "b": -3072, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ], + [ + 416, + -11 + ], + [ + 417, + -15 + ], + [ + 418, + -30 + ], + [ + 419, + -4 + ], + [ + 420, + -6 + ], + [ + 421, + -4 + ], + [ + 422, + -17 + ], + [ + 423, + -10 + ], + [ + 424, + -10 + ], + [ + 425, + -8 + ], + [ + 426, + -24 + ], + [ + 427, + -3 + ], + [ + 428, + -17 + ], + [ + 429, + -18 + ], + [ + 430, + -9 + ], + [ + 431, + -14 + ], + [ + 432, + -1 + ], + [ + 433, + -8 + ], + [ + 434, + -1 + ], + [ + 435, + -25 + ], + [ + 436, + -8 + ], + [ + 437, + -11 + ], + [ + 438, + -29 + ], + [ + 439, + -2 + ], + [ + 440, + -21 + ], + [ + 441, + -12 + ], + [ + 442, + -1 + ], + [ + 443, + -10 + ], + [ + 444, + -13 + ], + [ + 445, + -11 + ], + [ + 446, + -10 + ], + [ + 447, + -4 + ], + [ + 448, + -13 + ], + [ + 449, + -27 + ], + [ + 450, + -10 + ], + [ + 451, + -11 + ], + [ + 452, + -7 + ], + [ + 453, + -20 + ], + [ + 454, + -28 + ], + [ + 455, + -10 + ], + [ + 456, + -5 + ], + [ + 457, + -19 + ], + [ + 458, + -25 + ], + [ + 459, + -24 + ], + [ + 460, + -28 + ], + [ + 461, + -3 + ], + [ + 462, + -1 + ], + [ + 463, + -15 + ], + [ + 464, + -9 + ], + [ + 465, + -22 + ], + [ + 466, + -31 + ], + [ + 467, + -9 + ], + [ + 468, + -10 + ], + [ + 469, + -10 + ], + [ + 470, + -15 + ], + [ + 471, + -11 + ], + [ + 472, + -10 + ], + [ + 473, + -5 + ], + [ + 474, + -26 + ], + [ + 475, + -31 + ], + [ + 476, + -24 + ], + [ + 477, + -19 + ], + [ + 478, + -12 + ], + [ + 479, + -4 + ], + [ + 480, + -28 + ], + [ + 481, + -5 + ], + [ + 482, + -12 + ], + [ + 483, + -29 + ], + [ + 484, + -23 + ], + [ + 485, + -19 + ], + [ + 486, + -12 + ], + [ + 487, + -7 + ], + [ + 488, + -27 + ], + [ + 489, + -13 + ], + [ + 490, + -25 + ], + [ + 491, + -10 + ], + [ + 492, + -24 + ], + [ + 493, + -12 + ], + [ + 494, + -10 + ], + [ + 495, + -13 + ], + [ + 496, + -31 + ], + [ + 497, + -6 + ], + [ + 498, + -3 + ], + [ + 499, + -4 + ], + [ + 500, + -22 + ], + [ + 501, + -16 + ], + [ + 502, + -4 + ], + [ + 503, + -25 + ], + [ + 504, + -26 + ], + [ + 505, + -30 + ], + [ + 506, + -6 + ], + [ + 507, + -30 + ], + [ + 508, + -23 + ], + [ + 509, + -30 + ], + [ + 510, + -7 + ], + [ + 511, + -8 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10, + 11, + 15, + 30, + 4, + 6, + 4, + 17, + 10, + 10, + 8, + 24, + 3, + 17, + 18, + 9, + 14, + 1, + 8, + 1, + 25, + 8, + 11, + 29, + 2, + 21, + 12, + 1, + 10, + 13, + 11, + 10, + 4, + 13, + 27, + 10, + 11, + 7, + 20, + 28, + 10, + 5, + 19, + 25, + 24, + 28, + 3, + 1, + 15, + 9, + 22, + 31, + 9, + 10, + 10, + 15, + 11, + 10, + 5, + 26, + 31, + 24, + 19, + 12, + 4, + 28, + 5, + 12, + 29, + 23, + 19, + 12, + 7, + 27, + 13, + 25, + 10, + 24, + 12, + 10, + 13, + 31, + 6, + 3, + 4, + 22, + 16, + 4, + 25, + 26, + 30, + 6, + 30, + 23, + 30, + 7, + 8 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11, + 11, + 20, + 31, + 13, + 8, + 12, + 24, + 13, + 16, + 18, + 34, + 5, + 23, + 20, + 12, + 18, + 9, + 11, + 4, + 32, + 14, + 20, + 38, + 5, + 21, + 15, + 7, + 15, + 15, + 15, + 10, + 14, + 15, + 36, + 19, + 16, + 17, + 21, + 30, + 11, + 6, + 22, + 34, + 27, + 28, + 5, + 11, + 20, + 14, + 27, + 34, + 16, + 19, + 14, + 20, + 12, + 19, + 8, + 31, + 40, + 27, + 19, + 16, + 11, + 33, + 11, + 16, + 32, + 31, + 22, + 15, + 7, + 31, + 18, + 35, + 11, + 32, + 20, + 16, + 18, + 37, + 6, + 7, + 12, + 31, + 19, + 8, + 30, + 32, + 39, + 16, + 36, + 24, + 36, + 9, + 17 + ], + "capacities": [ + 3072 + ], + "capacity": 3072, + "table_cells": 1576449, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 512, + "variables": 512, + "rows": 1, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 512, + "model_variables": 512, + "modelled_variables": 512, + "size_unit": "items" + }, + "json_sha256": "a6a554e6feedbb00190e8b2612df540717bd9d8de8642d6654751bee0755f055", + "txt_sha256": "ad8202953da8af5f681625e21327591ca93996701395fd85397dd1c23b54f074" + }, + { + "id": "knapsack-384-uncorrelated", + "category": "knapsack", + "size": 384, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_384", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 384, + "natural_size": 384, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 384, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "input_variables": 384, + "model_variables": 384, + "modelled_variables": 384, + "size_unit": "items" + }, + "json_sha256": "5238bdc2b218148a51cfcc77f39eeb8d021cf7b89a9f9143a75096c40d9424d7", + "txt_sha256": "9680c130459aeefd7e563978d5df20a8d7aa209abf752bb7f18a8bd169f962b2" + }, + { + "id": "knapsack-384-correlated", + "category": "knapsack", + "size": 384, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_384", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 384, + "natural_size": 384, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 384, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10 + ], + "rows": [ + { + "b": -2304, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10 + ], + "capacities": [ + 2304 + ], + "capacity": 2304, + "table_cells": 887425, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 1, + "nonzeros": 384, + "globals": 0 + }, + "input_variables": 384, + "model_variables": 384, + "modelled_variables": 384, + "size_unit": "items" + }, + "json_sha256": "1303f63d2315befeb3ebb312e77d881ea26eb29b3104f83ad3f6c68cc647906d", + "txt_sha256": "b86e4f1a27ef7f0760a266be7dc49697c67cd5459a320536931b611b175a643c" + }, + { + "id": "knapsack-448-uncorrelated", + "category": "knapsack", + "size": 448, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_448", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 448, + "natural_size": 448, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 448, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62 + ], + "rows": [ + { + "b": -2688, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62 + ], + "capacities": [ + 2688 + ], + "capacity": 2688, + "table_cells": 1207361, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 448, + "variables": 448, + "rows": 1, + "nonzeros": 448, + "globals": 0 + }, + "input_variables": 448, + "model_variables": 448, + "modelled_variables": 448, + "size_unit": "items" + }, + "json_sha256": "f523962f5c03ef7ad6c8b58cad30a06ab2470488979524ba74ac83127c2a34d0", + "txt_sha256": "8fae4a8e7342909da33707155358e83d0fb3b3c022979fae4b4997656bf6f641" + }, + { + "id": "knapsack-448-correlated", + "category": "knapsack", + "size": 448, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_448", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 448, + "natural_size": 448, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 448, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11, + -11, + -20, + -31, + -13, + -8, + -12, + -24, + -13, + -16, + -18, + -34, + -5, + -23, + -20, + -12, + -18, + -9, + -11, + -4, + -32, + -14, + -20, + -38, + -5, + -21, + -15, + -7, + -15, + -15, + -15, + -10, + -14 + ], + "rows": [ + { + "b": -2688, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ], + [ + 416, + -11 + ], + [ + 417, + -15 + ], + [ + 418, + -30 + ], + [ + 419, + -4 + ], + [ + 420, + -6 + ], + [ + 421, + -4 + ], + [ + 422, + -17 + ], + [ + 423, + -10 + ], + [ + 424, + -10 + ], + [ + 425, + -8 + ], + [ + 426, + -24 + ], + [ + 427, + -3 + ], + [ + 428, + -17 + ], + [ + 429, + -18 + ], + [ + 430, + -9 + ], + [ + 431, + -14 + ], + [ + 432, + -1 + ], + [ + 433, + -8 + ], + [ + 434, + -1 + ], + [ + 435, + -25 + ], + [ + 436, + -8 + ], + [ + 437, + -11 + ], + [ + 438, + -29 + ], + [ + 439, + -2 + ], + [ + 440, + -21 + ], + [ + 441, + -12 + ], + [ + 442, + -1 + ], + [ + 443, + -10 + ], + [ + 444, + -13 + ], + [ + 445, + -11 + ], + [ + 446, + -10 + ], + [ + 447, + -4 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10, + 11, + 15, + 30, + 4, + 6, + 4, + 17, + 10, + 10, + 8, + 24, + 3, + 17, + 18, + 9, + 14, + 1, + 8, + 1, + 25, + 8, + 11, + 29, + 2, + 21, + 12, + 1, + 10, + 13, + 11, + 10, + 4 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11, + 11, + 20, + 31, + 13, + 8, + 12, + 24, + 13, + 16, + 18, + 34, + 5, + 23, + 20, + 12, + 18, + 9, + 11, + 4, + 32, + 14, + 20, + 38, + 5, + 21, + 15, + 7, + 15, + 15, + 15, + 10, + 14 + ], + "capacities": [ + 2688 + ], + "capacity": 2688, + "table_cells": 1207361, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 448, + "variables": 448, + "rows": 1, + "nonzeros": 448, + "globals": 0 + }, + "input_variables": 448, + "model_variables": 448, + "modelled_variables": 448, + "size_unit": "items" + }, + "json_sha256": "e475a1c2bf7cc969f39d4ef55b1a4d022bafe37c9050e170abdb1ead984cfd25", + "txt_sha256": "704f5975da38d9265cfdba000c1250b9d6f8e1f09b75810c30c3011be193a0c4" + }, + { + "id": "knapsack-416-uncorrelated", + "category": "knapsack", + "size": 416, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_416", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 416, + "natural_size": 416, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 416, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9 + ], + "rows": [ + { + "b": -2496, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9 + ], + "capacities": [ + 2496 + ], + "capacity": 2496, + "table_cells": 1041249, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 416, + "variables": 416, + "rows": 1, + "nonzeros": 416, + "globals": 0 + }, + "input_variables": 416, + "model_variables": 416, + "modelled_variables": 416, + "size_unit": "items" + }, + "json_sha256": "b4cc52b39df1992db0bcf875ee3097ce92ce6b77e6cd8b5c84f9c6ef5d23d560", + "txt_sha256": "364641e67e9778192e5ce52620f7e30df62b3cf6feadcc8e2aeceb50cfc37676" + }, + { + "id": "knapsack-416-correlated", + "category": "knapsack", + "size": 416, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_416", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 416, + "natural_size": 416, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 416, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11 + ], + "rows": [ + { + "b": -2496, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11 + ], + "capacities": [ + 2496 + ], + "capacity": 2496, + "table_cells": 1041249, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 416, + "variables": 416, + "rows": 1, + "nonzeros": 416, + "globals": 0 + }, + "input_variables": 416, + "model_variables": 416, + "modelled_variables": 416, + "size_unit": "items" + }, + "json_sha256": "6f960db3d1bb599a8cf2f5195eae7f1e7fd10246b3e263073e431b208381c31c", + "txt_sha256": "0338627e606a2b72738fea6a7ef0440466de8dfb5ec385c5a1cb1e87136814a1" + }, + { + "id": "knapsack-400-uncorrelated", + "category": "knapsack", + "size": 400, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_400", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 400, + "natural_size": 400, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57 + ], + "rows": [ + { + "b": -2400, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57 + ], + "capacities": [ + 2400 + ], + "capacity": 2400, + "table_cells": 962801, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 1, + "nonzeros": 400, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "items" + }, + "json_sha256": "eb11eff13a3ebcded9e244b8cdb4d3ac99dc593ad3f34d32f9168d2c75df81ad", + "txt_sha256": "14aa1d7429f25ad947fbcf74b151efdd61236d0d7a5bd33238c692eab7845049" + }, + { + "id": "knapsack-400-correlated", + "category": "knapsack", + "size": 400, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_400", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 400, + "natural_size": 400, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26 + ], + "rows": [ + { + "b": -2400, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26 + ], + "capacities": [ + 2400 + ], + "capacity": 2400, + "table_cells": 962801, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 1, + "nonzeros": 400, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "items" + }, + "json_sha256": "03de622188b6275fc9a1657be99c6d83bd7e37151ce029e9056378f81f15ca94", + "txt_sha256": "e62de14c4fb1857a6e97ff95f148c8fd507e634b00bf7dd6315cedb20757fb24" + }, + { + "id": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_408", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "fe7cbd8a86cab4ecbf283f0cd1d56180bf473b46e6794bfbb57f54ab39fa2b18", + "txt_sha256": "4268232dd470345470f6ee1eb620b04653772b822da383900de75e325c7603e3" + }, + { + "id": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_408", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "19e138a83cd2b42ee8c86a6bb443e238de55822be31dc03c918c7d964b156990", + "txt_sha256": "3add2fcfea9b3d807e0fe6cabef9a71b057f77d811778ee20571b815532354e0" + }, + { + "id": "knapsack-404-uncorrelated", + "category": "knapsack", + "size": 404, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_404", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 404, + "natural_size": 404, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 404, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19 + ], + "rows": [ + { + "b": -2424, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19 + ], + "capacities": [ + 2424 + ], + "capacity": 2424, + "table_cells": 982125, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 404, + "variables": 404, + "rows": 1, + "nonzeros": 404, + "globals": 0 + }, + "input_variables": 404, + "model_variables": 404, + "modelled_variables": 404, + "size_unit": "items" + }, + "json_sha256": "93a8100454ba552312b2dc93277ddf46b90c3fe5de0509ff85bb31101d32d353", + "txt_sha256": "fa346877265d7c91a6a7e75e958311a9bb65b855927df9bc7914058807479143" + }, + { + "id": "knapsack-404-correlated", + "category": "knapsack", + "size": 404, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_404", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 404, + "natural_size": 404, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 404, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28 + ], + "rows": [ + { + "b": -2424, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28 + ], + "capacities": [ + 2424 + ], + "capacity": 2424, + "table_cells": 982125, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 404, + "variables": 404, + "rows": 1, + "nonzeros": 404, + "globals": 0 + }, + "input_variables": 404, + "model_variables": 404, + "modelled_variables": 404, + "size_unit": "items" + }, + "json_sha256": "7395d9654c18664318ff47a6fff8fbfc845592822b11a6bc5a24173c38872697", + "txt_sha256": "0699e0270a034ed25fde3e2406be7c380c88b8037c0c302e1341c7ee85fd79db" + }, + { + "id": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_406", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 406, + "natural_size": 406, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 406, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25 + ], + "rows": [ + { + "b": -2436, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25 + ], + "capacities": [ + 2436 + ], + "capacity": 2436, + "table_cells": 991859, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 406, + "variables": 406, + "rows": 1, + "nonzeros": 406, + "globals": 0 + }, + "input_variables": 406, + "model_variables": 406, + "modelled_variables": 406, + "size_unit": "items" + }, + "json_sha256": "4f52cd43096e598c235de42607f225e047ccd815e43f11298987f8a0baf5828b", + "txt_sha256": "265deca2e810872aca05dc49fc2f4d487bf4b8e66159dc9cef56467936465b61" + }, + { + "id": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_406", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 406, + "natural_size": 406, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 406, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30 + ], + "rows": [ + { + "b": -2436, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30 + ], + "capacities": [ + 2436 + ], + "capacity": 2436, + "table_cells": 991859, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 406, + "variables": 406, + "rows": 1, + "nonzeros": 406, + "globals": 0 + }, + "input_variables": 406, + "model_variables": 406, + "modelled_variables": 406, + "size_unit": "items" + }, + "json_sha256": "5ad0697a65f0031480e444aee5dd38b9d0312b0d49d0b67be76d78f7795ebe73", + "txt_sha256": "9e2a110713fa7e2405816db8e0da91bde633b2bea11c5af7da4812269ac64f48" + }, + { + "id": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_407", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 407, + "natural_size": 407, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 407, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24 + ], + "rows": [ + { + "b": -2442, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24 + ], + "capacities": [ + 2442 + ], + "capacity": 2442, + "table_cells": 996744, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 407, + "variables": 407, + "rows": 1, + "nonzeros": 407, + "globals": 0 + }, + "input_variables": 407, + "model_variables": 407, + "modelled_variables": 407, + "size_unit": "items" + }, + "json_sha256": "cefa48a9a816fcbb53ea385d48df0b1846b0f2d7c17c1da9f23a16e03e096923", + "txt_sha256": "40f13ef271e867d65acea9499a2f7e876906bf3a04fd8b3779b3119c69589ef9" + }, + { + "id": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_407", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 407, + "natural_size": 407, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 407, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22 + ], + "rows": [ + { + "b": -2442, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22 + ], + "capacities": [ + 2442 + ], + "capacity": 2442, + "table_cells": 996744, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 407, + "variables": 407, + "rows": 1, + "nonzeros": 407, + "globals": 0 + }, + "input_variables": 407, + "model_variables": 407, + "modelled_variables": 407, + "size_unit": "items" + }, + "json_sha256": "bcc2426c297da3484e487e7fd9aabcca990072260dec5f66afafdf5d5204aa9d", + "txt_sha256": "662707672c2e9bee9f77f54f31aa041b6ee122e4ee274007a5884be7ec8f8ff4" + }, + { + "id": "knapsack-511-uncorrelated", + "category": "knapsack", + "size": 511, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_511", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 511, + "natural_size": 511, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 511, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67, + -91, + -79, + -10, + -94, + -48, + -20, + -67, + -9, + -84, + -27, + -12, + -39, + -43, + -82, + -5, + -83, + -5, + -19, + -11, + -54, + -1, + -77, + -60, + -75, + -37, + -65, + -3, + -70, + -79, + -42, + -88, + -7, + -27, + -19, + -21, + -90, + -73, + -95, + -65, + -62, + -4, + -73, + -82, + -60, + -16, + -32, + -95, + -41, + -42, + -65, + -53, + -11, + -59, + -52, + -48, + -60, + -89, + -41, + -73, + -97, + -75, + -94, + -89, + -18, + -37, + -7, + -33, + -59, + -52, + -41, + -11, + -44, + -92, + -55, + -28, + -39, + -98, + -57, + -100, + -93, + -58, + -65, + -66, + -99, + -45, + -97, + -89, + -71, + -45, + -28, + -10, + -35, + -83, + -91, + -77, + -60, + -37, + -72, + -40, + -3, + -76, + -15, + -67 + ], + "rows": [ + { + "b": -3066, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ], + [ + 408, + -21 + ], + [ + 409, + -9 + ], + [ + 410, + -1 + ], + [ + 411, + -5 + ], + [ + 412, + -11 + ], + [ + 413, + -12 + ], + [ + 414, + -5 + ], + [ + 415, + -31 + ], + [ + 416, + -7 + ], + [ + 417, + -17 + ], + [ + 418, + -2 + ], + [ + 419, + -2 + ], + [ + 420, + -17 + ], + [ + 421, + -26 + ], + [ + 422, + -23 + ], + [ + 423, + -26 + ], + [ + 424, + -24 + ], + [ + 425, + -16 + ], + [ + 426, + -19 + ], + [ + 427, + -8 + ], + [ + 428, + -11 + ], + [ + 429, + -2 + ], + [ + 430, + -11 + ], + [ + 431, + -27 + ], + [ + 432, + -7 + ], + [ + 433, + -4 + ], + [ + 434, + -4 + ], + [ + 435, + -16 + ], + [ + 436, + -30 + ], + [ + 437, + -5 + ], + [ + 438, + -23 + ], + [ + 439, + -18 + ], + [ + 440, + -13 + ], + [ + 441, + -20 + ], + [ + 442, + -15 + ], + [ + 443, + -15 + ], + [ + 444, + -12 + ], + [ + 445, + -12 + ], + [ + 446, + -10 + ], + [ + 447, + -5 + ], + [ + 448, + -14 + ], + [ + 449, + -4 + ], + [ + 450, + -11 + ], + [ + 451, + -22 + ], + [ + 452, + -16 + ], + [ + 453, + -29 + ], + [ + 454, + -20 + ], + [ + 455, + -21 + ], + [ + 456, + -15 + ], + [ + 457, + -13 + ], + [ + 458, + -28 + ], + [ + 459, + -28 + ], + [ + 460, + -22 + ], + [ + 461, + -24 + ], + [ + 462, + -6 + ], + [ + 463, + -1 + ], + [ + 464, + -29 + ], + [ + 465, + -10 + ], + [ + 466, + -6 + ], + [ + 467, + -10 + ], + [ + 468, + -13 + ], + [ + 469, + -3 + ], + [ + 470, + -3 + ], + [ + 471, + -22 + ], + [ + 472, + -8 + ], + [ + 473, + -26 + ], + [ + 474, + -19 + ], + [ + 475, + -3 + ], + [ + 476, + -9 + ], + [ + 477, + -12 + ], + [ + 478, + -5 + ], + [ + 479, + -24 + ], + [ + 480, + -4 + ], + [ + 481, + -22 + ], + [ + 482, + -13 + ], + [ + 483, + -3 + ], + [ + 484, + -2 + ], + [ + 485, + -19 + ], + [ + 486, + -27 + ], + [ + 487, + -16 + ], + [ + 488, + -5 + ], + [ + 489, + -19 + ], + [ + 490, + -4 + ], + [ + 491, + -19 + ], + [ + 492, + -5 + ], + [ + 493, + -23 + ], + [ + 494, + -24 + ], + [ + 495, + -15 + ], + [ + 496, + -4 + ], + [ + 497, + -28 + ], + [ + 498, + -29 + ], + [ + 499, + -13 + ], + [ + 500, + -25 + ], + [ + 501, + -19 + ], + [ + 502, + -30 + ], + [ + 503, + -10 + ], + [ + 504, + -28 + ], + [ + 505, + -9 + ], + [ + 506, + -3 + ], + [ + 507, + -4 + ], + [ + 508, + -14 + ], + [ + 509, + -19 + ], + [ + 510, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16, + 21, + 9, + 1, + 5, + 11, + 12, + 5, + 31, + 7, + 17, + 2, + 2, + 17, + 26, + 23, + 26, + 24, + 16, + 19, + 8, + 11, + 2, + 11, + 27, + 7, + 4, + 4, + 16, + 30, + 5, + 23, + 18, + 13, + 20, + 15, + 15, + 12, + 12, + 10, + 5, + 14, + 4, + 11, + 22, + 16, + 29, + 20, + 21, + 15, + 13, + 28, + 28, + 22, + 24, + 6, + 1, + 29, + 10, + 6, + 10, + 13, + 3, + 3, + 22, + 8, + 26, + 19, + 3, + 9, + 12, + 5, + 24, + 4, + 22, + 13, + 3, + 2, + 19, + 27, + 16, + 5, + 19, + 4, + 19, + 5, + 23, + 24, + 15, + 4, + 28, + 29, + 13, + 25, + 19, + 30, + 10, + 28, + 9, + 3, + 4, + 14, + 19, + 7 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67, + 91, + 79, + 10, + 94, + 48, + 20, + 67, + 9, + 84, + 27, + 12, + 39, + 43, + 82, + 5, + 83, + 5, + 19, + 11, + 54, + 1, + 77, + 60, + 75, + 37, + 65, + 3, + 70, + 79, + 42, + 88, + 7, + 27, + 19, + 21, + 90, + 73, + 95, + 65, + 62, + 4, + 73, + 82, + 60, + 16, + 32, + 95, + 41, + 42, + 65, + 53, + 11, + 59, + 52, + 48, + 60, + 89, + 41, + 73, + 97, + 75, + 94, + 89, + 18, + 37, + 7, + 33, + 59, + 52, + 41, + 11, + 44, + 92, + 55, + 28, + 39, + 98, + 57, + 100, + 93, + 58, + 65, + 66, + 99, + 45, + 97, + 89, + 71, + 45, + 28, + 10, + 35, + 83, + 91, + 77, + 60, + 37, + 72, + 40, + 3, + 76, + 15, + 67 + ], + "capacities": [ + 3066 + ], + "capacity": 3066, + "table_cells": 1570304, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 511, + "variables": 511, + "rows": 1, + "nonzeros": 511, + "globals": 0 + }, + "input_variables": 511, + "model_variables": 511, + "modelled_variables": 511, + "size_unit": "items" + }, + "json_sha256": "73254654913699d08167868fb6f572c4550ab53d75c1f4d3938f22c3c78a4fb5", + "txt_sha256": "9de271fea13889c16c5a5ed6aa1926bc210d636d0c0b48e06659f2b6865d1cdd" + }, + { + "id": "knapsack-511-correlated", + "category": "knapsack", + "size": 511, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_511", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 511, + "natural_size": 511, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 511, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19, + -6, + -19, + -32, + -21, + -17, + -15, + -10, + -11, + -11, + -20, + -31, + -13, + -8, + -12, + -24, + -13, + -16, + -18, + -34, + -5, + -23, + -20, + -12, + -18, + -9, + -11, + -4, + -32, + -14, + -20, + -38, + -5, + -21, + -15, + -7, + -15, + -15, + -15, + -10, + -14, + -15, + -36, + -19, + -16, + -17, + -21, + -30, + -11, + -6, + -22, + -34, + -27, + -28, + -5, + -11, + -20, + -14, + -27, + -34, + -16, + -19, + -14, + -20, + -12, + -19, + -8, + -31, + -40, + -27, + -19, + -16, + -11, + -33, + -11, + -16, + -32, + -31, + -22, + -15, + -7, + -31, + -18, + -35, + -11, + -32, + -20, + -16, + -18, + -37, + -6, + -7, + -12, + -31, + -19, + -8, + -30, + -32, + -39, + -16, + -36, + -24, + -36, + -9 + ], + "rows": [ + { + "b": -3066, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ], + [ + 408, + -1 + ], + [ + 409, + -10 + ], + [ + 410, + -25 + ], + [ + 411, + -17 + ], + [ + 412, + -15 + ], + [ + 413, + -12 + ], + [ + 414, + -8 + ], + [ + 415, + -10 + ], + [ + 416, + -11 + ], + [ + 417, + -15 + ], + [ + 418, + -30 + ], + [ + 419, + -4 + ], + [ + 420, + -6 + ], + [ + 421, + -4 + ], + [ + 422, + -17 + ], + [ + 423, + -10 + ], + [ + 424, + -10 + ], + [ + 425, + -8 + ], + [ + 426, + -24 + ], + [ + 427, + -3 + ], + [ + 428, + -17 + ], + [ + 429, + -18 + ], + [ + 430, + -9 + ], + [ + 431, + -14 + ], + [ + 432, + -1 + ], + [ + 433, + -8 + ], + [ + 434, + -1 + ], + [ + 435, + -25 + ], + [ + 436, + -8 + ], + [ + 437, + -11 + ], + [ + 438, + -29 + ], + [ + 439, + -2 + ], + [ + 440, + -21 + ], + [ + 441, + -12 + ], + [ + 442, + -1 + ], + [ + 443, + -10 + ], + [ + 444, + -13 + ], + [ + 445, + -11 + ], + [ + 446, + -10 + ], + [ + 447, + -4 + ], + [ + 448, + -13 + ], + [ + 449, + -27 + ], + [ + 450, + -10 + ], + [ + 451, + -11 + ], + [ + 452, + -7 + ], + [ + 453, + -20 + ], + [ + 454, + -28 + ], + [ + 455, + -10 + ], + [ + 456, + -5 + ], + [ + 457, + -19 + ], + [ + 458, + -25 + ], + [ + 459, + -24 + ], + [ + 460, + -28 + ], + [ + 461, + -3 + ], + [ + 462, + -1 + ], + [ + 463, + -15 + ], + [ + 464, + -9 + ], + [ + 465, + -22 + ], + [ + 466, + -31 + ], + [ + 467, + -9 + ], + [ + 468, + -10 + ], + [ + 469, + -10 + ], + [ + 470, + -15 + ], + [ + 471, + -11 + ], + [ + 472, + -10 + ], + [ + 473, + -5 + ], + [ + 474, + -26 + ], + [ + 475, + -31 + ], + [ + 476, + -24 + ], + [ + 477, + -19 + ], + [ + 478, + -12 + ], + [ + 479, + -4 + ], + [ + 480, + -28 + ], + [ + 481, + -5 + ], + [ + 482, + -12 + ], + [ + 483, + -29 + ], + [ + 484, + -23 + ], + [ + 485, + -19 + ], + [ + 486, + -12 + ], + [ + 487, + -7 + ], + [ + 488, + -27 + ], + [ + 489, + -13 + ], + [ + 490, + -25 + ], + [ + 491, + -10 + ], + [ + 492, + -24 + ], + [ + 493, + -12 + ], + [ + 494, + -10 + ], + [ + 495, + -13 + ], + [ + 496, + -31 + ], + [ + 497, + -6 + ], + [ + 498, + -3 + ], + [ + 499, + -4 + ], + [ + 500, + -22 + ], + [ + 501, + -16 + ], + [ + 502, + -4 + ], + [ + 503, + -25 + ], + [ + 504, + -26 + ], + [ + 505, + -30 + ], + [ + 506, + -6 + ], + [ + 507, + -30 + ], + [ + 508, + -23 + ], + [ + 509, + -30 + ], + [ + 510, + -7 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9, + 1, + 10, + 25, + 17, + 15, + 12, + 8, + 10, + 11, + 15, + 30, + 4, + 6, + 4, + 17, + 10, + 10, + 8, + 24, + 3, + 17, + 18, + 9, + 14, + 1, + 8, + 1, + 25, + 8, + 11, + 29, + 2, + 21, + 12, + 1, + 10, + 13, + 11, + 10, + 4, + 13, + 27, + 10, + 11, + 7, + 20, + 28, + 10, + 5, + 19, + 25, + 24, + 28, + 3, + 1, + 15, + 9, + 22, + 31, + 9, + 10, + 10, + 15, + 11, + 10, + 5, + 26, + 31, + 24, + 19, + 12, + 4, + 28, + 5, + 12, + 29, + 23, + 19, + 12, + 7, + 27, + 13, + 25, + 10, + 24, + 12, + 10, + 13, + 31, + 6, + 3, + 4, + 22, + 16, + 4, + 25, + 26, + 30, + 6, + 30, + 23, + 30, + 7 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19, + 6, + 19, + 32, + 21, + 17, + 15, + 10, + 11, + 11, + 20, + 31, + 13, + 8, + 12, + 24, + 13, + 16, + 18, + 34, + 5, + 23, + 20, + 12, + 18, + 9, + 11, + 4, + 32, + 14, + 20, + 38, + 5, + 21, + 15, + 7, + 15, + 15, + 15, + 10, + 14, + 15, + 36, + 19, + 16, + 17, + 21, + 30, + 11, + 6, + 22, + 34, + 27, + 28, + 5, + 11, + 20, + 14, + 27, + 34, + 16, + 19, + 14, + 20, + 12, + 19, + 8, + 31, + 40, + 27, + 19, + 16, + 11, + 33, + 11, + 16, + 32, + 31, + 22, + 15, + 7, + 31, + 18, + 35, + 11, + 32, + 20, + 16, + 18, + 37, + 6, + 7, + 12, + 31, + 19, + 8, + 30, + 32, + 39, + 16, + 36, + 24, + 36, + 9 + ], + "capacities": [ + 3066 + ], + "capacity": 3066, + "table_cells": 1570304, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 511, + "variables": 511, + "rows": 1, + "nonzeros": 511, + "globals": 0 + }, + "input_variables": 511, + "model_variables": 511, + "modelled_variables": 511, + "size_unit": "items" + }, + "json_sha256": "361cf7b364ccc8b624dc086c1e9fa8771b9f8ee7f6c4f954f3d035c6fb9190ed", + "txt_sha256": "506728f7ed565826d7d358099aa4b925fcc48bb7a7e803a30ec5d12ea42645ab" + }, + { + "id": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "model": { + "id": "assignment_single_16", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 256, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 16, + 1 + ], + [ + 32, + 1 + ], + [ + 48, + 1 + ], + [ + 64, + 1 + ], + [ + 80, + 1 + ], + [ + 96, + 1 + ], + [ + 112, + 1 + ], + [ + 128, + 1 + ], + [ + 144, + 1 + ], + [ + 160, + 1 + ], + [ + 176, + 1 + ], + [ + 192, + 1 + ], + [ + 208, + 1 + ], + [ + 224, + 1 + ], + [ + 240, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 16, + -1 + ], + [ + 32, + -1 + ], + [ + 48, + -1 + ], + [ + 64, + -1 + ], + [ + 80, + -1 + ], + [ + 96, + -1 + ], + [ + 112, + -1 + ], + [ + 128, + -1 + ], + [ + 144, + -1 + ], + [ + 160, + -1 + ], + [ + 176, + -1 + ], + [ + 192, + -1 + ], + [ + 208, + -1 + ], + [ + 224, + -1 + ], + [ + 240, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 17, + 1 + ], + [ + 33, + 1 + ], + [ + 49, + 1 + ], + [ + 65, + 1 + ], + [ + 81, + 1 + ], + [ + 97, + 1 + ], + [ + 113, + 1 + ], + [ + 129, + 1 + ], + [ + 145, + 1 + ], + [ + 161, + 1 + ], + [ + 177, + 1 + ], + [ + 193, + 1 + ], + [ + 209, + 1 + ], + [ + 225, + 1 + ], + [ + 241, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 17, + -1 + ], + [ + 33, + -1 + ], + [ + 49, + -1 + ], + [ + 65, + -1 + ], + [ + 81, + -1 + ], + [ + 97, + -1 + ], + [ + 113, + -1 + ], + [ + 129, + -1 + ], + [ + 145, + -1 + ], + [ + 161, + -1 + ], + [ + 177, + -1 + ], + [ + 193, + -1 + ], + [ + 209, + -1 + ], + [ + 225, + -1 + ], + [ + 241, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 18, + 1 + ], + [ + 34, + 1 + ], + [ + 50, + 1 + ], + [ + 66, + 1 + ], + [ + 82, + 1 + ], + [ + 98, + 1 + ], + [ + 114, + 1 + ], + [ + 130, + 1 + ], + [ + 146, + 1 + ], + [ + 162, + 1 + ], + [ + 178, + 1 + ], + [ + 194, + 1 + ], + [ + 210, + 1 + ], + [ + 226, + 1 + ], + [ + 242, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 18, + -1 + ], + [ + 34, + -1 + ], + [ + 50, + -1 + ], + [ + 66, + -1 + ], + [ + 82, + -1 + ], + [ + 98, + -1 + ], + [ + 114, + -1 + ], + [ + 130, + -1 + ], + [ + 146, + -1 + ], + [ + 162, + -1 + ], + [ + 178, + -1 + ], + [ + 194, + -1 + ], + [ + 210, + -1 + ], + [ + 226, + -1 + ], + [ + 242, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 19, + 1 + ], + [ + 35, + 1 + ], + [ + 51, + 1 + ], + [ + 67, + 1 + ], + [ + 83, + 1 + ], + [ + 99, + 1 + ], + [ + 115, + 1 + ], + [ + 131, + 1 + ], + [ + 147, + 1 + ], + [ + 163, + 1 + ], + [ + 179, + 1 + ], + [ + 195, + 1 + ], + [ + 211, + 1 + ], + [ + 227, + 1 + ], + [ + 243, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 19, + -1 + ], + [ + 35, + -1 + ], + [ + 51, + -1 + ], + [ + 67, + -1 + ], + [ + 83, + -1 + ], + [ + 99, + -1 + ], + [ + 115, + -1 + ], + [ + 131, + -1 + ], + [ + 147, + -1 + ], + [ + 163, + -1 + ], + [ + 179, + -1 + ], + [ + 195, + -1 + ], + [ + 211, + -1 + ], + [ + 227, + -1 + ], + [ + 243, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 20, + 1 + ], + [ + 36, + 1 + ], + [ + 52, + 1 + ], + [ + 68, + 1 + ], + [ + 84, + 1 + ], + [ + 100, + 1 + ], + [ + 116, + 1 + ], + [ + 132, + 1 + ], + [ + 148, + 1 + ], + [ + 164, + 1 + ], + [ + 180, + 1 + ], + [ + 196, + 1 + ], + [ + 212, + 1 + ], + [ + 228, + 1 + ], + [ + 244, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 20, + -1 + ], + [ + 36, + -1 + ], + [ + 52, + -1 + ], + [ + 68, + -1 + ], + [ + 84, + -1 + ], + [ + 100, + -1 + ], + [ + 116, + -1 + ], + [ + 132, + -1 + ], + [ + 148, + -1 + ], + [ + 164, + -1 + ], + [ + 180, + -1 + ], + [ + 196, + -1 + ], + [ + 212, + -1 + ], + [ + 228, + -1 + ], + [ + 244, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 21, + 1 + ], + [ + 37, + 1 + ], + [ + 53, + 1 + ], + [ + 69, + 1 + ], + [ + 85, + 1 + ], + [ + 101, + 1 + ], + [ + 117, + 1 + ], + [ + 133, + 1 + ], + [ + 149, + 1 + ], + [ + 165, + 1 + ], + [ + 181, + 1 + ], + [ + 197, + 1 + ], + [ + 213, + 1 + ], + [ + 229, + 1 + ], + [ + 245, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 21, + -1 + ], + [ + 37, + -1 + ], + [ + 53, + -1 + ], + [ + 69, + -1 + ], + [ + 85, + -1 + ], + [ + 101, + -1 + ], + [ + 117, + -1 + ], + [ + 133, + -1 + ], + [ + 149, + -1 + ], + [ + 165, + -1 + ], + [ + 181, + -1 + ], + [ + 197, + -1 + ], + [ + 213, + -1 + ], + [ + 229, + -1 + ], + [ + 245, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 22, + 1 + ], + [ + 38, + 1 + ], + [ + 54, + 1 + ], + [ + 70, + 1 + ], + [ + 86, + 1 + ], + [ + 102, + 1 + ], + [ + 118, + 1 + ], + [ + 134, + 1 + ], + [ + 150, + 1 + ], + [ + 166, + 1 + ], + [ + 182, + 1 + ], + [ + 198, + 1 + ], + [ + 214, + 1 + ], + [ + 230, + 1 + ], + [ + 246, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 22, + -1 + ], + [ + 38, + -1 + ], + [ + 54, + -1 + ], + [ + 70, + -1 + ], + [ + 86, + -1 + ], + [ + 102, + -1 + ], + [ + 118, + -1 + ], + [ + 134, + -1 + ], + [ + 150, + -1 + ], + [ + 166, + -1 + ], + [ + 182, + -1 + ], + [ + 198, + -1 + ], + [ + 214, + -1 + ], + [ + 230, + -1 + ], + [ + 246, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 23, + 1 + ], + [ + 39, + 1 + ], + [ + 55, + 1 + ], + [ + 71, + 1 + ], + [ + 87, + 1 + ], + [ + 103, + 1 + ], + [ + 119, + 1 + ], + [ + 135, + 1 + ], + [ + 151, + 1 + ], + [ + 167, + 1 + ], + [ + 183, + 1 + ], + [ + 199, + 1 + ], + [ + 215, + 1 + ], + [ + 231, + 1 + ], + [ + 247, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 23, + -1 + ], + [ + 39, + -1 + ], + [ + 55, + -1 + ], + [ + 71, + -1 + ], + [ + 87, + -1 + ], + [ + 103, + -1 + ], + [ + 119, + -1 + ], + [ + 135, + -1 + ], + [ + 151, + -1 + ], + [ + 167, + -1 + ], + [ + 183, + -1 + ], + [ + 199, + -1 + ], + [ + 215, + -1 + ], + [ + 231, + -1 + ], + [ + 247, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 24, + 1 + ], + [ + 40, + 1 + ], + [ + 56, + 1 + ], + [ + 72, + 1 + ], + [ + 88, + 1 + ], + [ + 104, + 1 + ], + [ + 120, + 1 + ], + [ + 136, + 1 + ], + [ + 152, + 1 + ], + [ + 168, + 1 + ], + [ + 184, + 1 + ], + [ + 200, + 1 + ], + [ + 216, + 1 + ], + [ + 232, + 1 + ], + [ + 248, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 24, + -1 + ], + [ + 40, + -1 + ], + [ + 56, + -1 + ], + [ + 72, + -1 + ], + [ + 88, + -1 + ], + [ + 104, + -1 + ], + [ + 120, + -1 + ], + [ + 136, + -1 + ], + [ + 152, + -1 + ], + [ + 168, + -1 + ], + [ + 184, + -1 + ], + [ + 200, + -1 + ], + [ + 216, + -1 + ], + [ + 232, + -1 + ], + [ + 248, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 25, + 1 + ], + [ + 41, + 1 + ], + [ + 57, + 1 + ], + [ + 73, + 1 + ], + [ + 89, + 1 + ], + [ + 105, + 1 + ], + [ + 121, + 1 + ], + [ + 137, + 1 + ], + [ + 153, + 1 + ], + [ + 169, + 1 + ], + [ + 185, + 1 + ], + [ + 201, + 1 + ], + [ + 217, + 1 + ], + [ + 233, + 1 + ], + [ + 249, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 25, + -1 + ], + [ + 41, + -1 + ], + [ + 57, + -1 + ], + [ + 73, + -1 + ], + [ + 89, + -1 + ], + [ + 105, + -1 + ], + [ + 121, + -1 + ], + [ + 137, + -1 + ], + [ + 153, + -1 + ], + [ + 169, + -1 + ], + [ + 185, + -1 + ], + [ + 201, + -1 + ], + [ + 217, + -1 + ], + [ + 233, + -1 + ], + [ + 249, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 26, + 1 + ], + [ + 42, + 1 + ], + [ + 58, + 1 + ], + [ + 74, + 1 + ], + [ + 90, + 1 + ], + [ + 106, + 1 + ], + [ + 122, + 1 + ], + [ + 138, + 1 + ], + [ + 154, + 1 + ], + [ + 170, + 1 + ], + [ + 186, + 1 + ], + [ + 202, + 1 + ], + [ + 218, + 1 + ], + [ + 234, + 1 + ], + [ + 250, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 26, + -1 + ], + [ + 42, + -1 + ], + [ + 58, + -1 + ], + [ + 74, + -1 + ], + [ + 90, + -1 + ], + [ + 106, + -1 + ], + [ + 122, + -1 + ], + [ + 138, + -1 + ], + [ + 154, + -1 + ], + [ + 170, + -1 + ], + [ + 186, + -1 + ], + [ + 202, + -1 + ], + [ + 218, + -1 + ], + [ + 234, + -1 + ], + [ + 250, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 27, + 1 + ], + [ + 43, + 1 + ], + [ + 59, + 1 + ], + [ + 75, + 1 + ], + [ + 91, + 1 + ], + [ + 107, + 1 + ], + [ + 123, + 1 + ], + [ + 139, + 1 + ], + [ + 155, + 1 + ], + [ + 171, + 1 + ], + [ + 187, + 1 + ], + [ + 203, + 1 + ], + [ + 219, + 1 + ], + [ + 235, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 27, + -1 + ], + [ + 43, + -1 + ], + [ + 59, + -1 + ], + [ + 75, + -1 + ], + [ + 91, + -1 + ], + [ + 107, + -1 + ], + [ + 123, + -1 + ], + [ + 139, + -1 + ], + [ + 155, + -1 + ], + [ + 171, + -1 + ], + [ + 187, + -1 + ], + [ + 203, + -1 + ], + [ + 219, + -1 + ], + [ + 235, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 28, + 1 + ], + [ + 44, + 1 + ], + [ + 60, + 1 + ], + [ + 76, + 1 + ], + [ + 92, + 1 + ], + [ + 108, + 1 + ], + [ + 124, + 1 + ], + [ + 140, + 1 + ], + [ + 156, + 1 + ], + [ + 172, + 1 + ], + [ + 188, + 1 + ], + [ + 204, + 1 + ], + [ + 220, + 1 + ], + [ + 236, + 1 + ], + [ + 252, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 28, + -1 + ], + [ + 44, + -1 + ], + [ + 60, + -1 + ], + [ + 76, + -1 + ], + [ + 92, + -1 + ], + [ + 108, + -1 + ], + [ + 124, + -1 + ], + [ + 140, + -1 + ], + [ + 156, + -1 + ], + [ + 172, + -1 + ], + [ + 188, + -1 + ], + [ + 204, + -1 + ], + [ + 220, + -1 + ], + [ + 236, + -1 + ], + [ + 252, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 29, + 1 + ], + [ + 45, + 1 + ], + [ + 61, + 1 + ], + [ + 77, + 1 + ], + [ + 93, + 1 + ], + [ + 109, + 1 + ], + [ + 125, + 1 + ], + [ + 141, + 1 + ], + [ + 157, + 1 + ], + [ + 173, + 1 + ], + [ + 189, + 1 + ], + [ + 205, + 1 + ], + [ + 221, + 1 + ], + [ + 237, + 1 + ], + [ + 253, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 29, + -1 + ], + [ + 45, + -1 + ], + [ + 61, + -1 + ], + [ + 77, + -1 + ], + [ + 93, + -1 + ], + [ + 109, + -1 + ], + [ + 125, + -1 + ], + [ + 141, + -1 + ], + [ + 157, + -1 + ], + [ + 173, + -1 + ], + [ + 189, + -1 + ], + [ + 205, + -1 + ], + [ + 221, + -1 + ], + [ + 237, + -1 + ], + [ + 253, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 30, + 1 + ], + [ + 46, + 1 + ], + [ + 62, + 1 + ], + [ + 78, + 1 + ], + [ + 94, + 1 + ], + [ + 110, + 1 + ], + [ + 126, + 1 + ], + [ + 142, + 1 + ], + [ + 158, + 1 + ], + [ + 174, + 1 + ], + [ + 190, + 1 + ], + [ + 206, + 1 + ], + [ + 222, + 1 + ], + [ + 238, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 30, + -1 + ], + [ + 46, + -1 + ], + [ + 62, + -1 + ], + [ + 78, + -1 + ], + [ + 94, + -1 + ], + [ + 110, + -1 + ], + [ + 126, + -1 + ], + [ + 142, + -1 + ], + [ + 158, + -1 + ], + [ + 174, + -1 + ], + [ + 190, + -1 + ], + [ + 206, + -1 + ], + [ + 222, + -1 + ], + [ + 238, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 31, + 1 + ], + [ + 47, + 1 + ], + [ + 63, + 1 + ], + [ + 79, + 1 + ], + [ + 95, + 1 + ], + [ + 111, + 1 + ], + [ + 127, + 1 + ], + [ + 143, + 1 + ], + [ + 159, + 1 + ], + [ + 175, + 1 + ], + [ + 191, + 1 + ], + [ + 207, + 1 + ], + [ + 223, + 1 + ], + [ + 239, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 31, + -1 + ], + [ + 47, + -1 + ], + [ + 63, + -1 + ], + [ + 79, + -1 + ], + [ + 95, + -1 + ], + [ + 111, + -1 + ], + [ + 127, + -1 + ], + [ + 143, + -1 + ], + [ + 159, + -1 + ], + [ + 175, + -1 + ], + [ + 191, + -1 + ], + [ + 207, + -1 + ], + [ + 223, + -1 + ], + [ + 239, + -1 + ], + [ + 255, + -1 + ] + ] + } + ], + "parameters": { + "size": 16, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 256, + "variables": 256, + "rows": 64, + "nonzeros": 1024, + "globals": 0 + }, + "input_variables": 256, + "model_variables": 256, + "modelled_variables": 256, + "size_unit": "tasks" + }, + "json_sha256": "2b199291221284f51fb713f23b6a66db528fb3e524db08c24da0df62e3b848b6", + "txt_sha256": "4e8cd3f1666029007ce8f8859394ba317ec7ec664124615fd5e51fc93fc9a289" + }, + { + "id": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "model": { + "id": "assignment_single_32", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 1024, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60, + 56, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21, + 66, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17, + 91, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14, + 23, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4, + 68, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57, + 51, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 68, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48, + 14, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52, + 10, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47, + 21, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97, + 13, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81, + 68, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96, + 65, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21, + 15, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57, + 94, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7, + 46, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30, + 58, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1, + 47, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11, + 24, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29, + 41, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34, + 56, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96, + 32, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98, + 47, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67, + 46, + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42, + 83, + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29, + 28, + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13, + 94, + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80, + 17, + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31, + 95, + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15, + 5, + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97, + 45, + 91, + 69, + 52, + 33, + 88, + 59, + 75, + 9, + 8, + 62, + 52, + 88, + 41, + 10, + 20, + 94, + 23, + 10, + 17, + 70, + 41, + 62, + 93, + 11, + 53, + 62, + 52, + 51, + 60, + 67, + 94, + 26 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ], + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ], + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ], + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ], + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 576, + 1 + ], + [ + 577, + 1 + ], + [ + 578, + 1 + ], + [ + 579, + 1 + ], + [ + 580, + 1 + ], + [ + 581, + 1 + ], + [ + 582, + 1 + ], + [ + 583, + 1 + ], + [ + 584, + 1 + ], + [ + 585, + 1 + ], + [ + 586, + 1 + ], + [ + 587, + 1 + ], + [ + 588, + 1 + ], + [ + 589, + 1 + ], + [ + 590, + 1 + ], + [ + 591, + 1 + ], + [ + 592, + 1 + ], + [ + 593, + 1 + ], + [ + 594, + 1 + ], + [ + 595, + 1 + ], + [ + 596, + 1 + ], + [ + 597, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ], + [ + 600, + 1 + ], + [ + 601, + 1 + ], + [ + 602, + 1 + ], + [ + 603, + 1 + ], + [ + 604, + 1 + ], + [ + 605, + 1 + ], + [ + 606, + 1 + ], + [ + 607, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 576, + -1 + ], + [ + 577, + -1 + ], + [ + 578, + -1 + ], + [ + 579, + -1 + ], + [ + 580, + -1 + ], + [ + 581, + -1 + ], + [ + 582, + -1 + ], + [ + 583, + -1 + ], + [ + 584, + -1 + ], + [ + 585, + -1 + ], + [ + 586, + -1 + ], + [ + 587, + -1 + ], + [ + 588, + -1 + ], + [ + 589, + -1 + ], + [ + 590, + -1 + ], + [ + 591, + -1 + ], + [ + 592, + -1 + ], + [ + 593, + -1 + ], + [ + 594, + -1 + ], + [ + 595, + -1 + ], + [ + 596, + -1 + ], + [ + 597, + -1 + ], + [ + 598, + -1 + ], + [ + 599, + -1 + ], + [ + 600, + -1 + ], + [ + 601, + -1 + ], + [ + 602, + -1 + ], + [ + 603, + -1 + ], + [ + 604, + -1 + ], + [ + 605, + -1 + ], + [ + 606, + -1 + ], + [ + 607, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 608, + 1 + ], + [ + 609, + 1 + ], + [ + 610, + 1 + ], + [ + 611, + 1 + ], + [ + 612, + 1 + ], + [ + 613, + 1 + ], + [ + 614, + 1 + ], + [ + 615, + 1 + ], + [ + 616, + 1 + ], + [ + 617, + 1 + ], + [ + 618, + 1 + ], + [ + 619, + 1 + ], + [ + 620, + 1 + ], + [ + 621, + 1 + ], + [ + 622, + 1 + ], + [ + 623, + 1 + ], + [ + 624, + 1 + ], + [ + 625, + 1 + ], + [ + 626, + 1 + ], + [ + 627, + 1 + ], + [ + 628, + 1 + ], + [ + 629, + 1 + ], + [ + 630, + 1 + ], + [ + 631, + 1 + ], + [ + 632, + 1 + ], + [ + 633, + 1 + ], + [ + 634, + 1 + ], + [ + 635, + 1 + ], + [ + 636, + 1 + ], + [ + 637, + 1 + ], + [ + 638, + 1 + ], + [ + 639, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 608, + -1 + ], + [ + 609, + -1 + ], + [ + 610, + -1 + ], + [ + 611, + -1 + ], + [ + 612, + -1 + ], + [ + 613, + -1 + ], + [ + 614, + -1 + ], + [ + 615, + -1 + ], + [ + 616, + -1 + ], + [ + 617, + -1 + ], + [ + 618, + -1 + ], + [ + 619, + -1 + ], + [ + 620, + -1 + ], + [ + 621, + -1 + ], + [ + 622, + -1 + ], + [ + 623, + -1 + ], + [ + 624, + -1 + ], + [ + 625, + -1 + ], + [ + 626, + -1 + ], + [ + 627, + -1 + ], + [ + 628, + -1 + ], + [ + 629, + -1 + ], + [ + 630, + -1 + ], + [ + 631, + -1 + ], + [ + 632, + -1 + ], + [ + 633, + -1 + ], + [ + 634, + -1 + ], + [ + 635, + -1 + ], + [ + 636, + -1 + ], + [ + 637, + -1 + ], + [ + 638, + -1 + ], + [ + 639, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 640, + 1 + ], + [ + 641, + 1 + ], + [ + 642, + 1 + ], + [ + 643, + 1 + ], + [ + 644, + 1 + ], + [ + 645, + 1 + ], + [ + 646, + 1 + ], + [ + 647, + 1 + ], + [ + 648, + 1 + ], + [ + 649, + 1 + ], + [ + 650, + 1 + ], + [ + 651, + 1 + ], + [ + 652, + 1 + ], + [ + 653, + 1 + ], + [ + 654, + 1 + ], + [ + 655, + 1 + ], + [ + 656, + 1 + ], + [ + 657, + 1 + ], + [ + 658, + 1 + ], + [ + 659, + 1 + ], + [ + 660, + 1 + ], + [ + 661, + 1 + ], + [ + 662, + 1 + ], + [ + 663, + 1 + ], + [ + 664, + 1 + ], + [ + 665, + 1 + ], + [ + 666, + 1 + ], + [ + 667, + 1 + ], + [ + 668, + 1 + ], + [ + 669, + 1 + ], + [ + 670, + 1 + ], + [ + 671, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 640, + -1 + ], + [ + 641, + -1 + ], + [ + 642, + -1 + ], + [ + 643, + -1 + ], + [ + 644, + -1 + ], + [ + 645, + -1 + ], + [ + 646, + -1 + ], + [ + 647, + -1 + ], + [ + 648, + -1 + ], + [ + 649, + -1 + ], + [ + 650, + -1 + ], + [ + 651, + -1 + ], + [ + 652, + -1 + ], + [ + 653, + -1 + ], + [ + 654, + -1 + ], + [ + 655, + -1 + ], + [ + 656, + -1 + ], + [ + 657, + -1 + ], + [ + 658, + -1 + ], + [ + 659, + -1 + ], + [ + 660, + -1 + ], + [ + 661, + -1 + ], + [ + 662, + -1 + ], + [ + 663, + -1 + ], + [ + 664, + -1 + ], + [ + 665, + -1 + ], + [ + 666, + -1 + ], + [ + 667, + -1 + ], + [ + 668, + -1 + ], + [ + 669, + -1 + ], + [ + 670, + -1 + ], + [ + 671, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 672, + 1 + ], + [ + 673, + 1 + ], + [ + 674, + 1 + ], + [ + 675, + 1 + ], + [ + 676, + 1 + ], + [ + 677, + 1 + ], + [ + 678, + 1 + ], + [ + 679, + 1 + ], + [ + 680, + 1 + ], + [ + 681, + 1 + ], + [ + 682, + 1 + ], + [ + 683, + 1 + ], + [ + 684, + 1 + ], + [ + 685, + 1 + ], + [ + 686, + 1 + ], + [ + 687, + 1 + ], + [ + 688, + 1 + ], + [ + 689, + 1 + ], + [ + 690, + 1 + ], + [ + 691, + 1 + ], + [ + 692, + 1 + ], + [ + 693, + 1 + ], + [ + 694, + 1 + ], + [ + 695, + 1 + ], + [ + 696, + 1 + ], + [ + 697, + 1 + ], + [ + 698, + 1 + ], + [ + 699, + 1 + ], + [ + 700, + 1 + ], + [ + 701, + 1 + ], + [ + 702, + 1 + ], + [ + 703, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 672, + -1 + ], + [ + 673, + -1 + ], + [ + 674, + -1 + ], + [ + 675, + -1 + ], + [ + 676, + -1 + ], + [ + 677, + -1 + ], + [ + 678, + -1 + ], + [ + 679, + -1 + ], + [ + 680, + -1 + ], + [ + 681, + -1 + ], + [ + 682, + -1 + ], + [ + 683, + -1 + ], + [ + 684, + -1 + ], + [ + 685, + -1 + ], + [ + 686, + -1 + ], + [ + 687, + -1 + ], + [ + 688, + -1 + ], + [ + 689, + -1 + ], + [ + 690, + -1 + ], + [ + 691, + -1 + ], + [ + 692, + -1 + ], + [ + 693, + -1 + ], + [ + 694, + -1 + ], + [ + 695, + -1 + ], + [ + 696, + -1 + ], + [ + 697, + -1 + ], + [ + 698, + -1 + ], + [ + 699, + -1 + ], + [ + 700, + -1 + ], + [ + 701, + -1 + ], + [ + 702, + -1 + ], + [ + 703, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 704, + 1 + ], + [ + 705, + 1 + ], + [ + 706, + 1 + ], + [ + 707, + 1 + ], + [ + 708, + 1 + ], + [ + 709, + 1 + ], + [ + 710, + 1 + ], + [ + 711, + 1 + ], + [ + 712, + 1 + ], + [ + 713, + 1 + ], + [ + 714, + 1 + ], + [ + 715, + 1 + ], + [ + 716, + 1 + ], + [ + 717, + 1 + ], + [ + 718, + 1 + ], + [ + 719, + 1 + ], + [ + 720, + 1 + ], + [ + 721, + 1 + ], + [ + 722, + 1 + ], + [ + 723, + 1 + ], + [ + 724, + 1 + ], + [ + 725, + 1 + ], + [ + 726, + 1 + ], + [ + 727, + 1 + ], + [ + 728, + 1 + ], + [ + 729, + 1 + ], + [ + 730, + 1 + ], + [ + 731, + 1 + ], + [ + 732, + 1 + ], + [ + 733, + 1 + ], + [ + 734, + 1 + ], + [ + 735, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 704, + -1 + ], + [ + 705, + -1 + ], + [ + 706, + -1 + ], + [ + 707, + -1 + ], + [ + 708, + -1 + ], + [ + 709, + -1 + ], + [ + 710, + -1 + ], + [ + 711, + -1 + ], + [ + 712, + -1 + ], + [ + 713, + -1 + ], + [ + 714, + -1 + ], + [ + 715, + -1 + ], + [ + 716, + -1 + ], + [ + 717, + -1 + ], + [ + 718, + -1 + ], + [ + 719, + -1 + ], + [ + 720, + -1 + ], + [ + 721, + -1 + ], + [ + 722, + -1 + ], + [ + 723, + -1 + ], + [ + 724, + -1 + ], + [ + 725, + -1 + ], + [ + 726, + -1 + ], + [ + 727, + -1 + ], + [ + 728, + -1 + ], + [ + 729, + -1 + ], + [ + 730, + -1 + ], + [ + 731, + -1 + ], + [ + 732, + -1 + ], + [ + 733, + -1 + ], + [ + 734, + -1 + ], + [ + 735, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 736, + 1 + ], + [ + 737, + 1 + ], + [ + 738, + 1 + ], + [ + 739, + 1 + ], + [ + 740, + 1 + ], + [ + 741, + 1 + ], + [ + 742, + 1 + ], + [ + 743, + 1 + ], + [ + 744, + 1 + ], + [ + 745, + 1 + ], + [ + 746, + 1 + ], + [ + 747, + 1 + ], + [ + 748, + 1 + ], + [ + 749, + 1 + ], + [ + 750, + 1 + ], + [ + 751, + 1 + ], + [ + 752, + 1 + ], + [ + 753, + 1 + ], + [ + 754, + 1 + ], + [ + 755, + 1 + ], + [ + 756, + 1 + ], + [ + 757, + 1 + ], + [ + 758, + 1 + ], + [ + 759, + 1 + ], + [ + 760, + 1 + ], + [ + 761, + 1 + ], + [ + 762, + 1 + ], + [ + 763, + 1 + ], + [ + 764, + 1 + ], + [ + 765, + 1 + ], + [ + 766, + 1 + ], + [ + 767, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 736, + -1 + ], + [ + 737, + -1 + ], + [ + 738, + -1 + ], + [ + 739, + -1 + ], + [ + 740, + -1 + ], + [ + 741, + -1 + ], + [ + 742, + -1 + ], + [ + 743, + -1 + ], + [ + 744, + -1 + ], + [ + 745, + -1 + ], + [ + 746, + -1 + ], + [ + 747, + -1 + ], + [ + 748, + -1 + ], + [ + 749, + -1 + ], + [ + 750, + -1 + ], + [ + 751, + -1 + ], + [ + 752, + -1 + ], + [ + 753, + -1 + ], + [ + 754, + -1 + ], + [ + 755, + -1 + ], + [ + 756, + -1 + ], + [ + 757, + -1 + ], + [ + 758, + -1 + ], + [ + 759, + -1 + ], + [ + 760, + -1 + ], + [ + 761, + -1 + ], + [ + 762, + -1 + ], + [ + 763, + -1 + ], + [ + 764, + -1 + ], + [ + 765, + -1 + ], + [ + 766, + -1 + ], + [ + 767, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 768, + 1 + ], + [ + 769, + 1 + ], + [ + 770, + 1 + ], + [ + 771, + 1 + ], + [ + 772, + 1 + ], + [ + 773, + 1 + ], + [ + 774, + 1 + ], + [ + 775, + 1 + ], + [ + 776, + 1 + ], + [ + 777, + 1 + ], + [ + 778, + 1 + ], + [ + 779, + 1 + ], + [ + 780, + 1 + ], + [ + 781, + 1 + ], + [ + 782, + 1 + ], + [ + 783, + 1 + ], + [ + 784, + 1 + ], + [ + 785, + 1 + ], + [ + 786, + 1 + ], + [ + 787, + 1 + ], + [ + 788, + 1 + ], + [ + 789, + 1 + ], + [ + 790, + 1 + ], + [ + 791, + 1 + ], + [ + 792, + 1 + ], + [ + 793, + 1 + ], + [ + 794, + 1 + ], + [ + 795, + 1 + ], + [ + 796, + 1 + ], + [ + 797, + 1 + ], + [ + 798, + 1 + ], + [ + 799, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 768, + -1 + ], + [ + 769, + -1 + ], + [ + 770, + -1 + ], + [ + 771, + -1 + ], + [ + 772, + -1 + ], + [ + 773, + -1 + ], + [ + 774, + -1 + ], + [ + 775, + -1 + ], + [ + 776, + -1 + ], + [ + 777, + -1 + ], + [ + 778, + -1 + ], + [ + 779, + -1 + ], + [ + 780, + -1 + ], + [ + 781, + -1 + ], + [ + 782, + -1 + ], + [ + 783, + -1 + ], + [ + 784, + -1 + ], + [ + 785, + -1 + ], + [ + 786, + -1 + ], + [ + 787, + -1 + ], + [ + 788, + -1 + ], + [ + 789, + -1 + ], + [ + 790, + -1 + ], + [ + 791, + -1 + ], + [ + 792, + -1 + ], + [ + 793, + -1 + ], + [ + 794, + -1 + ], + [ + 795, + -1 + ], + [ + 796, + -1 + ], + [ + 797, + -1 + ], + [ + 798, + -1 + ], + [ + 799, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 800, + 1 + ], + [ + 801, + 1 + ], + [ + 802, + 1 + ], + [ + 803, + 1 + ], + [ + 804, + 1 + ], + [ + 805, + 1 + ], + [ + 806, + 1 + ], + [ + 807, + 1 + ], + [ + 808, + 1 + ], + [ + 809, + 1 + ], + [ + 810, + 1 + ], + [ + 811, + 1 + ], + [ + 812, + 1 + ], + [ + 813, + 1 + ], + [ + 814, + 1 + ], + [ + 815, + 1 + ], + [ + 816, + 1 + ], + [ + 817, + 1 + ], + [ + 818, + 1 + ], + [ + 819, + 1 + ], + [ + 820, + 1 + ], + [ + 821, + 1 + ], + [ + 822, + 1 + ], + [ + 823, + 1 + ], + [ + 824, + 1 + ], + [ + 825, + 1 + ], + [ + 826, + 1 + ], + [ + 827, + 1 + ], + [ + 828, + 1 + ], + [ + 829, + 1 + ], + [ + 830, + 1 + ], + [ + 831, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 800, + -1 + ], + [ + 801, + -1 + ], + [ + 802, + -1 + ], + [ + 803, + -1 + ], + [ + 804, + -1 + ], + [ + 805, + -1 + ], + [ + 806, + -1 + ], + [ + 807, + -1 + ], + [ + 808, + -1 + ], + [ + 809, + -1 + ], + [ + 810, + -1 + ], + [ + 811, + -1 + ], + [ + 812, + -1 + ], + [ + 813, + -1 + ], + [ + 814, + -1 + ], + [ + 815, + -1 + ], + [ + 816, + -1 + ], + [ + 817, + -1 + ], + [ + 818, + -1 + ], + [ + 819, + -1 + ], + [ + 820, + -1 + ], + [ + 821, + -1 + ], + [ + 822, + -1 + ], + [ + 823, + -1 + ], + [ + 824, + -1 + ], + [ + 825, + -1 + ], + [ + 826, + -1 + ], + [ + 827, + -1 + ], + [ + 828, + -1 + ], + [ + 829, + -1 + ], + [ + 830, + -1 + ], + [ + 831, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 832, + 1 + ], + [ + 833, + 1 + ], + [ + 834, + 1 + ], + [ + 835, + 1 + ], + [ + 836, + 1 + ], + [ + 837, + 1 + ], + [ + 838, + 1 + ], + [ + 839, + 1 + ], + [ + 840, + 1 + ], + [ + 841, + 1 + ], + [ + 842, + 1 + ], + [ + 843, + 1 + ], + [ + 844, + 1 + ], + [ + 845, + 1 + ], + [ + 846, + 1 + ], + [ + 847, + 1 + ], + [ + 848, + 1 + ], + [ + 849, + 1 + ], + [ + 850, + 1 + ], + [ + 851, + 1 + ], + [ + 852, + 1 + ], + [ + 853, + 1 + ], + [ + 854, + 1 + ], + [ + 855, + 1 + ], + [ + 856, + 1 + ], + [ + 857, + 1 + ], + [ + 858, + 1 + ], + [ + 859, + 1 + ], + [ + 860, + 1 + ], + [ + 861, + 1 + ], + [ + 862, + 1 + ], + [ + 863, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 832, + -1 + ], + [ + 833, + -1 + ], + [ + 834, + -1 + ], + [ + 835, + -1 + ], + [ + 836, + -1 + ], + [ + 837, + -1 + ], + [ + 838, + -1 + ], + [ + 839, + -1 + ], + [ + 840, + -1 + ], + [ + 841, + -1 + ], + [ + 842, + -1 + ], + [ + 843, + -1 + ], + [ + 844, + -1 + ], + [ + 845, + -1 + ], + [ + 846, + -1 + ], + [ + 847, + -1 + ], + [ + 848, + -1 + ], + [ + 849, + -1 + ], + [ + 850, + -1 + ], + [ + 851, + -1 + ], + [ + 852, + -1 + ], + [ + 853, + -1 + ], + [ + 854, + -1 + ], + [ + 855, + -1 + ], + [ + 856, + -1 + ], + [ + 857, + -1 + ], + [ + 858, + -1 + ], + [ + 859, + -1 + ], + [ + 860, + -1 + ], + [ + 861, + -1 + ], + [ + 862, + -1 + ], + [ + 863, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 864, + 1 + ], + [ + 865, + 1 + ], + [ + 866, + 1 + ], + [ + 867, + 1 + ], + [ + 868, + 1 + ], + [ + 869, + 1 + ], + [ + 870, + 1 + ], + [ + 871, + 1 + ], + [ + 872, + 1 + ], + [ + 873, + 1 + ], + [ + 874, + 1 + ], + [ + 875, + 1 + ], + [ + 876, + 1 + ], + [ + 877, + 1 + ], + [ + 878, + 1 + ], + [ + 879, + 1 + ], + [ + 880, + 1 + ], + [ + 881, + 1 + ], + [ + 882, + 1 + ], + [ + 883, + 1 + ], + [ + 884, + 1 + ], + [ + 885, + 1 + ], + [ + 886, + 1 + ], + [ + 887, + 1 + ], + [ + 888, + 1 + ], + [ + 889, + 1 + ], + [ + 890, + 1 + ], + [ + 891, + 1 + ], + [ + 892, + 1 + ], + [ + 893, + 1 + ], + [ + 894, + 1 + ], + [ + 895, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 864, + -1 + ], + [ + 865, + -1 + ], + [ + 866, + -1 + ], + [ + 867, + -1 + ], + [ + 868, + -1 + ], + [ + 869, + -1 + ], + [ + 870, + -1 + ], + [ + 871, + -1 + ], + [ + 872, + -1 + ], + [ + 873, + -1 + ], + [ + 874, + -1 + ], + [ + 875, + -1 + ], + [ + 876, + -1 + ], + [ + 877, + -1 + ], + [ + 878, + -1 + ], + [ + 879, + -1 + ], + [ + 880, + -1 + ], + [ + 881, + -1 + ], + [ + 882, + -1 + ], + [ + 883, + -1 + ], + [ + 884, + -1 + ], + [ + 885, + -1 + ], + [ + 886, + -1 + ], + [ + 887, + -1 + ], + [ + 888, + -1 + ], + [ + 889, + -1 + ], + [ + 890, + -1 + ], + [ + 891, + -1 + ], + [ + 892, + -1 + ], + [ + 893, + -1 + ], + [ + 894, + -1 + ], + [ + 895, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 896, + 1 + ], + [ + 897, + 1 + ], + [ + 898, + 1 + ], + [ + 899, + 1 + ], + [ + 900, + 1 + ], + [ + 901, + 1 + ], + [ + 902, + 1 + ], + [ + 903, + 1 + ], + [ + 904, + 1 + ], + [ + 905, + 1 + ], + [ + 906, + 1 + ], + [ + 907, + 1 + ], + [ + 908, + 1 + ], + [ + 909, + 1 + ], + [ + 910, + 1 + ], + [ + 911, + 1 + ], + [ + 912, + 1 + ], + [ + 913, + 1 + ], + [ + 914, + 1 + ], + [ + 915, + 1 + ], + [ + 916, + 1 + ], + [ + 917, + 1 + ], + [ + 918, + 1 + ], + [ + 919, + 1 + ], + [ + 920, + 1 + ], + [ + 921, + 1 + ], + [ + 922, + 1 + ], + [ + 923, + 1 + ], + [ + 924, + 1 + ], + [ + 925, + 1 + ], + [ + 926, + 1 + ], + [ + 927, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 896, + -1 + ], + [ + 897, + -1 + ], + [ + 898, + -1 + ], + [ + 899, + -1 + ], + [ + 900, + -1 + ], + [ + 901, + -1 + ], + [ + 902, + -1 + ], + [ + 903, + -1 + ], + [ + 904, + -1 + ], + [ + 905, + -1 + ], + [ + 906, + -1 + ], + [ + 907, + -1 + ], + [ + 908, + -1 + ], + [ + 909, + -1 + ], + [ + 910, + -1 + ], + [ + 911, + -1 + ], + [ + 912, + -1 + ], + [ + 913, + -1 + ], + [ + 914, + -1 + ], + [ + 915, + -1 + ], + [ + 916, + -1 + ], + [ + 917, + -1 + ], + [ + 918, + -1 + ], + [ + 919, + -1 + ], + [ + 920, + -1 + ], + [ + 921, + -1 + ], + [ + 922, + -1 + ], + [ + 923, + -1 + ], + [ + 924, + -1 + ], + [ + 925, + -1 + ], + [ + 926, + -1 + ], + [ + 927, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 928, + 1 + ], + [ + 929, + 1 + ], + [ + 930, + 1 + ], + [ + 931, + 1 + ], + [ + 932, + 1 + ], + [ + 933, + 1 + ], + [ + 934, + 1 + ], + [ + 935, + 1 + ], + [ + 936, + 1 + ], + [ + 937, + 1 + ], + [ + 938, + 1 + ], + [ + 939, + 1 + ], + [ + 940, + 1 + ], + [ + 941, + 1 + ], + [ + 942, + 1 + ], + [ + 943, + 1 + ], + [ + 944, + 1 + ], + [ + 945, + 1 + ], + [ + 946, + 1 + ], + [ + 947, + 1 + ], + [ + 948, + 1 + ], + [ + 949, + 1 + ], + [ + 950, + 1 + ], + [ + 951, + 1 + ], + [ + 952, + 1 + ], + [ + 953, + 1 + ], + [ + 954, + 1 + ], + [ + 955, + 1 + ], + [ + 956, + 1 + ], + [ + 957, + 1 + ], + [ + 958, + 1 + ], + [ + 959, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 928, + -1 + ], + [ + 929, + -1 + ], + [ + 930, + -1 + ], + [ + 931, + -1 + ], + [ + 932, + -1 + ], + [ + 933, + -1 + ], + [ + 934, + -1 + ], + [ + 935, + -1 + ], + [ + 936, + -1 + ], + [ + 937, + -1 + ], + [ + 938, + -1 + ], + [ + 939, + -1 + ], + [ + 940, + -1 + ], + [ + 941, + -1 + ], + [ + 942, + -1 + ], + [ + 943, + -1 + ], + [ + 944, + -1 + ], + [ + 945, + -1 + ], + [ + 946, + -1 + ], + [ + 947, + -1 + ], + [ + 948, + -1 + ], + [ + 949, + -1 + ], + [ + 950, + -1 + ], + [ + 951, + -1 + ], + [ + 952, + -1 + ], + [ + 953, + -1 + ], + [ + 954, + -1 + ], + [ + 955, + -1 + ], + [ + 956, + -1 + ], + [ + 957, + -1 + ], + [ + 958, + -1 + ], + [ + 959, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 960, + 1 + ], + [ + 961, + 1 + ], + [ + 962, + 1 + ], + [ + 963, + 1 + ], + [ + 964, + 1 + ], + [ + 965, + 1 + ], + [ + 966, + 1 + ], + [ + 967, + 1 + ], + [ + 968, + 1 + ], + [ + 969, + 1 + ], + [ + 970, + 1 + ], + [ + 971, + 1 + ], + [ + 972, + 1 + ], + [ + 973, + 1 + ], + [ + 974, + 1 + ], + [ + 975, + 1 + ], + [ + 976, + 1 + ], + [ + 977, + 1 + ], + [ + 978, + 1 + ], + [ + 979, + 1 + ], + [ + 980, + 1 + ], + [ + 981, + 1 + ], + [ + 982, + 1 + ], + [ + 983, + 1 + ], + [ + 984, + 1 + ], + [ + 985, + 1 + ], + [ + 986, + 1 + ], + [ + 987, + 1 + ], + [ + 988, + 1 + ], + [ + 989, + 1 + ], + [ + 990, + 1 + ], + [ + 991, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 960, + -1 + ], + [ + 961, + -1 + ], + [ + 962, + -1 + ], + [ + 963, + -1 + ], + [ + 964, + -1 + ], + [ + 965, + -1 + ], + [ + 966, + -1 + ], + [ + 967, + -1 + ], + [ + 968, + -1 + ], + [ + 969, + -1 + ], + [ + 970, + -1 + ], + [ + 971, + -1 + ], + [ + 972, + -1 + ], + [ + 973, + -1 + ], + [ + 974, + -1 + ], + [ + 975, + -1 + ], + [ + 976, + -1 + ], + [ + 977, + -1 + ], + [ + 978, + -1 + ], + [ + 979, + -1 + ], + [ + 980, + -1 + ], + [ + 981, + -1 + ], + [ + 982, + -1 + ], + [ + 983, + -1 + ], + [ + 984, + -1 + ], + [ + 985, + -1 + ], + [ + 986, + -1 + ], + [ + 987, + -1 + ], + [ + 988, + -1 + ], + [ + 989, + -1 + ], + [ + 990, + -1 + ], + [ + 991, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 992, + 1 + ], + [ + 993, + 1 + ], + [ + 994, + 1 + ], + [ + 995, + 1 + ], + [ + 996, + 1 + ], + [ + 997, + 1 + ], + [ + 998, + 1 + ], + [ + 999, + 1 + ], + [ + 1000, + 1 + ], + [ + 1001, + 1 + ], + [ + 1002, + 1 + ], + [ + 1003, + 1 + ], + [ + 1004, + 1 + ], + [ + 1005, + 1 + ], + [ + 1006, + 1 + ], + [ + 1007, + 1 + ], + [ + 1008, + 1 + ], + [ + 1009, + 1 + ], + [ + 1010, + 1 + ], + [ + 1011, + 1 + ], + [ + 1012, + 1 + ], + [ + 1013, + 1 + ], + [ + 1014, + 1 + ], + [ + 1015, + 1 + ], + [ + 1016, + 1 + ], + [ + 1017, + 1 + ], + [ + 1018, + 1 + ], + [ + 1019, + 1 + ], + [ + 1020, + 1 + ], + [ + 1021, + 1 + ], + [ + 1022, + 1 + ], + [ + 1023, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 992, + -1 + ], + [ + 993, + -1 + ], + [ + 994, + -1 + ], + [ + 995, + -1 + ], + [ + 996, + -1 + ], + [ + 997, + -1 + ], + [ + 998, + -1 + ], + [ + 999, + -1 + ], + [ + 1000, + -1 + ], + [ + 1001, + -1 + ], + [ + 1002, + -1 + ], + [ + 1003, + -1 + ], + [ + 1004, + -1 + ], + [ + 1005, + -1 + ], + [ + 1006, + -1 + ], + [ + 1007, + -1 + ], + [ + 1008, + -1 + ], + [ + 1009, + -1 + ], + [ + 1010, + -1 + ], + [ + 1011, + -1 + ], + [ + 1012, + -1 + ], + [ + 1013, + -1 + ], + [ + 1014, + -1 + ], + [ + 1015, + -1 + ], + [ + 1016, + -1 + ], + [ + 1017, + -1 + ], + [ + 1018, + -1 + ], + [ + 1019, + -1 + ], + [ + 1020, + -1 + ], + [ + 1021, + -1 + ], + [ + 1022, + -1 + ], + [ + 1023, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 32, + 1 + ], + [ + 64, + 1 + ], + [ + 96, + 1 + ], + [ + 128, + 1 + ], + [ + 160, + 1 + ], + [ + 192, + 1 + ], + [ + 224, + 1 + ], + [ + 256, + 1 + ], + [ + 288, + 1 + ], + [ + 320, + 1 + ], + [ + 352, + 1 + ], + [ + 384, + 1 + ], + [ + 416, + 1 + ], + [ + 448, + 1 + ], + [ + 480, + 1 + ], + [ + 512, + 1 + ], + [ + 544, + 1 + ], + [ + 576, + 1 + ], + [ + 608, + 1 + ], + [ + 640, + 1 + ], + [ + 672, + 1 + ], + [ + 704, + 1 + ], + [ + 736, + 1 + ], + [ + 768, + 1 + ], + [ + 800, + 1 + ], + [ + 832, + 1 + ], + [ + 864, + 1 + ], + [ + 896, + 1 + ], + [ + 928, + 1 + ], + [ + 960, + 1 + ], + [ + 992, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 32, + -1 + ], + [ + 64, + -1 + ], + [ + 96, + -1 + ], + [ + 128, + -1 + ], + [ + 160, + -1 + ], + [ + 192, + -1 + ], + [ + 224, + -1 + ], + [ + 256, + -1 + ], + [ + 288, + -1 + ], + [ + 320, + -1 + ], + [ + 352, + -1 + ], + [ + 384, + -1 + ], + [ + 416, + -1 + ], + [ + 448, + -1 + ], + [ + 480, + -1 + ], + [ + 512, + -1 + ], + [ + 544, + -1 + ], + [ + 576, + -1 + ], + [ + 608, + -1 + ], + [ + 640, + -1 + ], + [ + 672, + -1 + ], + [ + 704, + -1 + ], + [ + 736, + -1 + ], + [ + 768, + -1 + ], + [ + 800, + -1 + ], + [ + 832, + -1 + ], + [ + 864, + -1 + ], + [ + 896, + -1 + ], + [ + 928, + -1 + ], + [ + 960, + -1 + ], + [ + 992, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 33, + 1 + ], + [ + 65, + 1 + ], + [ + 97, + 1 + ], + [ + 129, + 1 + ], + [ + 161, + 1 + ], + [ + 193, + 1 + ], + [ + 225, + 1 + ], + [ + 257, + 1 + ], + [ + 289, + 1 + ], + [ + 321, + 1 + ], + [ + 353, + 1 + ], + [ + 385, + 1 + ], + [ + 417, + 1 + ], + [ + 449, + 1 + ], + [ + 481, + 1 + ], + [ + 513, + 1 + ], + [ + 545, + 1 + ], + [ + 577, + 1 + ], + [ + 609, + 1 + ], + [ + 641, + 1 + ], + [ + 673, + 1 + ], + [ + 705, + 1 + ], + [ + 737, + 1 + ], + [ + 769, + 1 + ], + [ + 801, + 1 + ], + [ + 833, + 1 + ], + [ + 865, + 1 + ], + [ + 897, + 1 + ], + [ + 929, + 1 + ], + [ + 961, + 1 + ], + [ + 993, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 33, + -1 + ], + [ + 65, + -1 + ], + [ + 97, + -1 + ], + [ + 129, + -1 + ], + [ + 161, + -1 + ], + [ + 193, + -1 + ], + [ + 225, + -1 + ], + [ + 257, + -1 + ], + [ + 289, + -1 + ], + [ + 321, + -1 + ], + [ + 353, + -1 + ], + [ + 385, + -1 + ], + [ + 417, + -1 + ], + [ + 449, + -1 + ], + [ + 481, + -1 + ], + [ + 513, + -1 + ], + [ + 545, + -1 + ], + [ + 577, + -1 + ], + [ + 609, + -1 + ], + [ + 641, + -1 + ], + [ + 673, + -1 + ], + [ + 705, + -1 + ], + [ + 737, + -1 + ], + [ + 769, + -1 + ], + [ + 801, + -1 + ], + [ + 833, + -1 + ], + [ + 865, + -1 + ], + [ + 897, + -1 + ], + [ + 929, + -1 + ], + [ + 961, + -1 + ], + [ + 993, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 34, + 1 + ], + [ + 66, + 1 + ], + [ + 98, + 1 + ], + [ + 130, + 1 + ], + [ + 162, + 1 + ], + [ + 194, + 1 + ], + [ + 226, + 1 + ], + [ + 258, + 1 + ], + [ + 290, + 1 + ], + [ + 322, + 1 + ], + [ + 354, + 1 + ], + [ + 386, + 1 + ], + [ + 418, + 1 + ], + [ + 450, + 1 + ], + [ + 482, + 1 + ], + [ + 514, + 1 + ], + [ + 546, + 1 + ], + [ + 578, + 1 + ], + [ + 610, + 1 + ], + [ + 642, + 1 + ], + [ + 674, + 1 + ], + [ + 706, + 1 + ], + [ + 738, + 1 + ], + [ + 770, + 1 + ], + [ + 802, + 1 + ], + [ + 834, + 1 + ], + [ + 866, + 1 + ], + [ + 898, + 1 + ], + [ + 930, + 1 + ], + [ + 962, + 1 + ], + [ + 994, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 34, + -1 + ], + [ + 66, + -1 + ], + [ + 98, + -1 + ], + [ + 130, + -1 + ], + [ + 162, + -1 + ], + [ + 194, + -1 + ], + [ + 226, + -1 + ], + [ + 258, + -1 + ], + [ + 290, + -1 + ], + [ + 322, + -1 + ], + [ + 354, + -1 + ], + [ + 386, + -1 + ], + [ + 418, + -1 + ], + [ + 450, + -1 + ], + [ + 482, + -1 + ], + [ + 514, + -1 + ], + [ + 546, + -1 + ], + [ + 578, + -1 + ], + [ + 610, + -1 + ], + [ + 642, + -1 + ], + [ + 674, + -1 + ], + [ + 706, + -1 + ], + [ + 738, + -1 + ], + [ + 770, + -1 + ], + [ + 802, + -1 + ], + [ + 834, + -1 + ], + [ + 866, + -1 + ], + [ + 898, + -1 + ], + [ + 930, + -1 + ], + [ + 962, + -1 + ], + [ + 994, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 35, + 1 + ], + [ + 67, + 1 + ], + [ + 99, + 1 + ], + [ + 131, + 1 + ], + [ + 163, + 1 + ], + [ + 195, + 1 + ], + [ + 227, + 1 + ], + [ + 259, + 1 + ], + [ + 291, + 1 + ], + [ + 323, + 1 + ], + [ + 355, + 1 + ], + [ + 387, + 1 + ], + [ + 419, + 1 + ], + [ + 451, + 1 + ], + [ + 483, + 1 + ], + [ + 515, + 1 + ], + [ + 547, + 1 + ], + [ + 579, + 1 + ], + [ + 611, + 1 + ], + [ + 643, + 1 + ], + [ + 675, + 1 + ], + [ + 707, + 1 + ], + [ + 739, + 1 + ], + [ + 771, + 1 + ], + [ + 803, + 1 + ], + [ + 835, + 1 + ], + [ + 867, + 1 + ], + [ + 899, + 1 + ], + [ + 931, + 1 + ], + [ + 963, + 1 + ], + [ + 995, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 35, + -1 + ], + [ + 67, + -1 + ], + [ + 99, + -1 + ], + [ + 131, + -1 + ], + [ + 163, + -1 + ], + [ + 195, + -1 + ], + [ + 227, + -1 + ], + [ + 259, + -1 + ], + [ + 291, + -1 + ], + [ + 323, + -1 + ], + [ + 355, + -1 + ], + [ + 387, + -1 + ], + [ + 419, + -1 + ], + [ + 451, + -1 + ], + [ + 483, + -1 + ], + [ + 515, + -1 + ], + [ + 547, + -1 + ], + [ + 579, + -1 + ], + [ + 611, + -1 + ], + [ + 643, + -1 + ], + [ + 675, + -1 + ], + [ + 707, + -1 + ], + [ + 739, + -1 + ], + [ + 771, + -1 + ], + [ + 803, + -1 + ], + [ + 835, + -1 + ], + [ + 867, + -1 + ], + [ + 899, + -1 + ], + [ + 931, + -1 + ], + [ + 963, + -1 + ], + [ + 995, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 36, + 1 + ], + [ + 68, + 1 + ], + [ + 100, + 1 + ], + [ + 132, + 1 + ], + [ + 164, + 1 + ], + [ + 196, + 1 + ], + [ + 228, + 1 + ], + [ + 260, + 1 + ], + [ + 292, + 1 + ], + [ + 324, + 1 + ], + [ + 356, + 1 + ], + [ + 388, + 1 + ], + [ + 420, + 1 + ], + [ + 452, + 1 + ], + [ + 484, + 1 + ], + [ + 516, + 1 + ], + [ + 548, + 1 + ], + [ + 580, + 1 + ], + [ + 612, + 1 + ], + [ + 644, + 1 + ], + [ + 676, + 1 + ], + [ + 708, + 1 + ], + [ + 740, + 1 + ], + [ + 772, + 1 + ], + [ + 804, + 1 + ], + [ + 836, + 1 + ], + [ + 868, + 1 + ], + [ + 900, + 1 + ], + [ + 932, + 1 + ], + [ + 964, + 1 + ], + [ + 996, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 36, + -1 + ], + [ + 68, + -1 + ], + [ + 100, + -1 + ], + [ + 132, + -1 + ], + [ + 164, + -1 + ], + [ + 196, + -1 + ], + [ + 228, + -1 + ], + [ + 260, + -1 + ], + [ + 292, + -1 + ], + [ + 324, + -1 + ], + [ + 356, + -1 + ], + [ + 388, + -1 + ], + [ + 420, + -1 + ], + [ + 452, + -1 + ], + [ + 484, + -1 + ], + [ + 516, + -1 + ], + [ + 548, + -1 + ], + [ + 580, + -1 + ], + [ + 612, + -1 + ], + [ + 644, + -1 + ], + [ + 676, + -1 + ], + [ + 708, + -1 + ], + [ + 740, + -1 + ], + [ + 772, + -1 + ], + [ + 804, + -1 + ], + [ + 836, + -1 + ], + [ + 868, + -1 + ], + [ + 900, + -1 + ], + [ + 932, + -1 + ], + [ + 964, + -1 + ], + [ + 996, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 37, + 1 + ], + [ + 69, + 1 + ], + [ + 101, + 1 + ], + [ + 133, + 1 + ], + [ + 165, + 1 + ], + [ + 197, + 1 + ], + [ + 229, + 1 + ], + [ + 261, + 1 + ], + [ + 293, + 1 + ], + [ + 325, + 1 + ], + [ + 357, + 1 + ], + [ + 389, + 1 + ], + [ + 421, + 1 + ], + [ + 453, + 1 + ], + [ + 485, + 1 + ], + [ + 517, + 1 + ], + [ + 549, + 1 + ], + [ + 581, + 1 + ], + [ + 613, + 1 + ], + [ + 645, + 1 + ], + [ + 677, + 1 + ], + [ + 709, + 1 + ], + [ + 741, + 1 + ], + [ + 773, + 1 + ], + [ + 805, + 1 + ], + [ + 837, + 1 + ], + [ + 869, + 1 + ], + [ + 901, + 1 + ], + [ + 933, + 1 + ], + [ + 965, + 1 + ], + [ + 997, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 37, + -1 + ], + [ + 69, + -1 + ], + [ + 101, + -1 + ], + [ + 133, + -1 + ], + [ + 165, + -1 + ], + [ + 197, + -1 + ], + [ + 229, + -1 + ], + [ + 261, + -1 + ], + [ + 293, + -1 + ], + [ + 325, + -1 + ], + [ + 357, + -1 + ], + [ + 389, + -1 + ], + [ + 421, + -1 + ], + [ + 453, + -1 + ], + [ + 485, + -1 + ], + [ + 517, + -1 + ], + [ + 549, + -1 + ], + [ + 581, + -1 + ], + [ + 613, + -1 + ], + [ + 645, + -1 + ], + [ + 677, + -1 + ], + [ + 709, + -1 + ], + [ + 741, + -1 + ], + [ + 773, + -1 + ], + [ + 805, + -1 + ], + [ + 837, + -1 + ], + [ + 869, + -1 + ], + [ + 901, + -1 + ], + [ + 933, + -1 + ], + [ + 965, + -1 + ], + [ + 997, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 38, + 1 + ], + [ + 70, + 1 + ], + [ + 102, + 1 + ], + [ + 134, + 1 + ], + [ + 166, + 1 + ], + [ + 198, + 1 + ], + [ + 230, + 1 + ], + [ + 262, + 1 + ], + [ + 294, + 1 + ], + [ + 326, + 1 + ], + [ + 358, + 1 + ], + [ + 390, + 1 + ], + [ + 422, + 1 + ], + [ + 454, + 1 + ], + [ + 486, + 1 + ], + [ + 518, + 1 + ], + [ + 550, + 1 + ], + [ + 582, + 1 + ], + [ + 614, + 1 + ], + [ + 646, + 1 + ], + [ + 678, + 1 + ], + [ + 710, + 1 + ], + [ + 742, + 1 + ], + [ + 774, + 1 + ], + [ + 806, + 1 + ], + [ + 838, + 1 + ], + [ + 870, + 1 + ], + [ + 902, + 1 + ], + [ + 934, + 1 + ], + [ + 966, + 1 + ], + [ + 998, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 38, + -1 + ], + [ + 70, + -1 + ], + [ + 102, + -1 + ], + [ + 134, + -1 + ], + [ + 166, + -1 + ], + [ + 198, + -1 + ], + [ + 230, + -1 + ], + [ + 262, + -1 + ], + [ + 294, + -1 + ], + [ + 326, + -1 + ], + [ + 358, + -1 + ], + [ + 390, + -1 + ], + [ + 422, + -1 + ], + [ + 454, + -1 + ], + [ + 486, + -1 + ], + [ + 518, + -1 + ], + [ + 550, + -1 + ], + [ + 582, + -1 + ], + [ + 614, + -1 + ], + [ + 646, + -1 + ], + [ + 678, + -1 + ], + [ + 710, + -1 + ], + [ + 742, + -1 + ], + [ + 774, + -1 + ], + [ + 806, + -1 + ], + [ + 838, + -1 + ], + [ + 870, + -1 + ], + [ + 902, + -1 + ], + [ + 934, + -1 + ], + [ + 966, + -1 + ], + [ + 998, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 39, + 1 + ], + [ + 71, + 1 + ], + [ + 103, + 1 + ], + [ + 135, + 1 + ], + [ + 167, + 1 + ], + [ + 199, + 1 + ], + [ + 231, + 1 + ], + [ + 263, + 1 + ], + [ + 295, + 1 + ], + [ + 327, + 1 + ], + [ + 359, + 1 + ], + [ + 391, + 1 + ], + [ + 423, + 1 + ], + [ + 455, + 1 + ], + [ + 487, + 1 + ], + [ + 519, + 1 + ], + [ + 551, + 1 + ], + [ + 583, + 1 + ], + [ + 615, + 1 + ], + [ + 647, + 1 + ], + [ + 679, + 1 + ], + [ + 711, + 1 + ], + [ + 743, + 1 + ], + [ + 775, + 1 + ], + [ + 807, + 1 + ], + [ + 839, + 1 + ], + [ + 871, + 1 + ], + [ + 903, + 1 + ], + [ + 935, + 1 + ], + [ + 967, + 1 + ], + [ + 999, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 39, + -1 + ], + [ + 71, + -1 + ], + [ + 103, + -1 + ], + [ + 135, + -1 + ], + [ + 167, + -1 + ], + [ + 199, + -1 + ], + [ + 231, + -1 + ], + [ + 263, + -1 + ], + [ + 295, + -1 + ], + [ + 327, + -1 + ], + [ + 359, + -1 + ], + [ + 391, + -1 + ], + [ + 423, + -1 + ], + [ + 455, + -1 + ], + [ + 487, + -1 + ], + [ + 519, + -1 + ], + [ + 551, + -1 + ], + [ + 583, + -1 + ], + [ + 615, + -1 + ], + [ + 647, + -1 + ], + [ + 679, + -1 + ], + [ + 711, + -1 + ], + [ + 743, + -1 + ], + [ + 775, + -1 + ], + [ + 807, + -1 + ], + [ + 839, + -1 + ], + [ + 871, + -1 + ], + [ + 903, + -1 + ], + [ + 935, + -1 + ], + [ + 967, + -1 + ], + [ + 999, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 40, + 1 + ], + [ + 72, + 1 + ], + [ + 104, + 1 + ], + [ + 136, + 1 + ], + [ + 168, + 1 + ], + [ + 200, + 1 + ], + [ + 232, + 1 + ], + [ + 264, + 1 + ], + [ + 296, + 1 + ], + [ + 328, + 1 + ], + [ + 360, + 1 + ], + [ + 392, + 1 + ], + [ + 424, + 1 + ], + [ + 456, + 1 + ], + [ + 488, + 1 + ], + [ + 520, + 1 + ], + [ + 552, + 1 + ], + [ + 584, + 1 + ], + [ + 616, + 1 + ], + [ + 648, + 1 + ], + [ + 680, + 1 + ], + [ + 712, + 1 + ], + [ + 744, + 1 + ], + [ + 776, + 1 + ], + [ + 808, + 1 + ], + [ + 840, + 1 + ], + [ + 872, + 1 + ], + [ + 904, + 1 + ], + [ + 936, + 1 + ], + [ + 968, + 1 + ], + [ + 1000, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 40, + -1 + ], + [ + 72, + -1 + ], + [ + 104, + -1 + ], + [ + 136, + -1 + ], + [ + 168, + -1 + ], + [ + 200, + -1 + ], + [ + 232, + -1 + ], + [ + 264, + -1 + ], + [ + 296, + -1 + ], + [ + 328, + -1 + ], + [ + 360, + -1 + ], + [ + 392, + -1 + ], + [ + 424, + -1 + ], + [ + 456, + -1 + ], + [ + 488, + -1 + ], + [ + 520, + -1 + ], + [ + 552, + -1 + ], + [ + 584, + -1 + ], + [ + 616, + -1 + ], + [ + 648, + -1 + ], + [ + 680, + -1 + ], + [ + 712, + -1 + ], + [ + 744, + -1 + ], + [ + 776, + -1 + ], + [ + 808, + -1 + ], + [ + 840, + -1 + ], + [ + 872, + -1 + ], + [ + 904, + -1 + ], + [ + 936, + -1 + ], + [ + 968, + -1 + ], + [ + 1000, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 41, + 1 + ], + [ + 73, + 1 + ], + [ + 105, + 1 + ], + [ + 137, + 1 + ], + [ + 169, + 1 + ], + [ + 201, + 1 + ], + [ + 233, + 1 + ], + [ + 265, + 1 + ], + [ + 297, + 1 + ], + [ + 329, + 1 + ], + [ + 361, + 1 + ], + [ + 393, + 1 + ], + [ + 425, + 1 + ], + [ + 457, + 1 + ], + [ + 489, + 1 + ], + [ + 521, + 1 + ], + [ + 553, + 1 + ], + [ + 585, + 1 + ], + [ + 617, + 1 + ], + [ + 649, + 1 + ], + [ + 681, + 1 + ], + [ + 713, + 1 + ], + [ + 745, + 1 + ], + [ + 777, + 1 + ], + [ + 809, + 1 + ], + [ + 841, + 1 + ], + [ + 873, + 1 + ], + [ + 905, + 1 + ], + [ + 937, + 1 + ], + [ + 969, + 1 + ], + [ + 1001, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 41, + -1 + ], + [ + 73, + -1 + ], + [ + 105, + -1 + ], + [ + 137, + -1 + ], + [ + 169, + -1 + ], + [ + 201, + -1 + ], + [ + 233, + -1 + ], + [ + 265, + -1 + ], + [ + 297, + -1 + ], + [ + 329, + -1 + ], + [ + 361, + -1 + ], + [ + 393, + -1 + ], + [ + 425, + -1 + ], + [ + 457, + -1 + ], + [ + 489, + -1 + ], + [ + 521, + -1 + ], + [ + 553, + -1 + ], + [ + 585, + -1 + ], + [ + 617, + -1 + ], + [ + 649, + -1 + ], + [ + 681, + -1 + ], + [ + 713, + -1 + ], + [ + 745, + -1 + ], + [ + 777, + -1 + ], + [ + 809, + -1 + ], + [ + 841, + -1 + ], + [ + 873, + -1 + ], + [ + 905, + -1 + ], + [ + 937, + -1 + ], + [ + 969, + -1 + ], + [ + 1001, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 42, + 1 + ], + [ + 74, + 1 + ], + [ + 106, + 1 + ], + [ + 138, + 1 + ], + [ + 170, + 1 + ], + [ + 202, + 1 + ], + [ + 234, + 1 + ], + [ + 266, + 1 + ], + [ + 298, + 1 + ], + [ + 330, + 1 + ], + [ + 362, + 1 + ], + [ + 394, + 1 + ], + [ + 426, + 1 + ], + [ + 458, + 1 + ], + [ + 490, + 1 + ], + [ + 522, + 1 + ], + [ + 554, + 1 + ], + [ + 586, + 1 + ], + [ + 618, + 1 + ], + [ + 650, + 1 + ], + [ + 682, + 1 + ], + [ + 714, + 1 + ], + [ + 746, + 1 + ], + [ + 778, + 1 + ], + [ + 810, + 1 + ], + [ + 842, + 1 + ], + [ + 874, + 1 + ], + [ + 906, + 1 + ], + [ + 938, + 1 + ], + [ + 970, + 1 + ], + [ + 1002, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 42, + -1 + ], + [ + 74, + -1 + ], + [ + 106, + -1 + ], + [ + 138, + -1 + ], + [ + 170, + -1 + ], + [ + 202, + -1 + ], + [ + 234, + -1 + ], + [ + 266, + -1 + ], + [ + 298, + -1 + ], + [ + 330, + -1 + ], + [ + 362, + -1 + ], + [ + 394, + -1 + ], + [ + 426, + -1 + ], + [ + 458, + -1 + ], + [ + 490, + -1 + ], + [ + 522, + -1 + ], + [ + 554, + -1 + ], + [ + 586, + -1 + ], + [ + 618, + -1 + ], + [ + 650, + -1 + ], + [ + 682, + -1 + ], + [ + 714, + -1 + ], + [ + 746, + -1 + ], + [ + 778, + -1 + ], + [ + 810, + -1 + ], + [ + 842, + -1 + ], + [ + 874, + -1 + ], + [ + 906, + -1 + ], + [ + 938, + -1 + ], + [ + 970, + -1 + ], + [ + 1002, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 43, + 1 + ], + [ + 75, + 1 + ], + [ + 107, + 1 + ], + [ + 139, + 1 + ], + [ + 171, + 1 + ], + [ + 203, + 1 + ], + [ + 235, + 1 + ], + [ + 267, + 1 + ], + [ + 299, + 1 + ], + [ + 331, + 1 + ], + [ + 363, + 1 + ], + [ + 395, + 1 + ], + [ + 427, + 1 + ], + [ + 459, + 1 + ], + [ + 491, + 1 + ], + [ + 523, + 1 + ], + [ + 555, + 1 + ], + [ + 587, + 1 + ], + [ + 619, + 1 + ], + [ + 651, + 1 + ], + [ + 683, + 1 + ], + [ + 715, + 1 + ], + [ + 747, + 1 + ], + [ + 779, + 1 + ], + [ + 811, + 1 + ], + [ + 843, + 1 + ], + [ + 875, + 1 + ], + [ + 907, + 1 + ], + [ + 939, + 1 + ], + [ + 971, + 1 + ], + [ + 1003, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 43, + -1 + ], + [ + 75, + -1 + ], + [ + 107, + -1 + ], + [ + 139, + -1 + ], + [ + 171, + -1 + ], + [ + 203, + -1 + ], + [ + 235, + -1 + ], + [ + 267, + -1 + ], + [ + 299, + -1 + ], + [ + 331, + -1 + ], + [ + 363, + -1 + ], + [ + 395, + -1 + ], + [ + 427, + -1 + ], + [ + 459, + -1 + ], + [ + 491, + -1 + ], + [ + 523, + -1 + ], + [ + 555, + -1 + ], + [ + 587, + -1 + ], + [ + 619, + -1 + ], + [ + 651, + -1 + ], + [ + 683, + -1 + ], + [ + 715, + -1 + ], + [ + 747, + -1 + ], + [ + 779, + -1 + ], + [ + 811, + -1 + ], + [ + 843, + -1 + ], + [ + 875, + -1 + ], + [ + 907, + -1 + ], + [ + 939, + -1 + ], + [ + 971, + -1 + ], + [ + 1003, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 44, + 1 + ], + [ + 76, + 1 + ], + [ + 108, + 1 + ], + [ + 140, + 1 + ], + [ + 172, + 1 + ], + [ + 204, + 1 + ], + [ + 236, + 1 + ], + [ + 268, + 1 + ], + [ + 300, + 1 + ], + [ + 332, + 1 + ], + [ + 364, + 1 + ], + [ + 396, + 1 + ], + [ + 428, + 1 + ], + [ + 460, + 1 + ], + [ + 492, + 1 + ], + [ + 524, + 1 + ], + [ + 556, + 1 + ], + [ + 588, + 1 + ], + [ + 620, + 1 + ], + [ + 652, + 1 + ], + [ + 684, + 1 + ], + [ + 716, + 1 + ], + [ + 748, + 1 + ], + [ + 780, + 1 + ], + [ + 812, + 1 + ], + [ + 844, + 1 + ], + [ + 876, + 1 + ], + [ + 908, + 1 + ], + [ + 940, + 1 + ], + [ + 972, + 1 + ], + [ + 1004, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 44, + -1 + ], + [ + 76, + -1 + ], + [ + 108, + -1 + ], + [ + 140, + -1 + ], + [ + 172, + -1 + ], + [ + 204, + -1 + ], + [ + 236, + -1 + ], + [ + 268, + -1 + ], + [ + 300, + -1 + ], + [ + 332, + -1 + ], + [ + 364, + -1 + ], + [ + 396, + -1 + ], + [ + 428, + -1 + ], + [ + 460, + -1 + ], + [ + 492, + -1 + ], + [ + 524, + -1 + ], + [ + 556, + -1 + ], + [ + 588, + -1 + ], + [ + 620, + -1 + ], + [ + 652, + -1 + ], + [ + 684, + -1 + ], + [ + 716, + -1 + ], + [ + 748, + -1 + ], + [ + 780, + -1 + ], + [ + 812, + -1 + ], + [ + 844, + -1 + ], + [ + 876, + -1 + ], + [ + 908, + -1 + ], + [ + 940, + -1 + ], + [ + 972, + -1 + ], + [ + 1004, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 45, + 1 + ], + [ + 77, + 1 + ], + [ + 109, + 1 + ], + [ + 141, + 1 + ], + [ + 173, + 1 + ], + [ + 205, + 1 + ], + [ + 237, + 1 + ], + [ + 269, + 1 + ], + [ + 301, + 1 + ], + [ + 333, + 1 + ], + [ + 365, + 1 + ], + [ + 397, + 1 + ], + [ + 429, + 1 + ], + [ + 461, + 1 + ], + [ + 493, + 1 + ], + [ + 525, + 1 + ], + [ + 557, + 1 + ], + [ + 589, + 1 + ], + [ + 621, + 1 + ], + [ + 653, + 1 + ], + [ + 685, + 1 + ], + [ + 717, + 1 + ], + [ + 749, + 1 + ], + [ + 781, + 1 + ], + [ + 813, + 1 + ], + [ + 845, + 1 + ], + [ + 877, + 1 + ], + [ + 909, + 1 + ], + [ + 941, + 1 + ], + [ + 973, + 1 + ], + [ + 1005, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 45, + -1 + ], + [ + 77, + -1 + ], + [ + 109, + -1 + ], + [ + 141, + -1 + ], + [ + 173, + -1 + ], + [ + 205, + -1 + ], + [ + 237, + -1 + ], + [ + 269, + -1 + ], + [ + 301, + -1 + ], + [ + 333, + -1 + ], + [ + 365, + -1 + ], + [ + 397, + -1 + ], + [ + 429, + -1 + ], + [ + 461, + -1 + ], + [ + 493, + -1 + ], + [ + 525, + -1 + ], + [ + 557, + -1 + ], + [ + 589, + -1 + ], + [ + 621, + -1 + ], + [ + 653, + -1 + ], + [ + 685, + -1 + ], + [ + 717, + -1 + ], + [ + 749, + -1 + ], + [ + 781, + -1 + ], + [ + 813, + -1 + ], + [ + 845, + -1 + ], + [ + 877, + -1 + ], + [ + 909, + -1 + ], + [ + 941, + -1 + ], + [ + 973, + -1 + ], + [ + 1005, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 46, + 1 + ], + [ + 78, + 1 + ], + [ + 110, + 1 + ], + [ + 142, + 1 + ], + [ + 174, + 1 + ], + [ + 206, + 1 + ], + [ + 238, + 1 + ], + [ + 270, + 1 + ], + [ + 302, + 1 + ], + [ + 334, + 1 + ], + [ + 366, + 1 + ], + [ + 398, + 1 + ], + [ + 430, + 1 + ], + [ + 462, + 1 + ], + [ + 494, + 1 + ], + [ + 526, + 1 + ], + [ + 558, + 1 + ], + [ + 590, + 1 + ], + [ + 622, + 1 + ], + [ + 654, + 1 + ], + [ + 686, + 1 + ], + [ + 718, + 1 + ], + [ + 750, + 1 + ], + [ + 782, + 1 + ], + [ + 814, + 1 + ], + [ + 846, + 1 + ], + [ + 878, + 1 + ], + [ + 910, + 1 + ], + [ + 942, + 1 + ], + [ + 974, + 1 + ], + [ + 1006, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 46, + -1 + ], + [ + 78, + -1 + ], + [ + 110, + -1 + ], + [ + 142, + -1 + ], + [ + 174, + -1 + ], + [ + 206, + -1 + ], + [ + 238, + -1 + ], + [ + 270, + -1 + ], + [ + 302, + -1 + ], + [ + 334, + -1 + ], + [ + 366, + -1 + ], + [ + 398, + -1 + ], + [ + 430, + -1 + ], + [ + 462, + -1 + ], + [ + 494, + -1 + ], + [ + 526, + -1 + ], + [ + 558, + -1 + ], + [ + 590, + -1 + ], + [ + 622, + -1 + ], + [ + 654, + -1 + ], + [ + 686, + -1 + ], + [ + 718, + -1 + ], + [ + 750, + -1 + ], + [ + 782, + -1 + ], + [ + 814, + -1 + ], + [ + 846, + -1 + ], + [ + 878, + -1 + ], + [ + 910, + -1 + ], + [ + 942, + -1 + ], + [ + 974, + -1 + ], + [ + 1006, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 47, + 1 + ], + [ + 79, + 1 + ], + [ + 111, + 1 + ], + [ + 143, + 1 + ], + [ + 175, + 1 + ], + [ + 207, + 1 + ], + [ + 239, + 1 + ], + [ + 271, + 1 + ], + [ + 303, + 1 + ], + [ + 335, + 1 + ], + [ + 367, + 1 + ], + [ + 399, + 1 + ], + [ + 431, + 1 + ], + [ + 463, + 1 + ], + [ + 495, + 1 + ], + [ + 527, + 1 + ], + [ + 559, + 1 + ], + [ + 591, + 1 + ], + [ + 623, + 1 + ], + [ + 655, + 1 + ], + [ + 687, + 1 + ], + [ + 719, + 1 + ], + [ + 751, + 1 + ], + [ + 783, + 1 + ], + [ + 815, + 1 + ], + [ + 847, + 1 + ], + [ + 879, + 1 + ], + [ + 911, + 1 + ], + [ + 943, + 1 + ], + [ + 975, + 1 + ], + [ + 1007, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 47, + -1 + ], + [ + 79, + -1 + ], + [ + 111, + -1 + ], + [ + 143, + -1 + ], + [ + 175, + -1 + ], + [ + 207, + -1 + ], + [ + 239, + -1 + ], + [ + 271, + -1 + ], + [ + 303, + -1 + ], + [ + 335, + -1 + ], + [ + 367, + -1 + ], + [ + 399, + -1 + ], + [ + 431, + -1 + ], + [ + 463, + -1 + ], + [ + 495, + -1 + ], + [ + 527, + -1 + ], + [ + 559, + -1 + ], + [ + 591, + -1 + ], + [ + 623, + -1 + ], + [ + 655, + -1 + ], + [ + 687, + -1 + ], + [ + 719, + -1 + ], + [ + 751, + -1 + ], + [ + 783, + -1 + ], + [ + 815, + -1 + ], + [ + 847, + -1 + ], + [ + 879, + -1 + ], + [ + 911, + -1 + ], + [ + 943, + -1 + ], + [ + 975, + -1 + ], + [ + 1007, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 48, + 1 + ], + [ + 80, + 1 + ], + [ + 112, + 1 + ], + [ + 144, + 1 + ], + [ + 176, + 1 + ], + [ + 208, + 1 + ], + [ + 240, + 1 + ], + [ + 272, + 1 + ], + [ + 304, + 1 + ], + [ + 336, + 1 + ], + [ + 368, + 1 + ], + [ + 400, + 1 + ], + [ + 432, + 1 + ], + [ + 464, + 1 + ], + [ + 496, + 1 + ], + [ + 528, + 1 + ], + [ + 560, + 1 + ], + [ + 592, + 1 + ], + [ + 624, + 1 + ], + [ + 656, + 1 + ], + [ + 688, + 1 + ], + [ + 720, + 1 + ], + [ + 752, + 1 + ], + [ + 784, + 1 + ], + [ + 816, + 1 + ], + [ + 848, + 1 + ], + [ + 880, + 1 + ], + [ + 912, + 1 + ], + [ + 944, + 1 + ], + [ + 976, + 1 + ], + [ + 1008, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 48, + -1 + ], + [ + 80, + -1 + ], + [ + 112, + -1 + ], + [ + 144, + -1 + ], + [ + 176, + -1 + ], + [ + 208, + -1 + ], + [ + 240, + -1 + ], + [ + 272, + -1 + ], + [ + 304, + -1 + ], + [ + 336, + -1 + ], + [ + 368, + -1 + ], + [ + 400, + -1 + ], + [ + 432, + -1 + ], + [ + 464, + -1 + ], + [ + 496, + -1 + ], + [ + 528, + -1 + ], + [ + 560, + -1 + ], + [ + 592, + -1 + ], + [ + 624, + -1 + ], + [ + 656, + -1 + ], + [ + 688, + -1 + ], + [ + 720, + -1 + ], + [ + 752, + -1 + ], + [ + 784, + -1 + ], + [ + 816, + -1 + ], + [ + 848, + -1 + ], + [ + 880, + -1 + ], + [ + 912, + -1 + ], + [ + 944, + -1 + ], + [ + 976, + -1 + ], + [ + 1008, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 49, + 1 + ], + [ + 81, + 1 + ], + [ + 113, + 1 + ], + [ + 145, + 1 + ], + [ + 177, + 1 + ], + [ + 209, + 1 + ], + [ + 241, + 1 + ], + [ + 273, + 1 + ], + [ + 305, + 1 + ], + [ + 337, + 1 + ], + [ + 369, + 1 + ], + [ + 401, + 1 + ], + [ + 433, + 1 + ], + [ + 465, + 1 + ], + [ + 497, + 1 + ], + [ + 529, + 1 + ], + [ + 561, + 1 + ], + [ + 593, + 1 + ], + [ + 625, + 1 + ], + [ + 657, + 1 + ], + [ + 689, + 1 + ], + [ + 721, + 1 + ], + [ + 753, + 1 + ], + [ + 785, + 1 + ], + [ + 817, + 1 + ], + [ + 849, + 1 + ], + [ + 881, + 1 + ], + [ + 913, + 1 + ], + [ + 945, + 1 + ], + [ + 977, + 1 + ], + [ + 1009, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 49, + -1 + ], + [ + 81, + -1 + ], + [ + 113, + -1 + ], + [ + 145, + -1 + ], + [ + 177, + -1 + ], + [ + 209, + -1 + ], + [ + 241, + -1 + ], + [ + 273, + -1 + ], + [ + 305, + -1 + ], + [ + 337, + -1 + ], + [ + 369, + -1 + ], + [ + 401, + -1 + ], + [ + 433, + -1 + ], + [ + 465, + -1 + ], + [ + 497, + -1 + ], + [ + 529, + -1 + ], + [ + 561, + -1 + ], + [ + 593, + -1 + ], + [ + 625, + -1 + ], + [ + 657, + -1 + ], + [ + 689, + -1 + ], + [ + 721, + -1 + ], + [ + 753, + -1 + ], + [ + 785, + -1 + ], + [ + 817, + -1 + ], + [ + 849, + -1 + ], + [ + 881, + -1 + ], + [ + 913, + -1 + ], + [ + 945, + -1 + ], + [ + 977, + -1 + ], + [ + 1009, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 50, + 1 + ], + [ + 82, + 1 + ], + [ + 114, + 1 + ], + [ + 146, + 1 + ], + [ + 178, + 1 + ], + [ + 210, + 1 + ], + [ + 242, + 1 + ], + [ + 274, + 1 + ], + [ + 306, + 1 + ], + [ + 338, + 1 + ], + [ + 370, + 1 + ], + [ + 402, + 1 + ], + [ + 434, + 1 + ], + [ + 466, + 1 + ], + [ + 498, + 1 + ], + [ + 530, + 1 + ], + [ + 562, + 1 + ], + [ + 594, + 1 + ], + [ + 626, + 1 + ], + [ + 658, + 1 + ], + [ + 690, + 1 + ], + [ + 722, + 1 + ], + [ + 754, + 1 + ], + [ + 786, + 1 + ], + [ + 818, + 1 + ], + [ + 850, + 1 + ], + [ + 882, + 1 + ], + [ + 914, + 1 + ], + [ + 946, + 1 + ], + [ + 978, + 1 + ], + [ + 1010, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 50, + -1 + ], + [ + 82, + -1 + ], + [ + 114, + -1 + ], + [ + 146, + -1 + ], + [ + 178, + -1 + ], + [ + 210, + -1 + ], + [ + 242, + -1 + ], + [ + 274, + -1 + ], + [ + 306, + -1 + ], + [ + 338, + -1 + ], + [ + 370, + -1 + ], + [ + 402, + -1 + ], + [ + 434, + -1 + ], + [ + 466, + -1 + ], + [ + 498, + -1 + ], + [ + 530, + -1 + ], + [ + 562, + -1 + ], + [ + 594, + -1 + ], + [ + 626, + -1 + ], + [ + 658, + -1 + ], + [ + 690, + -1 + ], + [ + 722, + -1 + ], + [ + 754, + -1 + ], + [ + 786, + -1 + ], + [ + 818, + -1 + ], + [ + 850, + -1 + ], + [ + 882, + -1 + ], + [ + 914, + -1 + ], + [ + 946, + -1 + ], + [ + 978, + -1 + ], + [ + 1010, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 51, + 1 + ], + [ + 83, + 1 + ], + [ + 115, + 1 + ], + [ + 147, + 1 + ], + [ + 179, + 1 + ], + [ + 211, + 1 + ], + [ + 243, + 1 + ], + [ + 275, + 1 + ], + [ + 307, + 1 + ], + [ + 339, + 1 + ], + [ + 371, + 1 + ], + [ + 403, + 1 + ], + [ + 435, + 1 + ], + [ + 467, + 1 + ], + [ + 499, + 1 + ], + [ + 531, + 1 + ], + [ + 563, + 1 + ], + [ + 595, + 1 + ], + [ + 627, + 1 + ], + [ + 659, + 1 + ], + [ + 691, + 1 + ], + [ + 723, + 1 + ], + [ + 755, + 1 + ], + [ + 787, + 1 + ], + [ + 819, + 1 + ], + [ + 851, + 1 + ], + [ + 883, + 1 + ], + [ + 915, + 1 + ], + [ + 947, + 1 + ], + [ + 979, + 1 + ], + [ + 1011, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 51, + -1 + ], + [ + 83, + -1 + ], + [ + 115, + -1 + ], + [ + 147, + -1 + ], + [ + 179, + -1 + ], + [ + 211, + -1 + ], + [ + 243, + -1 + ], + [ + 275, + -1 + ], + [ + 307, + -1 + ], + [ + 339, + -1 + ], + [ + 371, + -1 + ], + [ + 403, + -1 + ], + [ + 435, + -1 + ], + [ + 467, + -1 + ], + [ + 499, + -1 + ], + [ + 531, + -1 + ], + [ + 563, + -1 + ], + [ + 595, + -1 + ], + [ + 627, + -1 + ], + [ + 659, + -1 + ], + [ + 691, + -1 + ], + [ + 723, + -1 + ], + [ + 755, + -1 + ], + [ + 787, + -1 + ], + [ + 819, + -1 + ], + [ + 851, + -1 + ], + [ + 883, + -1 + ], + [ + 915, + -1 + ], + [ + 947, + -1 + ], + [ + 979, + -1 + ], + [ + 1011, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 52, + 1 + ], + [ + 84, + 1 + ], + [ + 116, + 1 + ], + [ + 148, + 1 + ], + [ + 180, + 1 + ], + [ + 212, + 1 + ], + [ + 244, + 1 + ], + [ + 276, + 1 + ], + [ + 308, + 1 + ], + [ + 340, + 1 + ], + [ + 372, + 1 + ], + [ + 404, + 1 + ], + [ + 436, + 1 + ], + [ + 468, + 1 + ], + [ + 500, + 1 + ], + [ + 532, + 1 + ], + [ + 564, + 1 + ], + [ + 596, + 1 + ], + [ + 628, + 1 + ], + [ + 660, + 1 + ], + [ + 692, + 1 + ], + [ + 724, + 1 + ], + [ + 756, + 1 + ], + [ + 788, + 1 + ], + [ + 820, + 1 + ], + [ + 852, + 1 + ], + [ + 884, + 1 + ], + [ + 916, + 1 + ], + [ + 948, + 1 + ], + [ + 980, + 1 + ], + [ + 1012, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 52, + -1 + ], + [ + 84, + -1 + ], + [ + 116, + -1 + ], + [ + 148, + -1 + ], + [ + 180, + -1 + ], + [ + 212, + -1 + ], + [ + 244, + -1 + ], + [ + 276, + -1 + ], + [ + 308, + -1 + ], + [ + 340, + -1 + ], + [ + 372, + -1 + ], + [ + 404, + -1 + ], + [ + 436, + -1 + ], + [ + 468, + -1 + ], + [ + 500, + -1 + ], + [ + 532, + -1 + ], + [ + 564, + -1 + ], + [ + 596, + -1 + ], + [ + 628, + -1 + ], + [ + 660, + -1 + ], + [ + 692, + -1 + ], + [ + 724, + -1 + ], + [ + 756, + -1 + ], + [ + 788, + -1 + ], + [ + 820, + -1 + ], + [ + 852, + -1 + ], + [ + 884, + -1 + ], + [ + 916, + -1 + ], + [ + 948, + -1 + ], + [ + 980, + -1 + ], + [ + 1012, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 53, + 1 + ], + [ + 85, + 1 + ], + [ + 117, + 1 + ], + [ + 149, + 1 + ], + [ + 181, + 1 + ], + [ + 213, + 1 + ], + [ + 245, + 1 + ], + [ + 277, + 1 + ], + [ + 309, + 1 + ], + [ + 341, + 1 + ], + [ + 373, + 1 + ], + [ + 405, + 1 + ], + [ + 437, + 1 + ], + [ + 469, + 1 + ], + [ + 501, + 1 + ], + [ + 533, + 1 + ], + [ + 565, + 1 + ], + [ + 597, + 1 + ], + [ + 629, + 1 + ], + [ + 661, + 1 + ], + [ + 693, + 1 + ], + [ + 725, + 1 + ], + [ + 757, + 1 + ], + [ + 789, + 1 + ], + [ + 821, + 1 + ], + [ + 853, + 1 + ], + [ + 885, + 1 + ], + [ + 917, + 1 + ], + [ + 949, + 1 + ], + [ + 981, + 1 + ], + [ + 1013, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 53, + -1 + ], + [ + 85, + -1 + ], + [ + 117, + -1 + ], + [ + 149, + -1 + ], + [ + 181, + -1 + ], + [ + 213, + -1 + ], + [ + 245, + -1 + ], + [ + 277, + -1 + ], + [ + 309, + -1 + ], + [ + 341, + -1 + ], + [ + 373, + -1 + ], + [ + 405, + -1 + ], + [ + 437, + -1 + ], + [ + 469, + -1 + ], + [ + 501, + -1 + ], + [ + 533, + -1 + ], + [ + 565, + -1 + ], + [ + 597, + -1 + ], + [ + 629, + -1 + ], + [ + 661, + -1 + ], + [ + 693, + -1 + ], + [ + 725, + -1 + ], + [ + 757, + -1 + ], + [ + 789, + -1 + ], + [ + 821, + -1 + ], + [ + 853, + -1 + ], + [ + 885, + -1 + ], + [ + 917, + -1 + ], + [ + 949, + -1 + ], + [ + 981, + -1 + ], + [ + 1013, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 54, + 1 + ], + [ + 86, + 1 + ], + [ + 118, + 1 + ], + [ + 150, + 1 + ], + [ + 182, + 1 + ], + [ + 214, + 1 + ], + [ + 246, + 1 + ], + [ + 278, + 1 + ], + [ + 310, + 1 + ], + [ + 342, + 1 + ], + [ + 374, + 1 + ], + [ + 406, + 1 + ], + [ + 438, + 1 + ], + [ + 470, + 1 + ], + [ + 502, + 1 + ], + [ + 534, + 1 + ], + [ + 566, + 1 + ], + [ + 598, + 1 + ], + [ + 630, + 1 + ], + [ + 662, + 1 + ], + [ + 694, + 1 + ], + [ + 726, + 1 + ], + [ + 758, + 1 + ], + [ + 790, + 1 + ], + [ + 822, + 1 + ], + [ + 854, + 1 + ], + [ + 886, + 1 + ], + [ + 918, + 1 + ], + [ + 950, + 1 + ], + [ + 982, + 1 + ], + [ + 1014, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 54, + -1 + ], + [ + 86, + -1 + ], + [ + 118, + -1 + ], + [ + 150, + -1 + ], + [ + 182, + -1 + ], + [ + 214, + -1 + ], + [ + 246, + -1 + ], + [ + 278, + -1 + ], + [ + 310, + -1 + ], + [ + 342, + -1 + ], + [ + 374, + -1 + ], + [ + 406, + -1 + ], + [ + 438, + -1 + ], + [ + 470, + -1 + ], + [ + 502, + -1 + ], + [ + 534, + -1 + ], + [ + 566, + -1 + ], + [ + 598, + -1 + ], + [ + 630, + -1 + ], + [ + 662, + -1 + ], + [ + 694, + -1 + ], + [ + 726, + -1 + ], + [ + 758, + -1 + ], + [ + 790, + -1 + ], + [ + 822, + -1 + ], + [ + 854, + -1 + ], + [ + 886, + -1 + ], + [ + 918, + -1 + ], + [ + 950, + -1 + ], + [ + 982, + -1 + ], + [ + 1014, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 55, + 1 + ], + [ + 87, + 1 + ], + [ + 119, + 1 + ], + [ + 151, + 1 + ], + [ + 183, + 1 + ], + [ + 215, + 1 + ], + [ + 247, + 1 + ], + [ + 279, + 1 + ], + [ + 311, + 1 + ], + [ + 343, + 1 + ], + [ + 375, + 1 + ], + [ + 407, + 1 + ], + [ + 439, + 1 + ], + [ + 471, + 1 + ], + [ + 503, + 1 + ], + [ + 535, + 1 + ], + [ + 567, + 1 + ], + [ + 599, + 1 + ], + [ + 631, + 1 + ], + [ + 663, + 1 + ], + [ + 695, + 1 + ], + [ + 727, + 1 + ], + [ + 759, + 1 + ], + [ + 791, + 1 + ], + [ + 823, + 1 + ], + [ + 855, + 1 + ], + [ + 887, + 1 + ], + [ + 919, + 1 + ], + [ + 951, + 1 + ], + [ + 983, + 1 + ], + [ + 1015, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 55, + -1 + ], + [ + 87, + -1 + ], + [ + 119, + -1 + ], + [ + 151, + -1 + ], + [ + 183, + -1 + ], + [ + 215, + -1 + ], + [ + 247, + -1 + ], + [ + 279, + -1 + ], + [ + 311, + -1 + ], + [ + 343, + -1 + ], + [ + 375, + -1 + ], + [ + 407, + -1 + ], + [ + 439, + -1 + ], + [ + 471, + -1 + ], + [ + 503, + -1 + ], + [ + 535, + -1 + ], + [ + 567, + -1 + ], + [ + 599, + -1 + ], + [ + 631, + -1 + ], + [ + 663, + -1 + ], + [ + 695, + -1 + ], + [ + 727, + -1 + ], + [ + 759, + -1 + ], + [ + 791, + -1 + ], + [ + 823, + -1 + ], + [ + 855, + -1 + ], + [ + 887, + -1 + ], + [ + 919, + -1 + ], + [ + 951, + -1 + ], + [ + 983, + -1 + ], + [ + 1015, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 56, + 1 + ], + [ + 88, + 1 + ], + [ + 120, + 1 + ], + [ + 152, + 1 + ], + [ + 184, + 1 + ], + [ + 216, + 1 + ], + [ + 248, + 1 + ], + [ + 280, + 1 + ], + [ + 312, + 1 + ], + [ + 344, + 1 + ], + [ + 376, + 1 + ], + [ + 408, + 1 + ], + [ + 440, + 1 + ], + [ + 472, + 1 + ], + [ + 504, + 1 + ], + [ + 536, + 1 + ], + [ + 568, + 1 + ], + [ + 600, + 1 + ], + [ + 632, + 1 + ], + [ + 664, + 1 + ], + [ + 696, + 1 + ], + [ + 728, + 1 + ], + [ + 760, + 1 + ], + [ + 792, + 1 + ], + [ + 824, + 1 + ], + [ + 856, + 1 + ], + [ + 888, + 1 + ], + [ + 920, + 1 + ], + [ + 952, + 1 + ], + [ + 984, + 1 + ], + [ + 1016, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 56, + -1 + ], + [ + 88, + -1 + ], + [ + 120, + -1 + ], + [ + 152, + -1 + ], + [ + 184, + -1 + ], + [ + 216, + -1 + ], + [ + 248, + -1 + ], + [ + 280, + -1 + ], + [ + 312, + -1 + ], + [ + 344, + -1 + ], + [ + 376, + -1 + ], + [ + 408, + -1 + ], + [ + 440, + -1 + ], + [ + 472, + -1 + ], + [ + 504, + -1 + ], + [ + 536, + -1 + ], + [ + 568, + -1 + ], + [ + 600, + -1 + ], + [ + 632, + -1 + ], + [ + 664, + -1 + ], + [ + 696, + -1 + ], + [ + 728, + -1 + ], + [ + 760, + -1 + ], + [ + 792, + -1 + ], + [ + 824, + -1 + ], + [ + 856, + -1 + ], + [ + 888, + -1 + ], + [ + 920, + -1 + ], + [ + 952, + -1 + ], + [ + 984, + -1 + ], + [ + 1016, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 25, + 1 + ], + [ + 57, + 1 + ], + [ + 89, + 1 + ], + [ + 121, + 1 + ], + [ + 153, + 1 + ], + [ + 185, + 1 + ], + [ + 217, + 1 + ], + [ + 249, + 1 + ], + [ + 281, + 1 + ], + [ + 313, + 1 + ], + [ + 345, + 1 + ], + [ + 377, + 1 + ], + [ + 409, + 1 + ], + [ + 441, + 1 + ], + [ + 473, + 1 + ], + [ + 505, + 1 + ], + [ + 537, + 1 + ], + [ + 569, + 1 + ], + [ + 601, + 1 + ], + [ + 633, + 1 + ], + [ + 665, + 1 + ], + [ + 697, + 1 + ], + [ + 729, + 1 + ], + [ + 761, + 1 + ], + [ + 793, + 1 + ], + [ + 825, + 1 + ], + [ + 857, + 1 + ], + [ + 889, + 1 + ], + [ + 921, + 1 + ], + [ + 953, + 1 + ], + [ + 985, + 1 + ], + [ + 1017, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 25, + -1 + ], + [ + 57, + -1 + ], + [ + 89, + -1 + ], + [ + 121, + -1 + ], + [ + 153, + -1 + ], + [ + 185, + -1 + ], + [ + 217, + -1 + ], + [ + 249, + -1 + ], + [ + 281, + -1 + ], + [ + 313, + -1 + ], + [ + 345, + -1 + ], + [ + 377, + -1 + ], + [ + 409, + -1 + ], + [ + 441, + -1 + ], + [ + 473, + -1 + ], + [ + 505, + -1 + ], + [ + 537, + -1 + ], + [ + 569, + -1 + ], + [ + 601, + -1 + ], + [ + 633, + -1 + ], + [ + 665, + -1 + ], + [ + 697, + -1 + ], + [ + 729, + -1 + ], + [ + 761, + -1 + ], + [ + 793, + -1 + ], + [ + 825, + -1 + ], + [ + 857, + -1 + ], + [ + 889, + -1 + ], + [ + 921, + -1 + ], + [ + 953, + -1 + ], + [ + 985, + -1 + ], + [ + 1017, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 26, + 1 + ], + [ + 58, + 1 + ], + [ + 90, + 1 + ], + [ + 122, + 1 + ], + [ + 154, + 1 + ], + [ + 186, + 1 + ], + [ + 218, + 1 + ], + [ + 250, + 1 + ], + [ + 282, + 1 + ], + [ + 314, + 1 + ], + [ + 346, + 1 + ], + [ + 378, + 1 + ], + [ + 410, + 1 + ], + [ + 442, + 1 + ], + [ + 474, + 1 + ], + [ + 506, + 1 + ], + [ + 538, + 1 + ], + [ + 570, + 1 + ], + [ + 602, + 1 + ], + [ + 634, + 1 + ], + [ + 666, + 1 + ], + [ + 698, + 1 + ], + [ + 730, + 1 + ], + [ + 762, + 1 + ], + [ + 794, + 1 + ], + [ + 826, + 1 + ], + [ + 858, + 1 + ], + [ + 890, + 1 + ], + [ + 922, + 1 + ], + [ + 954, + 1 + ], + [ + 986, + 1 + ], + [ + 1018, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 26, + -1 + ], + [ + 58, + -1 + ], + [ + 90, + -1 + ], + [ + 122, + -1 + ], + [ + 154, + -1 + ], + [ + 186, + -1 + ], + [ + 218, + -1 + ], + [ + 250, + -1 + ], + [ + 282, + -1 + ], + [ + 314, + -1 + ], + [ + 346, + -1 + ], + [ + 378, + -1 + ], + [ + 410, + -1 + ], + [ + 442, + -1 + ], + [ + 474, + -1 + ], + [ + 506, + -1 + ], + [ + 538, + -1 + ], + [ + 570, + -1 + ], + [ + 602, + -1 + ], + [ + 634, + -1 + ], + [ + 666, + -1 + ], + [ + 698, + -1 + ], + [ + 730, + -1 + ], + [ + 762, + -1 + ], + [ + 794, + -1 + ], + [ + 826, + -1 + ], + [ + 858, + -1 + ], + [ + 890, + -1 + ], + [ + 922, + -1 + ], + [ + 954, + -1 + ], + [ + 986, + -1 + ], + [ + 1018, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 59, + 1 + ], + [ + 91, + 1 + ], + [ + 123, + 1 + ], + [ + 155, + 1 + ], + [ + 187, + 1 + ], + [ + 219, + 1 + ], + [ + 251, + 1 + ], + [ + 283, + 1 + ], + [ + 315, + 1 + ], + [ + 347, + 1 + ], + [ + 379, + 1 + ], + [ + 411, + 1 + ], + [ + 443, + 1 + ], + [ + 475, + 1 + ], + [ + 507, + 1 + ], + [ + 539, + 1 + ], + [ + 571, + 1 + ], + [ + 603, + 1 + ], + [ + 635, + 1 + ], + [ + 667, + 1 + ], + [ + 699, + 1 + ], + [ + 731, + 1 + ], + [ + 763, + 1 + ], + [ + 795, + 1 + ], + [ + 827, + 1 + ], + [ + 859, + 1 + ], + [ + 891, + 1 + ], + [ + 923, + 1 + ], + [ + 955, + 1 + ], + [ + 987, + 1 + ], + [ + 1019, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 59, + -1 + ], + [ + 91, + -1 + ], + [ + 123, + -1 + ], + [ + 155, + -1 + ], + [ + 187, + -1 + ], + [ + 219, + -1 + ], + [ + 251, + -1 + ], + [ + 283, + -1 + ], + [ + 315, + -1 + ], + [ + 347, + -1 + ], + [ + 379, + -1 + ], + [ + 411, + -1 + ], + [ + 443, + -1 + ], + [ + 475, + -1 + ], + [ + 507, + -1 + ], + [ + 539, + -1 + ], + [ + 571, + -1 + ], + [ + 603, + -1 + ], + [ + 635, + -1 + ], + [ + 667, + -1 + ], + [ + 699, + -1 + ], + [ + 731, + -1 + ], + [ + 763, + -1 + ], + [ + 795, + -1 + ], + [ + 827, + -1 + ], + [ + 859, + -1 + ], + [ + 891, + -1 + ], + [ + 923, + -1 + ], + [ + 955, + -1 + ], + [ + 987, + -1 + ], + [ + 1019, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 28, + 1 + ], + [ + 60, + 1 + ], + [ + 92, + 1 + ], + [ + 124, + 1 + ], + [ + 156, + 1 + ], + [ + 188, + 1 + ], + [ + 220, + 1 + ], + [ + 252, + 1 + ], + [ + 284, + 1 + ], + [ + 316, + 1 + ], + [ + 348, + 1 + ], + [ + 380, + 1 + ], + [ + 412, + 1 + ], + [ + 444, + 1 + ], + [ + 476, + 1 + ], + [ + 508, + 1 + ], + [ + 540, + 1 + ], + [ + 572, + 1 + ], + [ + 604, + 1 + ], + [ + 636, + 1 + ], + [ + 668, + 1 + ], + [ + 700, + 1 + ], + [ + 732, + 1 + ], + [ + 764, + 1 + ], + [ + 796, + 1 + ], + [ + 828, + 1 + ], + [ + 860, + 1 + ], + [ + 892, + 1 + ], + [ + 924, + 1 + ], + [ + 956, + 1 + ], + [ + 988, + 1 + ], + [ + 1020, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 28, + -1 + ], + [ + 60, + -1 + ], + [ + 92, + -1 + ], + [ + 124, + -1 + ], + [ + 156, + -1 + ], + [ + 188, + -1 + ], + [ + 220, + -1 + ], + [ + 252, + -1 + ], + [ + 284, + -1 + ], + [ + 316, + -1 + ], + [ + 348, + -1 + ], + [ + 380, + -1 + ], + [ + 412, + -1 + ], + [ + 444, + -1 + ], + [ + 476, + -1 + ], + [ + 508, + -1 + ], + [ + 540, + -1 + ], + [ + 572, + -1 + ], + [ + 604, + -1 + ], + [ + 636, + -1 + ], + [ + 668, + -1 + ], + [ + 700, + -1 + ], + [ + 732, + -1 + ], + [ + 764, + -1 + ], + [ + 796, + -1 + ], + [ + 828, + -1 + ], + [ + 860, + -1 + ], + [ + 892, + -1 + ], + [ + 924, + -1 + ], + [ + 956, + -1 + ], + [ + 988, + -1 + ], + [ + 1020, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 29, + 1 + ], + [ + 61, + 1 + ], + [ + 93, + 1 + ], + [ + 125, + 1 + ], + [ + 157, + 1 + ], + [ + 189, + 1 + ], + [ + 221, + 1 + ], + [ + 253, + 1 + ], + [ + 285, + 1 + ], + [ + 317, + 1 + ], + [ + 349, + 1 + ], + [ + 381, + 1 + ], + [ + 413, + 1 + ], + [ + 445, + 1 + ], + [ + 477, + 1 + ], + [ + 509, + 1 + ], + [ + 541, + 1 + ], + [ + 573, + 1 + ], + [ + 605, + 1 + ], + [ + 637, + 1 + ], + [ + 669, + 1 + ], + [ + 701, + 1 + ], + [ + 733, + 1 + ], + [ + 765, + 1 + ], + [ + 797, + 1 + ], + [ + 829, + 1 + ], + [ + 861, + 1 + ], + [ + 893, + 1 + ], + [ + 925, + 1 + ], + [ + 957, + 1 + ], + [ + 989, + 1 + ], + [ + 1021, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 29, + -1 + ], + [ + 61, + -1 + ], + [ + 93, + -1 + ], + [ + 125, + -1 + ], + [ + 157, + -1 + ], + [ + 189, + -1 + ], + [ + 221, + -1 + ], + [ + 253, + -1 + ], + [ + 285, + -1 + ], + [ + 317, + -1 + ], + [ + 349, + -1 + ], + [ + 381, + -1 + ], + [ + 413, + -1 + ], + [ + 445, + -1 + ], + [ + 477, + -1 + ], + [ + 509, + -1 + ], + [ + 541, + -1 + ], + [ + 573, + -1 + ], + [ + 605, + -1 + ], + [ + 637, + -1 + ], + [ + 669, + -1 + ], + [ + 701, + -1 + ], + [ + 733, + -1 + ], + [ + 765, + -1 + ], + [ + 797, + -1 + ], + [ + 829, + -1 + ], + [ + 861, + -1 + ], + [ + 893, + -1 + ], + [ + 925, + -1 + ], + [ + 957, + -1 + ], + [ + 989, + -1 + ], + [ + 1021, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 30, + 1 + ], + [ + 62, + 1 + ], + [ + 94, + 1 + ], + [ + 126, + 1 + ], + [ + 158, + 1 + ], + [ + 190, + 1 + ], + [ + 222, + 1 + ], + [ + 254, + 1 + ], + [ + 286, + 1 + ], + [ + 318, + 1 + ], + [ + 350, + 1 + ], + [ + 382, + 1 + ], + [ + 414, + 1 + ], + [ + 446, + 1 + ], + [ + 478, + 1 + ], + [ + 510, + 1 + ], + [ + 542, + 1 + ], + [ + 574, + 1 + ], + [ + 606, + 1 + ], + [ + 638, + 1 + ], + [ + 670, + 1 + ], + [ + 702, + 1 + ], + [ + 734, + 1 + ], + [ + 766, + 1 + ], + [ + 798, + 1 + ], + [ + 830, + 1 + ], + [ + 862, + 1 + ], + [ + 894, + 1 + ], + [ + 926, + 1 + ], + [ + 958, + 1 + ], + [ + 990, + 1 + ], + [ + 1022, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 30, + -1 + ], + [ + 62, + -1 + ], + [ + 94, + -1 + ], + [ + 126, + -1 + ], + [ + 158, + -1 + ], + [ + 190, + -1 + ], + [ + 222, + -1 + ], + [ + 254, + -1 + ], + [ + 286, + -1 + ], + [ + 318, + -1 + ], + [ + 350, + -1 + ], + [ + 382, + -1 + ], + [ + 414, + -1 + ], + [ + 446, + -1 + ], + [ + 478, + -1 + ], + [ + 510, + -1 + ], + [ + 542, + -1 + ], + [ + 574, + -1 + ], + [ + 606, + -1 + ], + [ + 638, + -1 + ], + [ + 670, + -1 + ], + [ + 702, + -1 + ], + [ + 734, + -1 + ], + [ + 766, + -1 + ], + [ + 798, + -1 + ], + [ + 830, + -1 + ], + [ + 862, + -1 + ], + [ + 894, + -1 + ], + [ + 926, + -1 + ], + [ + 958, + -1 + ], + [ + 990, + -1 + ], + [ + 1022, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 31, + 1 + ], + [ + 63, + 1 + ], + [ + 95, + 1 + ], + [ + 127, + 1 + ], + [ + 159, + 1 + ], + [ + 191, + 1 + ], + [ + 223, + 1 + ], + [ + 255, + 1 + ], + [ + 287, + 1 + ], + [ + 319, + 1 + ], + [ + 351, + 1 + ], + [ + 383, + 1 + ], + [ + 415, + 1 + ], + [ + 447, + 1 + ], + [ + 479, + 1 + ], + [ + 511, + 1 + ], + [ + 543, + 1 + ], + [ + 575, + 1 + ], + [ + 607, + 1 + ], + [ + 639, + 1 + ], + [ + 671, + 1 + ], + [ + 703, + 1 + ], + [ + 735, + 1 + ], + [ + 767, + 1 + ], + [ + 799, + 1 + ], + [ + 831, + 1 + ], + [ + 863, + 1 + ], + [ + 895, + 1 + ], + [ + 927, + 1 + ], + [ + 959, + 1 + ], + [ + 991, + 1 + ], + [ + 1023, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 31, + -1 + ], + [ + 63, + -1 + ], + [ + 95, + -1 + ], + [ + 127, + -1 + ], + [ + 159, + -1 + ], + [ + 191, + -1 + ], + [ + 223, + -1 + ], + [ + 255, + -1 + ], + [ + 287, + -1 + ], + [ + 319, + -1 + ], + [ + 351, + -1 + ], + [ + 383, + -1 + ], + [ + 415, + -1 + ], + [ + 447, + -1 + ], + [ + 479, + -1 + ], + [ + 511, + -1 + ], + [ + 543, + -1 + ], + [ + 575, + -1 + ], + [ + 607, + -1 + ], + [ + 639, + -1 + ], + [ + 671, + -1 + ], + [ + 703, + -1 + ], + [ + 735, + -1 + ], + [ + 767, + -1 + ], + [ + 799, + -1 + ], + [ + 831, + -1 + ], + [ + 863, + -1 + ], + [ + 895, + -1 + ], + [ + 927, + -1 + ], + [ + 959, + -1 + ], + [ + 991, + -1 + ], + [ + 1023, + -1 + ] + ] + } + ], + "parameters": { + "size": 32, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60, + 56 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21, + 66 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17, + 91 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14, + 23 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4, + 68 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57, + 51 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 68 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48, + 14 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52, + 10 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47, + 21 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97, + 13 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81, + 68 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96, + 65 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21, + 15 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57, + 94 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7, + 46 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30, + 58 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1, + 47 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11, + 24 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29, + 41 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34, + 56 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96, + 32 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98, + 47 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67, + 46 + ], + [ + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42, + 83 + ], + [ + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29, + 28 + ], + [ + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13, + 94 + ], + [ + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80, + 17 + ], + [ + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31, + 95 + ], + [ + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15, + 5 + ], + [ + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97, + 45 + ], + [ + 91, + 69, + 52, + 33, + 88, + 59, + 75, + 9, + 8, + 62, + 52, + 88, + 41, + 10, + 20, + 94, + 23, + 10, + 17, + 70, + 41, + 62, + 93, + 11, + 53, + 62, + 52, + 51, + 60, + 67, + 94, + 26 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 1024, + "variables": 1024, + "rows": 128, + "nonzeros": 4096, + "globals": 0 + }, + "input_variables": 1024, + "model_variables": 1024, + "modelled_variables": 1024, + "size_unit": "tasks" + }, + "json_sha256": "68b2d2dd93beac22b677d2271621900e9fa30ca759153b85c427d477125b77dc", + "txt_sha256": "ee623300ceb101a5124fbf804aa908e51145675c428e25791f7fcfa443b7dad0" + }, + { + "id": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "model": { + "id": "assignment_single_24", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 576, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ], + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ], + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ], + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ], + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ], + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ], + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 24, + 1 + ], + [ + 48, + 1 + ], + [ + 72, + 1 + ], + [ + 96, + 1 + ], + [ + 120, + 1 + ], + [ + 144, + 1 + ], + [ + 168, + 1 + ], + [ + 192, + 1 + ], + [ + 216, + 1 + ], + [ + 240, + 1 + ], + [ + 264, + 1 + ], + [ + 288, + 1 + ], + [ + 312, + 1 + ], + [ + 336, + 1 + ], + [ + 360, + 1 + ], + [ + 384, + 1 + ], + [ + 408, + 1 + ], + [ + 432, + 1 + ], + [ + 456, + 1 + ], + [ + 480, + 1 + ], + [ + 504, + 1 + ], + [ + 528, + 1 + ], + [ + 552, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 24, + -1 + ], + [ + 48, + -1 + ], + [ + 72, + -1 + ], + [ + 96, + -1 + ], + [ + 120, + -1 + ], + [ + 144, + -1 + ], + [ + 168, + -1 + ], + [ + 192, + -1 + ], + [ + 216, + -1 + ], + [ + 240, + -1 + ], + [ + 264, + -1 + ], + [ + 288, + -1 + ], + [ + 312, + -1 + ], + [ + 336, + -1 + ], + [ + 360, + -1 + ], + [ + 384, + -1 + ], + [ + 408, + -1 + ], + [ + 432, + -1 + ], + [ + 456, + -1 + ], + [ + 480, + -1 + ], + [ + 504, + -1 + ], + [ + 528, + -1 + ], + [ + 552, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 25, + 1 + ], + [ + 49, + 1 + ], + [ + 73, + 1 + ], + [ + 97, + 1 + ], + [ + 121, + 1 + ], + [ + 145, + 1 + ], + [ + 169, + 1 + ], + [ + 193, + 1 + ], + [ + 217, + 1 + ], + [ + 241, + 1 + ], + [ + 265, + 1 + ], + [ + 289, + 1 + ], + [ + 313, + 1 + ], + [ + 337, + 1 + ], + [ + 361, + 1 + ], + [ + 385, + 1 + ], + [ + 409, + 1 + ], + [ + 433, + 1 + ], + [ + 457, + 1 + ], + [ + 481, + 1 + ], + [ + 505, + 1 + ], + [ + 529, + 1 + ], + [ + 553, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 25, + -1 + ], + [ + 49, + -1 + ], + [ + 73, + -1 + ], + [ + 97, + -1 + ], + [ + 121, + -1 + ], + [ + 145, + -1 + ], + [ + 169, + -1 + ], + [ + 193, + -1 + ], + [ + 217, + -1 + ], + [ + 241, + -1 + ], + [ + 265, + -1 + ], + [ + 289, + -1 + ], + [ + 313, + -1 + ], + [ + 337, + -1 + ], + [ + 361, + -1 + ], + [ + 385, + -1 + ], + [ + 409, + -1 + ], + [ + 433, + -1 + ], + [ + 457, + -1 + ], + [ + 481, + -1 + ], + [ + 505, + -1 + ], + [ + 529, + -1 + ], + [ + 553, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 26, + 1 + ], + [ + 50, + 1 + ], + [ + 74, + 1 + ], + [ + 98, + 1 + ], + [ + 122, + 1 + ], + [ + 146, + 1 + ], + [ + 170, + 1 + ], + [ + 194, + 1 + ], + [ + 218, + 1 + ], + [ + 242, + 1 + ], + [ + 266, + 1 + ], + [ + 290, + 1 + ], + [ + 314, + 1 + ], + [ + 338, + 1 + ], + [ + 362, + 1 + ], + [ + 386, + 1 + ], + [ + 410, + 1 + ], + [ + 434, + 1 + ], + [ + 458, + 1 + ], + [ + 482, + 1 + ], + [ + 506, + 1 + ], + [ + 530, + 1 + ], + [ + 554, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 26, + -1 + ], + [ + 50, + -1 + ], + [ + 74, + -1 + ], + [ + 98, + -1 + ], + [ + 122, + -1 + ], + [ + 146, + -1 + ], + [ + 170, + -1 + ], + [ + 194, + -1 + ], + [ + 218, + -1 + ], + [ + 242, + -1 + ], + [ + 266, + -1 + ], + [ + 290, + -1 + ], + [ + 314, + -1 + ], + [ + 338, + -1 + ], + [ + 362, + -1 + ], + [ + 386, + -1 + ], + [ + 410, + -1 + ], + [ + 434, + -1 + ], + [ + 458, + -1 + ], + [ + 482, + -1 + ], + [ + 506, + -1 + ], + [ + 530, + -1 + ], + [ + 554, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 27, + 1 + ], + [ + 51, + 1 + ], + [ + 75, + 1 + ], + [ + 99, + 1 + ], + [ + 123, + 1 + ], + [ + 147, + 1 + ], + [ + 171, + 1 + ], + [ + 195, + 1 + ], + [ + 219, + 1 + ], + [ + 243, + 1 + ], + [ + 267, + 1 + ], + [ + 291, + 1 + ], + [ + 315, + 1 + ], + [ + 339, + 1 + ], + [ + 363, + 1 + ], + [ + 387, + 1 + ], + [ + 411, + 1 + ], + [ + 435, + 1 + ], + [ + 459, + 1 + ], + [ + 483, + 1 + ], + [ + 507, + 1 + ], + [ + 531, + 1 + ], + [ + 555, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 27, + -1 + ], + [ + 51, + -1 + ], + [ + 75, + -1 + ], + [ + 99, + -1 + ], + [ + 123, + -1 + ], + [ + 147, + -1 + ], + [ + 171, + -1 + ], + [ + 195, + -1 + ], + [ + 219, + -1 + ], + [ + 243, + -1 + ], + [ + 267, + -1 + ], + [ + 291, + -1 + ], + [ + 315, + -1 + ], + [ + 339, + -1 + ], + [ + 363, + -1 + ], + [ + 387, + -1 + ], + [ + 411, + -1 + ], + [ + 435, + -1 + ], + [ + 459, + -1 + ], + [ + 483, + -1 + ], + [ + 507, + -1 + ], + [ + 531, + -1 + ], + [ + 555, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 28, + 1 + ], + [ + 52, + 1 + ], + [ + 76, + 1 + ], + [ + 100, + 1 + ], + [ + 124, + 1 + ], + [ + 148, + 1 + ], + [ + 172, + 1 + ], + [ + 196, + 1 + ], + [ + 220, + 1 + ], + [ + 244, + 1 + ], + [ + 268, + 1 + ], + [ + 292, + 1 + ], + [ + 316, + 1 + ], + [ + 340, + 1 + ], + [ + 364, + 1 + ], + [ + 388, + 1 + ], + [ + 412, + 1 + ], + [ + 436, + 1 + ], + [ + 460, + 1 + ], + [ + 484, + 1 + ], + [ + 508, + 1 + ], + [ + 532, + 1 + ], + [ + 556, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 28, + -1 + ], + [ + 52, + -1 + ], + [ + 76, + -1 + ], + [ + 100, + -1 + ], + [ + 124, + -1 + ], + [ + 148, + -1 + ], + [ + 172, + -1 + ], + [ + 196, + -1 + ], + [ + 220, + -1 + ], + [ + 244, + -1 + ], + [ + 268, + -1 + ], + [ + 292, + -1 + ], + [ + 316, + -1 + ], + [ + 340, + -1 + ], + [ + 364, + -1 + ], + [ + 388, + -1 + ], + [ + 412, + -1 + ], + [ + 436, + -1 + ], + [ + 460, + -1 + ], + [ + 484, + -1 + ], + [ + 508, + -1 + ], + [ + 532, + -1 + ], + [ + 556, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 29, + 1 + ], + [ + 53, + 1 + ], + [ + 77, + 1 + ], + [ + 101, + 1 + ], + [ + 125, + 1 + ], + [ + 149, + 1 + ], + [ + 173, + 1 + ], + [ + 197, + 1 + ], + [ + 221, + 1 + ], + [ + 245, + 1 + ], + [ + 269, + 1 + ], + [ + 293, + 1 + ], + [ + 317, + 1 + ], + [ + 341, + 1 + ], + [ + 365, + 1 + ], + [ + 389, + 1 + ], + [ + 413, + 1 + ], + [ + 437, + 1 + ], + [ + 461, + 1 + ], + [ + 485, + 1 + ], + [ + 509, + 1 + ], + [ + 533, + 1 + ], + [ + 557, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 29, + -1 + ], + [ + 53, + -1 + ], + [ + 77, + -1 + ], + [ + 101, + -1 + ], + [ + 125, + -1 + ], + [ + 149, + -1 + ], + [ + 173, + -1 + ], + [ + 197, + -1 + ], + [ + 221, + -1 + ], + [ + 245, + -1 + ], + [ + 269, + -1 + ], + [ + 293, + -1 + ], + [ + 317, + -1 + ], + [ + 341, + -1 + ], + [ + 365, + -1 + ], + [ + 389, + -1 + ], + [ + 413, + -1 + ], + [ + 437, + -1 + ], + [ + 461, + -1 + ], + [ + 485, + -1 + ], + [ + 509, + -1 + ], + [ + 533, + -1 + ], + [ + 557, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 30, + 1 + ], + [ + 54, + 1 + ], + [ + 78, + 1 + ], + [ + 102, + 1 + ], + [ + 126, + 1 + ], + [ + 150, + 1 + ], + [ + 174, + 1 + ], + [ + 198, + 1 + ], + [ + 222, + 1 + ], + [ + 246, + 1 + ], + [ + 270, + 1 + ], + [ + 294, + 1 + ], + [ + 318, + 1 + ], + [ + 342, + 1 + ], + [ + 366, + 1 + ], + [ + 390, + 1 + ], + [ + 414, + 1 + ], + [ + 438, + 1 + ], + [ + 462, + 1 + ], + [ + 486, + 1 + ], + [ + 510, + 1 + ], + [ + 534, + 1 + ], + [ + 558, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 30, + -1 + ], + [ + 54, + -1 + ], + [ + 78, + -1 + ], + [ + 102, + -1 + ], + [ + 126, + -1 + ], + [ + 150, + -1 + ], + [ + 174, + -1 + ], + [ + 198, + -1 + ], + [ + 222, + -1 + ], + [ + 246, + -1 + ], + [ + 270, + -1 + ], + [ + 294, + -1 + ], + [ + 318, + -1 + ], + [ + 342, + -1 + ], + [ + 366, + -1 + ], + [ + 390, + -1 + ], + [ + 414, + -1 + ], + [ + 438, + -1 + ], + [ + 462, + -1 + ], + [ + 486, + -1 + ], + [ + 510, + -1 + ], + [ + 534, + -1 + ], + [ + 558, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 31, + 1 + ], + [ + 55, + 1 + ], + [ + 79, + 1 + ], + [ + 103, + 1 + ], + [ + 127, + 1 + ], + [ + 151, + 1 + ], + [ + 175, + 1 + ], + [ + 199, + 1 + ], + [ + 223, + 1 + ], + [ + 247, + 1 + ], + [ + 271, + 1 + ], + [ + 295, + 1 + ], + [ + 319, + 1 + ], + [ + 343, + 1 + ], + [ + 367, + 1 + ], + [ + 391, + 1 + ], + [ + 415, + 1 + ], + [ + 439, + 1 + ], + [ + 463, + 1 + ], + [ + 487, + 1 + ], + [ + 511, + 1 + ], + [ + 535, + 1 + ], + [ + 559, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 31, + -1 + ], + [ + 55, + -1 + ], + [ + 79, + -1 + ], + [ + 103, + -1 + ], + [ + 127, + -1 + ], + [ + 151, + -1 + ], + [ + 175, + -1 + ], + [ + 199, + -1 + ], + [ + 223, + -1 + ], + [ + 247, + -1 + ], + [ + 271, + -1 + ], + [ + 295, + -1 + ], + [ + 319, + -1 + ], + [ + 343, + -1 + ], + [ + 367, + -1 + ], + [ + 391, + -1 + ], + [ + 415, + -1 + ], + [ + 439, + -1 + ], + [ + 463, + -1 + ], + [ + 487, + -1 + ], + [ + 511, + -1 + ], + [ + 535, + -1 + ], + [ + 559, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 32, + 1 + ], + [ + 56, + 1 + ], + [ + 80, + 1 + ], + [ + 104, + 1 + ], + [ + 128, + 1 + ], + [ + 152, + 1 + ], + [ + 176, + 1 + ], + [ + 200, + 1 + ], + [ + 224, + 1 + ], + [ + 248, + 1 + ], + [ + 272, + 1 + ], + [ + 296, + 1 + ], + [ + 320, + 1 + ], + [ + 344, + 1 + ], + [ + 368, + 1 + ], + [ + 392, + 1 + ], + [ + 416, + 1 + ], + [ + 440, + 1 + ], + [ + 464, + 1 + ], + [ + 488, + 1 + ], + [ + 512, + 1 + ], + [ + 536, + 1 + ], + [ + 560, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 32, + -1 + ], + [ + 56, + -1 + ], + [ + 80, + -1 + ], + [ + 104, + -1 + ], + [ + 128, + -1 + ], + [ + 152, + -1 + ], + [ + 176, + -1 + ], + [ + 200, + -1 + ], + [ + 224, + -1 + ], + [ + 248, + -1 + ], + [ + 272, + -1 + ], + [ + 296, + -1 + ], + [ + 320, + -1 + ], + [ + 344, + -1 + ], + [ + 368, + -1 + ], + [ + 392, + -1 + ], + [ + 416, + -1 + ], + [ + 440, + -1 + ], + [ + 464, + -1 + ], + [ + 488, + -1 + ], + [ + 512, + -1 + ], + [ + 536, + -1 + ], + [ + 560, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 33, + 1 + ], + [ + 57, + 1 + ], + [ + 81, + 1 + ], + [ + 105, + 1 + ], + [ + 129, + 1 + ], + [ + 153, + 1 + ], + [ + 177, + 1 + ], + [ + 201, + 1 + ], + [ + 225, + 1 + ], + [ + 249, + 1 + ], + [ + 273, + 1 + ], + [ + 297, + 1 + ], + [ + 321, + 1 + ], + [ + 345, + 1 + ], + [ + 369, + 1 + ], + [ + 393, + 1 + ], + [ + 417, + 1 + ], + [ + 441, + 1 + ], + [ + 465, + 1 + ], + [ + 489, + 1 + ], + [ + 513, + 1 + ], + [ + 537, + 1 + ], + [ + 561, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 33, + -1 + ], + [ + 57, + -1 + ], + [ + 81, + -1 + ], + [ + 105, + -1 + ], + [ + 129, + -1 + ], + [ + 153, + -1 + ], + [ + 177, + -1 + ], + [ + 201, + -1 + ], + [ + 225, + -1 + ], + [ + 249, + -1 + ], + [ + 273, + -1 + ], + [ + 297, + -1 + ], + [ + 321, + -1 + ], + [ + 345, + -1 + ], + [ + 369, + -1 + ], + [ + 393, + -1 + ], + [ + 417, + -1 + ], + [ + 441, + -1 + ], + [ + 465, + -1 + ], + [ + 489, + -1 + ], + [ + 513, + -1 + ], + [ + 537, + -1 + ], + [ + 561, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 34, + 1 + ], + [ + 58, + 1 + ], + [ + 82, + 1 + ], + [ + 106, + 1 + ], + [ + 130, + 1 + ], + [ + 154, + 1 + ], + [ + 178, + 1 + ], + [ + 202, + 1 + ], + [ + 226, + 1 + ], + [ + 250, + 1 + ], + [ + 274, + 1 + ], + [ + 298, + 1 + ], + [ + 322, + 1 + ], + [ + 346, + 1 + ], + [ + 370, + 1 + ], + [ + 394, + 1 + ], + [ + 418, + 1 + ], + [ + 442, + 1 + ], + [ + 466, + 1 + ], + [ + 490, + 1 + ], + [ + 514, + 1 + ], + [ + 538, + 1 + ], + [ + 562, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 34, + -1 + ], + [ + 58, + -1 + ], + [ + 82, + -1 + ], + [ + 106, + -1 + ], + [ + 130, + -1 + ], + [ + 154, + -1 + ], + [ + 178, + -1 + ], + [ + 202, + -1 + ], + [ + 226, + -1 + ], + [ + 250, + -1 + ], + [ + 274, + -1 + ], + [ + 298, + -1 + ], + [ + 322, + -1 + ], + [ + 346, + -1 + ], + [ + 370, + -1 + ], + [ + 394, + -1 + ], + [ + 418, + -1 + ], + [ + 442, + -1 + ], + [ + 466, + -1 + ], + [ + 490, + -1 + ], + [ + 514, + -1 + ], + [ + 538, + -1 + ], + [ + 562, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 35, + 1 + ], + [ + 59, + 1 + ], + [ + 83, + 1 + ], + [ + 107, + 1 + ], + [ + 131, + 1 + ], + [ + 155, + 1 + ], + [ + 179, + 1 + ], + [ + 203, + 1 + ], + [ + 227, + 1 + ], + [ + 251, + 1 + ], + [ + 275, + 1 + ], + [ + 299, + 1 + ], + [ + 323, + 1 + ], + [ + 347, + 1 + ], + [ + 371, + 1 + ], + [ + 395, + 1 + ], + [ + 419, + 1 + ], + [ + 443, + 1 + ], + [ + 467, + 1 + ], + [ + 491, + 1 + ], + [ + 515, + 1 + ], + [ + 539, + 1 + ], + [ + 563, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 35, + -1 + ], + [ + 59, + -1 + ], + [ + 83, + -1 + ], + [ + 107, + -1 + ], + [ + 131, + -1 + ], + [ + 155, + -1 + ], + [ + 179, + -1 + ], + [ + 203, + -1 + ], + [ + 227, + -1 + ], + [ + 251, + -1 + ], + [ + 275, + -1 + ], + [ + 299, + -1 + ], + [ + 323, + -1 + ], + [ + 347, + -1 + ], + [ + 371, + -1 + ], + [ + 395, + -1 + ], + [ + 419, + -1 + ], + [ + 443, + -1 + ], + [ + 467, + -1 + ], + [ + 491, + -1 + ], + [ + 515, + -1 + ], + [ + 539, + -1 + ], + [ + 563, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 36, + 1 + ], + [ + 60, + 1 + ], + [ + 84, + 1 + ], + [ + 108, + 1 + ], + [ + 132, + 1 + ], + [ + 156, + 1 + ], + [ + 180, + 1 + ], + [ + 204, + 1 + ], + [ + 228, + 1 + ], + [ + 252, + 1 + ], + [ + 276, + 1 + ], + [ + 300, + 1 + ], + [ + 324, + 1 + ], + [ + 348, + 1 + ], + [ + 372, + 1 + ], + [ + 396, + 1 + ], + [ + 420, + 1 + ], + [ + 444, + 1 + ], + [ + 468, + 1 + ], + [ + 492, + 1 + ], + [ + 516, + 1 + ], + [ + 540, + 1 + ], + [ + 564, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 36, + -1 + ], + [ + 60, + -1 + ], + [ + 84, + -1 + ], + [ + 108, + -1 + ], + [ + 132, + -1 + ], + [ + 156, + -1 + ], + [ + 180, + -1 + ], + [ + 204, + -1 + ], + [ + 228, + -1 + ], + [ + 252, + -1 + ], + [ + 276, + -1 + ], + [ + 300, + -1 + ], + [ + 324, + -1 + ], + [ + 348, + -1 + ], + [ + 372, + -1 + ], + [ + 396, + -1 + ], + [ + 420, + -1 + ], + [ + 444, + -1 + ], + [ + 468, + -1 + ], + [ + 492, + -1 + ], + [ + 516, + -1 + ], + [ + 540, + -1 + ], + [ + 564, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 37, + 1 + ], + [ + 61, + 1 + ], + [ + 85, + 1 + ], + [ + 109, + 1 + ], + [ + 133, + 1 + ], + [ + 157, + 1 + ], + [ + 181, + 1 + ], + [ + 205, + 1 + ], + [ + 229, + 1 + ], + [ + 253, + 1 + ], + [ + 277, + 1 + ], + [ + 301, + 1 + ], + [ + 325, + 1 + ], + [ + 349, + 1 + ], + [ + 373, + 1 + ], + [ + 397, + 1 + ], + [ + 421, + 1 + ], + [ + 445, + 1 + ], + [ + 469, + 1 + ], + [ + 493, + 1 + ], + [ + 517, + 1 + ], + [ + 541, + 1 + ], + [ + 565, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 37, + -1 + ], + [ + 61, + -1 + ], + [ + 85, + -1 + ], + [ + 109, + -1 + ], + [ + 133, + -1 + ], + [ + 157, + -1 + ], + [ + 181, + -1 + ], + [ + 205, + -1 + ], + [ + 229, + -1 + ], + [ + 253, + -1 + ], + [ + 277, + -1 + ], + [ + 301, + -1 + ], + [ + 325, + -1 + ], + [ + 349, + -1 + ], + [ + 373, + -1 + ], + [ + 397, + -1 + ], + [ + 421, + -1 + ], + [ + 445, + -1 + ], + [ + 469, + -1 + ], + [ + 493, + -1 + ], + [ + 517, + -1 + ], + [ + 541, + -1 + ], + [ + 565, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 38, + 1 + ], + [ + 62, + 1 + ], + [ + 86, + 1 + ], + [ + 110, + 1 + ], + [ + 134, + 1 + ], + [ + 158, + 1 + ], + [ + 182, + 1 + ], + [ + 206, + 1 + ], + [ + 230, + 1 + ], + [ + 254, + 1 + ], + [ + 278, + 1 + ], + [ + 302, + 1 + ], + [ + 326, + 1 + ], + [ + 350, + 1 + ], + [ + 374, + 1 + ], + [ + 398, + 1 + ], + [ + 422, + 1 + ], + [ + 446, + 1 + ], + [ + 470, + 1 + ], + [ + 494, + 1 + ], + [ + 518, + 1 + ], + [ + 542, + 1 + ], + [ + 566, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 38, + -1 + ], + [ + 62, + -1 + ], + [ + 86, + -1 + ], + [ + 110, + -1 + ], + [ + 134, + -1 + ], + [ + 158, + -1 + ], + [ + 182, + -1 + ], + [ + 206, + -1 + ], + [ + 230, + -1 + ], + [ + 254, + -1 + ], + [ + 278, + -1 + ], + [ + 302, + -1 + ], + [ + 326, + -1 + ], + [ + 350, + -1 + ], + [ + 374, + -1 + ], + [ + 398, + -1 + ], + [ + 422, + -1 + ], + [ + 446, + -1 + ], + [ + 470, + -1 + ], + [ + 494, + -1 + ], + [ + 518, + -1 + ], + [ + 542, + -1 + ], + [ + 566, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 39, + 1 + ], + [ + 63, + 1 + ], + [ + 87, + 1 + ], + [ + 111, + 1 + ], + [ + 135, + 1 + ], + [ + 159, + 1 + ], + [ + 183, + 1 + ], + [ + 207, + 1 + ], + [ + 231, + 1 + ], + [ + 255, + 1 + ], + [ + 279, + 1 + ], + [ + 303, + 1 + ], + [ + 327, + 1 + ], + [ + 351, + 1 + ], + [ + 375, + 1 + ], + [ + 399, + 1 + ], + [ + 423, + 1 + ], + [ + 447, + 1 + ], + [ + 471, + 1 + ], + [ + 495, + 1 + ], + [ + 519, + 1 + ], + [ + 543, + 1 + ], + [ + 567, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 39, + -1 + ], + [ + 63, + -1 + ], + [ + 87, + -1 + ], + [ + 111, + -1 + ], + [ + 135, + -1 + ], + [ + 159, + -1 + ], + [ + 183, + -1 + ], + [ + 207, + -1 + ], + [ + 231, + -1 + ], + [ + 255, + -1 + ], + [ + 279, + -1 + ], + [ + 303, + -1 + ], + [ + 327, + -1 + ], + [ + 351, + -1 + ], + [ + 375, + -1 + ], + [ + 399, + -1 + ], + [ + 423, + -1 + ], + [ + 447, + -1 + ], + [ + 471, + -1 + ], + [ + 495, + -1 + ], + [ + 519, + -1 + ], + [ + 543, + -1 + ], + [ + 567, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 40, + 1 + ], + [ + 64, + 1 + ], + [ + 88, + 1 + ], + [ + 112, + 1 + ], + [ + 136, + 1 + ], + [ + 160, + 1 + ], + [ + 184, + 1 + ], + [ + 208, + 1 + ], + [ + 232, + 1 + ], + [ + 256, + 1 + ], + [ + 280, + 1 + ], + [ + 304, + 1 + ], + [ + 328, + 1 + ], + [ + 352, + 1 + ], + [ + 376, + 1 + ], + [ + 400, + 1 + ], + [ + 424, + 1 + ], + [ + 448, + 1 + ], + [ + 472, + 1 + ], + [ + 496, + 1 + ], + [ + 520, + 1 + ], + [ + 544, + 1 + ], + [ + 568, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 40, + -1 + ], + [ + 64, + -1 + ], + [ + 88, + -1 + ], + [ + 112, + -1 + ], + [ + 136, + -1 + ], + [ + 160, + -1 + ], + [ + 184, + -1 + ], + [ + 208, + -1 + ], + [ + 232, + -1 + ], + [ + 256, + -1 + ], + [ + 280, + -1 + ], + [ + 304, + -1 + ], + [ + 328, + -1 + ], + [ + 352, + -1 + ], + [ + 376, + -1 + ], + [ + 400, + -1 + ], + [ + 424, + -1 + ], + [ + 448, + -1 + ], + [ + 472, + -1 + ], + [ + 496, + -1 + ], + [ + 520, + -1 + ], + [ + 544, + -1 + ], + [ + 568, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 41, + 1 + ], + [ + 65, + 1 + ], + [ + 89, + 1 + ], + [ + 113, + 1 + ], + [ + 137, + 1 + ], + [ + 161, + 1 + ], + [ + 185, + 1 + ], + [ + 209, + 1 + ], + [ + 233, + 1 + ], + [ + 257, + 1 + ], + [ + 281, + 1 + ], + [ + 305, + 1 + ], + [ + 329, + 1 + ], + [ + 353, + 1 + ], + [ + 377, + 1 + ], + [ + 401, + 1 + ], + [ + 425, + 1 + ], + [ + 449, + 1 + ], + [ + 473, + 1 + ], + [ + 497, + 1 + ], + [ + 521, + 1 + ], + [ + 545, + 1 + ], + [ + 569, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 41, + -1 + ], + [ + 65, + -1 + ], + [ + 89, + -1 + ], + [ + 113, + -1 + ], + [ + 137, + -1 + ], + [ + 161, + -1 + ], + [ + 185, + -1 + ], + [ + 209, + -1 + ], + [ + 233, + -1 + ], + [ + 257, + -1 + ], + [ + 281, + -1 + ], + [ + 305, + -1 + ], + [ + 329, + -1 + ], + [ + 353, + -1 + ], + [ + 377, + -1 + ], + [ + 401, + -1 + ], + [ + 425, + -1 + ], + [ + 449, + -1 + ], + [ + 473, + -1 + ], + [ + 497, + -1 + ], + [ + 521, + -1 + ], + [ + 545, + -1 + ], + [ + 569, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 42, + 1 + ], + [ + 66, + 1 + ], + [ + 90, + 1 + ], + [ + 114, + 1 + ], + [ + 138, + 1 + ], + [ + 162, + 1 + ], + [ + 186, + 1 + ], + [ + 210, + 1 + ], + [ + 234, + 1 + ], + [ + 258, + 1 + ], + [ + 282, + 1 + ], + [ + 306, + 1 + ], + [ + 330, + 1 + ], + [ + 354, + 1 + ], + [ + 378, + 1 + ], + [ + 402, + 1 + ], + [ + 426, + 1 + ], + [ + 450, + 1 + ], + [ + 474, + 1 + ], + [ + 498, + 1 + ], + [ + 522, + 1 + ], + [ + 546, + 1 + ], + [ + 570, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 42, + -1 + ], + [ + 66, + -1 + ], + [ + 90, + -1 + ], + [ + 114, + -1 + ], + [ + 138, + -1 + ], + [ + 162, + -1 + ], + [ + 186, + -1 + ], + [ + 210, + -1 + ], + [ + 234, + -1 + ], + [ + 258, + -1 + ], + [ + 282, + -1 + ], + [ + 306, + -1 + ], + [ + 330, + -1 + ], + [ + 354, + -1 + ], + [ + 378, + -1 + ], + [ + 402, + -1 + ], + [ + 426, + -1 + ], + [ + 450, + -1 + ], + [ + 474, + -1 + ], + [ + 498, + -1 + ], + [ + 522, + -1 + ], + [ + 546, + -1 + ], + [ + 570, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 43, + 1 + ], + [ + 67, + 1 + ], + [ + 91, + 1 + ], + [ + 115, + 1 + ], + [ + 139, + 1 + ], + [ + 163, + 1 + ], + [ + 187, + 1 + ], + [ + 211, + 1 + ], + [ + 235, + 1 + ], + [ + 259, + 1 + ], + [ + 283, + 1 + ], + [ + 307, + 1 + ], + [ + 331, + 1 + ], + [ + 355, + 1 + ], + [ + 379, + 1 + ], + [ + 403, + 1 + ], + [ + 427, + 1 + ], + [ + 451, + 1 + ], + [ + 475, + 1 + ], + [ + 499, + 1 + ], + [ + 523, + 1 + ], + [ + 547, + 1 + ], + [ + 571, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 43, + -1 + ], + [ + 67, + -1 + ], + [ + 91, + -1 + ], + [ + 115, + -1 + ], + [ + 139, + -1 + ], + [ + 163, + -1 + ], + [ + 187, + -1 + ], + [ + 211, + -1 + ], + [ + 235, + -1 + ], + [ + 259, + -1 + ], + [ + 283, + -1 + ], + [ + 307, + -1 + ], + [ + 331, + -1 + ], + [ + 355, + -1 + ], + [ + 379, + -1 + ], + [ + 403, + -1 + ], + [ + 427, + -1 + ], + [ + 451, + -1 + ], + [ + 475, + -1 + ], + [ + 499, + -1 + ], + [ + 523, + -1 + ], + [ + 547, + -1 + ], + [ + 571, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 44, + 1 + ], + [ + 68, + 1 + ], + [ + 92, + 1 + ], + [ + 116, + 1 + ], + [ + 140, + 1 + ], + [ + 164, + 1 + ], + [ + 188, + 1 + ], + [ + 212, + 1 + ], + [ + 236, + 1 + ], + [ + 260, + 1 + ], + [ + 284, + 1 + ], + [ + 308, + 1 + ], + [ + 332, + 1 + ], + [ + 356, + 1 + ], + [ + 380, + 1 + ], + [ + 404, + 1 + ], + [ + 428, + 1 + ], + [ + 452, + 1 + ], + [ + 476, + 1 + ], + [ + 500, + 1 + ], + [ + 524, + 1 + ], + [ + 548, + 1 + ], + [ + 572, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 44, + -1 + ], + [ + 68, + -1 + ], + [ + 92, + -1 + ], + [ + 116, + -1 + ], + [ + 140, + -1 + ], + [ + 164, + -1 + ], + [ + 188, + -1 + ], + [ + 212, + -1 + ], + [ + 236, + -1 + ], + [ + 260, + -1 + ], + [ + 284, + -1 + ], + [ + 308, + -1 + ], + [ + 332, + -1 + ], + [ + 356, + -1 + ], + [ + 380, + -1 + ], + [ + 404, + -1 + ], + [ + 428, + -1 + ], + [ + 452, + -1 + ], + [ + 476, + -1 + ], + [ + 500, + -1 + ], + [ + 524, + -1 + ], + [ + 548, + -1 + ], + [ + 572, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 45, + 1 + ], + [ + 69, + 1 + ], + [ + 93, + 1 + ], + [ + 117, + 1 + ], + [ + 141, + 1 + ], + [ + 165, + 1 + ], + [ + 189, + 1 + ], + [ + 213, + 1 + ], + [ + 237, + 1 + ], + [ + 261, + 1 + ], + [ + 285, + 1 + ], + [ + 309, + 1 + ], + [ + 333, + 1 + ], + [ + 357, + 1 + ], + [ + 381, + 1 + ], + [ + 405, + 1 + ], + [ + 429, + 1 + ], + [ + 453, + 1 + ], + [ + 477, + 1 + ], + [ + 501, + 1 + ], + [ + 525, + 1 + ], + [ + 549, + 1 + ], + [ + 573, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 45, + -1 + ], + [ + 69, + -1 + ], + [ + 93, + -1 + ], + [ + 117, + -1 + ], + [ + 141, + -1 + ], + [ + 165, + -1 + ], + [ + 189, + -1 + ], + [ + 213, + -1 + ], + [ + 237, + -1 + ], + [ + 261, + -1 + ], + [ + 285, + -1 + ], + [ + 309, + -1 + ], + [ + 333, + -1 + ], + [ + 357, + -1 + ], + [ + 381, + -1 + ], + [ + 405, + -1 + ], + [ + 429, + -1 + ], + [ + 453, + -1 + ], + [ + 477, + -1 + ], + [ + 501, + -1 + ], + [ + 525, + -1 + ], + [ + 549, + -1 + ], + [ + 573, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 46, + 1 + ], + [ + 70, + 1 + ], + [ + 94, + 1 + ], + [ + 118, + 1 + ], + [ + 142, + 1 + ], + [ + 166, + 1 + ], + [ + 190, + 1 + ], + [ + 214, + 1 + ], + [ + 238, + 1 + ], + [ + 262, + 1 + ], + [ + 286, + 1 + ], + [ + 310, + 1 + ], + [ + 334, + 1 + ], + [ + 358, + 1 + ], + [ + 382, + 1 + ], + [ + 406, + 1 + ], + [ + 430, + 1 + ], + [ + 454, + 1 + ], + [ + 478, + 1 + ], + [ + 502, + 1 + ], + [ + 526, + 1 + ], + [ + 550, + 1 + ], + [ + 574, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 46, + -1 + ], + [ + 70, + -1 + ], + [ + 94, + -1 + ], + [ + 118, + -1 + ], + [ + 142, + -1 + ], + [ + 166, + -1 + ], + [ + 190, + -1 + ], + [ + 214, + -1 + ], + [ + 238, + -1 + ], + [ + 262, + -1 + ], + [ + 286, + -1 + ], + [ + 310, + -1 + ], + [ + 334, + -1 + ], + [ + 358, + -1 + ], + [ + 382, + -1 + ], + [ + 406, + -1 + ], + [ + 430, + -1 + ], + [ + 454, + -1 + ], + [ + 478, + -1 + ], + [ + 502, + -1 + ], + [ + 526, + -1 + ], + [ + 550, + -1 + ], + [ + 574, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 47, + 1 + ], + [ + 71, + 1 + ], + [ + 95, + 1 + ], + [ + 119, + 1 + ], + [ + 143, + 1 + ], + [ + 167, + 1 + ], + [ + 191, + 1 + ], + [ + 215, + 1 + ], + [ + 239, + 1 + ], + [ + 263, + 1 + ], + [ + 287, + 1 + ], + [ + 311, + 1 + ], + [ + 335, + 1 + ], + [ + 359, + 1 + ], + [ + 383, + 1 + ], + [ + 407, + 1 + ], + [ + 431, + 1 + ], + [ + 455, + 1 + ], + [ + 479, + 1 + ], + [ + 503, + 1 + ], + [ + 527, + 1 + ], + [ + 551, + 1 + ], + [ + 575, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 47, + -1 + ], + [ + 71, + -1 + ], + [ + 95, + -1 + ], + [ + 119, + -1 + ], + [ + 143, + -1 + ], + [ + 167, + -1 + ], + [ + 191, + -1 + ], + [ + 215, + -1 + ], + [ + 239, + -1 + ], + [ + 263, + -1 + ], + [ + 287, + -1 + ], + [ + 311, + -1 + ], + [ + 335, + -1 + ], + [ + 359, + -1 + ], + [ + 383, + -1 + ], + [ + 407, + -1 + ], + [ + 431, + -1 + ], + [ + 455, + -1 + ], + [ + 479, + -1 + ], + [ + 503, + -1 + ], + [ + 527, + -1 + ], + [ + 551, + -1 + ], + [ + 575, + -1 + ] + ] + } + ], + "parameters": { + "size": 24, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 576, + "variables": 576, + "rows": 96, + "nonzeros": 2304, + "globals": 0 + }, + "input_variables": 576, + "model_variables": 576, + "modelled_variables": 576, + "size_unit": "tasks" + }, + "json_sha256": "55fac4018a514754eba3ff4c96aed96226722164943b1e11d94a8058bbfda3af", + "txt_sha256": "ba99bcdc121b61f47d6659da536d2fb42dfbfa491bf9b5276c513a869af5f6b9" + }, + { + "id": "assignment-20-single", + "category": "assignment", + "size": 20, + "variant": "single", + "model": { + "id": "assignment_single_20", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 400, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 20, + 1 + ], + [ + 40, + 1 + ], + [ + 60, + 1 + ], + [ + 80, + 1 + ], + [ + 100, + 1 + ], + [ + 120, + 1 + ], + [ + 140, + 1 + ], + [ + 160, + 1 + ], + [ + 180, + 1 + ], + [ + 200, + 1 + ], + [ + 220, + 1 + ], + [ + 240, + 1 + ], + [ + 260, + 1 + ], + [ + 280, + 1 + ], + [ + 300, + 1 + ], + [ + 320, + 1 + ], + [ + 340, + 1 + ], + [ + 360, + 1 + ], + [ + 380, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 20, + -1 + ], + [ + 40, + -1 + ], + [ + 60, + -1 + ], + [ + 80, + -1 + ], + [ + 100, + -1 + ], + [ + 120, + -1 + ], + [ + 140, + -1 + ], + [ + 160, + -1 + ], + [ + 180, + -1 + ], + [ + 200, + -1 + ], + [ + 220, + -1 + ], + [ + 240, + -1 + ], + [ + 260, + -1 + ], + [ + 280, + -1 + ], + [ + 300, + -1 + ], + [ + 320, + -1 + ], + [ + 340, + -1 + ], + [ + 360, + -1 + ], + [ + 380, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 21, + 1 + ], + [ + 41, + 1 + ], + [ + 61, + 1 + ], + [ + 81, + 1 + ], + [ + 101, + 1 + ], + [ + 121, + 1 + ], + [ + 141, + 1 + ], + [ + 161, + 1 + ], + [ + 181, + 1 + ], + [ + 201, + 1 + ], + [ + 221, + 1 + ], + [ + 241, + 1 + ], + [ + 261, + 1 + ], + [ + 281, + 1 + ], + [ + 301, + 1 + ], + [ + 321, + 1 + ], + [ + 341, + 1 + ], + [ + 361, + 1 + ], + [ + 381, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 21, + -1 + ], + [ + 41, + -1 + ], + [ + 61, + -1 + ], + [ + 81, + -1 + ], + [ + 101, + -1 + ], + [ + 121, + -1 + ], + [ + 141, + -1 + ], + [ + 161, + -1 + ], + [ + 181, + -1 + ], + [ + 201, + -1 + ], + [ + 221, + -1 + ], + [ + 241, + -1 + ], + [ + 261, + -1 + ], + [ + 281, + -1 + ], + [ + 301, + -1 + ], + [ + 321, + -1 + ], + [ + 341, + -1 + ], + [ + 361, + -1 + ], + [ + 381, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 22, + 1 + ], + [ + 42, + 1 + ], + [ + 62, + 1 + ], + [ + 82, + 1 + ], + [ + 102, + 1 + ], + [ + 122, + 1 + ], + [ + 142, + 1 + ], + [ + 162, + 1 + ], + [ + 182, + 1 + ], + [ + 202, + 1 + ], + [ + 222, + 1 + ], + [ + 242, + 1 + ], + [ + 262, + 1 + ], + [ + 282, + 1 + ], + [ + 302, + 1 + ], + [ + 322, + 1 + ], + [ + 342, + 1 + ], + [ + 362, + 1 + ], + [ + 382, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 22, + -1 + ], + [ + 42, + -1 + ], + [ + 62, + -1 + ], + [ + 82, + -1 + ], + [ + 102, + -1 + ], + [ + 122, + -1 + ], + [ + 142, + -1 + ], + [ + 162, + -1 + ], + [ + 182, + -1 + ], + [ + 202, + -1 + ], + [ + 222, + -1 + ], + [ + 242, + -1 + ], + [ + 262, + -1 + ], + [ + 282, + -1 + ], + [ + 302, + -1 + ], + [ + 322, + -1 + ], + [ + 342, + -1 + ], + [ + 362, + -1 + ], + [ + 382, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 23, + 1 + ], + [ + 43, + 1 + ], + [ + 63, + 1 + ], + [ + 83, + 1 + ], + [ + 103, + 1 + ], + [ + 123, + 1 + ], + [ + 143, + 1 + ], + [ + 163, + 1 + ], + [ + 183, + 1 + ], + [ + 203, + 1 + ], + [ + 223, + 1 + ], + [ + 243, + 1 + ], + [ + 263, + 1 + ], + [ + 283, + 1 + ], + [ + 303, + 1 + ], + [ + 323, + 1 + ], + [ + 343, + 1 + ], + [ + 363, + 1 + ], + [ + 383, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 23, + -1 + ], + [ + 43, + -1 + ], + [ + 63, + -1 + ], + [ + 83, + -1 + ], + [ + 103, + -1 + ], + [ + 123, + -1 + ], + [ + 143, + -1 + ], + [ + 163, + -1 + ], + [ + 183, + -1 + ], + [ + 203, + -1 + ], + [ + 223, + -1 + ], + [ + 243, + -1 + ], + [ + 263, + -1 + ], + [ + 283, + -1 + ], + [ + 303, + -1 + ], + [ + 323, + -1 + ], + [ + 343, + -1 + ], + [ + 363, + -1 + ], + [ + 383, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 24, + 1 + ], + [ + 44, + 1 + ], + [ + 64, + 1 + ], + [ + 84, + 1 + ], + [ + 104, + 1 + ], + [ + 124, + 1 + ], + [ + 144, + 1 + ], + [ + 164, + 1 + ], + [ + 184, + 1 + ], + [ + 204, + 1 + ], + [ + 224, + 1 + ], + [ + 244, + 1 + ], + [ + 264, + 1 + ], + [ + 284, + 1 + ], + [ + 304, + 1 + ], + [ + 324, + 1 + ], + [ + 344, + 1 + ], + [ + 364, + 1 + ], + [ + 384, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 24, + -1 + ], + [ + 44, + -1 + ], + [ + 64, + -1 + ], + [ + 84, + -1 + ], + [ + 104, + -1 + ], + [ + 124, + -1 + ], + [ + 144, + -1 + ], + [ + 164, + -1 + ], + [ + 184, + -1 + ], + [ + 204, + -1 + ], + [ + 224, + -1 + ], + [ + 244, + -1 + ], + [ + 264, + -1 + ], + [ + 284, + -1 + ], + [ + 304, + -1 + ], + [ + 324, + -1 + ], + [ + 344, + -1 + ], + [ + 364, + -1 + ], + [ + 384, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 25, + 1 + ], + [ + 45, + 1 + ], + [ + 65, + 1 + ], + [ + 85, + 1 + ], + [ + 105, + 1 + ], + [ + 125, + 1 + ], + [ + 145, + 1 + ], + [ + 165, + 1 + ], + [ + 185, + 1 + ], + [ + 205, + 1 + ], + [ + 225, + 1 + ], + [ + 245, + 1 + ], + [ + 265, + 1 + ], + [ + 285, + 1 + ], + [ + 305, + 1 + ], + [ + 325, + 1 + ], + [ + 345, + 1 + ], + [ + 365, + 1 + ], + [ + 385, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 25, + -1 + ], + [ + 45, + -1 + ], + [ + 65, + -1 + ], + [ + 85, + -1 + ], + [ + 105, + -1 + ], + [ + 125, + -1 + ], + [ + 145, + -1 + ], + [ + 165, + -1 + ], + [ + 185, + -1 + ], + [ + 205, + -1 + ], + [ + 225, + -1 + ], + [ + 245, + -1 + ], + [ + 265, + -1 + ], + [ + 285, + -1 + ], + [ + 305, + -1 + ], + [ + 325, + -1 + ], + [ + 345, + -1 + ], + [ + 365, + -1 + ], + [ + 385, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 26, + 1 + ], + [ + 46, + 1 + ], + [ + 66, + 1 + ], + [ + 86, + 1 + ], + [ + 106, + 1 + ], + [ + 126, + 1 + ], + [ + 146, + 1 + ], + [ + 166, + 1 + ], + [ + 186, + 1 + ], + [ + 206, + 1 + ], + [ + 226, + 1 + ], + [ + 246, + 1 + ], + [ + 266, + 1 + ], + [ + 286, + 1 + ], + [ + 306, + 1 + ], + [ + 326, + 1 + ], + [ + 346, + 1 + ], + [ + 366, + 1 + ], + [ + 386, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 26, + -1 + ], + [ + 46, + -1 + ], + [ + 66, + -1 + ], + [ + 86, + -1 + ], + [ + 106, + -1 + ], + [ + 126, + -1 + ], + [ + 146, + -1 + ], + [ + 166, + -1 + ], + [ + 186, + -1 + ], + [ + 206, + -1 + ], + [ + 226, + -1 + ], + [ + 246, + -1 + ], + [ + 266, + -1 + ], + [ + 286, + -1 + ], + [ + 306, + -1 + ], + [ + 326, + -1 + ], + [ + 346, + -1 + ], + [ + 366, + -1 + ], + [ + 386, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 27, + 1 + ], + [ + 47, + 1 + ], + [ + 67, + 1 + ], + [ + 87, + 1 + ], + [ + 107, + 1 + ], + [ + 127, + 1 + ], + [ + 147, + 1 + ], + [ + 167, + 1 + ], + [ + 187, + 1 + ], + [ + 207, + 1 + ], + [ + 227, + 1 + ], + [ + 247, + 1 + ], + [ + 267, + 1 + ], + [ + 287, + 1 + ], + [ + 307, + 1 + ], + [ + 327, + 1 + ], + [ + 347, + 1 + ], + [ + 367, + 1 + ], + [ + 387, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 27, + -1 + ], + [ + 47, + -1 + ], + [ + 67, + -1 + ], + [ + 87, + -1 + ], + [ + 107, + -1 + ], + [ + 127, + -1 + ], + [ + 147, + -1 + ], + [ + 167, + -1 + ], + [ + 187, + -1 + ], + [ + 207, + -1 + ], + [ + 227, + -1 + ], + [ + 247, + -1 + ], + [ + 267, + -1 + ], + [ + 287, + -1 + ], + [ + 307, + -1 + ], + [ + 327, + -1 + ], + [ + 347, + -1 + ], + [ + 367, + -1 + ], + [ + 387, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 28, + 1 + ], + [ + 48, + 1 + ], + [ + 68, + 1 + ], + [ + 88, + 1 + ], + [ + 108, + 1 + ], + [ + 128, + 1 + ], + [ + 148, + 1 + ], + [ + 168, + 1 + ], + [ + 188, + 1 + ], + [ + 208, + 1 + ], + [ + 228, + 1 + ], + [ + 248, + 1 + ], + [ + 268, + 1 + ], + [ + 288, + 1 + ], + [ + 308, + 1 + ], + [ + 328, + 1 + ], + [ + 348, + 1 + ], + [ + 368, + 1 + ], + [ + 388, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 28, + -1 + ], + [ + 48, + -1 + ], + [ + 68, + -1 + ], + [ + 88, + -1 + ], + [ + 108, + -1 + ], + [ + 128, + -1 + ], + [ + 148, + -1 + ], + [ + 168, + -1 + ], + [ + 188, + -1 + ], + [ + 208, + -1 + ], + [ + 228, + -1 + ], + [ + 248, + -1 + ], + [ + 268, + -1 + ], + [ + 288, + -1 + ], + [ + 308, + -1 + ], + [ + 328, + -1 + ], + [ + 348, + -1 + ], + [ + 368, + -1 + ], + [ + 388, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 29, + 1 + ], + [ + 49, + 1 + ], + [ + 69, + 1 + ], + [ + 89, + 1 + ], + [ + 109, + 1 + ], + [ + 129, + 1 + ], + [ + 149, + 1 + ], + [ + 169, + 1 + ], + [ + 189, + 1 + ], + [ + 209, + 1 + ], + [ + 229, + 1 + ], + [ + 249, + 1 + ], + [ + 269, + 1 + ], + [ + 289, + 1 + ], + [ + 309, + 1 + ], + [ + 329, + 1 + ], + [ + 349, + 1 + ], + [ + 369, + 1 + ], + [ + 389, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 29, + -1 + ], + [ + 49, + -1 + ], + [ + 69, + -1 + ], + [ + 89, + -1 + ], + [ + 109, + -1 + ], + [ + 129, + -1 + ], + [ + 149, + -1 + ], + [ + 169, + -1 + ], + [ + 189, + -1 + ], + [ + 209, + -1 + ], + [ + 229, + -1 + ], + [ + 249, + -1 + ], + [ + 269, + -1 + ], + [ + 289, + -1 + ], + [ + 309, + -1 + ], + [ + 329, + -1 + ], + [ + 349, + -1 + ], + [ + 369, + -1 + ], + [ + 389, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 30, + 1 + ], + [ + 50, + 1 + ], + [ + 70, + 1 + ], + [ + 90, + 1 + ], + [ + 110, + 1 + ], + [ + 130, + 1 + ], + [ + 150, + 1 + ], + [ + 170, + 1 + ], + [ + 190, + 1 + ], + [ + 210, + 1 + ], + [ + 230, + 1 + ], + [ + 250, + 1 + ], + [ + 270, + 1 + ], + [ + 290, + 1 + ], + [ + 310, + 1 + ], + [ + 330, + 1 + ], + [ + 350, + 1 + ], + [ + 370, + 1 + ], + [ + 390, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 30, + -1 + ], + [ + 50, + -1 + ], + [ + 70, + -1 + ], + [ + 90, + -1 + ], + [ + 110, + -1 + ], + [ + 130, + -1 + ], + [ + 150, + -1 + ], + [ + 170, + -1 + ], + [ + 190, + -1 + ], + [ + 210, + -1 + ], + [ + 230, + -1 + ], + [ + 250, + -1 + ], + [ + 270, + -1 + ], + [ + 290, + -1 + ], + [ + 310, + -1 + ], + [ + 330, + -1 + ], + [ + 350, + -1 + ], + [ + 370, + -1 + ], + [ + 390, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 31, + 1 + ], + [ + 51, + 1 + ], + [ + 71, + 1 + ], + [ + 91, + 1 + ], + [ + 111, + 1 + ], + [ + 131, + 1 + ], + [ + 151, + 1 + ], + [ + 171, + 1 + ], + [ + 191, + 1 + ], + [ + 211, + 1 + ], + [ + 231, + 1 + ], + [ + 251, + 1 + ], + [ + 271, + 1 + ], + [ + 291, + 1 + ], + [ + 311, + 1 + ], + [ + 331, + 1 + ], + [ + 351, + 1 + ], + [ + 371, + 1 + ], + [ + 391, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 31, + -1 + ], + [ + 51, + -1 + ], + [ + 71, + -1 + ], + [ + 91, + -1 + ], + [ + 111, + -1 + ], + [ + 131, + -1 + ], + [ + 151, + -1 + ], + [ + 171, + -1 + ], + [ + 191, + -1 + ], + [ + 211, + -1 + ], + [ + 231, + -1 + ], + [ + 251, + -1 + ], + [ + 271, + -1 + ], + [ + 291, + -1 + ], + [ + 311, + -1 + ], + [ + 331, + -1 + ], + [ + 351, + -1 + ], + [ + 371, + -1 + ], + [ + 391, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 32, + 1 + ], + [ + 52, + 1 + ], + [ + 72, + 1 + ], + [ + 92, + 1 + ], + [ + 112, + 1 + ], + [ + 132, + 1 + ], + [ + 152, + 1 + ], + [ + 172, + 1 + ], + [ + 192, + 1 + ], + [ + 212, + 1 + ], + [ + 232, + 1 + ], + [ + 252, + 1 + ], + [ + 272, + 1 + ], + [ + 292, + 1 + ], + [ + 312, + 1 + ], + [ + 332, + 1 + ], + [ + 352, + 1 + ], + [ + 372, + 1 + ], + [ + 392, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 32, + -1 + ], + [ + 52, + -1 + ], + [ + 72, + -1 + ], + [ + 92, + -1 + ], + [ + 112, + -1 + ], + [ + 132, + -1 + ], + [ + 152, + -1 + ], + [ + 172, + -1 + ], + [ + 192, + -1 + ], + [ + 212, + -1 + ], + [ + 232, + -1 + ], + [ + 252, + -1 + ], + [ + 272, + -1 + ], + [ + 292, + -1 + ], + [ + 312, + -1 + ], + [ + 332, + -1 + ], + [ + 352, + -1 + ], + [ + 372, + -1 + ], + [ + 392, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 33, + 1 + ], + [ + 53, + 1 + ], + [ + 73, + 1 + ], + [ + 93, + 1 + ], + [ + 113, + 1 + ], + [ + 133, + 1 + ], + [ + 153, + 1 + ], + [ + 173, + 1 + ], + [ + 193, + 1 + ], + [ + 213, + 1 + ], + [ + 233, + 1 + ], + [ + 253, + 1 + ], + [ + 273, + 1 + ], + [ + 293, + 1 + ], + [ + 313, + 1 + ], + [ + 333, + 1 + ], + [ + 353, + 1 + ], + [ + 373, + 1 + ], + [ + 393, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 33, + -1 + ], + [ + 53, + -1 + ], + [ + 73, + -1 + ], + [ + 93, + -1 + ], + [ + 113, + -1 + ], + [ + 133, + -1 + ], + [ + 153, + -1 + ], + [ + 173, + -1 + ], + [ + 193, + -1 + ], + [ + 213, + -1 + ], + [ + 233, + -1 + ], + [ + 253, + -1 + ], + [ + 273, + -1 + ], + [ + 293, + -1 + ], + [ + 313, + -1 + ], + [ + 333, + -1 + ], + [ + 353, + -1 + ], + [ + 373, + -1 + ], + [ + 393, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 34, + 1 + ], + [ + 54, + 1 + ], + [ + 74, + 1 + ], + [ + 94, + 1 + ], + [ + 114, + 1 + ], + [ + 134, + 1 + ], + [ + 154, + 1 + ], + [ + 174, + 1 + ], + [ + 194, + 1 + ], + [ + 214, + 1 + ], + [ + 234, + 1 + ], + [ + 254, + 1 + ], + [ + 274, + 1 + ], + [ + 294, + 1 + ], + [ + 314, + 1 + ], + [ + 334, + 1 + ], + [ + 354, + 1 + ], + [ + 374, + 1 + ], + [ + 394, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 34, + -1 + ], + [ + 54, + -1 + ], + [ + 74, + -1 + ], + [ + 94, + -1 + ], + [ + 114, + -1 + ], + [ + 134, + -1 + ], + [ + 154, + -1 + ], + [ + 174, + -1 + ], + [ + 194, + -1 + ], + [ + 214, + -1 + ], + [ + 234, + -1 + ], + [ + 254, + -1 + ], + [ + 274, + -1 + ], + [ + 294, + -1 + ], + [ + 314, + -1 + ], + [ + 334, + -1 + ], + [ + 354, + -1 + ], + [ + 374, + -1 + ], + [ + 394, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 35, + 1 + ], + [ + 55, + 1 + ], + [ + 75, + 1 + ], + [ + 95, + 1 + ], + [ + 115, + 1 + ], + [ + 135, + 1 + ], + [ + 155, + 1 + ], + [ + 175, + 1 + ], + [ + 195, + 1 + ], + [ + 215, + 1 + ], + [ + 235, + 1 + ], + [ + 255, + 1 + ], + [ + 275, + 1 + ], + [ + 295, + 1 + ], + [ + 315, + 1 + ], + [ + 335, + 1 + ], + [ + 355, + 1 + ], + [ + 375, + 1 + ], + [ + 395, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 35, + -1 + ], + [ + 55, + -1 + ], + [ + 75, + -1 + ], + [ + 95, + -1 + ], + [ + 115, + -1 + ], + [ + 135, + -1 + ], + [ + 155, + -1 + ], + [ + 175, + -1 + ], + [ + 195, + -1 + ], + [ + 215, + -1 + ], + [ + 235, + -1 + ], + [ + 255, + -1 + ], + [ + 275, + -1 + ], + [ + 295, + -1 + ], + [ + 315, + -1 + ], + [ + 335, + -1 + ], + [ + 355, + -1 + ], + [ + 375, + -1 + ], + [ + 395, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 36, + 1 + ], + [ + 56, + 1 + ], + [ + 76, + 1 + ], + [ + 96, + 1 + ], + [ + 116, + 1 + ], + [ + 136, + 1 + ], + [ + 156, + 1 + ], + [ + 176, + 1 + ], + [ + 196, + 1 + ], + [ + 216, + 1 + ], + [ + 236, + 1 + ], + [ + 256, + 1 + ], + [ + 276, + 1 + ], + [ + 296, + 1 + ], + [ + 316, + 1 + ], + [ + 336, + 1 + ], + [ + 356, + 1 + ], + [ + 376, + 1 + ], + [ + 396, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 36, + -1 + ], + [ + 56, + -1 + ], + [ + 76, + -1 + ], + [ + 96, + -1 + ], + [ + 116, + -1 + ], + [ + 136, + -1 + ], + [ + 156, + -1 + ], + [ + 176, + -1 + ], + [ + 196, + -1 + ], + [ + 216, + -1 + ], + [ + 236, + -1 + ], + [ + 256, + -1 + ], + [ + 276, + -1 + ], + [ + 296, + -1 + ], + [ + 316, + -1 + ], + [ + 336, + -1 + ], + [ + 356, + -1 + ], + [ + 376, + -1 + ], + [ + 396, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 37, + 1 + ], + [ + 57, + 1 + ], + [ + 77, + 1 + ], + [ + 97, + 1 + ], + [ + 117, + 1 + ], + [ + 137, + 1 + ], + [ + 157, + 1 + ], + [ + 177, + 1 + ], + [ + 197, + 1 + ], + [ + 217, + 1 + ], + [ + 237, + 1 + ], + [ + 257, + 1 + ], + [ + 277, + 1 + ], + [ + 297, + 1 + ], + [ + 317, + 1 + ], + [ + 337, + 1 + ], + [ + 357, + 1 + ], + [ + 377, + 1 + ], + [ + 397, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 37, + -1 + ], + [ + 57, + -1 + ], + [ + 77, + -1 + ], + [ + 97, + -1 + ], + [ + 117, + -1 + ], + [ + 137, + -1 + ], + [ + 157, + -1 + ], + [ + 177, + -1 + ], + [ + 197, + -1 + ], + [ + 217, + -1 + ], + [ + 237, + -1 + ], + [ + 257, + -1 + ], + [ + 277, + -1 + ], + [ + 297, + -1 + ], + [ + 317, + -1 + ], + [ + 337, + -1 + ], + [ + 357, + -1 + ], + [ + 377, + -1 + ], + [ + 397, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 38, + 1 + ], + [ + 58, + 1 + ], + [ + 78, + 1 + ], + [ + 98, + 1 + ], + [ + 118, + 1 + ], + [ + 138, + 1 + ], + [ + 158, + 1 + ], + [ + 178, + 1 + ], + [ + 198, + 1 + ], + [ + 218, + 1 + ], + [ + 238, + 1 + ], + [ + 258, + 1 + ], + [ + 278, + 1 + ], + [ + 298, + 1 + ], + [ + 318, + 1 + ], + [ + 338, + 1 + ], + [ + 358, + 1 + ], + [ + 378, + 1 + ], + [ + 398, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 38, + -1 + ], + [ + 58, + -1 + ], + [ + 78, + -1 + ], + [ + 98, + -1 + ], + [ + 118, + -1 + ], + [ + 138, + -1 + ], + [ + 158, + -1 + ], + [ + 178, + -1 + ], + [ + 198, + -1 + ], + [ + 218, + -1 + ], + [ + 238, + -1 + ], + [ + 258, + -1 + ], + [ + 278, + -1 + ], + [ + 298, + -1 + ], + [ + 318, + -1 + ], + [ + 338, + -1 + ], + [ + 358, + -1 + ], + [ + 378, + -1 + ], + [ + 398, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 39, + 1 + ], + [ + 59, + 1 + ], + [ + 79, + 1 + ], + [ + 99, + 1 + ], + [ + 119, + 1 + ], + [ + 139, + 1 + ], + [ + 159, + 1 + ], + [ + 179, + 1 + ], + [ + 199, + 1 + ], + [ + 219, + 1 + ], + [ + 239, + 1 + ], + [ + 259, + 1 + ], + [ + 279, + 1 + ], + [ + 299, + 1 + ], + [ + 319, + 1 + ], + [ + 339, + 1 + ], + [ + 359, + 1 + ], + [ + 379, + 1 + ], + [ + 399, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 39, + -1 + ], + [ + 59, + -1 + ], + [ + 79, + -1 + ], + [ + 99, + -1 + ], + [ + 119, + -1 + ], + [ + 139, + -1 + ], + [ + 159, + -1 + ], + [ + 179, + -1 + ], + [ + 199, + -1 + ], + [ + 219, + -1 + ], + [ + 239, + -1 + ], + [ + 259, + -1 + ], + [ + 279, + -1 + ], + [ + 299, + -1 + ], + [ + 319, + -1 + ], + [ + 339, + -1 + ], + [ + 359, + -1 + ], + [ + 379, + -1 + ], + [ + 399, + -1 + ] + ] + } + ], + "parameters": { + "size": 20, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 400, + "variables": 400, + "rows": 80, + "nonzeros": 1600, + "globals": 0 + }, + "input_variables": 400, + "model_variables": 400, + "modelled_variables": 400, + "size_unit": "tasks" + }, + "json_sha256": "3d1722683664e926239b76e59c1f99416a04d662bcf588240efa7d5cdff91ef5", + "txt_sha256": "4c6315ffaa357a6d18671613ac04cc78e6a69b5d3310dc06a509973e0b6a94c2" + }, + { + "id": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "model": { + "id": "assignment_single_18", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 324, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 18, + 1 + ], + [ + 36, + 1 + ], + [ + 54, + 1 + ], + [ + 72, + 1 + ], + [ + 90, + 1 + ], + [ + 108, + 1 + ], + [ + 126, + 1 + ], + [ + 144, + 1 + ], + [ + 162, + 1 + ], + [ + 180, + 1 + ], + [ + 198, + 1 + ], + [ + 216, + 1 + ], + [ + 234, + 1 + ], + [ + 252, + 1 + ], + [ + 270, + 1 + ], + [ + 288, + 1 + ], + [ + 306, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 18, + -1 + ], + [ + 36, + -1 + ], + [ + 54, + -1 + ], + [ + 72, + -1 + ], + [ + 90, + -1 + ], + [ + 108, + -1 + ], + [ + 126, + -1 + ], + [ + 144, + -1 + ], + [ + 162, + -1 + ], + [ + 180, + -1 + ], + [ + 198, + -1 + ], + [ + 216, + -1 + ], + [ + 234, + -1 + ], + [ + 252, + -1 + ], + [ + 270, + -1 + ], + [ + 288, + -1 + ], + [ + 306, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 19, + 1 + ], + [ + 37, + 1 + ], + [ + 55, + 1 + ], + [ + 73, + 1 + ], + [ + 91, + 1 + ], + [ + 109, + 1 + ], + [ + 127, + 1 + ], + [ + 145, + 1 + ], + [ + 163, + 1 + ], + [ + 181, + 1 + ], + [ + 199, + 1 + ], + [ + 217, + 1 + ], + [ + 235, + 1 + ], + [ + 253, + 1 + ], + [ + 271, + 1 + ], + [ + 289, + 1 + ], + [ + 307, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 19, + -1 + ], + [ + 37, + -1 + ], + [ + 55, + -1 + ], + [ + 73, + -1 + ], + [ + 91, + -1 + ], + [ + 109, + -1 + ], + [ + 127, + -1 + ], + [ + 145, + -1 + ], + [ + 163, + -1 + ], + [ + 181, + -1 + ], + [ + 199, + -1 + ], + [ + 217, + -1 + ], + [ + 235, + -1 + ], + [ + 253, + -1 + ], + [ + 271, + -1 + ], + [ + 289, + -1 + ], + [ + 307, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 20, + 1 + ], + [ + 38, + 1 + ], + [ + 56, + 1 + ], + [ + 74, + 1 + ], + [ + 92, + 1 + ], + [ + 110, + 1 + ], + [ + 128, + 1 + ], + [ + 146, + 1 + ], + [ + 164, + 1 + ], + [ + 182, + 1 + ], + [ + 200, + 1 + ], + [ + 218, + 1 + ], + [ + 236, + 1 + ], + [ + 254, + 1 + ], + [ + 272, + 1 + ], + [ + 290, + 1 + ], + [ + 308, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 20, + -1 + ], + [ + 38, + -1 + ], + [ + 56, + -1 + ], + [ + 74, + -1 + ], + [ + 92, + -1 + ], + [ + 110, + -1 + ], + [ + 128, + -1 + ], + [ + 146, + -1 + ], + [ + 164, + -1 + ], + [ + 182, + -1 + ], + [ + 200, + -1 + ], + [ + 218, + -1 + ], + [ + 236, + -1 + ], + [ + 254, + -1 + ], + [ + 272, + -1 + ], + [ + 290, + -1 + ], + [ + 308, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 21, + 1 + ], + [ + 39, + 1 + ], + [ + 57, + 1 + ], + [ + 75, + 1 + ], + [ + 93, + 1 + ], + [ + 111, + 1 + ], + [ + 129, + 1 + ], + [ + 147, + 1 + ], + [ + 165, + 1 + ], + [ + 183, + 1 + ], + [ + 201, + 1 + ], + [ + 219, + 1 + ], + [ + 237, + 1 + ], + [ + 255, + 1 + ], + [ + 273, + 1 + ], + [ + 291, + 1 + ], + [ + 309, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 21, + -1 + ], + [ + 39, + -1 + ], + [ + 57, + -1 + ], + [ + 75, + -1 + ], + [ + 93, + -1 + ], + [ + 111, + -1 + ], + [ + 129, + -1 + ], + [ + 147, + -1 + ], + [ + 165, + -1 + ], + [ + 183, + -1 + ], + [ + 201, + -1 + ], + [ + 219, + -1 + ], + [ + 237, + -1 + ], + [ + 255, + -1 + ], + [ + 273, + -1 + ], + [ + 291, + -1 + ], + [ + 309, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 22, + 1 + ], + [ + 40, + 1 + ], + [ + 58, + 1 + ], + [ + 76, + 1 + ], + [ + 94, + 1 + ], + [ + 112, + 1 + ], + [ + 130, + 1 + ], + [ + 148, + 1 + ], + [ + 166, + 1 + ], + [ + 184, + 1 + ], + [ + 202, + 1 + ], + [ + 220, + 1 + ], + [ + 238, + 1 + ], + [ + 256, + 1 + ], + [ + 274, + 1 + ], + [ + 292, + 1 + ], + [ + 310, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 22, + -1 + ], + [ + 40, + -1 + ], + [ + 58, + -1 + ], + [ + 76, + -1 + ], + [ + 94, + -1 + ], + [ + 112, + -1 + ], + [ + 130, + -1 + ], + [ + 148, + -1 + ], + [ + 166, + -1 + ], + [ + 184, + -1 + ], + [ + 202, + -1 + ], + [ + 220, + -1 + ], + [ + 238, + -1 + ], + [ + 256, + -1 + ], + [ + 274, + -1 + ], + [ + 292, + -1 + ], + [ + 310, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 23, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 77, + 1 + ], + [ + 95, + 1 + ], + [ + 113, + 1 + ], + [ + 131, + 1 + ], + [ + 149, + 1 + ], + [ + 167, + 1 + ], + [ + 185, + 1 + ], + [ + 203, + 1 + ], + [ + 221, + 1 + ], + [ + 239, + 1 + ], + [ + 257, + 1 + ], + [ + 275, + 1 + ], + [ + 293, + 1 + ], + [ + 311, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 23, + -1 + ], + [ + 41, + -1 + ], + [ + 59, + -1 + ], + [ + 77, + -1 + ], + [ + 95, + -1 + ], + [ + 113, + -1 + ], + [ + 131, + -1 + ], + [ + 149, + -1 + ], + [ + 167, + -1 + ], + [ + 185, + -1 + ], + [ + 203, + -1 + ], + [ + 221, + -1 + ], + [ + 239, + -1 + ], + [ + 257, + -1 + ], + [ + 275, + -1 + ], + [ + 293, + -1 + ], + [ + 311, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 24, + 1 + ], + [ + 42, + 1 + ], + [ + 60, + 1 + ], + [ + 78, + 1 + ], + [ + 96, + 1 + ], + [ + 114, + 1 + ], + [ + 132, + 1 + ], + [ + 150, + 1 + ], + [ + 168, + 1 + ], + [ + 186, + 1 + ], + [ + 204, + 1 + ], + [ + 222, + 1 + ], + [ + 240, + 1 + ], + [ + 258, + 1 + ], + [ + 276, + 1 + ], + [ + 294, + 1 + ], + [ + 312, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 24, + -1 + ], + [ + 42, + -1 + ], + [ + 60, + -1 + ], + [ + 78, + -1 + ], + [ + 96, + -1 + ], + [ + 114, + -1 + ], + [ + 132, + -1 + ], + [ + 150, + -1 + ], + [ + 168, + -1 + ], + [ + 186, + -1 + ], + [ + 204, + -1 + ], + [ + 222, + -1 + ], + [ + 240, + -1 + ], + [ + 258, + -1 + ], + [ + 276, + -1 + ], + [ + 294, + -1 + ], + [ + 312, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 25, + 1 + ], + [ + 43, + 1 + ], + [ + 61, + 1 + ], + [ + 79, + 1 + ], + [ + 97, + 1 + ], + [ + 115, + 1 + ], + [ + 133, + 1 + ], + [ + 151, + 1 + ], + [ + 169, + 1 + ], + [ + 187, + 1 + ], + [ + 205, + 1 + ], + [ + 223, + 1 + ], + [ + 241, + 1 + ], + [ + 259, + 1 + ], + [ + 277, + 1 + ], + [ + 295, + 1 + ], + [ + 313, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 25, + -1 + ], + [ + 43, + -1 + ], + [ + 61, + -1 + ], + [ + 79, + -1 + ], + [ + 97, + -1 + ], + [ + 115, + -1 + ], + [ + 133, + -1 + ], + [ + 151, + -1 + ], + [ + 169, + -1 + ], + [ + 187, + -1 + ], + [ + 205, + -1 + ], + [ + 223, + -1 + ], + [ + 241, + -1 + ], + [ + 259, + -1 + ], + [ + 277, + -1 + ], + [ + 295, + -1 + ], + [ + 313, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 26, + 1 + ], + [ + 44, + 1 + ], + [ + 62, + 1 + ], + [ + 80, + 1 + ], + [ + 98, + 1 + ], + [ + 116, + 1 + ], + [ + 134, + 1 + ], + [ + 152, + 1 + ], + [ + 170, + 1 + ], + [ + 188, + 1 + ], + [ + 206, + 1 + ], + [ + 224, + 1 + ], + [ + 242, + 1 + ], + [ + 260, + 1 + ], + [ + 278, + 1 + ], + [ + 296, + 1 + ], + [ + 314, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 26, + -1 + ], + [ + 44, + -1 + ], + [ + 62, + -1 + ], + [ + 80, + -1 + ], + [ + 98, + -1 + ], + [ + 116, + -1 + ], + [ + 134, + -1 + ], + [ + 152, + -1 + ], + [ + 170, + -1 + ], + [ + 188, + -1 + ], + [ + 206, + -1 + ], + [ + 224, + -1 + ], + [ + 242, + -1 + ], + [ + 260, + -1 + ], + [ + 278, + -1 + ], + [ + 296, + -1 + ], + [ + 314, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 27, + 1 + ], + [ + 45, + 1 + ], + [ + 63, + 1 + ], + [ + 81, + 1 + ], + [ + 99, + 1 + ], + [ + 117, + 1 + ], + [ + 135, + 1 + ], + [ + 153, + 1 + ], + [ + 171, + 1 + ], + [ + 189, + 1 + ], + [ + 207, + 1 + ], + [ + 225, + 1 + ], + [ + 243, + 1 + ], + [ + 261, + 1 + ], + [ + 279, + 1 + ], + [ + 297, + 1 + ], + [ + 315, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 27, + -1 + ], + [ + 45, + -1 + ], + [ + 63, + -1 + ], + [ + 81, + -1 + ], + [ + 99, + -1 + ], + [ + 117, + -1 + ], + [ + 135, + -1 + ], + [ + 153, + -1 + ], + [ + 171, + -1 + ], + [ + 189, + -1 + ], + [ + 207, + -1 + ], + [ + 225, + -1 + ], + [ + 243, + -1 + ], + [ + 261, + -1 + ], + [ + 279, + -1 + ], + [ + 297, + -1 + ], + [ + 315, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 28, + 1 + ], + [ + 46, + 1 + ], + [ + 64, + 1 + ], + [ + 82, + 1 + ], + [ + 100, + 1 + ], + [ + 118, + 1 + ], + [ + 136, + 1 + ], + [ + 154, + 1 + ], + [ + 172, + 1 + ], + [ + 190, + 1 + ], + [ + 208, + 1 + ], + [ + 226, + 1 + ], + [ + 244, + 1 + ], + [ + 262, + 1 + ], + [ + 280, + 1 + ], + [ + 298, + 1 + ], + [ + 316, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 28, + -1 + ], + [ + 46, + -1 + ], + [ + 64, + -1 + ], + [ + 82, + -1 + ], + [ + 100, + -1 + ], + [ + 118, + -1 + ], + [ + 136, + -1 + ], + [ + 154, + -1 + ], + [ + 172, + -1 + ], + [ + 190, + -1 + ], + [ + 208, + -1 + ], + [ + 226, + -1 + ], + [ + 244, + -1 + ], + [ + 262, + -1 + ], + [ + 280, + -1 + ], + [ + 298, + -1 + ], + [ + 316, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 29, + 1 + ], + [ + 47, + 1 + ], + [ + 65, + 1 + ], + [ + 83, + 1 + ], + [ + 101, + 1 + ], + [ + 119, + 1 + ], + [ + 137, + 1 + ], + [ + 155, + 1 + ], + [ + 173, + 1 + ], + [ + 191, + 1 + ], + [ + 209, + 1 + ], + [ + 227, + 1 + ], + [ + 245, + 1 + ], + [ + 263, + 1 + ], + [ + 281, + 1 + ], + [ + 299, + 1 + ], + [ + 317, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 29, + -1 + ], + [ + 47, + -1 + ], + [ + 65, + -1 + ], + [ + 83, + -1 + ], + [ + 101, + -1 + ], + [ + 119, + -1 + ], + [ + 137, + -1 + ], + [ + 155, + -1 + ], + [ + 173, + -1 + ], + [ + 191, + -1 + ], + [ + 209, + -1 + ], + [ + 227, + -1 + ], + [ + 245, + -1 + ], + [ + 263, + -1 + ], + [ + 281, + -1 + ], + [ + 299, + -1 + ], + [ + 317, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 30, + 1 + ], + [ + 48, + 1 + ], + [ + 66, + 1 + ], + [ + 84, + 1 + ], + [ + 102, + 1 + ], + [ + 120, + 1 + ], + [ + 138, + 1 + ], + [ + 156, + 1 + ], + [ + 174, + 1 + ], + [ + 192, + 1 + ], + [ + 210, + 1 + ], + [ + 228, + 1 + ], + [ + 246, + 1 + ], + [ + 264, + 1 + ], + [ + 282, + 1 + ], + [ + 300, + 1 + ], + [ + 318, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 30, + -1 + ], + [ + 48, + -1 + ], + [ + 66, + -1 + ], + [ + 84, + -1 + ], + [ + 102, + -1 + ], + [ + 120, + -1 + ], + [ + 138, + -1 + ], + [ + 156, + -1 + ], + [ + 174, + -1 + ], + [ + 192, + -1 + ], + [ + 210, + -1 + ], + [ + 228, + -1 + ], + [ + 246, + -1 + ], + [ + 264, + -1 + ], + [ + 282, + -1 + ], + [ + 300, + -1 + ], + [ + 318, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 31, + 1 + ], + [ + 49, + 1 + ], + [ + 67, + 1 + ], + [ + 85, + 1 + ], + [ + 103, + 1 + ], + [ + 121, + 1 + ], + [ + 139, + 1 + ], + [ + 157, + 1 + ], + [ + 175, + 1 + ], + [ + 193, + 1 + ], + [ + 211, + 1 + ], + [ + 229, + 1 + ], + [ + 247, + 1 + ], + [ + 265, + 1 + ], + [ + 283, + 1 + ], + [ + 301, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 31, + -1 + ], + [ + 49, + -1 + ], + [ + 67, + -1 + ], + [ + 85, + -1 + ], + [ + 103, + -1 + ], + [ + 121, + -1 + ], + [ + 139, + -1 + ], + [ + 157, + -1 + ], + [ + 175, + -1 + ], + [ + 193, + -1 + ], + [ + 211, + -1 + ], + [ + 229, + -1 + ], + [ + 247, + -1 + ], + [ + 265, + -1 + ], + [ + 283, + -1 + ], + [ + 301, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 32, + 1 + ], + [ + 50, + 1 + ], + [ + 68, + 1 + ], + [ + 86, + 1 + ], + [ + 104, + 1 + ], + [ + 122, + 1 + ], + [ + 140, + 1 + ], + [ + 158, + 1 + ], + [ + 176, + 1 + ], + [ + 194, + 1 + ], + [ + 212, + 1 + ], + [ + 230, + 1 + ], + [ + 248, + 1 + ], + [ + 266, + 1 + ], + [ + 284, + 1 + ], + [ + 302, + 1 + ], + [ + 320, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 32, + -1 + ], + [ + 50, + -1 + ], + [ + 68, + -1 + ], + [ + 86, + -1 + ], + [ + 104, + -1 + ], + [ + 122, + -1 + ], + [ + 140, + -1 + ], + [ + 158, + -1 + ], + [ + 176, + -1 + ], + [ + 194, + -1 + ], + [ + 212, + -1 + ], + [ + 230, + -1 + ], + [ + 248, + -1 + ], + [ + 266, + -1 + ], + [ + 284, + -1 + ], + [ + 302, + -1 + ], + [ + 320, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 33, + 1 + ], + [ + 51, + 1 + ], + [ + 69, + 1 + ], + [ + 87, + 1 + ], + [ + 105, + 1 + ], + [ + 123, + 1 + ], + [ + 141, + 1 + ], + [ + 159, + 1 + ], + [ + 177, + 1 + ], + [ + 195, + 1 + ], + [ + 213, + 1 + ], + [ + 231, + 1 + ], + [ + 249, + 1 + ], + [ + 267, + 1 + ], + [ + 285, + 1 + ], + [ + 303, + 1 + ], + [ + 321, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 33, + -1 + ], + [ + 51, + -1 + ], + [ + 69, + -1 + ], + [ + 87, + -1 + ], + [ + 105, + -1 + ], + [ + 123, + -1 + ], + [ + 141, + -1 + ], + [ + 159, + -1 + ], + [ + 177, + -1 + ], + [ + 195, + -1 + ], + [ + 213, + -1 + ], + [ + 231, + -1 + ], + [ + 249, + -1 + ], + [ + 267, + -1 + ], + [ + 285, + -1 + ], + [ + 303, + -1 + ], + [ + 321, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 34, + 1 + ], + [ + 52, + 1 + ], + [ + 70, + 1 + ], + [ + 88, + 1 + ], + [ + 106, + 1 + ], + [ + 124, + 1 + ], + [ + 142, + 1 + ], + [ + 160, + 1 + ], + [ + 178, + 1 + ], + [ + 196, + 1 + ], + [ + 214, + 1 + ], + [ + 232, + 1 + ], + [ + 250, + 1 + ], + [ + 268, + 1 + ], + [ + 286, + 1 + ], + [ + 304, + 1 + ], + [ + 322, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 34, + -1 + ], + [ + 52, + -1 + ], + [ + 70, + -1 + ], + [ + 88, + -1 + ], + [ + 106, + -1 + ], + [ + 124, + -1 + ], + [ + 142, + -1 + ], + [ + 160, + -1 + ], + [ + 178, + -1 + ], + [ + 196, + -1 + ], + [ + 214, + -1 + ], + [ + 232, + -1 + ], + [ + 250, + -1 + ], + [ + 268, + -1 + ], + [ + 286, + -1 + ], + [ + 304, + -1 + ], + [ + 322, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 35, + 1 + ], + [ + 53, + 1 + ], + [ + 71, + 1 + ], + [ + 89, + 1 + ], + [ + 107, + 1 + ], + [ + 125, + 1 + ], + [ + 143, + 1 + ], + [ + 161, + 1 + ], + [ + 179, + 1 + ], + [ + 197, + 1 + ], + [ + 215, + 1 + ], + [ + 233, + 1 + ], + [ + 251, + 1 + ], + [ + 269, + 1 + ], + [ + 287, + 1 + ], + [ + 305, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 35, + -1 + ], + [ + 53, + -1 + ], + [ + 71, + -1 + ], + [ + 89, + -1 + ], + [ + 107, + -1 + ], + [ + 125, + -1 + ], + [ + 143, + -1 + ], + [ + 161, + -1 + ], + [ + 179, + -1 + ], + [ + 197, + -1 + ], + [ + 215, + -1 + ], + [ + 233, + -1 + ], + [ + 251, + -1 + ], + [ + 269, + -1 + ], + [ + 287, + -1 + ], + [ + 305, + -1 + ], + [ + 323, + -1 + ] + ] + } + ], + "parameters": { + "size": 18, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 324, + "variables": 324, + "rows": 72, + "nonzeros": 1296, + "globals": 0 + }, + "input_variables": 324, + "model_variables": 324, + "modelled_variables": 324, + "size_unit": "tasks" + }, + "json_sha256": "f7aec878b0d183145a18e4a617de998b1de1367b4d786aed6bd6f3c04e94ec14", + "txt_sha256": "da55d2790da690ed9f306d2169173379e76528f1c7760cdc7978b7294cdcf80a" + }, + { + "id": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "model": { + "id": "assignment_single_17", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 17, + "natural_size": 17, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 289, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 17, + 1 + ], + [ + 34, + 1 + ], + [ + 51, + 1 + ], + [ + 68, + 1 + ], + [ + 85, + 1 + ], + [ + 102, + 1 + ], + [ + 119, + 1 + ], + [ + 136, + 1 + ], + [ + 153, + 1 + ], + [ + 170, + 1 + ], + [ + 187, + 1 + ], + [ + 204, + 1 + ], + [ + 221, + 1 + ], + [ + 238, + 1 + ], + [ + 255, + 1 + ], + [ + 272, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 17, + -1 + ], + [ + 34, + -1 + ], + [ + 51, + -1 + ], + [ + 68, + -1 + ], + [ + 85, + -1 + ], + [ + 102, + -1 + ], + [ + 119, + -1 + ], + [ + 136, + -1 + ], + [ + 153, + -1 + ], + [ + 170, + -1 + ], + [ + 187, + -1 + ], + [ + 204, + -1 + ], + [ + 221, + -1 + ], + [ + 238, + -1 + ], + [ + 255, + -1 + ], + [ + 272, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 18, + 1 + ], + [ + 35, + 1 + ], + [ + 52, + 1 + ], + [ + 69, + 1 + ], + [ + 86, + 1 + ], + [ + 103, + 1 + ], + [ + 120, + 1 + ], + [ + 137, + 1 + ], + [ + 154, + 1 + ], + [ + 171, + 1 + ], + [ + 188, + 1 + ], + [ + 205, + 1 + ], + [ + 222, + 1 + ], + [ + 239, + 1 + ], + [ + 256, + 1 + ], + [ + 273, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 18, + -1 + ], + [ + 35, + -1 + ], + [ + 52, + -1 + ], + [ + 69, + -1 + ], + [ + 86, + -1 + ], + [ + 103, + -1 + ], + [ + 120, + -1 + ], + [ + 137, + -1 + ], + [ + 154, + -1 + ], + [ + 171, + -1 + ], + [ + 188, + -1 + ], + [ + 205, + -1 + ], + [ + 222, + -1 + ], + [ + 239, + -1 + ], + [ + 256, + -1 + ], + [ + 273, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 19, + 1 + ], + [ + 36, + 1 + ], + [ + 53, + 1 + ], + [ + 70, + 1 + ], + [ + 87, + 1 + ], + [ + 104, + 1 + ], + [ + 121, + 1 + ], + [ + 138, + 1 + ], + [ + 155, + 1 + ], + [ + 172, + 1 + ], + [ + 189, + 1 + ], + [ + 206, + 1 + ], + [ + 223, + 1 + ], + [ + 240, + 1 + ], + [ + 257, + 1 + ], + [ + 274, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 19, + -1 + ], + [ + 36, + -1 + ], + [ + 53, + -1 + ], + [ + 70, + -1 + ], + [ + 87, + -1 + ], + [ + 104, + -1 + ], + [ + 121, + -1 + ], + [ + 138, + -1 + ], + [ + 155, + -1 + ], + [ + 172, + -1 + ], + [ + 189, + -1 + ], + [ + 206, + -1 + ], + [ + 223, + -1 + ], + [ + 240, + -1 + ], + [ + 257, + -1 + ], + [ + 274, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 20, + 1 + ], + [ + 37, + 1 + ], + [ + 54, + 1 + ], + [ + 71, + 1 + ], + [ + 88, + 1 + ], + [ + 105, + 1 + ], + [ + 122, + 1 + ], + [ + 139, + 1 + ], + [ + 156, + 1 + ], + [ + 173, + 1 + ], + [ + 190, + 1 + ], + [ + 207, + 1 + ], + [ + 224, + 1 + ], + [ + 241, + 1 + ], + [ + 258, + 1 + ], + [ + 275, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 20, + -1 + ], + [ + 37, + -1 + ], + [ + 54, + -1 + ], + [ + 71, + -1 + ], + [ + 88, + -1 + ], + [ + 105, + -1 + ], + [ + 122, + -1 + ], + [ + 139, + -1 + ], + [ + 156, + -1 + ], + [ + 173, + -1 + ], + [ + 190, + -1 + ], + [ + 207, + -1 + ], + [ + 224, + -1 + ], + [ + 241, + -1 + ], + [ + 258, + -1 + ], + [ + 275, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 21, + 1 + ], + [ + 38, + 1 + ], + [ + 55, + 1 + ], + [ + 72, + 1 + ], + [ + 89, + 1 + ], + [ + 106, + 1 + ], + [ + 123, + 1 + ], + [ + 140, + 1 + ], + [ + 157, + 1 + ], + [ + 174, + 1 + ], + [ + 191, + 1 + ], + [ + 208, + 1 + ], + [ + 225, + 1 + ], + [ + 242, + 1 + ], + [ + 259, + 1 + ], + [ + 276, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 21, + -1 + ], + [ + 38, + -1 + ], + [ + 55, + -1 + ], + [ + 72, + -1 + ], + [ + 89, + -1 + ], + [ + 106, + -1 + ], + [ + 123, + -1 + ], + [ + 140, + -1 + ], + [ + 157, + -1 + ], + [ + 174, + -1 + ], + [ + 191, + -1 + ], + [ + 208, + -1 + ], + [ + 225, + -1 + ], + [ + 242, + -1 + ], + [ + 259, + -1 + ], + [ + 276, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 22, + 1 + ], + [ + 39, + 1 + ], + [ + 56, + 1 + ], + [ + 73, + 1 + ], + [ + 90, + 1 + ], + [ + 107, + 1 + ], + [ + 124, + 1 + ], + [ + 141, + 1 + ], + [ + 158, + 1 + ], + [ + 175, + 1 + ], + [ + 192, + 1 + ], + [ + 209, + 1 + ], + [ + 226, + 1 + ], + [ + 243, + 1 + ], + [ + 260, + 1 + ], + [ + 277, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 22, + -1 + ], + [ + 39, + -1 + ], + [ + 56, + -1 + ], + [ + 73, + -1 + ], + [ + 90, + -1 + ], + [ + 107, + -1 + ], + [ + 124, + -1 + ], + [ + 141, + -1 + ], + [ + 158, + -1 + ], + [ + 175, + -1 + ], + [ + 192, + -1 + ], + [ + 209, + -1 + ], + [ + 226, + -1 + ], + [ + 243, + -1 + ], + [ + 260, + -1 + ], + [ + 277, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 23, + 1 + ], + [ + 40, + 1 + ], + [ + 57, + 1 + ], + [ + 74, + 1 + ], + [ + 91, + 1 + ], + [ + 108, + 1 + ], + [ + 125, + 1 + ], + [ + 142, + 1 + ], + [ + 159, + 1 + ], + [ + 176, + 1 + ], + [ + 193, + 1 + ], + [ + 210, + 1 + ], + [ + 227, + 1 + ], + [ + 244, + 1 + ], + [ + 261, + 1 + ], + [ + 278, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 23, + -1 + ], + [ + 40, + -1 + ], + [ + 57, + -1 + ], + [ + 74, + -1 + ], + [ + 91, + -1 + ], + [ + 108, + -1 + ], + [ + 125, + -1 + ], + [ + 142, + -1 + ], + [ + 159, + -1 + ], + [ + 176, + -1 + ], + [ + 193, + -1 + ], + [ + 210, + -1 + ], + [ + 227, + -1 + ], + [ + 244, + -1 + ], + [ + 261, + -1 + ], + [ + 278, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 24, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 75, + 1 + ], + [ + 92, + 1 + ], + [ + 109, + 1 + ], + [ + 126, + 1 + ], + [ + 143, + 1 + ], + [ + 160, + 1 + ], + [ + 177, + 1 + ], + [ + 194, + 1 + ], + [ + 211, + 1 + ], + [ + 228, + 1 + ], + [ + 245, + 1 + ], + [ + 262, + 1 + ], + [ + 279, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 24, + -1 + ], + [ + 41, + -1 + ], + [ + 58, + -1 + ], + [ + 75, + -1 + ], + [ + 92, + -1 + ], + [ + 109, + -1 + ], + [ + 126, + -1 + ], + [ + 143, + -1 + ], + [ + 160, + -1 + ], + [ + 177, + -1 + ], + [ + 194, + -1 + ], + [ + 211, + -1 + ], + [ + 228, + -1 + ], + [ + 245, + -1 + ], + [ + 262, + -1 + ], + [ + 279, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 25, + 1 + ], + [ + 42, + 1 + ], + [ + 59, + 1 + ], + [ + 76, + 1 + ], + [ + 93, + 1 + ], + [ + 110, + 1 + ], + [ + 127, + 1 + ], + [ + 144, + 1 + ], + [ + 161, + 1 + ], + [ + 178, + 1 + ], + [ + 195, + 1 + ], + [ + 212, + 1 + ], + [ + 229, + 1 + ], + [ + 246, + 1 + ], + [ + 263, + 1 + ], + [ + 280, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 25, + -1 + ], + [ + 42, + -1 + ], + [ + 59, + -1 + ], + [ + 76, + -1 + ], + [ + 93, + -1 + ], + [ + 110, + -1 + ], + [ + 127, + -1 + ], + [ + 144, + -1 + ], + [ + 161, + -1 + ], + [ + 178, + -1 + ], + [ + 195, + -1 + ], + [ + 212, + -1 + ], + [ + 229, + -1 + ], + [ + 246, + -1 + ], + [ + 263, + -1 + ], + [ + 280, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 26, + 1 + ], + [ + 43, + 1 + ], + [ + 60, + 1 + ], + [ + 77, + 1 + ], + [ + 94, + 1 + ], + [ + 111, + 1 + ], + [ + 128, + 1 + ], + [ + 145, + 1 + ], + [ + 162, + 1 + ], + [ + 179, + 1 + ], + [ + 196, + 1 + ], + [ + 213, + 1 + ], + [ + 230, + 1 + ], + [ + 247, + 1 + ], + [ + 264, + 1 + ], + [ + 281, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 26, + -1 + ], + [ + 43, + -1 + ], + [ + 60, + -1 + ], + [ + 77, + -1 + ], + [ + 94, + -1 + ], + [ + 111, + -1 + ], + [ + 128, + -1 + ], + [ + 145, + -1 + ], + [ + 162, + -1 + ], + [ + 179, + -1 + ], + [ + 196, + -1 + ], + [ + 213, + -1 + ], + [ + 230, + -1 + ], + [ + 247, + -1 + ], + [ + 264, + -1 + ], + [ + 281, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 27, + 1 + ], + [ + 44, + 1 + ], + [ + 61, + 1 + ], + [ + 78, + 1 + ], + [ + 95, + 1 + ], + [ + 112, + 1 + ], + [ + 129, + 1 + ], + [ + 146, + 1 + ], + [ + 163, + 1 + ], + [ + 180, + 1 + ], + [ + 197, + 1 + ], + [ + 214, + 1 + ], + [ + 231, + 1 + ], + [ + 248, + 1 + ], + [ + 265, + 1 + ], + [ + 282, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 27, + -1 + ], + [ + 44, + -1 + ], + [ + 61, + -1 + ], + [ + 78, + -1 + ], + [ + 95, + -1 + ], + [ + 112, + -1 + ], + [ + 129, + -1 + ], + [ + 146, + -1 + ], + [ + 163, + -1 + ], + [ + 180, + -1 + ], + [ + 197, + -1 + ], + [ + 214, + -1 + ], + [ + 231, + -1 + ], + [ + 248, + -1 + ], + [ + 265, + -1 + ], + [ + 282, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 28, + 1 + ], + [ + 45, + 1 + ], + [ + 62, + 1 + ], + [ + 79, + 1 + ], + [ + 96, + 1 + ], + [ + 113, + 1 + ], + [ + 130, + 1 + ], + [ + 147, + 1 + ], + [ + 164, + 1 + ], + [ + 181, + 1 + ], + [ + 198, + 1 + ], + [ + 215, + 1 + ], + [ + 232, + 1 + ], + [ + 249, + 1 + ], + [ + 266, + 1 + ], + [ + 283, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 28, + -1 + ], + [ + 45, + -1 + ], + [ + 62, + -1 + ], + [ + 79, + -1 + ], + [ + 96, + -1 + ], + [ + 113, + -1 + ], + [ + 130, + -1 + ], + [ + 147, + -1 + ], + [ + 164, + -1 + ], + [ + 181, + -1 + ], + [ + 198, + -1 + ], + [ + 215, + -1 + ], + [ + 232, + -1 + ], + [ + 249, + -1 + ], + [ + 266, + -1 + ], + [ + 283, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 29, + 1 + ], + [ + 46, + 1 + ], + [ + 63, + 1 + ], + [ + 80, + 1 + ], + [ + 97, + 1 + ], + [ + 114, + 1 + ], + [ + 131, + 1 + ], + [ + 148, + 1 + ], + [ + 165, + 1 + ], + [ + 182, + 1 + ], + [ + 199, + 1 + ], + [ + 216, + 1 + ], + [ + 233, + 1 + ], + [ + 250, + 1 + ], + [ + 267, + 1 + ], + [ + 284, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 29, + -1 + ], + [ + 46, + -1 + ], + [ + 63, + -1 + ], + [ + 80, + -1 + ], + [ + 97, + -1 + ], + [ + 114, + -1 + ], + [ + 131, + -1 + ], + [ + 148, + -1 + ], + [ + 165, + -1 + ], + [ + 182, + -1 + ], + [ + 199, + -1 + ], + [ + 216, + -1 + ], + [ + 233, + -1 + ], + [ + 250, + -1 + ], + [ + 267, + -1 + ], + [ + 284, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 30, + 1 + ], + [ + 47, + 1 + ], + [ + 64, + 1 + ], + [ + 81, + 1 + ], + [ + 98, + 1 + ], + [ + 115, + 1 + ], + [ + 132, + 1 + ], + [ + 149, + 1 + ], + [ + 166, + 1 + ], + [ + 183, + 1 + ], + [ + 200, + 1 + ], + [ + 217, + 1 + ], + [ + 234, + 1 + ], + [ + 251, + 1 + ], + [ + 268, + 1 + ], + [ + 285, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 30, + -1 + ], + [ + 47, + -1 + ], + [ + 64, + -1 + ], + [ + 81, + -1 + ], + [ + 98, + -1 + ], + [ + 115, + -1 + ], + [ + 132, + -1 + ], + [ + 149, + -1 + ], + [ + 166, + -1 + ], + [ + 183, + -1 + ], + [ + 200, + -1 + ], + [ + 217, + -1 + ], + [ + 234, + -1 + ], + [ + 251, + -1 + ], + [ + 268, + -1 + ], + [ + 285, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 31, + 1 + ], + [ + 48, + 1 + ], + [ + 65, + 1 + ], + [ + 82, + 1 + ], + [ + 99, + 1 + ], + [ + 116, + 1 + ], + [ + 133, + 1 + ], + [ + 150, + 1 + ], + [ + 167, + 1 + ], + [ + 184, + 1 + ], + [ + 201, + 1 + ], + [ + 218, + 1 + ], + [ + 235, + 1 + ], + [ + 252, + 1 + ], + [ + 269, + 1 + ], + [ + 286, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 31, + -1 + ], + [ + 48, + -1 + ], + [ + 65, + -1 + ], + [ + 82, + -1 + ], + [ + 99, + -1 + ], + [ + 116, + -1 + ], + [ + 133, + -1 + ], + [ + 150, + -1 + ], + [ + 167, + -1 + ], + [ + 184, + -1 + ], + [ + 201, + -1 + ], + [ + 218, + -1 + ], + [ + 235, + -1 + ], + [ + 252, + -1 + ], + [ + 269, + -1 + ], + [ + 286, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 32, + 1 + ], + [ + 49, + 1 + ], + [ + 66, + 1 + ], + [ + 83, + 1 + ], + [ + 100, + 1 + ], + [ + 117, + 1 + ], + [ + 134, + 1 + ], + [ + 151, + 1 + ], + [ + 168, + 1 + ], + [ + 185, + 1 + ], + [ + 202, + 1 + ], + [ + 219, + 1 + ], + [ + 236, + 1 + ], + [ + 253, + 1 + ], + [ + 270, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 32, + -1 + ], + [ + 49, + -1 + ], + [ + 66, + -1 + ], + [ + 83, + -1 + ], + [ + 100, + -1 + ], + [ + 117, + -1 + ], + [ + 134, + -1 + ], + [ + 151, + -1 + ], + [ + 168, + -1 + ], + [ + 185, + -1 + ], + [ + 202, + -1 + ], + [ + 219, + -1 + ], + [ + 236, + -1 + ], + [ + 253, + -1 + ], + [ + 270, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 33, + 1 + ], + [ + 50, + 1 + ], + [ + 67, + 1 + ], + [ + 84, + 1 + ], + [ + 101, + 1 + ], + [ + 118, + 1 + ], + [ + 135, + 1 + ], + [ + 152, + 1 + ], + [ + 169, + 1 + ], + [ + 186, + 1 + ], + [ + 203, + 1 + ], + [ + 220, + 1 + ], + [ + 237, + 1 + ], + [ + 254, + 1 + ], + [ + 271, + 1 + ], + [ + 288, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 33, + -1 + ], + [ + 50, + -1 + ], + [ + 67, + -1 + ], + [ + 84, + -1 + ], + [ + 101, + -1 + ], + [ + 118, + -1 + ], + [ + 135, + -1 + ], + [ + 152, + -1 + ], + [ + 169, + -1 + ], + [ + 186, + -1 + ], + [ + 203, + -1 + ], + [ + 220, + -1 + ], + [ + 237, + -1 + ], + [ + 254, + -1 + ], + [ + 271, + -1 + ], + [ + 288, + -1 + ] + ] + } + ], + "parameters": { + "size": 17, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 289, + "variables": 289, + "rows": 68, + "nonzeros": 1156, + "globals": 0 + }, + "input_variables": 289, + "model_variables": 289, + "modelled_variables": 289, + "size_unit": "tasks" + }, + "json_sha256": "b44f5b80efe1397da234315a1f1ae2138e6aedc87e778c4795bdaa14c335192d", + "txt_sha256": "c3f64b31096e37a5d728345f26a81f4b1641f05fcdb6e0cdc24cb1fbcdab4b96" + }, + { + "id": "assignment-28-single", + "category": "assignment", + "size": 28, + "variant": "single", + "model": { + "id": "assignment_single_28", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 28, + "natural_size": 28, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 784, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ], + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ], + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ], + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ], + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ], + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ], + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ], + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ], + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ], + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ], + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ], + [ + 576, + 1 + ], + [ + 577, + 1 + ], + [ + 578, + 1 + ], + [ + 579, + 1 + ], + [ + 580, + 1 + ], + [ + 581, + 1 + ], + [ + 582, + 1 + ], + [ + 583, + 1 + ], + [ + 584, + 1 + ], + [ + 585, + 1 + ], + [ + 586, + 1 + ], + [ + 587, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ], + [ + 576, + -1 + ], + [ + 577, + -1 + ], + [ + 578, + -1 + ], + [ + 579, + -1 + ], + [ + 580, + -1 + ], + [ + 581, + -1 + ], + [ + 582, + -1 + ], + [ + 583, + -1 + ], + [ + 584, + -1 + ], + [ + 585, + -1 + ], + [ + 586, + -1 + ], + [ + 587, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 588, + 1 + ], + [ + 589, + 1 + ], + [ + 590, + 1 + ], + [ + 591, + 1 + ], + [ + 592, + 1 + ], + [ + 593, + 1 + ], + [ + 594, + 1 + ], + [ + 595, + 1 + ], + [ + 596, + 1 + ], + [ + 597, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ], + [ + 600, + 1 + ], + [ + 601, + 1 + ], + [ + 602, + 1 + ], + [ + 603, + 1 + ], + [ + 604, + 1 + ], + [ + 605, + 1 + ], + [ + 606, + 1 + ], + [ + 607, + 1 + ], + [ + 608, + 1 + ], + [ + 609, + 1 + ], + [ + 610, + 1 + ], + [ + 611, + 1 + ], + [ + 612, + 1 + ], + [ + 613, + 1 + ], + [ + 614, + 1 + ], + [ + 615, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 588, + -1 + ], + [ + 589, + -1 + ], + [ + 590, + -1 + ], + [ + 591, + -1 + ], + [ + 592, + -1 + ], + [ + 593, + -1 + ], + [ + 594, + -1 + ], + [ + 595, + -1 + ], + [ + 596, + -1 + ], + [ + 597, + -1 + ], + [ + 598, + -1 + ], + [ + 599, + -1 + ], + [ + 600, + -1 + ], + [ + 601, + -1 + ], + [ + 602, + -1 + ], + [ + 603, + -1 + ], + [ + 604, + -1 + ], + [ + 605, + -1 + ], + [ + 606, + -1 + ], + [ + 607, + -1 + ], + [ + 608, + -1 + ], + [ + 609, + -1 + ], + [ + 610, + -1 + ], + [ + 611, + -1 + ], + [ + 612, + -1 + ], + [ + 613, + -1 + ], + [ + 614, + -1 + ], + [ + 615, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 616, + 1 + ], + [ + 617, + 1 + ], + [ + 618, + 1 + ], + [ + 619, + 1 + ], + [ + 620, + 1 + ], + [ + 621, + 1 + ], + [ + 622, + 1 + ], + [ + 623, + 1 + ], + [ + 624, + 1 + ], + [ + 625, + 1 + ], + [ + 626, + 1 + ], + [ + 627, + 1 + ], + [ + 628, + 1 + ], + [ + 629, + 1 + ], + [ + 630, + 1 + ], + [ + 631, + 1 + ], + [ + 632, + 1 + ], + [ + 633, + 1 + ], + [ + 634, + 1 + ], + [ + 635, + 1 + ], + [ + 636, + 1 + ], + [ + 637, + 1 + ], + [ + 638, + 1 + ], + [ + 639, + 1 + ], + [ + 640, + 1 + ], + [ + 641, + 1 + ], + [ + 642, + 1 + ], + [ + 643, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 616, + -1 + ], + [ + 617, + -1 + ], + [ + 618, + -1 + ], + [ + 619, + -1 + ], + [ + 620, + -1 + ], + [ + 621, + -1 + ], + [ + 622, + -1 + ], + [ + 623, + -1 + ], + [ + 624, + -1 + ], + [ + 625, + -1 + ], + [ + 626, + -1 + ], + [ + 627, + -1 + ], + [ + 628, + -1 + ], + [ + 629, + -1 + ], + [ + 630, + -1 + ], + [ + 631, + -1 + ], + [ + 632, + -1 + ], + [ + 633, + -1 + ], + [ + 634, + -1 + ], + [ + 635, + -1 + ], + [ + 636, + -1 + ], + [ + 637, + -1 + ], + [ + 638, + -1 + ], + [ + 639, + -1 + ], + [ + 640, + -1 + ], + [ + 641, + -1 + ], + [ + 642, + -1 + ], + [ + 643, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 644, + 1 + ], + [ + 645, + 1 + ], + [ + 646, + 1 + ], + [ + 647, + 1 + ], + [ + 648, + 1 + ], + [ + 649, + 1 + ], + [ + 650, + 1 + ], + [ + 651, + 1 + ], + [ + 652, + 1 + ], + [ + 653, + 1 + ], + [ + 654, + 1 + ], + [ + 655, + 1 + ], + [ + 656, + 1 + ], + [ + 657, + 1 + ], + [ + 658, + 1 + ], + [ + 659, + 1 + ], + [ + 660, + 1 + ], + [ + 661, + 1 + ], + [ + 662, + 1 + ], + [ + 663, + 1 + ], + [ + 664, + 1 + ], + [ + 665, + 1 + ], + [ + 666, + 1 + ], + [ + 667, + 1 + ], + [ + 668, + 1 + ], + [ + 669, + 1 + ], + [ + 670, + 1 + ], + [ + 671, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 644, + -1 + ], + [ + 645, + -1 + ], + [ + 646, + -1 + ], + [ + 647, + -1 + ], + [ + 648, + -1 + ], + [ + 649, + -1 + ], + [ + 650, + -1 + ], + [ + 651, + -1 + ], + [ + 652, + -1 + ], + [ + 653, + -1 + ], + [ + 654, + -1 + ], + [ + 655, + -1 + ], + [ + 656, + -1 + ], + [ + 657, + -1 + ], + [ + 658, + -1 + ], + [ + 659, + -1 + ], + [ + 660, + -1 + ], + [ + 661, + -1 + ], + [ + 662, + -1 + ], + [ + 663, + -1 + ], + [ + 664, + -1 + ], + [ + 665, + -1 + ], + [ + 666, + -1 + ], + [ + 667, + -1 + ], + [ + 668, + -1 + ], + [ + 669, + -1 + ], + [ + 670, + -1 + ], + [ + 671, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 672, + 1 + ], + [ + 673, + 1 + ], + [ + 674, + 1 + ], + [ + 675, + 1 + ], + [ + 676, + 1 + ], + [ + 677, + 1 + ], + [ + 678, + 1 + ], + [ + 679, + 1 + ], + [ + 680, + 1 + ], + [ + 681, + 1 + ], + [ + 682, + 1 + ], + [ + 683, + 1 + ], + [ + 684, + 1 + ], + [ + 685, + 1 + ], + [ + 686, + 1 + ], + [ + 687, + 1 + ], + [ + 688, + 1 + ], + [ + 689, + 1 + ], + [ + 690, + 1 + ], + [ + 691, + 1 + ], + [ + 692, + 1 + ], + [ + 693, + 1 + ], + [ + 694, + 1 + ], + [ + 695, + 1 + ], + [ + 696, + 1 + ], + [ + 697, + 1 + ], + [ + 698, + 1 + ], + [ + 699, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 672, + -1 + ], + [ + 673, + -1 + ], + [ + 674, + -1 + ], + [ + 675, + -1 + ], + [ + 676, + -1 + ], + [ + 677, + -1 + ], + [ + 678, + -1 + ], + [ + 679, + -1 + ], + [ + 680, + -1 + ], + [ + 681, + -1 + ], + [ + 682, + -1 + ], + [ + 683, + -1 + ], + [ + 684, + -1 + ], + [ + 685, + -1 + ], + [ + 686, + -1 + ], + [ + 687, + -1 + ], + [ + 688, + -1 + ], + [ + 689, + -1 + ], + [ + 690, + -1 + ], + [ + 691, + -1 + ], + [ + 692, + -1 + ], + [ + 693, + -1 + ], + [ + 694, + -1 + ], + [ + 695, + -1 + ], + [ + 696, + -1 + ], + [ + 697, + -1 + ], + [ + 698, + -1 + ], + [ + 699, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 700, + 1 + ], + [ + 701, + 1 + ], + [ + 702, + 1 + ], + [ + 703, + 1 + ], + [ + 704, + 1 + ], + [ + 705, + 1 + ], + [ + 706, + 1 + ], + [ + 707, + 1 + ], + [ + 708, + 1 + ], + [ + 709, + 1 + ], + [ + 710, + 1 + ], + [ + 711, + 1 + ], + [ + 712, + 1 + ], + [ + 713, + 1 + ], + [ + 714, + 1 + ], + [ + 715, + 1 + ], + [ + 716, + 1 + ], + [ + 717, + 1 + ], + [ + 718, + 1 + ], + [ + 719, + 1 + ], + [ + 720, + 1 + ], + [ + 721, + 1 + ], + [ + 722, + 1 + ], + [ + 723, + 1 + ], + [ + 724, + 1 + ], + [ + 725, + 1 + ], + [ + 726, + 1 + ], + [ + 727, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 700, + -1 + ], + [ + 701, + -1 + ], + [ + 702, + -1 + ], + [ + 703, + -1 + ], + [ + 704, + -1 + ], + [ + 705, + -1 + ], + [ + 706, + -1 + ], + [ + 707, + -1 + ], + [ + 708, + -1 + ], + [ + 709, + -1 + ], + [ + 710, + -1 + ], + [ + 711, + -1 + ], + [ + 712, + -1 + ], + [ + 713, + -1 + ], + [ + 714, + -1 + ], + [ + 715, + -1 + ], + [ + 716, + -1 + ], + [ + 717, + -1 + ], + [ + 718, + -1 + ], + [ + 719, + -1 + ], + [ + 720, + -1 + ], + [ + 721, + -1 + ], + [ + 722, + -1 + ], + [ + 723, + -1 + ], + [ + 724, + -1 + ], + [ + 725, + -1 + ], + [ + 726, + -1 + ], + [ + 727, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 728, + 1 + ], + [ + 729, + 1 + ], + [ + 730, + 1 + ], + [ + 731, + 1 + ], + [ + 732, + 1 + ], + [ + 733, + 1 + ], + [ + 734, + 1 + ], + [ + 735, + 1 + ], + [ + 736, + 1 + ], + [ + 737, + 1 + ], + [ + 738, + 1 + ], + [ + 739, + 1 + ], + [ + 740, + 1 + ], + [ + 741, + 1 + ], + [ + 742, + 1 + ], + [ + 743, + 1 + ], + [ + 744, + 1 + ], + [ + 745, + 1 + ], + [ + 746, + 1 + ], + [ + 747, + 1 + ], + [ + 748, + 1 + ], + [ + 749, + 1 + ], + [ + 750, + 1 + ], + [ + 751, + 1 + ], + [ + 752, + 1 + ], + [ + 753, + 1 + ], + [ + 754, + 1 + ], + [ + 755, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 728, + -1 + ], + [ + 729, + -1 + ], + [ + 730, + -1 + ], + [ + 731, + -1 + ], + [ + 732, + -1 + ], + [ + 733, + -1 + ], + [ + 734, + -1 + ], + [ + 735, + -1 + ], + [ + 736, + -1 + ], + [ + 737, + -1 + ], + [ + 738, + -1 + ], + [ + 739, + -1 + ], + [ + 740, + -1 + ], + [ + 741, + -1 + ], + [ + 742, + -1 + ], + [ + 743, + -1 + ], + [ + 744, + -1 + ], + [ + 745, + -1 + ], + [ + 746, + -1 + ], + [ + 747, + -1 + ], + [ + 748, + -1 + ], + [ + 749, + -1 + ], + [ + 750, + -1 + ], + [ + 751, + -1 + ], + [ + 752, + -1 + ], + [ + 753, + -1 + ], + [ + 754, + -1 + ], + [ + 755, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 756, + 1 + ], + [ + 757, + 1 + ], + [ + 758, + 1 + ], + [ + 759, + 1 + ], + [ + 760, + 1 + ], + [ + 761, + 1 + ], + [ + 762, + 1 + ], + [ + 763, + 1 + ], + [ + 764, + 1 + ], + [ + 765, + 1 + ], + [ + 766, + 1 + ], + [ + 767, + 1 + ], + [ + 768, + 1 + ], + [ + 769, + 1 + ], + [ + 770, + 1 + ], + [ + 771, + 1 + ], + [ + 772, + 1 + ], + [ + 773, + 1 + ], + [ + 774, + 1 + ], + [ + 775, + 1 + ], + [ + 776, + 1 + ], + [ + 777, + 1 + ], + [ + 778, + 1 + ], + [ + 779, + 1 + ], + [ + 780, + 1 + ], + [ + 781, + 1 + ], + [ + 782, + 1 + ], + [ + 783, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 756, + -1 + ], + [ + 757, + -1 + ], + [ + 758, + -1 + ], + [ + 759, + -1 + ], + [ + 760, + -1 + ], + [ + 761, + -1 + ], + [ + 762, + -1 + ], + [ + 763, + -1 + ], + [ + 764, + -1 + ], + [ + 765, + -1 + ], + [ + 766, + -1 + ], + [ + 767, + -1 + ], + [ + 768, + -1 + ], + [ + 769, + -1 + ], + [ + 770, + -1 + ], + [ + 771, + -1 + ], + [ + 772, + -1 + ], + [ + 773, + -1 + ], + [ + 774, + -1 + ], + [ + 775, + -1 + ], + [ + 776, + -1 + ], + [ + 777, + -1 + ], + [ + 778, + -1 + ], + [ + 779, + -1 + ], + [ + 780, + -1 + ], + [ + 781, + -1 + ], + [ + 782, + -1 + ], + [ + 783, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 28, + 1 + ], + [ + 56, + 1 + ], + [ + 84, + 1 + ], + [ + 112, + 1 + ], + [ + 140, + 1 + ], + [ + 168, + 1 + ], + [ + 196, + 1 + ], + [ + 224, + 1 + ], + [ + 252, + 1 + ], + [ + 280, + 1 + ], + [ + 308, + 1 + ], + [ + 336, + 1 + ], + [ + 364, + 1 + ], + [ + 392, + 1 + ], + [ + 420, + 1 + ], + [ + 448, + 1 + ], + [ + 476, + 1 + ], + [ + 504, + 1 + ], + [ + 532, + 1 + ], + [ + 560, + 1 + ], + [ + 588, + 1 + ], + [ + 616, + 1 + ], + [ + 644, + 1 + ], + [ + 672, + 1 + ], + [ + 700, + 1 + ], + [ + 728, + 1 + ], + [ + 756, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 28, + -1 + ], + [ + 56, + -1 + ], + [ + 84, + -1 + ], + [ + 112, + -1 + ], + [ + 140, + -1 + ], + [ + 168, + -1 + ], + [ + 196, + -1 + ], + [ + 224, + -1 + ], + [ + 252, + -1 + ], + [ + 280, + -1 + ], + [ + 308, + -1 + ], + [ + 336, + -1 + ], + [ + 364, + -1 + ], + [ + 392, + -1 + ], + [ + 420, + -1 + ], + [ + 448, + -1 + ], + [ + 476, + -1 + ], + [ + 504, + -1 + ], + [ + 532, + -1 + ], + [ + 560, + -1 + ], + [ + 588, + -1 + ], + [ + 616, + -1 + ], + [ + 644, + -1 + ], + [ + 672, + -1 + ], + [ + 700, + -1 + ], + [ + 728, + -1 + ], + [ + 756, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 29, + 1 + ], + [ + 57, + 1 + ], + [ + 85, + 1 + ], + [ + 113, + 1 + ], + [ + 141, + 1 + ], + [ + 169, + 1 + ], + [ + 197, + 1 + ], + [ + 225, + 1 + ], + [ + 253, + 1 + ], + [ + 281, + 1 + ], + [ + 309, + 1 + ], + [ + 337, + 1 + ], + [ + 365, + 1 + ], + [ + 393, + 1 + ], + [ + 421, + 1 + ], + [ + 449, + 1 + ], + [ + 477, + 1 + ], + [ + 505, + 1 + ], + [ + 533, + 1 + ], + [ + 561, + 1 + ], + [ + 589, + 1 + ], + [ + 617, + 1 + ], + [ + 645, + 1 + ], + [ + 673, + 1 + ], + [ + 701, + 1 + ], + [ + 729, + 1 + ], + [ + 757, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 29, + -1 + ], + [ + 57, + -1 + ], + [ + 85, + -1 + ], + [ + 113, + -1 + ], + [ + 141, + -1 + ], + [ + 169, + -1 + ], + [ + 197, + -1 + ], + [ + 225, + -1 + ], + [ + 253, + -1 + ], + [ + 281, + -1 + ], + [ + 309, + -1 + ], + [ + 337, + -1 + ], + [ + 365, + -1 + ], + [ + 393, + -1 + ], + [ + 421, + -1 + ], + [ + 449, + -1 + ], + [ + 477, + -1 + ], + [ + 505, + -1 + ], + [ + 533, + -1 + ], + [ + 561, + -1 + ], + [ + 589, + -1 + ], + [ + 617, + -1 + ], + [ + 645, + -1 + ], + [ + 673, + -1 + ], + [ + 701, + -1 + ], + [ + 729, + -1 + ], + [ + 757, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 30, + 1 + ], + [ + 58, + 1 + ], + [ + 86, + 1 + ], + [ + 114, + 1 + ], + [ + 142, + 1 + ], + [ + 170, + 1 + ], + [ + 198, + 1 + ], + [ + 226, + 1 + ], + [ + 254, + 1 + ], + [ + 282, + 1 + ], + [ + 310, + 1 + ], + [ + 338, + 1 + ], + [ + 366, + 1 + ], + [ + 394, + 1 + ], + [ + 422, + 1 + ], + [ + 450, + 1 + ], + [ + 478, + 1 + ], + [ + 506, + 1 + ], + [ + 534, + 1 + ], + [ + 562, + 1 + ], + [ + 590, + 1 + ], + [ + 618, + 1 + ], + [ + 646, + 1 + ], + [ + 674, + 1 + ], + [ + 702, + 1 + ], + [ + 730, + 1 + ], + [ + 758, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 30, + -1 + ], + [ + 58, + -1 + ], + [ + 86, + -1 + ], + [ + 114, + -1 + ], + [ + 142, + -1 + ], + [ + 170, + -1 + ], + [ + 198, + -1 + ], + [ + 226, + -1 + ], + [ + 254, + -1 + ], + [ + 282, + -1 + ], + [ + 310, + -1 + ], + [ + 338, + -1 + ], + [ + 366, + -1 + ], + [ + 394, + -1 + ], + [ + 422, + -1 + ], + [ + 450, + -1 + ], + [ + 478, + -1 + ], + [ + 506, + -1 + ], + [ + 534, + -1 + ], + [ + 562, + -1 + ], + [ + 590, + -1 + ], + [ + 618, + -1 + ], + [ + 646, + -1 + ], + [ + 674, + -1 + ], + [ + 702, + -1 + ], + [ + 730, + -1 + ], + [ + 758, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 31, + 1 + ], + [ + 59, + 1 + ], + [ + 87, + 1 + ], + [ + 115, + 1 + ], + [ + 143, + 1 + ], + [ + 171, + 1 + ], + [ + 199, + 1 + ], + [ + 227, + 1 + ], + [ + 255, + 1 + ], + [ + 283, + 1 + ], + [ + 311, + 1 + ], + [ + 339, + 1 + ], + [ + 367, + 1 + ], + [ + 395, + 1 + ], + [ + 423, + 1 + ], + [ + 451, + 1 + ], + [ + 479, + 1 + ], + [ + 507, + 1 + ], + [ + 535, + 1 + ], + [ + 563, + 1 + ], + [ + 591, + 1 + ], + [ + 619, + 1 + ], + [ + 647, + 1 + ], + [ + 675, + 1 + ], + [ + 703, + 1 + ], + [ + 731, + 1 + ], + [ + 759, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 31, + -1 + ], + [ + 59, + -1 + ], + [ + 87, + -1 + ], + [ + 115, + -1 + ], + [ + 143, + -1 + ], + [ + 171, + -1 + ], + [ + 199, + -1 + ], + [ + 227, + -1 + ], + [ + 255, + -1 + ], + [ + 283, + -1 + ], + [ + 311, + -1 + ], + [ + 339, + -1 + ], + [ + 367, + -1 + ], + [ + 395, + -1 + ], + [ + 423, + -1 + ], + [ + 451, + -1 + ], + [ + 479, + -1 + ], + [ + 507, + -1 + ], + [ + 535, + -1 + ], + [ + 563, + -1 + ], + [ + 591, + -1 + ], + [ + 619, + -1 + ], + [ + 647, + -1 + ], + [ + 675, + -1 + ], + [ + 703, + -1 + ], + [ + 731, + -1 + ], + [ + 759, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 32, + 1 + ], + [ + 60, + 1 + ], + [ + 88, + 1 + ], + [ + 116, + 1 + ], + [ + 144, + 1 + ], + [ + 172, + 1 + ], + [ + 200, + 1 + ], + [ + 228, + 1 + ], + [ + 256, + 1 + ], + [ + 284, + 1 + ], + [ + 312, + 1 + ], + [ + 340, + 1 + ], + [ + 368, + 1 + ], + [ + 396, + 1 + ], + [ + 424, + 1 + ], + [ + 452, + 1 + ], + [ + 480, + 1 + ], + [ + 508, + 1 + ], + [ + 536, + 1 + ], + [ + 564, + 1 + ], + [ + 592, + 1 + ], + [ + 620, + 1 + ], + [ + 648, + 1 + ], + [ + 676, + 1 + ], + [ + 704, + 1 + ], + [ + 732, + 1 + ], + [ + 760, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 32, + -1 + ], + [ + 60, + -1 + ], + [ + 88, + -1 + ], + [ + 116, + -1 + ], + [ + 144, + -1 + ], + [ + 172, + -1 + ], + [ + 200, + -1 + ], + [ + 228, + -1 + ], + [ + 256, + -1 + ], + [ + 284, + -1 + ], + [ + 312, + -1 + ], + [ + 340, + -1 + ], + [ + 368, + -1 + ], + [ + 396, + -1 + ], + [ + 424, + -1 + ], + [ + 452, + -1 + ], + [ + 480, + -1 + ], + [ + 508, + -1 + ], + [ + 536, + -1 + ], + [ + 564, + -1 + ], + [ + 592, + -1 + ], + [ + 620, + -1 + ], + [ + 648, + -1 + ], + [ + 676, + -1 + ], + [ + 704, + -1 + ], + [ + 732, + -1 + ], + [ + 760, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 33, + 1 + ], + [ + 61, + 1 + ], + [ + 89, + 1 + ], + [ + 117, + 1 + ], + [ + 145, + 1 + ], + [ + 173, + 1 + ], + [ + 201, + 1 + ], + [ + 229, + 1 + ], + [ + 257, + 1 + ], + [ + 285, + 1 + ], + [ + 313, + 1 + ], + [ + 341, + 1 + ], + [ + 369, + 1 + ], + [ + 397, + 1 + ], + [ + 425, + 1 + ], + [ + 453, + 1 + ], + [ + 481, + 1 + ], + [ + 509, + 1 + ], + [ + 537, + 1 + ], + [ + 565, + 1 + ], + [ + 593, + 1 + ], + [ + 621, + 1 + ], + [ + 649, + 1 + ], + [ + 677, + 1 + ], + [ + 705, + 1 + ], + [ + 733, + 1 + ], + [ + 761, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 33, + -1 + ], + [ + 61, + -1 + ], + [ + 89, + -1 + ], + [ + 117, + -1 + ], + [ + 145, + -1 + ], + [ + 173, + -1 + ], + [ + 201, + -1 + ], + [ + 229, + -1 + ], + [ + 257, + -1 + ], + [ + 285, + -1 + ], + [ + 313, + -1 + ], + [ + 341, + -1 + ], + [ + 369, + -1 + ], + [ + 397, + -1 + ], + [ + 425, + -1 + ], + [ + 453, + -1 + ], + [ + 481, + -1 + ], + [ + 509, + -1 + ], + [ + 537, + -1 + ], + [ + 565, + -1 + ], + [ + 593, + -1 + ], + [ + 621, + -1 + ], + [ + 649, + -1 + ], + [ + 677, + -1 + ], + [ + 705, + -1 + ], + [ + 733, + -1 + ], + [ + 761, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 34, + 1 + ], + [ + 62, + 1 + ], + [ + 90, + 1 + ], + [ + 118, + 1 + ], + [ + 146, + 1 + ], + [ + 174, + 1 + ], + [ + 202, + 1 + ], + [ + 230, + 1 + ], + [ + 258, + 1 + ], + [ + 286, + 1 + ], + [ + 314, + 1 + ], + [ + 342, + 1 + ], + [ + 370, + 1 + ], + [ + 398, + 1 + ], + [ + 426, + 1 + ], + [ + 454, + 1 + ], + [ + 482, + 1 + ], + [ + 510, + 1 + ], + [ + 538, + 1 + ], + [ + 566, + 1 + ], + [ + 594, + 1 + ], + [ + 622, + 1 + ], + [ + 650, + 1 + ], + [ + 678, + 1 + ], + [ + 706, + 1 + ], + [ + 734, + 1 + ], + [ + 762, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 34, + -1 + ], + [ + 62, + -1 + ], + [ + 90, + -1 + ], + [ + 118, + -1 + ], + [ + 146, + -1 + ], + [ + 174, + -1 + ], + [ + 202, + -1 + ], + [ + 230, + -1 + ], + [ + 258, + -1 + ], + [ + 286, + -1 + ], + [ + 314, + -1 + ], + [ + 342, + -1 + ], + [ + 370, + -1 + ], + [ + 398, + -1 + ], + [ + 426, + -1 + ], + [ + 454, + -1 + ], + [ + 482, + -1 + ], + [ + 510, + -1 + ], + [ + 538, + -1 + ], + [ + 566, + -1 + ], + [ + 594, + -1 + ], + [ + 622, + -1 + ], + [ + 650, + -1 + ], + [ + 678, + -1 + ], + [ + 706, + -1 + ], + [ + 734, + -1 + ], + [ + 762, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 35, + 1 + ], + [ + 63, + 1 + ], + [ + 91, + 1 + ], + [ + 119, + 1 + ], + [ + 147, + 1 + ], + [ + 175, + 1 + ], + [ + 203, + 1 + ], + [ + 231, + 1 + ], + [ + 259, + 1 + ], + [ + 287, + 1 + ], + [ + 315, + 1 + ], + [ + 343, + 1 + ], + [ + 371, + 1 + ], + [ + 399, + 1 + ], + [ + 427, + 1 + ], + [ + 455, + 1 + ], + [ + 483, + 1 + ], + [ + 511, + 1 + ], + [ + 539, + 1 + ], + [ + 567, + 1 + ], + [ + 595, + 1 + ], + [ + 623, + 1 + ], + [ + 651, + 1 + ], + [ + 679, + 1 + ], + [ + 707, + 1 + ], + [ + 735, + 1 + ], + [ + 763, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 35, + -1 + ], + [ + 63, + -1 + ], + [ + 91, + -1 + ], + [ + 119, + -1 + ], + [ + 147, + -1 + ], + [ + 175, + -1 + ], + [ + 203, + -1 + ], + [ + 231, + -1 + ], + [ + 259, + -1 + ], + [ + 287, + -1 + ], + [ + 315, + -1 + ], + [ + 343, + -1 + ], + [ + 371, + -1 + ], + [ + 399, + -1 + ], + [ + 427, + -1 + ], + [ + 455, + -1 + ], + [ + 483, + -1 + ], + [ + 511, + -1 + ], + [ + 539, + -1 + ], + [ + 567, + -1 + ], + [ + 595, + -1 + ], + [ + 623, + -1 + ], + [ + 651, + -1 + ], + [ + 679, + -1 + ], + [ + 707, + -1 + ], + [ + 735, + -1 + ], + [ + 763, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 36, + 1 + ], + [ + 64, + 1 + ], + [ + 92, + 1 + ], + [ + 120, + 1 + ], + [ + 148, + 1 + ], + [ + 176, + 1 + ], + [ + 204, + 1 + ], + [ + 232, + 1 + ], + [ + 260, + 1 + ], + [ + 288, + 1 + ], + [ + 316, + 1 + ], + [ + 344, + 1 + ], + [ + 372, + 1 + ], + [ + 400, + 1 + ], + [ + 428, + 1 + ], + [ + 456, + 1 + ], + [ + 484, + 1 + ], + [ + 512, + 1 + ], + [ + 540, + 1 + ], + [ + 568, + 1 + ], + [ + 596, + 1 + ], + [ + 624, + 1 + ], + [ + 652, + 1 + ], + [ + 680, + 1 + ], + [ + 708, + 1 + ], + [ + 736, + 1 + ], + [ + 764, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 36, + -1 + ], + [ + 64, + -1 + ], + [ + 92, + -1 + ], + [ + 120, + -1 + ], + [ + 148, + -1 + ], + [ + 176, + -1 + ], + [ + 204, + -1 + ], + [ + 232, + -1 + ], + [ + 260, + -1 + ], + [ + 288, + -1 + ], + [ + 316, + -1 + ], + [ + 344, + -1 + ], + [ + 372, + -1 + ], + [ + 400, + -1 + ], + [ + 428, + -1 + ], + [ + 456, + -1 + ], + [ + 484, + -1 + ], + [ + 512, + -1 + ], + [ + 540, + -1 + ], + [ + 568, + -1 + ], + [ + 596, + -1 + ], + [ + 624, + -1 + ], + [ + 652, + -1 + ], + [ + 680, + -1 + ], + [ + 708, + -1 + ], + [ + 736, + -1 + ], + [ + 764, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 37, + 1 + ], + [ + 65, + 1 + ], + [ + 93, + 1 + ], + [ + 121, + 1 + ], + [ + 149, + 1 + ], + [ + 177, + 1 + ], + [ + 205, + 1 + ], + [ + 233, + 1 + ], + [ + 261, + 1 + ], + [ + 289, + 1 + ], + [ + 317, + 1 + ], + [ + 345, + 1 + ], + [ + 373, + 1 + ], + [ + 401, + 1 + ], + [ + 429, + 1 + ], + [ + 457, + 1 + ], + [ + 485, + 1 + ], + [ + 513, + 1 + ], + [ + 541, + 1 + ], + [ + 569, + 1 + ], + [ + 597, + 1 + ], + [ + 625, + 1 + ], + [ + 653, + 1 + ], + [ + 681, + 1 + ], + [ + 709, + 1 + ], + [ + 737, + 1 + ], + [ + 765, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 37, + -1 + ], + [ + 65, + -1 + ], + [ + 93, + -1 + ], + [ + 121, + -1 + ], + [ + 149, + -1 + ], + [ + 177, + -1 + ], + [ + 205, + -1 + ], + [ + 233, + -1 + ], + [ + 261, + -1 + ], + [ + 289, + -1 + ], + [ + 317, + -1 + ], + [ + 345, + -1 + ], + [ + 373, + -1 + ], + [ + 401, + -1 + ], + [ + 429, + -1 + ], + [ + 457, + -1 + ], + [ + 485, + -1 + ], + [ + 513, + -1 + ], + [ + 541, + -1 + ], + [ + 569, + -1 + ], + [ + 597, + -1 + ], + [ + 625, + -1 + ], + [ + 653, + -1 + ], + [ + 681, + -1 + ], + [ + 709, + -1 + ], + [ + 737, + -1 + ], + [ + 765, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 38, + 1 + ], + [ + 66, + 1 + ], + [ + 94, + 1 + ], + [ + 122, + 1 + ], + [ + 150, + 1 + ], + [ + 178, + 1 + ], + [ + 206, + 1 + ], + [ + 234, + 1 + ], + [ + 262, + 1 + ], + [ + 290, + 1 + ], + [ + 318, + 1 + ], + [ + 346, + 1 + ], + [ + 374, + 1 + ], + [ + 402, + 1 + ], + [ + 430, + 1 + ], + [ + 458, + 1 + ], + [ + 486, + 1 + ], + [ + 514, + 1 + ], + [ + 542, + 1 + ], + [ + 570, + 1 + ], + [ + 598, + 1 + ], + [ + 626, + 1 + ], + [ + 654, + 1 + ], + [ + 682, + 1 + ], + [ + 710, + 1 + ], + [ + 738, + 1 + ], + [ + 766, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 38, + -1 + ], + [ + 66, + -1 + ], + [ + 94, + -1 + ], + [ + 122, + -1 + ], + [ + 150, + -1 + ], + [ + 178, + -1 + ], + [ + 206, + -1 + ], + [ + 234, + -1 + ], + [ + 262, + -1 + ], + [ + 290, + -1 + ], + [ + 318, + -1 + ], + [ + 346, + -1 + ], + [ + 374, + -1 + ], + [ + 402, + -1 + ], + [ + 430, + -1 + ], + [ + 458, + -1 + ], + [ + 486, + -1 + ], + [ + 514, + -1 + ], + [ + 542, + -1 + ], + [ + 570, + -1 + ], + [ + 598, + -1 + ], + [ + 626, + -1 + ], + [ + 654, + -1 + ], + [ + 682, + -1 + ], + [ + 710, + -1 + ], + [ + 738, + -1 + ], + [ + 766, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 39, + 1 + ], + [ + 67, + 1 + ], + [ + 95, + 1 + ], + [ + 123, + 1 + ], + [ + 151, + 1 + ], + [ + 179, + 1 + ], + [ + 207, + 1 + ], + [ + 235, + 1 + ], + [ + 263, + 1 + ], + [ + 291, + 1 + ], + [ + 319, + 1 + ], + [ + 347, + 1 + ], + [ + 375, + 1 + ], + [ + 403, + 1 + ], + [ + 431, + 1 + ], + [ + 459, + 1 + ], + [ + 487, + 1 + ], + [ + 515, + 1 + ], + [ + 543, + 1 + ], + [ + 571, + 1 + ], + [ + 599, + 1 + ], + [ + 627, + 1 + ], + [ + 655, + 1 + ], + [ + 683, + 1 + ], + [ + 711, + 1 + ], + [ + 739, + 1 + ], + [ + 767, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 39, + -1 + ], + [ + 67, + -1 + ], + [ + 95, + -1 + ], + [ + 123, + -1 + ], + [ + 151, + -1 + ], + [ + 179, + -1 + ], + [ + 207, + -1 + ], + [ + 235, + -1 + ], + [ + 263, + -1 + ], + [ + 291, + -1 + ], + [ + 319, + -1 + ], + [ + 347, + -1 + ], + [ + 375, + -1 + ], + [ + 403, + -1 + ], + [ + 431, + -1 + ], + [ + 459, + -1 + ], + [ + 487, + -1 + ], + [ + 515, + -1 + ], + [ + 543, + -1 + ], + [ + 571, + -1 + ], + [ + 599, + -1 + ], + [ + 627, + -1 + ], + [ + 655, + -1 + ], + [ + 683, + -1 + ], + [ + 711, + -1 + ], + [ + 739, + -1 + ], + [ + 767, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 40, + 1 + ], + [ + 68, + 1 + ], + [ + 96, + 1 + ], + [ + 124, + 1 + ], + [ + 152, + 1 + ], + [ + 180, + 1 + ], + [ + 208, + 1 + ], + [ + 236, + 1 + ], + [ + 264, + 1 + ], + [ + 292, + 1 + ], + [ + 320, + 1 + ], + [ + 348, + 1 + ], + [ + 376, + 1 + ], + [ + 404, + 1 + ], + [ + 432, + 1 + ], + [ + 460, + 1 + ], + [ + 488, + 1 + ], + [ + 516, + 1 + ], + [ + 544, + 1 + ], + [ + 572, + 1 + ], + [ + 600, + 1 + ], + [ + 628, + 1 + ], + [ + 656, + 1 + ], + [ + 684, + 1 + ], + [ + 712, + 1 + ], + [ + 740, + 1 + ], + [ + 768, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 40, + -1 + ], + [ + 68, + -1 + ], + [ + 96, + -1 + ], + [ + 124, + -1 + ], + [ + 152, + -1 + ], + [ + 180, + -1 + ], + [ + 208, + -1 + ], + [ + 236, + -1 + ], + [ + 264, + -1 + ], + [ + 292, + -1 + ], + [ + 320, + -1 + ], + [ + 348, + -1 + ], + [ + 376, + -1 + ], + [ + 404, + -1 + ], + [ + 432, + -1 + ], + [ + 460, + -1 + ], + [ + 488, + -1 + ], + [ + 516, + -1 + ], + [ + 544, + -1 + ], + [ + 572, + -1 + ], + [ + 600, + -1 + ], + [ + 628, + -1 + ], + [ + 656, + -1 + ], + [ + 684, + -1 + ], + [ + 712, + -1 + ], + [ + 740, + -1 + ], + [ + 768, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 41, + 1 + ], + [ + 69, + 1 + ], + [ + 97, + 1 + ], + [ + 125, + 1 + ], + [ + 153, + 1 + ], + [ + 181, + 1 + ], + [ + 209, + 1 + ], + [ + 237, + 1 + ], + [ + 265, + 1 + ], + [ + 293, + 1 + ], + [ + 321, + 1 + ], + [ + 349, + 1 + ], + [ + 377, + 1 + ], + [ + 405, + 1 + ], + [ + 433, + 1 + ], + [ + 461, + 1 + ], + [ + 489, + 1 + ], + [ + 517, + 1 + ], + [ + 545, + 1 + ], + [ + 573, + 1 + ], + [ + 601, + 1 + ], + [ + 629, + 1 + ], + [ + 657, + 1 + ], + [ + 685, + 1 + ], + [ + 713, + 1 + ], + [ + 741, + 1 + ], + [ + 769, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 41, + -1 + ], + [ + 69, + -1 + ], + [ + 97, + -1 + ], + [ + 125, + -1 + ], + [ + 153, + -1 + ], + [ + 181, + -1 + ], + [ + 209, + -1 + ], + [ + 237, + -1 + ], + [ + 265, + -1 + ], + [ + 293, + -1 + ], + [ + 321, + -1 + ], + [ + 349, + -1 + ], + [ + 377, + -1 + ], + [ + 405, + -1 + ], + [ + 433, + -1 + ], + [ + 461, + -1 + ], + [ + 489, + -1 + ], + [ + 517, + -1 + ], + [ + 545, + -1 + ], + [ + 573, + -1 + ], + [ + 601, + -1 + ], + [ + 629, + -1 + ], + [ + 657, + -1 + ], + [ + 685, + -1 + ], + [ + 713, + -1 + ], + [ + 741, + -1 + ], + [ + 769, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 42, + 1 + ], + [ + 70, + 1 + ], + [ + 98, + 1 + ], + [ + 126, + 1 + ], + [ + 154, + 1 + ], + [ + 182, + 1 + ], + [ + 210, + 1 + ], + [ + 238, + 1 + ], + [ + 266, + 1 + ], + [ + 294, + 1 + ], + [ + 322, + 1 + ], + [ + 350, + 1 + ], + [ + 378, + 1 + ], + [ + 406, + 1 + ], + [ + 434, + 1 + ], + [ + 462, + 1 + ], + [ + 490, + 1 + ], + [ + 518, + 1 + ], + [ + 546, + 1 + ], + [ + 574, + 1 + ], + [ + 602, + 1 + ], + [ + 630, + 1 + ], + [ + 658, + 1 + ], + [ + 686, + 1 + ], + [ + 714, + 1 + ], + [ + 742, + 1 + ], + [ + 770, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 42, + -1 + ], + [ + 70, + -1 + ], + [ + 98, + -1 + ], + [ + 126, + -1 + ], + [ + 154, + -1 + ], + [ + 182, + -1 + ], + [ + 210, + -1 + ], + [ + 238, + -1 + ], + [ + 266, + -1 + ], + [ + 294, + -1 + ], + [ + 322, + -1 + ], + [ + 350, + -1 + ], + [ + 378, + -1 + ], + [ + 406, + -1 + ], + [ + 434, + -1 + ], + [ + 462, + -1 + ], + [ + 490, + -1 + ], + [ + 518, + -1 + ], + [ + 546, + -1 + ], + [ + 574, + -1 + ], + [ + 602, + -1 + ], + [ + 630, + -1 + ], + [ + 658, + -1 + ], + [ + 686, + -1 + ], + [ + 714, + -1 + ], + [ + 742, + -1 + ], + [ + 770, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 43, + 1 + ], + [ + 71, + 1 + ], + [ + 99, + 1 + ], + [ + 127, + 1 + ], + [ + 155, + 1 + ], + [ + 183, + 1 + ], + [ + 211, + 1 + ], + [ + 239, + 1 + ], + [ + 267, + 1 + ], + [ + 295, + 1 + ], + [ + 323, + 1 + ], + [ + 351, + 1 + ], + [ + 379, + 1 + ], + [ + 407, + 1 + ], + [ + 435, + 1 + ], + [ + 463, + 1 + ], + [ + 491, + 1 + ], + [ + 519, + 1 + ], + [ + 547, + 1 + ], + [ + 575, + 1 + ], + [ + 603, + 1 + ], + [ + 631, + 1 + ], + [ + 659, + 1 + ], + [ + 687, + 1 + ], + [ + 715, + 1 + ], + [ + 743, + 1 + ], + [ + 771, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 43, + -1 + ], + [ + 71, + -1 + ], + [ + 99, + -1 + ], + [ + 127, + -1 + ], + [ + 155, + -1 + ], + [ + 183, + -1 + ], + [ + 211, + -1 + ], + [ + 239, + -1 + ], + [ + 267, + -1 + ], + [ + 295, + -1 + ], + [ + 323, + -1 + ], + [ + 351, + -1 + ], + [ + 379, + -1 + ], + [ + 407, + -1 + ], + [ + 435, + -1 + ], + [ + 463, + -1 + ], + [ + 491, + -1 + ], + [ + 519, + -1 + ], + [ + 547, + -1 + ], + [ + 575, + -1 + ], + [ + 603, + -1 + ], + [ + 631, + -1 + ], + [ + 659, + -1 + ], + [ + 687, + -1 + ], + [ + 715, + -1 + ], + [ + 743, + -1 + ], + [ + 771, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 44, + 1 + ], + [ + 72, + 1 + ], + [ + 100, + 1 + ], + [ + 128, + 1 + ], + [ + 156, + 1 + ], + [ + 184, + 1 + ], + [ + 212, + 1 + ], + [ + 240, + 1 + ], + [ + 268, + 1 + ], + [ + 296, + 1 + ], + [ + 324, + 1 + ], + [ + 352, + 1 + ], + [ + 380, + 1 + ], + [ + 408, + 1 + ], + [ + 436, + 1 + ], + [ + 464, + 1 + ], + [ + 492, + 1 + ], + [ + 520, + 1 + ], + [ + 548, + 1 + ], + [ + 576, + 1 + ], + [ + 604, + 1 + ], + [ + 632, + 1 + ], + [ + 660, + 1 + ], + [ + 688, + 1 + ], + [ + 716, + 1 + ], + [ + 744, + 1 + ], + [ + 772, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 44, + -1 + ], + [ + 72, + -1 + ], + [ + 100, + -1 + ], + [ + 128, + -1 + ], + [ + 156, + -1 + ], + [ + 184, + -1 + ], + [ + 212, + -1 + ], + [ + 240, + -1 + ], + [ + 268, + -1 + ], + [ + 296, + -1 + ], + [ + 324, + -1 + ], + [ + 352, + -1 + ], + [ + 380, + -1 + ], + [ + 408, + -1 + ], + [ + 436, + -1 + ], + [ + 464, + -1 + ], + [ + 492, + -1 + ], + [ + 520, + -1 + ], + [ + 548, + -1 + ], + [ + 576, + -1 + ], + [ + 604, + -1 + ], + [ + 632, + -1 + ], + [ + 660, + -1 + ], + [ + 688, + -1 + ], + [ + 716, + -1 + ], + [ + 744, + -1 + ], + [ + 772, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 45, + 1 + ], + [ + 73, + 1 + ], + [ + 101, + 1 + ], + [ + 129, + 1 + ], + [ + 157, + 1 + ], + [ + 185, + 1 + ], + [ + 213, + 1 + ], + [ + 241, + 1 + ], + [ + 269, + 1 + ], + [ + 297, + 1 + ], + [ + 325, + 1 + ], + [ + 353, + 1 + ], + [ + 381, + 1 + ], + [ + 409, + 1 + ], + [ + 437, + 1 + ], + [ + 465, + 1 + ], + [ + 493, + 1 + ], + [ + 521, + 1 + ], + [ + 549, + 1 + ], + [ + 577, + 1 + ], + [ + 605, + 1 + ], + [ + 633, + 1 + ], + [ + 661, + 1 + ], + [ + 689, + 1 + ], + [ + 717, + 1 + ], + [ + 745, + 1 + ], + [ + 773, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 45, + -1 + ], + [ + 73, + -1 + ], + [ + 101, + -1 + ], + [ + 129, + -1 + ], + [ + 157, + -1 + ], + [ + 185, + -1 + ], + [ + 213, + -1 + ], + [ + 241, + -1 + ], + [ + 269, + -1 + ], + [ + 297, + -1 + ], + [ + 325, + -1 + ], + [ + 353, + -1 + ], + [ + 381, + -1 + ], + [ + 409, + -1 + ], + [ + 437, + -1 + ], + [ + 465, + -1 + ], + [ + 493, + -1 + ], + [ + 521, + -1 + ], + [ + 549, + -1 + ], + [ + 577, + -1 + ], + [ + 605, + -1 + ], + [ + 633, + -1 + ], + [ + 661, + -1 + ], + [ + 689, + -1 + ], + [ + 717, + -1 + ], + [ + 745, + -1 + ], + [ + 773, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 46, + 1 + ], + [ + 74, + 1 + ], + [ + 102, + 1 + ], + [ + 130, + 1 + ], + [ + 158, + 1 + ], + [ + 186, + 1 + ], + [ + 214, + 1 + ], + [ + 242, + 1 + ], + [ + 270, + 1 + ], + [ + 298, + 1 + ], + [ + 326, + 1 + ], + [ + 354, + 1 + ], + [ + 382, + 1 + ], + [ + 410, + 1 + ], + [ + 438, + 1 + ], + [ + 466, + 1 + ], + [ + 494, + 1 + ], + [ + 522, + 1 + ], + [ + 550, + 1 + ], + [ + 578, + 1 + ], + [ + 606, + 1 + ], + [ + 634, + 1 + ], + [ + 662, + 1 + ], + [ + 690, + 1 + ], + [ + 718, + 1 + ], + [ + 746, + 1 + ], + [ + 774, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 46, + -1 + ], + [ + 74, + -1 + ], + [ + 102, + -1 + ], + [ + 130, + -1 + ], + [ + 158, + -1 + ], + [ + 186, + -1 + ], + [ + 214, + -1 + ], + [ + 242, + -1 + ], + [ + 270, + -1 + ], + [ + 298, + -1 + ], + [ + 326, + -1 + ], + [ + 354, + -1 + ], + [ + 382, + -1 + ], + [ + 410, + -1 + ], + [ + 438, + -1 + ], + [ + 466, + -1 + ], + [ + 494, + -1 + ], + [ + 522, + -1 + ], + [ + 550, + -1 + ], + [ + 578, + -1 + ], + [ + 606, + -1 + ], + [ + 634, + -1 + ], + [ + 662, + -1 + ], + [ + 690, + -1 + ], + [ + 718, + -1 + ], + [ + 746, + -1 + ], + [ + 774, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 47, + 1 + ], + [ + 75, + 1 + ], + [ + 103, + 1 + ], + [ + 131, + 1 + ], + [ + 159, + 1 + ], + [ + 187, + 1 + ], + [ + 215, + 1 + ], + [ + 243, + 1 + ], + [ + 271, + 1 + ], + [ + 299, + 1 + ], + [ + 327, + 1 + ], + [ + 355, + 1 + ], + [ + 383, + 1 + ], + [ + 411, + 1 + ], + [ + 439, + 1 + ], + [ + 467, + 1 + ], + [ + 495, + 1 + ], + [ + 523, + 1 + ], + [ + 551, + 1 + ], + [ + 579, + 1 + ], + [ + 607, + 1 + ], + [ + 635, + 1 + ], + [ + 663, + 1 + ], + [ + 691, + 1 + ], + [ + 719, + 1 + ], + [ + 747, + 1 + ], + [ + 775, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 47, + -1 + ], + [ + 75, + -1 + ], + [ + 103, + -1 + ], + [ + 131, + -1 + ], + [ + 159, + -1 + ], + [ + 187, + -1 + ], + [ + 215, + -1 + ], + [ + 243, + -1 + ], + [ + 271, + -1 + ], + [ + 299, + -1 + ], + [ + 327, + -1 + ], + [ + 355, + -1 + ], + [ + 383, + -1 + ], + [ + 411, + -1 + ], + [ + 439, + -1 + ], + [ + 467, + -1 + ], + [ + 495, + -1 + ], + [ + 523, + -1 + ], + [ + 551, + -1 + ], + [ + 579, + -1 + ], + [ + 607, + -1 + ], + [ + 635, + -1 + ], + [ + 663, + -1 + ], + [ + 691, + -1 + ], + [ + 719, + -1 + ], + [ + 747, + -1 + ], + [ + 775, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 48, + 1 + ], + [ + 76, + 1 + ], + [ + 104, + 1 + ], + [ + 132, + 1 + ], + [ + 160, + 1 + ], + [ + 188, + 1 + ], + [ + 216, + 1 + ], + [ + 244, + 1 + ], + [ + 272, + 1 + ], + [ + 300, + 1 + ], + [ + 328, + 1 + ], + [ + 356, + 1 + ], + [ + 384, + 1 + ], + [ + 412, + 1 + ], + [ + 440, + 1 + ], + [ + 468, + 1 + ], + [ + 496, + 1 + ], + [ + 524, + 1 + ], + [ + 552, + 1 + ], + [ + 580, + 1 + ], + [ + 608, + 1 + ], + [ + 636, + 1 + ], + [ + 664, + 1 + ], + [ + 692, + 1 + ], + [ + 720, + 1 + ], + [ + 748, + 1 + ], + [ + 776, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 48, + -1 + ], + [ + 76, + -1 + ], + [ + 104, + -1 + ], + [ + 132, + -1 + ], + [ + 160, + -1 + ], + [ + 188, + -1 + ], + [ + 216, + -1 + ], + [ + 244, + -1 + ], + [ + 272, + -1 + ], + [ + 300, + -1 + ], + [ + 328, + -1 + ], + [ + 356, + -1 + ], + [ + 384, + -1 + ], + [ + 412, + -1 + ], + [ + 440, + -1 + ], + [ + 468, + -1 + ], + [ + 496, + -1 + ], + [ + 524, + -1 + ], + [ + 552, + -1 + ], + [ + 580, + -1 + ], + [ + 608, + -1 + ], + [ + 636, + -1 + ], + [ + 664, + -1 + ], + [ + 692, + -1 + ], + [ + 720, + -1 + ], + [ + 748, + -1 + ], + [ + 776, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 49, + 1 + ], + [ + 77, + 1 + ], + [ + 105, + 1 + ], + [ + 133, + 1 + ], + [ + 161, + 1 + ], + [ + 189, + 1 + ], + [ + 217, + 1 + ], + [ + 245, + 1 + ], + [ + 273, + 1 + ], + [ + 301, + 1 + ], + [ + 329, + 1 + ], + [ + 357, + 1 + ], + [ + 385, + 1 + ], + [ + 413, + 1 + ], + [ + 441, + 1 + ], + [ + 469, + 1 + ], + [ + 497, + 1 + ], + [ + 525, + 1 + ], + [ + 553, + 1 + ], + [ + 581, + 1 + ], + [ + 609, + 1 + ], + [ + 637, + 1 + ], + [ + 665, + 1 + ], + [ + 693, + 1 + ], + [ + 721, + 1 + ], + [ + 749, + 1 + ], + [ + 777, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 49, + -1 + ], + [ + 77, + -1 + ], + [ + 105, + -1 + ], + [ + 133, + -1 + ], + [ + 161, + -1 + ], + [ + 189, + -1 + ], + [ + 217, + -1 + ], + [ + 245, + -1 + ], + [ + 273, + -1 + ], + [ + 301, + -1 + ], + [ + 329, + -1 + ], + [ + 357, + -1 + ], + [ + 385, + -1 + ], + [ + 413, + -1 + ], + [ + 441, + -1 + ], + [ + 469, + -1 + ], + [ + 497, + -1 + ], + [ + 525, + -1 + ], + [ + 553, + -1 + ], + [ + 581, + -1 + ], + [ + 609, + -1 + ], + [ + 637, + -1 + ], + [ + 665, + -1 + ], + [ + 693, + -1 + ], + [ + 721, + -1 + ], + [ + 749, + -1 + ], + [ + 777, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 50, + 1 + ], + [ + 78, + 1 + ], + [ + 106, + 1 + ], + [ + 134, + 1 + ], + [ + 162, + 1 + ], + [ + 190, + 1 + ], + [ + 218, + 1 + ], + [ + 246, + 1 + ], + [ + 274, + 1 + ], + [ + 302, + 1 + ], + [ + 330, + 1 + ], + [ + 358, + 1 + ], + [ + 386, + 1 + ], + [ + 414, + 1 + ], + [ + 442, + 1 + ], + [ + 470, + 1 + ], + [ + 498, + 1 + ], + [ + 526, + 1 + ], + [ + 554, + 1 + ], + [ + 582, + 1 + ], + [ + 610, + 1 + ], + [ + 638, + 1 + ], + [ + 666, + 1 + ], + [ + 694, + 1 + ], + [ + 722, + 1 + ], + [ + 750, + 1 + ], + [ + 778, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 50, + -1 + ], + [ + 78, + -1 + ], + [ + 106, + -1 + ], + [ + 134, + -1 + ], + [ + 162, + -1 + ], + [ + 190, + -1 + ], + [ + 218, + -1 + ], + [ + 246, + -1 + ], + [ + 274, + -1 + ], + [ + 302, + -1 + ], + [ + 330, + -1 + ], + [ + 358, + -1 + ], + [ + 386, + -1 + ], + [ + 414, + -1 + ], + [ + 442, + -1 + ], + [ + 470, + -1 + ], + [ + 498, + -1 + ], + [ + 526, + -1 + ], + [ + 554, + -1 + ], + [ + 582, + -1 + ], + [ + 610, + -1 + ], + [ + 638, + -1 + ], + [ + 666, + -1 + ], + [ + 694, + -1 + ], + [ + 722, + -1 + ], + [ + 750, + -1 + ], + [ + 778, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 51, + 1 + ], + [ + 79, + 1 + ], + [ + 107, + 1 + ], + [ + 135, + 1 + ], + [ + 163, + 1 + ], + [ + 191, + 1 + ], + [ + 219, + 1 + ], + [ + 247, + 1 + ], + [ + 275, + 1 + ], + [ + 303, + 1 + ], + [ + 331, + 1 + ], + [ + 359, + 1 + ], + [ + 387, + 1 + ], + [ + 415, + 1 + ], + [ + 443, + 1 + ], + [ + 471, + 1 + ], + [ + 499, + 1 + ], + [ + 527, + 1 + ], + [ + 555, + 1 + ], + [ + 583, + 1 + ], + [ + 611, + 1 + ], + [ + 639, + 1 + ], + [ + 667, + 1 + ], + [ + 695, + 1 + ], + [ + 723, + 1 + ], + [ + 751, + 1 + ], + [ + 779, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 51, + -1 + ], + [ + 79, + -1 + ], + [ + 107, + -1 + ], + [ + 135, + -1 + ], + [ + 163, + -1 + ], + [ + 191, + -1 + ], + [ + 219, + -1 + ], + [ + 247, + -1 + ], + [ + 275, + -1 + ], + [ + 303, + -1 + ], + [ + 331, + -1 + ], + [ + 359, + -1 + ], + [ + 387, + -1 + ], + [ + 415, + -1 + ], + [ + 443, + -1 + ], + [ + 471, + -1 + ], + [ + 499, + -1 + ], + [ + 527, + -1 + ], + [ + 555, + -1 + ], + [ + 583, + -1 + ], + [ + 611, + -1 + ], + [ + 639, + -1 + ], + [ + 667, + -1 + ], + [ + 695, + -1 + ], + [ + 723, + -1 + ], + [ + 751, + -1 + ], + [ + 779, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 52, + 1 + ], + [ + 80, + 1 + ], + [ + 108, + 1 + ], + [ + 136, + 1 + ], + [ + 164, + 1 + ], + [ + 192, + 1 + ], + [ + 220, + 1 + ], + [ + 248, + 1 + ], + [ + 276, + 1 + ], + [ + 304, + 1 + ], + [ + 332, + 1 + ], + [ + 360, + 1 + ], + [ + 388, + 1 + ], + [ + 416, + 1 + ], + [ + 444, + 1 + ], + [ + 472, + 1 + ], + [ + 500, + 1 + ], + [ + 528, + 1 + ], + [ + 556, + 1 + ], + [ + 584, + 1 + ], + [ + 612, + 1 + ], + [ + 640, + 1 + ], + [ + 668, + 1 + ], + [ + 696, + 1 + ], + [ + 724, + 1 + ], + [ + 752, + 1 + ], + [ + 780, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 52, + -1 + ], + [ + 80, + -1 + ], + [ + 108, + -1 + ], + [ + 136, + -1 + ], + [ + 164, + -1 + ], + [ + 192, + -1 + ], + [ + 220, + -1 + ], + [ + 248, + -1 + ], + [ + 276, + -1 + ], + [ + 304, + -1 + ], + [ + 332, + -1 + ], + [ + 360, + -1 + ], + [ + 388, + -1 + ], + [ + 416, + -1 + ], + [ + 444, + -1 + ], + [ + 472, + -1 + ], + [ + 500, + -1 + ], + [ + 528, + -1 + ], + [ + 556, + -1 + ], + [ + 584, + -1 + ], + [ + 612, + -1 + ], + [ + 640, + -1 + ], + [ + 668, + -1 + ], + [ + 696, + -1 + ], + [ + 724, + -1 + ], + [ + 752, + -1 + ], + [ + 780, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 25, + 1 + ], + [ + 53, + 1 + ], + [ + 81, + 1 + ], + [ + 109, + 1 + ], + [ + 137, + 1 + ], + [ + 165, + 1 + ], + [ + 193, + 1 + ], + [ + 221, + 1 + ], + [ + 249, + 1 + ], + [ + 277, + 1 + ], + [ + 305, + 1 + ], + [ + 333, + 1 + ], + [ + 361, + 1 + ], + [ + 389, + 1 + ], + [ + 417, + 1 + ], + [ + 445, + 1 + ], + [ + 473, + 1 + ], + [ + 501, + 1 + ], + [ + 529, + 1 + ], + [ + 557, + 1 + ], + [ + 585, + 1 + ], + [ + 613, + 1 + ], + [ + 641, + 1 + ], + [ + 669, + 1 + ], + [ + 697, + 1 + ], + [ + 725, + 1 + ], + [ + 753, + 1 + ], + [ + 781, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 25, + -1 + ], + [ + 53, + -1 + ], + [ + 81, + -1 + ], + [ + 109, + -1 + ], + [ + 137, + -1 + ], + [ + 165, + -1 + ], + [ + 193, + -1 + ], + [ + 221, + -1 + ], + [ + 249, + -1 + ], + [ + 277, + -1 + ], + [ + 305, + -1 + ], + [ + 333, + -1 + ], + [ + 361, + -1 + ], + [ + 389, + -1 + ], + [ + 417, + -1 + ], + [ + 445, + -1 + ], + [ + 473, + -1 + ], + [ + 501, + -1 + ], + [ + 529, + -1 + ], + [ + 557, + -1 + ], + [ + 585, + -1 + ], + [ + 613, + -1 + ], + [ + 641, + -1 + ], + [ + 669, + -1 + ], + [ + 697, + -1 + ], + [ + 725, + -1 + ], + [ + 753, + -1 + ], + [ + 781, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 26, + 1 + ], + [ + 54, + 1 + ], + [ + 82, + 1 + ], + [ + 110, + 1 + ], + [ + 138, + 1 + ], + [ + 166, + 1 + ], + [ + 194, + 1 + ], + [ + 222, + 1 + ], + [ + 250, + 1 + ], + [ + 278, + 1 + ], + [ + 306, + 1 + ], + [ + 334, + 1 + ], + [ + 362, + 1 + ], + [ + 390, + 1 + ], + [ + 418, + 1 + ], + [ + 446, + 1 + ], + [ + 474, + 1 + ], + [ + 502, + 1 + ], + [ + 530, + 1 + ], + [ + 558, + 1 + ], + [ + 586, + 1 + ], + [ + 614, + 1 + ], + [ + 642, + 1 + ], + [ + 670, + 1 + ], + [ + 698, + 1 + ], + [ + 726, + 1 + ], + [ + 754, + 1 + ], + [ + 782, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 26, + -1 + ], + [ + 54, + -1 + ], + [ + 82, + -1 + ], + [ + 110, + -1 + ], + [ + 138, + -1 + ], + [ + 166, + -1 + ], + [ + 194, + -1 + ], + [ + 222, + -1 + ], + [ + 250, + -1 + ], + [ + 278, + -1 + ], + [ + 306, + -1 + ], + [ + 334, + -1 + ], + [ + 362, + -1 + ], + [ + 390, + -1 + ], + [ + 418, + -1 + ], + [ + 446, + -1 + ], + [ + 474, + -1 + ], + [ + 502, + -1 + ], + [ + 530, + -1 + ], + [ + 558, + -1 + ], + [ + 586, + -1 + ], + [ + 614, + -1 + ], + [ + 642, + -1 + ], + [ + 670, + -1 + ], + [ + 698, + -1 + ], + [ + 726, + -1 + ], + [ + 754, + -1 + ], + [ + 782, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 55, + 1 + ], + [ + 83, + 1 + ], + [ + 111, + 1 + ], + [ + 139, + 1 + ], + [ + 167, + 1 + ], + [ + 195, + 1 + ], + [ + 223, + 1 + ], + [ + 251, + 1 + ], + [ + 279, + 1 + ], + [ + 307, + 1 + ], + [ + 335, + 1 + ], + [ + 363, + 1 + ], + [ + 391, + 1 + ], + [ + 419, + 1 + ], + [ + 447, + 1 + ], + [ + 475, + 1 + ], + [ + 503, + 1 + ], + [ + 531, + 1 + ], + [ + 559, + 1 + ], + [ + 587, + 1 + ], + [ + 615, + 1 + ], + [ + 643, + 1 + ], + [ + 671, + 1 + ], + [ + 699, + 1 + ], + [ + 727, + 1 + ], + [ + 755, + 1 + ], + [ + 783, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 55, + -1 + ], + [ + 83, + -1 + ], + [ + 111, + -1 + ], + [ + 139, + -1 + ], + [ + 167, + -1 + ], + [ + 195, + -1 + ], + [ + 223, + -1 + ], + [ + 251, + -1 + ], + [ + 279, + -1 + ], + [ + 307, + -1 + ], + [ + 335, + -1 + ], + [ + 363, + -1 + ], + [ + 391, + -1 + ], + [ + 419, + -1 + ], + [ + 447, + -1 + ], + [ + 475, + -1 + ], + [ + 503, + -1 + ], + [ + 531, + -1 + ], + [ + 559, + -1 + ], + [ + 587, + -1 + ], + [ + 615, + -1 + ], + [ + 643, + -1 + ], + [ + 671, + -1 + ], + [ + 699, + -1 + ], + [ + 727, + -1 + ], + [ + 755, + -1 + ], + [ + 783, + -1 + ] + ] + } + ], + "parameters": { + "size": 28, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86 + ], + [ + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33 + ], + [ + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59 + ], + [ + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92 + ], + [ + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 784, + "variables": 784, + "rows": 112, + "nonzeros": 3136, + "globals": 0 + }, + "input_variables": 784, + "model_variables": 784, + "modelled_variables": 784, + "size_unit": "tasks" + }, + "json_sha256": "8265176d2695d1be1d7b1950e41b2eb2e64c84b604b0a7e3579ffbfdb9058cab", + "txt_sha256": "40aa45a69ef19a3595ed92e3c9a47b7f329939d109470743bfecdc170816be38" + }, + { + "id": "assignment-30-single", + "category": "assignment", + "size": 30, + "variant": "single", + "model": { + "id": "assignment_single_30", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 30, + "natural_size": 30, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 900, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ], + [ + 448, + 1 + ], + [ + 449, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ], + [ + 448, + -1 + ], + [ + 449, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ], + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ], + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 510, + 1 + ], + [ + 511, + 1 + ], + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ], + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 510, + -1 + ], + [ + 511, + -1 + ], + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ], + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ], + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ], + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ], + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ], + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ], + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ], + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ], + [ + 576, + 1 + ], + [ + 577, + 1 + ], + [ + 578, + 1 + ], + [ + 579, + 1 + ], + [ + 580, + 1 + ], + [ + 581, + 1 + ], + [ + 582, + 1 + ], + [ + 583, + 1 + ], + [ + 584, + 1 + ], + [ + 585, + 1 + ], + [ + 586, + 1 + ], + [ + 587, + 1 + ], + [ + 588, + 1 + ], + [ + 589, + 1 + ], + [ + 590, + 1 + ], + [ + 591, + 1 + ], + [ + 592, + 1 + ], + [ + 593, + 1 + ], + [ + 594, + 1 + ], + [ + 595, + 1 + ], + [ + 596, + 1 + ], + [ + 597, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ], + [ + 576, + -1 + ], + [ + 577, + -1 + ], + [ + 578, + -1 + ], + [ + 579, + -1 + ], + [ + 580, + -1 + ], + [ + 581, + -1 + ], + [ + 582, + -1 + ], + [ + 583, + -1 + ], + [ + 584, + -1 + ], + [ + 585, + -1 + ], + [ + 586, + -1 + ], + [ + 587, + -1 + ], + [ + 588, + -1 + ], + [ + 589, + -1 + ], + [ + 590, + -1 + ], + [ + 591, + -1 + ], + [ + 592, + -1 + ], + [ + 593, + -1 + ], + [ + 594, + -1 + ], + [ + 595, + -1 + ], + [ + 596, + -1 + ], + [ + 597, + -1 + ], + [ + 598, + -1 + ], + [ + 599, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 600, + 1 + ], + [ + 601, + 1 + ], + [ + 602, + 1 + ], + [ + 603, + 1 + ], + [ + 604, + 1 + ], + [ + 605, + 1 + ], + [ + 606, + 1 + ], + [ + 607, + 1 + ], + [ + 608, + 1 + ], + [ + 609, + 1 + ], + [ + 610, + 1 + ], + [ + 611, + 1 + ], + [ + 612, + 1 + ], + [ + 613, + 1 + ], + [ + 614, + 1 + ], + [ + 615, + 1 + ], + [ + 616, + 1 + ], + [ + 617, + 1 + ], + [ + 618, + 1 + ], + [ + 619, + 1 + ], + [ + 620, + 1 + ], + [ + 621, + 1 + ], + [ + 622, + 1 + ], + [ + 623, + 1 + ], + [ + 624, + 1 + ], + [ + 625, + 1 + ], + [ + 626, + 1 + ], + [ + 627, + 1 + ], + [ + 628, + 1 + ], + [ + 629, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 600, + -1 + ], + [ + 601, + -1 + ], + [ + 602, + -1 + ], + [ + 603, + -1 + ], + [ + 604, + -1 + ], + [ + 605, + -1 + ], + [ + 606, + -1 + ], + [ + 607, + -1 + ], + [ + 608, + -1 + ], + [ + 609, + -1 + ], + [ + 610, + -1 + ], + [ + 611, + -1 + ], + [ + 612, + -1 + ], + [ + 613, + -1 + ], + [ + 614, + -1 + ], + [ + 615, + -1 + ], + [ + 616, + -1 + ], + [ + 617, + -1 + ], + [ + 618, + -1 + ], + [ + 619, + -1 + ], + [ + 620, + -1 + ], + [ + 621, + -1 + ], + [ + 622, + -1 + ], + [ + 623, + -1 + ], + [ + 624, + -1 + ], + [ + 625, + -1 + ], + [ + 626, + -1 + ], + [ + 627, + -1 + ], + [ + 628, + -1 + ], + [ + 629, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 630, + 1 + ], + [ + 631, + 1 + ], + [ + 632, + 1 + ], + [ + 633, + 1 + ], + [ + 634, + 1 + ], + [ + 635, + 1 + ], + [ + 636, + 1 + ], + [ + 637, + 1 + ], + [ + 638, + 1 + ], + [ + 639, + 1 + ], + [ + 640, + 1 + ], + [ + 641, + 1 + ], + [ + 642, + 1 + ], + [ + 643, + 1 + ], + [ + 644, + 1 + ], + [ + 645, + 1 + ], + [ + 646, + 1 + ], + [ + 647, + 1 + ], + [ + 648, + 1 + ], + [ + 649, + 1 + ], + [ + 650, + 1 + ], + [ + 651, + 1 + ], + [ + 652, + 1 + ], + [ + 653, + 1 + ], + [ + 654, + 1 + ], + [ + 655, + 1 + ], + [ + 656, + 1 + ], + [ + 657, + 1 + ], + [ + 658, + 1 + ], + [ + 659, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 630, + -1 + ], + [ + 631, + -1 + ], + [ + 632, + -1 + ], + [ + 633, + -1 + ], + [ + 634, + -1 + ], + [ + 635, + -1 + ], + [ + 636, + -1 + ], + [ + 637, + -1 + ], + [ + 638, + -1 + ], + [ + 639, + -1 + ], + [ + 640, + -1 + ], + [ + 641, + -1 + ], + [ + 642, + -1 + ], + [ + 643, + -1 + ], + [ + 644, + -1 + ], + [ + 645, + -1 + ], + [ + 646, + -1 + ], + [ + 647, + -1 + ], + [ + 648, + -1 + ], + [ + 649, + -1 + ], + [ + 650, + -1 + ], + [ + 651, + -1 + ], + [ + 652, + -1 + ], + [ + 653, + -1 + ], + [ + 654, + -1 + ], + [ + 655, + -1 + ], + [ + 656, + -1 + ], + [ + 657, + -1 + ], + [ + 658, + -1 + ], + [ + 659, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 660, + 1 + ], + [ + 661, + 1 + ], + [ + 662, + 1 + ], + [ + 663, + 1 + ], + [ + 664, + 1 + ], + [ + 665, + 1 + ], + [ + 666, + 1 + ], + [ + 667, + 1 + ], + [ + 668, + 1 + ], + [ + 669, + 1 + ], + [ + 670, + 1 + ], + [ + 671, + 1 + ], + [ + 672, + 1 + ], + [ + 673, + 1 + ], + [ + 674, + 1 + ], + [ + 675, + 1 + ], + [ + 676, + 1 + ], + [ + 677, + 1 + ], + [ + 678, + 1 + ], + [ + 679, + 1 + ], + [ + 680, + 1 + ], + [ + 681, + 1 + ], + [ + 682, + 1 + ], + [ + 683, + 1 + ], + [ + 684, + 1 + ], + [ + 685, + 1 + ], + [ + 686, + 1 + ], + [ + 687, + 1 + ], + [ + 688, + 1 + ], + [ + 689, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 660, + -1 + ], + [ + 661, + -1 + ], + [ + 662, + -1 + ], + [ + 663, + -1 + ], + [ + 664, + -1 + ], + [ + 665, + -1 + ], + [ + 666, + -1 + ], + [ + 667, + -1 + ], + [ + 668, + -1 + ], + [ + 669, + -1 + ], + [ + 670, + -1 + ], + [ + 671, + -1 + ], + [ + 672, + -1 + ], + [ + 673, + -1 + ], + [ + 674, + -1 + ], + [ + 675, + -1 + ], + [ + 676, + -1 + ], + [ + 677, + -1 + ], + [ + 678, + -1 + ], + [ + 679, + -1 + ], + [ + 680, + -1 + ], + [ + 681, + -1 + ], + [ + 682, + -1 + ], + [ + 683, + -1 + ], + [ + 684, + -1 + ], + [ + 685, + -1 + ], + [ + 686, + -1 + ], + [ + 687, + -1 + ], + [ + 688, + -1 + ], + [ + 689, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 690, + 1 + ], + [ + 691, + 1 + ], + [ + 692, + 1 + ], + [ + 693, + 1 + ], + [ + 694, + 1 + ], + [ + 695, + 1 + ], + [ + 696, + 1 + ], + [ + 697, + 1 + ], + [ + 698, + 1 + ], + [ + 699, + 1 + ], + [ + 700, + 1 + ], + [ + 701, + 1 + ], + [ + 702, + 1 + ], + [ + 703, + 1 + ], + [ + 704, + 1 + ], + [ + 705, + 1 + ], + [ + 706, + 1 + ], + [ + 707, + 1 + ], + [ + 708, + 1 + ], + [ + 709, + 1 + ], + [ + 710, + 1 + ], + [ + 711, + 1 + ], + [ + 712, + 1 + ], + [ + 713, + 1 + ], + [ + 714, + 1 + ], + [ + 715, + 1 + ], + [ + 716, + 1 + ], + [ + 717, + 1 + ], + [ + 718, + 1 + ], + [ + 719, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 690, + -1 + ], + [ + 691, + -1 + ], + [ + 692, + -1 + ], + [ + 693, + -1 + ], + [ + 694, + -1 + ], + [ + 695, + -1 + ], + [ + 696, + -1 + ], + [ + 697, + -1 + ], + [ + 698, + -1 + ], + [ + 699, + -1 + ], + [ + 700, + -1 + ], + [ + 701, + -1 + ], + [ + 702, + -1 + ], + [ + 703, + -1 + ], + [ + 704, + -1 + ], + [ + 705, + -1 + ], + [ + 706, + -1 + ], + [ + 707, + -1 + ], + [ + 708, + -1 + ], + [ + 709, + -1 + ], + [ + 710, + -1 + ], + [ + 711, + -1 + ], + [ + 712, + -1 + ], + [ + 713, + -1 + ], + [ + 714, + -1 + ], + [ + 715, + -1 + ], + [ + 716, + -1 + ], + [ + 717, + -1 + ], + [ + 718, + -1 + ], + [ + 719, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 720, + 1 + ], + [ + 721, + 1 + ], + [ + 722, + 1 + ], + [ + 723, + 1 + ], + [ + 724, + 1 + ], + [ + 725, + 1 + ], + [ + 726, + 1 + ], + [ + 727, + 1 + ], + [ + 728, + 1 + ], + [ + 729, + 1 + ], + [ + 730, + 1 + ], + [ + 731, + 1 + ], + [ + 732, + 1 + ], + [ + 733, + 1 + ], + [ + 734, + 1 + ], + [ + 735, + 1 + ], + [ + 736, + 1 + ], + [ + 737, + 1 + ], + [ + 738, + 1 + ], + [ + 739, + 1 + ], + [ + 740, + 1 + ], + [ + 741, + 1 + ], + [ + 742, + 1 + ], + [ + 743, + 1 + ], + [ + 744, + 1 + ], + [ + 745, + 1 + ], + [ + 746, + 1 + ], + [ + 747, + 1 + ], + [ + 748, + 1 + ], + [ + 749, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 720, + -1 + ], + [ + 721, + -1 + ], + [ + 722, + -1 + ], + [ + 723, + -1 + ], + [ + 724, + -1 + ], + [ + 725, + -1 + ], + [ + 726, + -1 + ], + [ + 727, + -1 + ], + [ + 728, + -1 + ], + [ + 729, + -1 + ], + [ + 730, + -1 + ], + [ + 731, + -1 + ], + [ + 732, + -1 + ], + [ + 733, + -1 + ], + [ + 734, + -1 + ], + [ + 735, + -1 + ], + [ + 736, + -1 + ], + [ + 737, + -1 + ], + [ + 738, + -1 + ], + [ + 739, + -1 + ], + [ + 740, + -1 + ], + [ + 741, + -1 + ], + [ + 742, + -1 + ], + [ + 743, + -1 + ], + [ + 744, + -1 + ], + [ + 745, + -1 + ], + [ + 746, + -1 + ], + [ + 747, + -1 + ], + [ + 748, + -1 + ], + [ + 749, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 750, + 1 + ], + [ + 751, + 1 + ], + [ + 752, + 1 + ], + [ + 753, + 1 + ], + [ + 754, + 1 + ], + [ + 755, + 1 + ], + [ + 756, + 1 + ], + [ + 757, + 1 + ], + [ + 758, + 1 + ], + [ + 759, + 1 + ], + [ + 760, + 1 + ], + [ + 761, + 1 + ], + [ + 762, + 1 + ], + [ + 763, + 1 + ], + [ + 764, + 1 + ], + [ + 765, + 1 + ], + [ + 766, + 1 + ], + [ + 767, + 1 + ], + [ + 768, + 1 + ], + [ + 769, + 1 + ], + [ + 770, + 1 + ], + [ + 771, + 1 + ], + [ + 772, + 1 + ], + [ + 773, + 1 + ], + [ + 774, + 1 + ], + [ + 775, + 1 + ], + [ + 776, + 1 + ], + [ + 777, + 1 + ], + [ + 778, + 1 + ], + [ + 779, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 750, + -1 + ], + [ + 751, + -1 + ], + [ + 752, + -1 + ], + [ + 753, + -1 + ], + [ + 754, + -1 + ], + [ + 755, + -1 + ], + [ + 756, + -1 + ], + [ + 757, + -1 + ], + [ + 758, + -1 + ], + [ + 759, + -1 + ], + [ + 760, + -1 + ], + [ + 761, + -1 + ], + [ + 762, + -1 + ], + [ + 763, + -1 + ], + [ + 764, + -1 + ], + [ + 765, + -1 + ], + [ + 766, + -1 + ], + [ + 767, + -1 + ], + [ + 768, + -1 + ], + [ + 769, + -1 + ], + [ + 770, + -1 + ], + [ + 771, + -1 + ], + [ + 772, + -1 + ], + [ + 773, + -1 + ], + [ + 774, + -1 + ], + [ + 775, + -1 + ], + [ + 776, + -1 + ], + [ + 777, + -1 + ], + [ + 778, + -1 + ], + [ + 779, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 780, + 1 + ], + [ + 781, + 1 + ], + [ + 782, + 1 + ], + [ + 783, + 1 + ], + [ + 784, + 1 + ], + [ + 785, + 1 + ], + [ + 786, + 1 + ], + [ + 787, + 1 + ], + [ + 788, + 1 + ], + [ + 789, + 1 + ], + [ + 790, + 1 + ], + [ + 791, + 1 + ], + [ + 792, + 1 + ], + [ + 793, + 1 + ], + [ + 794, + 1 + ], + [ + 795, + 1 + ], + [ + 796, + 1 + ], + [ + 797, + 1 + ], + [ + 798, + 1 + ], + [ + 799, + 1 + ], + [ + 800, + 1 + ], + [ + 801, + 1 + ], + [ + 802, + 1 + ], + [ + 803, + 1 + ], + [ + 804, + 1 + ], + [ + 805, + 1 + ], + [ + 806, + 1 + ], + [ + 807, + 1 + ], + [ + 808, + 1 + ], + [ + 809, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 780, + -1 + ], + [ + 781, + -1 + ], + [ + 782, + -1 + ], + [ + 783, + -1 + ], + [ + 784, + -1 + ], + [ + 785, + -1 + ], + [ + 786, + -1 + ], + [ + 787, + -1 + ], + [ + 788, + -1 + ], + [ + 789, + -1 + ], + [ + 790, + -1 + ], + [ + 791, + -1 + ], + [ + 792, + -1 + ], + [ + 793, + -1 + ], + [ + 794, + -1 + ], + [ + 795, + -1 + ], + [ + 796, + -1 + ], + [ + 797, + -1 + ], + [ + 798, + -1 + ], + [ + 799, + -1 + ], + [ + 800, + -1 + ], + [ + 801, + -1 + ], + [ + 802, + -1 + ], + [ + 803, + -1 + ], + [ + 804, + -1 + ], + [ + 805, + -1 + ], + [ + 806, + -1 + ], + [ + 807, + -1 + ], + [ + 808, + -1 + ], + [ + 809, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 810, + 1 + ], + [ + 811, + 1 + ], + [ + 812, + 1 + ], + [ + 813, + 1 + ], + [ + 814, + 1 + ], + [ + 815, + 1 + ], + [ + 816, + 1 + ], + [ + 817, + 1 + ], + [ + 818, + 1 + ], + [ + 819, + 1 + ], + [ + 820, + 1 + ], + [ + 821, + 1 + ], + [ + 822, + 1 + ], + [ + 823, + 1 + ], + [ + 824, + 1 + ], + [ + 825, + 1 + ], + [ + 826, + 1 + ], + [ + 827, + 1 + ], + [ + 828, + 1 + ], + [ + 829, + 1 + ], + [ + 830, + 1 + ], + [ + 831, + 1 + ], + [ + 832, + 1 + ], + [ + 833, + 1 + ], + [ + 834, + 1 + ], + [ + 835, + 1 + ], + [ + 836, + 1 + ], + [ + 837, + 1 + ], + [ + 838, + 1 + ], + [ + 839, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 810, + -1 + ], + [ + 811, + -1 + ], + [ + 812, + -1 + ], + [ + 813, + -1 + ], + [ + 814, + -1 + ], + [ + 815, + -1 + ], + [ + 816, + -1 + ], + [ + 817, + -1 + ], + [ + 818, + -1 + ], + [ + 819, + -1 + ], + [ + 820, + -1 + ], + [ + 821, + -1 + ], + [ + 822, + -1 + ], + [ + 823, + -1 + ], + [ + 824, + -1 + ], + [ + 825, + -1 + ], + [ + 826, + -1 + ], + [ + 827, + -1 + ], + [ + 828, + -1 + ], + [ + 829, + -1 + ], + [ + 830, + -1 + ], + [ + 831, + -1 + ], + [ + 832, + -1 + ], + [ + 833, + -1 + ], + [ + 834, + -1 + ], + [ + 835, + -1 + ], + [ + 836, + -1 + ], + [ + 837, + -1 + ], + [ + 838, + -1 + ], + [ + 839, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 840, + 1 + ], + [ + 841, + 1 + ], + [ + 842, + 1 + ], + [ + 843, + 1 + ], + [ + 844, + 1 + ], + [ + 845, + 1 + ], + [ + 846, + 1 + ], + [ + 847, + 1 + ], + [ + 848, + 1 + ], + [ + 849, + 1 + ], + [ + 850, + 1 + ], + [ + 851, + 1 + ], + [ + 852, + 1 + ], + [ + 853, + 1 + ], + [ + 854, + 1 + ], + [ + 855, + 1 + ], + [ + 856, + 1 + ], + [ + 857, + 1 + ], + [ + 858, + 1 + ], + [ + 859, + 1 + ], + [ + 860, + 1 + ], + [ + 861, + 1 + ], + [ + 862, + 1 + ], + [ + 863, + 1 + ], + [ + 864, + 1 + ], + [ + 865, + 1 + ], + [ + 866, + 1 + ], + [ + 867, + 1 + ], + [ + 868, + 1 + ], + [ + 869, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 840, + -1 + ], + [ + 841, + -1 + ], + [ + 842, + -1 + ], + [ + 843, + -1 + ], + [ + 844, + -1 + ], + [ + 845, + -1 + ], + [ + 846, + -1 + ], + [ + 847, + -1 + ], + [ + 848, + -1 + ], + [ + 849, + -1 + ], + [ + 850, + -1 + ], + [ + 851, + -1 + ], + [ + 852, + -1 + ], + [ + 853, + -1 + ], + [ + 854, + -1 + ], + [ + 855, + -1 + ], + [ + 856, + -1 + ], + [ + 857, + -1 + ], + [ + 858, + -1 + ], + [ + 859, + -1 + ], + [ + 860, + -1 + ], + [ + 861, + -1 + ], + [ + 862, + -1 + ], + [ + 863, + -1 + ], + [ + 864, + -1 + ], + [ + 865, + -1 + ], + [ + 866, + -1 + ], + [ + 867, + -1 + ], + [ + 868, + -1 + ], + [ + 869, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 870, + 1 + ], + [ + 871, + 1 + ], + [ + 872, + 1 + ], + [ + 873, + 1 + ], + [ + 874, + 1 + ], + [ + 875, + 1 + ], + [ + 876, + 1 + ], + [ + 877, + 1 + ], + [ + 878, + 1 + ], + [ + 879, + 1 + ], + [ + 880, + 1 + ], + [ + 881, + 1 + ], + [ + 882, + 1 + ], + [ + 883, + 1 + ], + [ + 884, + 1 + ], + [ + 885, + 1 + ], + [ + 886, + 1 + ], + [ + 887, + 1 + ], + [ + 888, + 1 + ], + [ + 889, + 1 + ], + [ + 890, + 1 + ], + [ + 891, + 1 + ], + [ + 892, + 1 + ], + [ + 893, + 1 + ], + [ + 894, + 1 + ], + [ + 895, + 1 + ], + [ + 896, + 1 + ], + [ + 897, + 1 + ], + [ + 898, + 1 + ], + [ + 899, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 870, + -1 + ], + [ + 871, + -1 + ], + [ + 872, + -1 + ], + [ + 873, + -1 + ], + [ + 874, + -1 + ], + [ + 875, + -1 + ], + [ + 876, + -1 + ], + [ + 877, + -1 + ], + [ + 878, + -1 + ], + [ + 879, + -1 + ], + [ + 880, + -1 + ], + [ + 881, + -1 + ], + [ + 882, + -1 + ], + [ + 883, + -1 + ], + [ + 884, + -1 + ], + [ + 885, + -1 + ], + [ + 886, + -1 + ], + [ + 887, + -1 + ], + [ + 888, + -1 + ], + [ + 889, + -1 + ], + [ + 890, + -1 + ], + [ + 891, + -1 + ], + [ + 892, + -1 + ], + [ + 893, + -1 + ], + [ + 894, + -1 + ], + [ + 895, + -1 + ], + [ + 896, + -1 + ], + [ + 897, + -1 + ], + [ + 898, + -1 + ], + [ + 899, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 30, + 1 + ], + [ + 60, + 1 + ], + [ + 90, + 1 + ], + [ + 120, + 1 + ], + [ + 150, + 1 + ], + [ + 180, + 1 + ], + [ + 210, + 1 + ], + [ + 240, + 1 + ], + [ + 270, + 1 + ], + [ + 300, + 1 + ], + [ + 330, + 1 + ], + [ + 360, + 1 + ], + [ + 390, + 1 + ], + [ + 420, + 1 + ], + [ + 450, + 1 + ], + [ + 480, + 1 + ], + [ + 510, + 1 + ], + [ + 540, + 1 + ], + [ + 570, + 1 + ], + [ + 600, + 1 + ], + [ + 630, + 1 + ], + [ + 660, + 1 + ], + [ + 690, + 1 + ], + [ + 720, + 1 + ], + [ + 750, + 1 + ], + [ + 780, + 1 + ], + [ + 810, + 1 + ], + [ + 840, + 1 + ], + [ + 870, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 30, + -1 + ], + [ + 60, + -1 + ], + [ + 90, + -1 + ], + [ + 120, + -1 + ], + [ + 150, + -1 + ], + [ + 180, + -1 + ], + [ + 210, + -1 + ], + [ + 240, + -1 + ], + [ + 270, + -1 + ], + [ + 300, + -1 + ], + [ + 330, + -1 + ], + [ + 360, + -1 + ], + [ + 390, + -1 + ], + [ + 420, + -1 + ], + [ + 450, + -1 + ], + [ + 480, + -1 + ], + [ + 510, + -1 + ], + [ + 540, + -1 + ], + [ + 570, + -1 + ], + [ + 600, + -1 + ], + [ + 630, + -1 + ], + [ + 660, + -1 + ], + [ + 690, + -1 + ], + [ + 720, + -1 + ], + [ + 750, + -1 + ], + [ + 780, + -1 + ], + [ + 810, + -1 + ], + [ + 840, + -1 + ], + [ + 870, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 31, + 1 + ], + [ + 61, + 1 + ], + [ + 91, + 1 + ], + [ + 121, + 1 + ], + [ + 151, + 1 + ], + [ + 181, + 1 + ], + [ + 211, + 1 + ], + [ + 241, + 1 + ], + [ + 271, + 1 + ], + [ + 301, + 1 + ], + [ + 331, + 1 + ], + [ + 361, + 1 + ], + [ + 391, + 1 + ], + [ + 421, + 1 + ], + [ + 451, + 1 + ], + [ + 481, + 1 + ], + [ + 511, + 1 + ], + [ + 541, + 1 + ], + [ + 571, + 1 + ], + [ + 601, + 1 + ], + [ + 631, + 1 + ], + [ + 661, + 1 + ], + [ + 691, + 1 + ], + [ + 721, + 1 + ], + [ + 751, + 1 + ], + [ + 781, + 1 + ], + [ + 811, + 1 + ], + [ + 841, + 1 + ], + [ + 871, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 31, + -1 + ], + [ + 61, + -1 + ], + [ + 91, + -1 + ], + [ + 121, + -1 + ], + [ + 151, + -1 + ], + [ + 181, + -1 + ], + [ + 211, + -1 + ], + [ + 241, + -1 + ], + [ + 271, + -1 + ], + [ + 301, + -1 + ], + [ + 331, + -1 + ], + [ + 361, + -1 + ], + [ + 391, + -1 + ], + [ + 421, + -1 + ], + [ + 451, + -1 + ], + [ + 481, + -1 + ], + [ + 511, + -1 + ], + [ + 541, + -1 + ], + [ + 571, + -1 + ], + [ + 601, + -1 + ], + [ + 631, + -1 + ], + [ + 661, + -1 + ], + [ + 691, + -1 + ], + [ + 721, + -1 + ], + [ + 751, + -1 + ], + [ + 781, + -1 + ], + [ + 811, + -1 + ], + [ + 841, + -1 + ], + [ + 871, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 32, + 1 + ], + [ + 62, + 1 + ], + [ + 92, + 1 + ], + [ + 122, + 1 + ], + [ + 152, + 1 + ], + [ + 182, + 1 + ], + [ + 212, + 1 + ], + [ + 242, + 1 + ], + [ + 272, + 1 + ], + [ + 302, + 1 + ], + [ + 332, + 1 + ], + [ + 362, + 1 + ], + [ + 392, + 1 + ], + [ + 422, + 1 + ], + [ + 452, + 1 + ], + [ + 482, + 1 + ], + [ + 512, + 1 + ], + [ + 542, + 1 + ], + [ + 572, + 1 + ], + [ + 602, + 1 + ], + [ + 632, + 1 + ], + [ + 662, + 1 + ], + [ + 692, + 1 + ], + [ + 722, + 1 + ], + [ + 752, + 1 + ], + [ + 782, + 1 + ], + [ + 812, + 1 + ], + [ + 842, + 1 + ], + [ + 872, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 32, + -1 + ], + [ + 62, + -1 + ], + [ + 92, + -1 + ], + [ + 122, + -1 + ], + [ + 152, + -1 + ], + [ + 182, + -1 + ], + [ + 212, + -1 + ], + [ + 242, + -1 + ], + [ + 272, + -1 + ], + [ + 302, + -1 + ], + [ + 332, + -1 + ], + [ + 362, + -1 + ], + [ + 392, + -1 + ], + [ + 422, + -1 + ], + [ + 452, + -1 + ], + [ + 482, + -1 + ], + [ + 512, + -1 + ], + [ + 542, + -1 + ], + [ + 572, + -1 + ], + [ + 602, + -1 + ], + [ + 632, + -1 + ], + [ + 662, + -1 + ], + [ + 692, + -1 + ], + [ + 722, + -1 + ], + [ + 752, + -1 + ], + [ + 782, + -1 + ], + [ + 812, + -1 + ], + [ + 842, + -1 + ], + [ + 872, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 33, + 1 + ], + [ + 63, + 1 + ], + [ + 93, + 1 + ], + [ + 123, + 1 + ], + [ + 153, + 1 + ], + [ + 183, + 1 + ], + [ + 213, + 1 + ], + [ + 243, + 1 + ], + [ + 273, + 1 + ], + [ + 303, + 1 + ], + [ + 333, + 1 + ], + [ + 363, + 1 + ], + [ + 393, + 1 + ], + [ + 423, + 1 + ], + [ + 453, + 1 + ], + [ + 483, + 1 + ], + [ + 513, + 1 + ], + [ + 543, + 1 + ], + [ + 573, + 1 + ], + [ + 603, + 1 + ], + [ + 633, + 1 + ], + [ + 663, + 1 + ], + [ + 693, + 1 + ], + [ + 723, + 1 + ], + [ + 753, + 1 + ], + [ + 783, + 1 + ], + [ + 813, + 1 + ], + [ + 843, + 1 + ], + [ + 873, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 33, + -1 + ], + [ + 63, + -1 + ], + [ + 93, + -1 + ], + [ + 123, + -1 + ], + [ + 153, + -1 + ], + [ + 183, + -1 + ], + [ + 213, + -1 + ], + [ + 243, + -1 + ], + [ + 273, + -1 + ], + [ + 303, + -1 + ], + [ + 333, + -1 + ], + [ + 363, + -1 + ], + [ + 393, + -1 + ], + [ + 423, + -1 + ], + [ + 453, + -1 + ], + [ + 483, + -1 + ], + [ + 513, + -1 + ], + [ + 543, + -1 + ], + [ + 573, + -1 + ], + [ + 603, + -1 + ], + [ + 633, + -1 + ], + [ + 663, + -1 + ], + [ + 693, + -1 + ], + [ + 723, + -1 + ], + [ + 753, + -1 + ], + [ + 783, + -1 + ], + [ + 813, + -1 + ], + [ + 843, + -1 + ], + [ + 873, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 34, + 1 + ], + [ + 64, + 1 + ], + [ + 94, + 1 + ], + [ + 124, + 1 + ], + [ + 154, + 1 + ], + [ + 184, + 1 + ], + [ + 214, + 1 + ], + [ + 244, + 1 + ], + [ + 274, + 1 + ], + [ + 304, + 1 + ], + [ + 334, + 1 + ], + [ + 364, + 1 + ], + [ + 394, + 1 + ], + [ + 424, + 1 + ], + [ + 454, + 1 + ], + [ + 484, + 1 + ], + [ + 514, + 1 + ], + [ + 544, + 1 + ], + [ + 574, + 1 + ], + [ + 604, + 1 + ], + [ + 634, + 1 + ], + [ + 664, + 1 + ], + [ + 694, + 1 + ], + [ + 724, + 1 + ], + [ + 754, + 1 + ], + [ + 784, + 1 + ], + [ + 814, + 1 + ], + [ + 844, + 1 + ], + [ + 874, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 34, + -1 + ], + [ + 64, + -1 + ], + [ + 94, + -1 + ], + [ + 124, + -1 + ], + [ + 154, + -1 + ], + [ + 184, + -1 + ], + [ + 214, + -1 + ], + [ + 244, + -1 + ], + [ + 274, + -1 + ], + [ + 304, + -1 + ], + [ + 334, + -1 + ], + [ + 364, + -1 + ], + [ + 394, + -1 + ], + [ + 424, + -1 + ], + [ + 454, + -1 + ], + [ + 484, + -1 + ], + [ + 514, + -1 + ], + [ + 544, + -1 + ], + [ + 574, + -1 + ], + [ + 604, + -1 + ], + [ + 634, + -1 + ], + [ + 664, + -1 + ], + [ + 694, + -1 + ], + [ + 724, + -1 + ], + [ + 754, + -1 + ], + [ + 784, + -1 + ], + [ + 814, + -1 + ], + [ + 844, + -1 + ], + [ + 874, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 35, + 1 + ], + [ + 65, + 1 + ], + [ + 95, + 1 + ], + [ + 125, + 1 + ], + [ + 155, + 1 + ], + [ + 185, + 1 + ], + [ + 215, + 1 + ], + [ + 245, + 1 + ], + [ + 275, + 1 + ], + [ + 305, + 1 + ], + [ + 335, + 1 + ], + [ + 365, + 1 + ], + [ + 395, + 1 + ], + [ + 425, + 1 + ], + [ + 455, + 1 + ], + [ + 485, + 1 + ], + [ + 515, + 1 + ], + [ + 545, + 1 + ], + [ + 575, + 1 + ], + [ + 605, + 1 + ], + [ + 635, + 1 + ], + [ + 665, + 1 + ], + [ + 695, + 1 + ], + [ + 725, + 1 + ], + [ + 755, + 1 + ], + [ + 785, + 1 + ], + [ + 815, + 1 + ], + [ + 845, + 1 + ], + [ + 875, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 35, + -1 + ], + [ + 65, + -1 + ], + [ + 95, + -1 + ], + [ + 125, + -1 + ], + [ + 155, + -1 + ], + [ + 185, + -1 + ], + [ + 215, + -1 + ], + [ + 245, + -1 + ], + [ + 275, + -1 + ], + [ + 305, + -1 + ], + [ + 335, + -1 + ], + [ + 365, + -1 + ], + [ + 395, + -1 + ], + [ + 425, + -1 + ], + [ + 455, + -1 + ], + [ + 485, + -1 + ], + [ + 515, + -1 + ], + [ + 545, + -1 + ], + [ + 575, + -1 + ], + [ + 605, + -1 + ], + [ + 635, + -1 + ], + [ + 665, + -1 + ], + [ + 695, + -1 + ], + [ + 725, + -1 + ], + [ + 755, + -1 + ], + [ + 785, + -1 + ], + [ + 815, + -1 + ], + [ + 845, + -1 + ], + [ + 875, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 36, + 1 + ], + [ + 66, + 1 + ], + [ + 96, + 1 + ], + [ + 126, + 1 + ], + [ + 156, + 1 + ], + [ + 186, + 1 + ], + [ + 216, + 1 + ], + [ + 246, + 1 + ], + [ + 276, + 1 + ], + [ + 306, + 1 + ], + [ + 336, + 1 + ], + [ + 366, + 1 + ], + [ + 396, + 1 + ], + [ + 426, + 1 + ], + [ + 456, + 1 + ], + [ + 486, + 1 + ], + [ + 516, + 1 + ], + [ + 546, + 1 + ], + [ + 576, + 1 + ], + [ + 606, + 1 + ], + [ + 636, + 1 + ], + [ + 666, + 1 + ], + [ + 696, + 1 + ], + [ + 726, + 1 + ], + [ + 756, + 1 + ], + [ + 786, + 1 + ], + [ + 816, + 1 + ], + [ + 846, + 1 + ], + [ + 876, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 36, + -1 + ], + [ + 66, + -1 + ], + [ + 96, + -1 + ], + [ + 126, + -1 + ], + [ + 156, + -1 + ], + [ + 186, + -1 + ], + [ + 216, + -1 + ], + [ + 246, + -1 + ], + [ + 276, + -1 + ], + [ + 306, + -1 + ], + [ + 336, + -1 + ], + [ + 366, + -1 + ], + [ + 396, + -1 + ], + [ + 426, + -1 + ], + [ + 456, + -1 + ], + [ + 486, + -1 + ], + [ + 516, + -1 + ], + [ + 546, + -1 + ], + [ + 576, + -1 + ], + [ + 606, + -1 + ], + [ + 636, + -1 + ], + [ + 666, + -1 + ], + [ + 696, + -1 + ], + [ + 726, + -1 + ], + [ + 756, + -1 + ], + [ + 786, + -1 + ], + [ + 816, + -1 + ], + [ + 846, + -1 + ], + [ + 876, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 37, + 1 + ], + [ + 67, + 1 + ], + [ + 97, + 1 + ], + [ + 127, + 1 + ], + [ + 157, + 1 + ], + [ + 187, + 1 + ], + [ + 217, + 1 + ], + [ + 247, + 1 + ], + [ + 277, + 1 + ], + [ + 307, + 1 + ], + [ + 337, + 1 + ], + [ + 367, + 1 + ], + [ + 397, + 1 + ], + [ + 427, + 1 + ], + [ + 457, + 1 + ], + [ + 487, + 1 + ], + [ + 517, + 1 + ], + [ + 547, + 1 + ], + [ + 577, + 1 + ], + [ + 607, + 1 + ], + [ + 637, + 1 + ], + [ + 667, + 1 + ], + [ + 697, + 1 + ], + [ + 727, + 1 + ], + [ + 757, + 1 + ], + [ + 787, + 1 + ], + [ + 817, + 1 + ], + [ + 847, + 1 + ], + [ + 877, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 37, + -1 + ], + [ + 67, + -1 + ], + [ + 97, + -1 + ], + [ + 127, + -1 + ], + [ + 157, + -1 + ], + [ + 187, + -1 + ], + [ + 217, + -1 + ], + [ + 247, + -1 + ], + [ + 277, + -1 + ], + [ + 307, + -1 + ], + [ + 337, + -1 + ], + [ + 367, + -1 + ], + [ + 397, + -1 + ], + [ + 427, + -1 + ], + [ + 457, + -1 + ], + [ + 487, + -1 + ], + [ + 517, + -1 + ], + [ + 547, + -1 + ], + [ + 577, + -1 + ], + [ + 607, + -1 + ], + [ + 637, + -1 + ], + [ + 667, + -1 + ], + [ + 697, + -1 + ], + [ + 727, + -1 + ], + [ + 757, + -1 + ], + [ + 787, + -1 + ], + [ + 817, + -1 + ], + [ + 847, + -1 + ], + [ + 877, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 38, + 1 + ], + [ + 68, + 1 + ], + [ + 98, + 1 + ], + [ + 128, + 1 + ], + [ + 158, + 1 + ], + [ + 188, + 1 + ], + [ + 218, + 1 + ], + [ + 248, + 1 + ], + [ + 278, + 1 + ], + [ + 308, + 1 + ], + [ + 338, + 1 + ], + [ + 368, + 1 + ], + [ + 398, + 1 + ], + [ + 428, + 1 + ], + [ + 458, + 1 + ], + [ + 488, + 1 + ], + [ + 518, + 1 + ], + [ + 548, + 1 + ], + [ + 578, + 1 + ], + [ + 608, + 1 + ], + [ + 638, + 1 + ], + [ + 668, + 1 + ], + [ + 698, + 1 + ], + [ + 728, + 1 + ], + [ + 758, + 1 + ], + [ + 788, + 1 + ], + [ + 818, + 1 + ], + [ + 848, + 1 + ], + [ + 878, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 38, + -1 + ], + [ + 68, + -1 + ], + [ + 98, + -1 + ], + [ + 128, + -1 + ], + [ + 158, + -1 + ], + [ + 188, + -1 + ], + [ + 218, + -1 + ], + [ + 248, + -1 + ], + [ + 278, + -1 + ], + [ + 308, + -1 + ], + [ + 338, + -1 + ], + [ + 368, + -1 + ], + [ + 398, + -1 + ], + [ + 428, + -1 + ], + [ + 458, + -1 + ], + [ + 488, + -1 + ], + [ + 518, + -1 + ], + [ + 548, + -1 + ], + [ + 578, + -1 + ], + [ + 608, + -1 + ], + [ + 638, + -1 + ], + [ + 668, + -1 + ], + [ + 698, + -1 + ], + [ + 728, + -1 + ], + [ + 758, + -1 + ], + [ + 788, + -1 + ], + [ + 818, + -1 + ], + [ + 848, + -1 + ], + [ + 878, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 39, + 1 + ], + [ + 69, + 1 + ], + [ + 99, + 1 + ], + [ + 129, + 1 + ], + [ + 159, + 1 + ], + [ + 189, + 1 + ], + [ + 219, + 1 + ], + [ + 249, + 1 + ], + [ + 279, + 1 + ], + [ + 309, + 1 + ], + [ + 339, + 1 + ], + [ + 369, + 1 + ], + [ + 399, + 1 + ], + [ + 429, + 1 + ], + [ + 459, + 1 + ], + [ + 489, + 1 + ], + [ + 519, + 1 + ], + [ + 549, + 1 + ], + [ + 579, + 1 + ], + [ + 609, + 1 + ], + [ + 639, + 1 + ], + [ + 669, + 1 + ], + [ + 699, + 1 + ], + [ + 729, + 1 + ], + [ + 759, + 1 + ], + [ + 789, + 1 + ], + [ + 819, + 1 + ], + [ + 849, + 1 + ], + [ + 879, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 39, + -1 + ], + [ + 69, + -1 + ], + [ + 99, + -1 + ], + [ + 129, + -1 + ], + [ + 159, + -1 + ], + [ + 189, + -1 + ], + [ + 219, + -1 + ], + [ + 249, + -1 + ], + [ + 279, + -1 + ], + [ + 309, + -1 + ], + [ + 339, + -1 + ], + [ + 369, + -1 + ], + [ + 399, + -1 + ], + [ + 429, + -1 + ], + [ + 459, + -1 + ], + [ + 489, + -1 + ], + [ + 519, + -1 + ], + [ + 549, + -1 + ], + [ + 579, + -1 + ], + [ + 609, + -1 + ], + [ + 639, + -1 + ], + [ + 669, + -1 + ], + [ + 699, + -1 + ], + [ + 729, + -1 + ], + [ + 759, + -1 + ], + [ + 789, + -1 + ], + [ + 819, + -1 + ], + [ + 849, + -1 + ], + [ + 879, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 40, + 1 + ], + [ + 70, + 1 + ], + [ + 100, + 1 + ], + [ + 130, + 1 + ], + [ + 160, + 1 + ], + [ + 190, + 1 + ], + [ + 220, + 1 + ], + [ + 250, + 1 + ], + [ + 280, + 1 + ], + [ + 310, + 1 + ], + [ + 340, + 1 + ], + [ + 370, + 1 + ], + [ + 400, + 1 + ], + [ + 430, + 1 + ], + [ + 460, + 1 + ], + [ + 490, + 1 + ], + [ + 520, + 1 + ], + [ + 550, + 1 + ], + [ + 580, + 1 + ], + [ + 610, + 1 + ], + [ + 640, + 1 + ], + [ + 670, + 1 + ], + [ + 700, + 1 + ], + [ + 730, + 1 + ], + [ + 760, + 1 + ], + [ + 790, + 1 + ], + [ + 820, + 1 + ], + [ + 850, + 1 + ], + [ + 880, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 40, + -1 + ], + [ + 70, + -1 + ], + [ + 100, + -1 + ], + [ + 130, + -1 + ], + [ + 160, + -1 + ], + [ + 190, + -1 + ], + [ + 220, + -1 + ], + [ + 250, + -1 + ], + [ + 280, + -1 + ], + [ + 310, + -1 + ], + [ + 340, + -1 + ], + [ + 370, + -1 + ], + [ + 400, + -1 + ], + [ + 430, + -1 + ], + [ + 460, + -1 + ], + [ + 490, + -1 + ], + [ + 520, + -1 + ], + [ + 550, + -1 + ], + [ + 580, + -1 + ], + [ + 610, + -1 + ], + [ + 640, + -1 + ], + [ + 670, + -1 + ], + [ + 700, + -1 + ], + [ + 730, + -1 + ], + [ + 760, + -1 + ], + [ + 790, + -1 + ], + [ + 820, + -1 + ], + [ + 850, + -1 + ], + [ + 880, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 41, + 1 + ], + [ + 71, + 1 + ], + [ + 101, + 1 + ], + [ + 131, + 1 + ], + [ + 161, + 1 + ], + [ + 191, + 1 + ], + [ + 221, + 1 + ], + [ + 251, + 1 + ], + [ + 281, + 1 + ], + [ + 311, + 1 + ], + [ + 341, + 1 + ], + [ + 371, + 1 + ], + [ + 401, + 1 + ], + [ + 431, + 1 + ], + [ + 461, + 1 + ], + [ + 491, + 1 + ], + [ + 521, + 1 + ], + [ + 551, + 1 + ], + [ + 581, + 1 + ], + [ + 611, + 1 + ], + [ + 641, + 1 + ], + [ + 671, + 1 + ], + [ + 701, + 1 + ], + [ + 731, + 1 + ], + [ + 761, + 1 + ], + [ + 791, + 1 + ], + [ + 821, + 1 + ], + [ + 851, + 1 + ], + [ + 881, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 41, + -1 + ], + [ + 71, + -1 + ], + [ + 101, + -1 + ], + [ + 131, + -1 + ], + [ + 161, + -1 + ], + [ + 191, + -1 + ], + [ + 221, + -1 + ], + [ + 251, + -1 + ], + [ + 281, + -1 + ], + [ + 311, + -1 + ], + [ + 341, + -1 + ], + [ + 371, + -1 + ], + [ + 401, + -1 + ], + [ + 431, + -1 + ], + [ + 461, + -1 + ], + [ + 491, + -1 + ], + [ + 521, + -1 + ], + [ + 551, + -1 + ], + [ + 581, + -1 + ], + [ + 611, + -1 + ], + [ + 641, + -1 + ], + [ + 671, + -1 + ], + [ + 701, + -1 + ], + [ + 731, + -1 + ], + [ + 761, + -1 + ], + [ + 791, + -1 + ], + [ + 821, + -1 + ], + [ + 851, + -1 + ], + [ + 881, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 42, + 1 + ], + [ + 72, + 1 + ], + [ + 102, + 1 + ], + [ + 132, + 1 + ], + [ + 162, + 1 + ], + [ + 192, + 1 + ], + [ + 222, + 1 + ], + [ + 252, + 1 + ], + [ + 282, + 1 + ], + [ + 312, + 1 + ], + [ + 342, + 1 + ], + [ + 372, + 1 + ], + [ + 402, + 1 + ], + [ + 432, + 1 + ], + [ + 462, + 1 + ], + [ + 492, + 1 + ], + [ + 522, + 1 + ], + [ + 552, + 1 + ], + [ + 582, + 1 + ], + [ + 612, + 1 + ], + [ + 642, + 1 + ], + [ + 672, + 1 + ], + [ + 702, + 1 + ], + [ + 732, + 1 + ], + [ + 762, + 1 + ], + [ + 792, + 1 + ], + [ + 822, + 1 + ], + [ + 852, + 1 + ], + [ + 882, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 42, + -1 + ], + [ + 72, + -1 + ], + [ + 102, + -1 + ], + [ + 132, + -1 + ], + [ + 162, + -1 + ], + [ + 192, + -1 + ], + [ + 222, + -1 + ], + [ + 252, + -1 + ], + [ + 282, + -1 + ], + [ + 312, + -1 + ], + [ + 342, + -1 + ], + [ + 372, + -1 + ], + [ + 402, + -1 + ], + [ + 432, + -1 + ], + [ + 462, + -1 + ], + [ + 492, + -1 + ], + [ + 522, + -1 + ], + [ + 552, + -1 + ], + [ + 582, + -1 + ], + [ + 612, + -1 + ], + [ + 642, + -1 + ], + [ + 672, + -1 + ], + [ + 702, + -1 + ], + [ + 732, + -1 + ], + [ + 762, + -1 + ], + [ + 792, + -1 + ], + [ + 822, + -1 + ], + [ + 852, + -1 + ], + [ + 882, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 43, + 1 + ], + [ + 73, + 1 + ], + [ + 103, + 1 + ], + [ + 133, + 1 + ], + [ + 163, + 1 + ], + [ + 193, + 1 + ], + [ + 223, + 1 + ], + [ + 253, + 1 + ], + [ + 283, + 1 + ], + [ + 313, + 1 + ], + [ + 343, + 1 + ], + [ + 373, + 1 + ], + [ + 403, + 1 + ], + [ + 433, + 1 + ], + [ + 463, + 1 + ], + [ + 493, + 1 + ], + [ + 523, + 1 + ], + [ + 553, + 1 + ], + [ + 583, + 1 + ], + [ + 613, + 1 + ], + [ + 643, + 1 + ], + [ + 673, + 1 + ], + [ + 703, + 1 + ], + [ + 733, + 1 + ], + [ + 763, + 1 + ], + [ + 793, + 1 + ], + [ + 823, + 1 + ], + [ + 853, + 1 + ], + [ + 883, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 43, + -1 + ], + [ + 73, + -1 + ], + [ + 103, + -1 + ], + [ + 133, + -1 + ], + [ + 163, + -1 + ], + [ + 193, + -1 + ], + [ + 223, + -1 + ], + [ + 253, + -1 + ], + [ + 283, + -1 + ], + [ + 313, + -1 + ], + [ + 343, + -1 + ], + [ + 373, + -1 + ], + [ + 403, + -1 + ], + [ + 433, + -1 + ], + [ + 463, + -1 + ], + [ + 493, + -1 + ], + [ + 523, + -1 + ], + [ + 553, + -1 + ], + [ + 583, + -1 + ], + [ + 613, + -1 + ], + [ + 643, + -1 + ], + [ + 673, + -1 + ], + [ + 703, + -1 + ], + [ + 733, + -1 + ], + [ + 763, + -1 + ], + [ + 793, + -1 + ], + [ + 823, + -1 + ], + [ + 853, + -1 + ], + [ + 883, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 44, + 1 + ], + [ + 74, + 1 + ], + [ + 104, + 1 + ], + [ + 134, + 1 + ], + [ + 164, + 1 + ], + [ + 194, + 1 + ], + [ + 224, + 1 + ], + [ + 254, + 1 + ], + [ + 284, + 1 + ], + [ + 314, + 1 + ], + [ + 344, + 1 + ], + [ + 374, + 1 + ], + [ + 404, + 1 + ], + [ + 434, + 1 + ], + [ + 464, + 1 + ], + [ + 494, + 1 + ], + [ + 524, + 1 + ], + [ + 554, + 1 + ], + [ + 584, + 1 + ], + [ + 614, + 1 + ], + [ + 644, + 1 + ], + [ + 674, + 1 + ], + [ + 704, + 1 + ], + [ + 734, + 1 + ], + [ + 764, + 1 + ], + [ + 794, + 1 + ], + [ + 824, + 1 + ], + [ + 854, + 1 + ], + [ + 884, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 44, + -1 + ], + [ + 74, + -1 + ], + [ + 104, + -1 + ], + [ + 134, + -1 + ], + [ + 164, + -1 + ], + [ + 194, + -1 + ], + [ + 224, + -1 + ], + [ + 254, + -1 + ], + [ + 284, + -1 + ], + [ + 314, + -1 + ], + [ + 344, + -1 + ], + [ + 374, + -1 + ], + [ + 404, + -1 + ], + [ + 434, + -1 + ], + [ + 464, + -1 + ], + [ + 494, + -1 + ], + [ + 524, + -1 + ], + [ + 554, + -1 + ], + [ + 584, + -1 + ], + [ + 614, + -1 + ], + [ + 644, + -1 + ], + [ + 674, + -1 + ], + [ + 704, + -1 + ], + [ + 734, + -1 + ], + [ + 764, + -1 + ], + [ + 794, + -1 + ], + [ + 824, + -1 + ], + [ + 854, + -1 + ], + [ + 884, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 45, + 1 + ], + [ + 75, + 1 + ], + [ + 105, + 1 + ], + [ + 135, + 1 + ], + [ + 165, + 1 + ], + [ + 195, + 1 + ], + [ + 225, + 1 + ], + [ + 255, + 1 + ], + [ + 285, + 1 + ], + [ + 315, + 1 + ], + [ + 345, + 1 + ], + [ + 375, + 1 + ], + [ + 405, + 1 + ], + [ + 435, + 1 + ], + [ + 465, + 1 + ], + [ + 495, + 1 + ], + [ + 525, + 1 + ], + [ + 555, + 1 + ], + [ + 585, + 1 + ], + [ + 615, + 1 + ], + [ + 645, + 1 + ], + [ + 675, + 1 + ], + [ + 705, + 1 + ], + [ + 735, + 1 + ], + [ + 765, + 1 + ], + [ + 795, + 1 + ], + [ + 825, + 1 + ], + [ + 855, + 1 + ], + [ + 885, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 45, + -1 + ], + [ + 75, + -1 + ], + [ + 105, + -1 + ], + [ + 135, + -1 + ], + [ + 165, + -1 + ], + [ + 195, + -1 + ], + [ + 225, + -1 + ], + [ + 255, + -1 + ], + [ + 285, + -1 + ], + [ + 315, + -1 + ], + [ + 345, + -1 + ], + [ + 375, + -1 + ], + [ + 405, + -1 + ], + [ + 435, + -1 + ], + [ + 465, + -1 + ], + [ + 495, + -1 + ], + [ + 525, + -1 + ], + [ + 555, + -1 + ], + [ + 585, + -1 + ], + [ + 615, + -1 + ], + [ + 645, + -1 + ], + [ + 675, + -1 + ], + [ + 705, + -1 + ], + [ + 735, + -1 + ], + [ + 765, + -1 + ], + [ + 795, + -1 + ], + [ + 825, + -1 + ], + [ + 855, + -1 + ], + [ + 885, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 46, + 1 + ], + [ + 76, + 1 + ], + [ + 106, + 1 + ], + [ + 136, + 1 + ], + [ + 166, + 1 + ], + [ + 196, + 1 + ], + [ + 226, + 1 + ], + [ + 256, + 1 + ], + [ + 286, + 1 + ], + [ + 316, + 1 + ], + [ + 346, + 1 + ], + [ + 376, + 1 + ], + [ + 406, + 1 + ], + [ + 436, + 1 + ], + [ + 466, + 1 + ], + [ + 496, + 1 + ], + [ + 526, + 1 + ], + [ + 556, + 1 + ], + [ + 586, + 1 + ], + [ + 616, + 1 + ], + [ + 646, + 1 + ], + [ + 676, + 1 + ], + [ + 706, + 1 + ], + [ + 736, + 1 + ], + [ + 766, + 1 + ], + [ + 796, + 1 + ], + [ + 826, + 1 + ], + [ + 856, + 1 + ], + [ + 886, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 46, + -1 + ], + [ + 76, + -1 + ], + [ + 106, + -1 + ], + [ + 136, + -1 + ], + [ + 166, + -1 + ], + [ + 196, + -1 + ], + [ + 226, + -1 + ], + [ + 256, + -1 + ], + [ + 286, + -1 + ], + [ + 316, + -1 + ], + [ + 346, + -1 + ], + [ + 376, + -1 + ], + [ + 406, + -1 + ], + [ + 436, + -1 + ], + [ + 466, + -1 + ], + [ + 496, + -1 + ], + [ + 526, + -1 + ], + [ + 556, + -1 + ], + [ + 586, + -1 + ], + [ + 616, + -1 + ], + [ + 646, + -1 + ], + [ + 676, + -1 + ], + [ + 706, + -1 + ], + [ + 736, + -1 + ], + [ + 766, + -1 + ], + [ + 796, + -1 + ], + [ + 826, + -1 + ], + [ + 856, + -1 + ], + [ + 886, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 47, + 1 + ], + [ + 77, + 1 + ], + [ + 107, + 1 + ], + [ + 137, + 1 + ], + [ + 167, + 1 + ], + [ + 197, + 1 + ], + [ + 227, + 1 + ], + [ + 257, + 1 + ], + [ + 287, + 1 + ], + [ + 317, + 1 + ], + [ + 347, + 1 + ], + [ + 377, + 1 + ], + [ + 407, + 1 + ], + [ + 437, + 1 + ], + [ + 467, + 1 + ], + [ + 497, + 1 + ], + [ + 527, + 1 + ], + [ + 557, + 1 + ], + [ + 587, + 1 + ], + [ + 617, + 1 + ], + [ + 647, + 1 + ], + [ + 677, + 1 + ], + [ + 707, + 1 + ], + [ + 737, + 1 + ], + [ + 767, + 1 + ], + [ + 797, + 1 + ], + [ + 827, + 1 + ], + [ + 857, + 1 + ], + [ + 887, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 47, + -1 + ], + [ + 77, + -1 + ], + [ + 107, + -1 + ], + [ + 137, + -1 + ], + [ + 167, + -1 + ], + [ + 197, + -1 + ], + [ + 227, + -1 + ], + [ + 257, + -1 + ], + [ + 287, + -1 + ], + [ + 317, + -1 + ], + [ + 347, + -1 + ], + [ + 377, + -1 + ], + [ + 407, + -1 + ], + [ + 437, + -1 + ], + [ + 467, + -1 + ], + [ + 497, + -1 + ], + [ + 527, + -1 + ], + [ + 557, + -1 + ], + [ + 587, + -1 + ], + [ + 617, + -1 + ], + [ + 647, + -1 + ], + [ + 677, + -1 + ], + [ + 707, + -1 + ], + [ + 737, + -1 + ], + [ + 767, + -1 + ], + [ + 797, + -1 + ], + [ + 827, + -1 + ], + [ + 857, + -1 + ], + [ + 887, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 48, + 1 + ], + [ + 78, + 1 + ], + [ + 108, + 1 + ], + [ + 138, + 1 + ], + [ + 168, + 1 + ], + [ + 198, + 1 + ], + [ + 228, + 1 + ], + [ + 258, + 1 + ], + [ + 288, + 1 + ], + [ + 318, + 1 + ], + [ + 348, + 1 + ], + [ + 378, + 1 + ], + [ + 408, + 1 + ], + [ + 438, + 1 + ], + [ + 468, + 1 + ], + [ + 498, + 1 + ], + [ + 528, + 1 + ], + [ + 558, + 1 + ], + [ + 588, + 1 + ], + [ + 618, + 1 + ], + [ + 648, + 1 + ], + [ + 678, + 1 + ], + [ + 708, + 1 + ], + [ + 738, + 1 + ], + [ + 768, + 1 + ], + [ + 798, + 1 + ], + [ + 828, + 1 + ], + [ + 858, + 1 + ], + [ + 888, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 48, + -1 + ], + [ + 78, + -1 + ], + [ + 108, + -1 + ], + [ + 138, + -1 + ], + [ + 168, + -1 + ], + [ + 198, + -1 + ], + [ + 228, + -1 + ], + [ + 258, + -1 + ], + [ + 288, + -1 + ], + [ + 318, + -1 + ], + [ + 348, + -1 + ], + [ + 378, + -1 + ], + [ + 408, + -1 + ], + [ + 438, + -1 + ], + [ + 468, + -1 + ], + [ + 498, + -1 + ], + [ + 528, + -1 + ], + [ + 558, + -1 + ], + [ + 588, + -1 + ], + [ + 618, + -1 + ], + [ + 648, + -1 + ], + [ + 678, + -1 + ], + [ + 708, + -1 + ], + [ + 738, + -1 + ], + [ + 768, + -1 + ], + [ + 798, + -1 + ], + [ + 828, + -1 + ], + [ + 858, + -1 + ], + [ + 888, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 49, + 1 + ], + [ + 79, + 1 + ], + [ + 109, + 1 + ], + [ + 139, + 1 + ], + [ + 169, + 1 + ], + [ + 199, + 1 + ], + [ + 229, + 1 + ], + [ + 259, + 1 + ], + [ + 289, + 1 + ], + [ + 319, + 1 + ], + [ + 349, + 1 + ], + [ + 379, + 1 + ], + [ + 409, + 1 + ], + [ + 439, + 1 + ], + [ + 469, + 1 + ], + [ + 499, + 1 + ], + [ + 529, + 1 + ], + [ + 559, + 1 + ], + [ + 589, + 1 + ], + [ + 619, + 1 + ], + [ + 649, + 1 + ], + [ + 679, + 1 + ], + [ + 709, + 1 + ], + [ + 739, + 1 + ], + [ + 769, + 1 + ], + [ + 799, + 1 + ], + [ + 829, + 1 + ], + [ + 859, + 1 + ], + [ + 889, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 49, + -1 + ], + [ + 79, + -1 + ], + [ + 109, + -1 + ], + [ + 139, + -1 + ], + [ + 169, + -1 + ], + [ + 199, + -1 + ], + [ + 229, + -1 + ], + [ + 259, + -1 + ], + [ + 289, + -1 + ], + [ + 319, + -1 + ], + [ + 349, + -1 + ], + [ + 379, + -1 + ], + [ + 409, + -1 + ], + [ + 439, + -1 + ], + [ + 469, + -1 + ], + [ + 499, + -1 + ], + [ + 529, + -1 + ], + [ + 559, + -1 + ], + [ + 589, + -1 + ], + [ + 619, + -1 + ], + [ + 649, + -1 + ], + [ + 679, + -1 + ], + [ + 709, + -1 + ], + [ + 739, + -1 + ], + [ + 769, + -1 + ], + [ + 799, + -1 + ], + [ + 829, + -1 + ], + [ + 859, + -1 + ], + [ + 889, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 50, + 1 + ], + [ + 80, + 1 + ], + [ + 110, + 1 + ], + [ + 140, + 1 + ], + [ + 170, + 1 + ], + [ + 200, + 1 + ], + [ + 230, + 1 + ], + [ + 260, + 1 + ], + [ + 290, + 1 + ], + [ + 320, + 1 + ], + [ + 350, + 1 + ], + [ + 380, + 1 + ], + [ + 410, + 1 + ], + [ + 440, + 1 + ], + [ + 470, + 1 + ], + [ + 500, + 1 + ], + [ + 530, + 1 + ], + [ + 560, + 1 + ], + [ + 590, + 1 + ], + [ + 620, + 1 + ], + [ + 650, + 1 + ], + [ + 680, + 1 + ], + [ + 710, + 1 + ], + [ + 740, + 1 + ], + [ + 770, + 1 + ], + [ + 800, + 1 + ], + [ + 830, + 1 + ], + [ + 860, + 1 + ], + [ + 890, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 50, + -1 + ], + [ + 80, + -1 + ], + [ + 110, + -1 + ], + [ + 140, + -1 + ], + [ + 170, + -1 + ], + [ + 200, + -1 + ], + [ + 230, + -1 + ], + [ + 260, + -1 + ], + [ + 290, + -1 + ], + [ + 320, + -1 + ], + [ + 350, + -1 + ], + [ + 380, + -1 + ], + [ + 410, + -1 + ], + [ + 440, + -1 + ], + [ + 470, + -1 + ], + [ + 500, + -1 + ], + [ + 530, + -1 + ], + [ + 560, + -1 + ], + [ + 590, + -1 + ], + [ + 620, + -1 + ], + [ + 650, + -1 + ], + [ + 680, + -1 + ], + [ + 710, + -1 + ], + [ + 740, + -1 + ], + [ + 770, + -1 + ], + [ + 800, + -1 + ], + [ + 830, + -1 + ], + [ + 860, + -1 + ], + [ + 890, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 51, + 1 + ], + [ + 81, + 1 + ], + [ + 111, + 1 + ], + [ + 141, + 1 + ], + [ + 171, + 1 + ], + [ + 201, + 1 + ], + [ + 231, + 1 + ], + [ + 261, + 1 + ], + [ + 291, + 1 + ], + [ + 321, + 1 + ], + [ + 351, + 1 + ], + [ + 381, + 1 + ], + [ + 411, + 1 + ], + [ + 441, + 1 + ], + [ + 471, + 1 + ], + [ + 501, + 1 + ], + [ + 531, + 1 + ], + [ + 561, + 1 + ], + [ + 591, + 1 + ], + [ + 621, + 1 + ], + [ + 651, + 1 + ], + [ + 681, + 1 + ], + [ + 711, + 1 + ], + [ + 741, + 1 + ], + [ + 771, + 1 + ], + [ + 801, + 1 + ], + [ + 831, + 1 + ], + [ + 861, + 1 + ], + [ + 891, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 51, + -1 + ], + [ + 81, + -1 + ], + [ + 111, + -1 + ], + [ + 141, + -1 + ], + [ + 171, + -1 + ], + [ + 201, + -1 + ], + [ + 231, + -1 + ], + [ + 261, + -1 + ], + [ + 291, + -1 + ], + [ + 321, + -1 + ], + [ + 351, + -1 + ], + [ + 381, + -1 + ], + [ + 411, + -1 + ], + [ + 441, + -1 + ], + [ + 471, + -1 + ], + [ + 501, + -1 + ], + [ + 531, + -1 + ], + [ + 561, + -1 + ], + [ + 591, + -1 + ], + [ + 621, + -1 + ], + [ + 651, + -1 + ], + [ + 681, + -1 + ], + [ + 711, + -1 + ], + [ + 741, + -1 + ], + [ + 771, + -1 + ], + [ + 801, + -1 + ], + [ + 831, + -1 + ], + [ + 861, + -1 + ], + [ + 891, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 52, + 1 + ], + [ + 82, + 1 + ], + [ + 112, + 1 + ], + [ + 142, + 1 + ], + [ + 172, + 1 + ], + [ + 202, + 1 + ], + [ + 232, + 1 + ], + [ + 262, + 1 + ], + [ + 292, + 1 + ], + [ + 322, + 1 + ], + [ + 352, + 1 + ], + [ + 382, + 1 + ], + [ + 412, + 1 + ], + [ + 442, + 1 + ], + [ + 472, + 1 + ], + [ + 502, + 1 + ], + [ + 532, + 1 + ], + [ + 562, + 1 + ], + [ + 592, + 1 + ], + [ + 622, + 1 + ], + [ + 652, + 1 + ], + [ + 682, + 1 + ], + [ + 712, + 1 + ], + [ + 742, + 1 + ], + [ + 772, + 1 + ], + [ + 802, + 1 + ], + [ + 832, + 1 + ], + [ + 862, + 1 + ], + [ + 892, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 52, + -1 + ], + [ + 82, + -1 + ], + [ + 112, + -1 + ], + [ + 142, + -1 + ], + [ + 172, + -1 + ], + [ + 202, + -1 + ], + [ + 232, + -1 + ], + [ + 262, + -1 + ], + [ + 292, + -1 + ], + [ + 322, + -1 + ], + [ + 352, + -1 + ], + [ + 382, + -1 + ], + [ + 412, + -1 + ], + [ + 442, + -1 + ], + [ + 472, + -1 + ], + [ + 502, + -1 + ], + [ + 532, + -1 + ], + [ + 562, + -1 + ], + [ + 592, + -1 + ], + [ + 622, + -1 + ], + [ + 652, + -1 + ], + [ + 682, + -1 + ], + [ + 712, + -1 + ], + [ + 742, + -1 + ], + [ + 772, + -1 + ], + [ + 802, + -1 + ], + [ + 832, + -1 + ], + [ + 862, + -1 + ], + [ + 892, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 53, + 1 + ], + [ + 83, + 1 + ], + [ + 113, + 1 + ], + [ + 143, + 1 + ], + [ + 173, + 1 + ], + [ + 203, + 1 + ], + [ + 233, + 1 + ], + [ + 263, + 1 + ], + [ + 293, + 1 + ], + [ + 323, + 1 + ], + [ + 353, + 1 + ], + [ + 383, + 1 + ], + [ + 413, + 1 + ], + [ + 443, + 1 + ], + [ + 473, + 1 + ], + [ + 503, + 1 + ], + [ + 533, + 1 + ], + [ + 563, + 1 + ], + [ + 593, + 1 + ], + [ + 623, + 1 + ], + [ + 653, + 1 + ], + [ + 683, + 1 + ], + [ + 713, + 1 + ], + [ + 743, + 1 + ], + [ + 773, + 1 + ], + [ + 803, + 1 + ], + [ + 833, + 1 + ], + [ + 863, + 1 + ], + [ + 893, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 53, + -1 + ], + [ + 83, + -1 + ], + [ + 113, + -1 + ], + [ + 143, + -1 + ], + [ + 173, + -1 + ], + [ + 203, + -1 + ], + [ + 233, + -1 + ], + [ + 263, + -1 + ], + [ + 293, + -1 + ], + [ + 323, + -1 + ], + [ + 353, + -1 + ], + [ + 383, + -1 + ], + [ + 413, + -1 + ], + [ + 443, + -1 + ], + [ + 473, + -1 + ], + [ + 503, + -1 + ], + [ + 533, + -1 + ], + [ + 563, + -1 + ], + [ + 593, + -1 + ], + [ + 623, + -1 + ], + [ + 653, + -1 + ], + [ + 683, + -1 + ], + [ + 713, + -1 + ], + [ + 743, + -1 + ], + [ + 773, + -1 + ], + [ + 803, + -1 + ], + [ + 833, + -1 + ], + [ + 863, + -1 + ], + [ + 893, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 54, + 1 + ], + [ + 84, + 1 + ], + [ + 114, + 1 + ], + [ + 144, + 1 + ], + [ + 174, + 1 + ], + [ + 204, + 1 + ], + [ + 234, + 1 + ], + [ + 264, + 1 + ], + [ + 294, + 1 + ], + [ + 324, + 1 + ], + [ + 354, + 1 + ], + [ + 384, + 1 + ], + [ + 414, + 1 + ], + [ + 444, + 1 + ], + [ + 474, + 1 + ], + [ + 504, + 1 + ], + [ + 534, + 1 + ], + [ + 564, + 1 + ], + [ + 594, + 1 + ], + [ + 624, + 1 + ], + [ + 654, + 1 + ], + [ + 684, + 1 + ], + [ + 714, + 1 + ], + [ + 744, + 1 + ], + [ + 774, + 1 + ], + [ + 804, + 1 + ], + [ + 834, + 1 + ], + [ + 864, + 1 + ], + [ + 894, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 54, + -1 + ], + [ + 84, + -1 + ], + [ + 114, + -1 + ], + [ + 144, + -1 + ], + [ + 174, + -1 + ], + [ + 204, + -1 + ], + [ + 234, + -1 + ], + [ + 264, + -1 + ], + [ + 294, + -1 + ], + [ + 324, + -1 + ], + [ + 354, + -1 + ], + [ + 384, + -1 + ], + [ + 414, + -1 + ], + [ + 444, + -1 + ], + [ + 474, + -1 + ], + [ + 504, + -1 + ], + [ + 534, + -1 + ], + [ + 564, + -1 + ], + [ + 594, + -1 + ], + [ + 624, + -1 + ], + [ + 654, + -1 + ], + [ + 684, + -1 + ], + [ + 714, + -1 + ], + [ + 744, + -1 + ], + [ + 774, + -1 + ], + [ + 804, + -1 + ], + [ + 834, + -1 + ], + [ + 864, + -1 + ], + [ + 894, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 25, + 1 + ], + [ + 55, + 1 + ], + [ + 85, + 1 + ], + [ + 115, + 1 + ], + [ + 145, + 1 + ], + [ + 175, + 1 + ], + [ + 205, + 1 + ], + [ + 235, + 1 + ], + [ + 265, + 1 + ], + [ + 295, + 1 + ], + [ + 325, + 1 + ], + [ + 355, + 1 + ], + [ + 385, + 1 + ], + [ + 415, + 1 + ], + [ + 445, + 1 + ], + [ + 475, + 1 + ], + [ + 505, + 1 + ], + [ + 535, + 1 + ], + [ + 565, + 1 + ], + [ + 595, + 1 + ], + [ + 625, + 1 + ], + [ + 655, + 1 + ], + [ + 685, + 1 + ], + [ + 715, + 1 + ], + [ + 745, + 1 + ], + [ + 775, + 1 + ], + [ + 805, + 1 + ], + [ + 835, + 1 + ], + [ + 865, + 1 + ], + [ + 895, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 25, + -1 + ], + [ + 55, + -1 + ], + [ + 85, + -1 + ], + [ + 115, + -1 + ], + [ + 145, + -1 + ], + [ + 175, + -1 + ], + [ + 205, + -1 + ], + [ + 235, + -1 + ], + [ + 265, + -1 + ], + [ + 295, + -1 + ], + [ + 325, + -1 + ], + [ + 355, + -1 + ], + [ + 385, + -1 + ], + [ + 415, + -1 + ], + [ + 445, + -1 + ], + [ + 475, + -1 + ], + [ + 505, + -1 + ], + [ + 535, + -1 + ], + [ + 565, + -1 + ], + [ + 595, + -1 + ], + [ + 625, + -1 + ], + [ + 655, + -1 + ], + [ + 685, + -1 + ], + [ + 715, + -1 + ], + [ + 745, + -1 + ], + [ + 775, + -1 + ], + [ + 805, + -1 + ], + [ + 835, + -1 + ], + [ + 865, + -1 + ], + [ + 895, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 26, + 1 + ], + [ + 56, + 1 + ], + [ + 86, + 1 + ], + [ + 116, + 1 + ], + [ + 146, + 1 + ], + [ + 176, + 1 + ], + [ + 206, + 1 + ], + [ + 236, + 1 + ], + [ + 266, + 1 + ], + [ + 296, + 1 + ], + [ + 326, + 1 + ], + [ + 356, + 1 + ], + [ + 386, + 1 + ], + [ + 416, + 1 + ], + [ + 446, + 1 + ], + [ + 476, + 1 + ], + [ + 506, + 1 + ], + [ + 536, + 1 + ], + [ + 566, + 1 + ], + [ + 596, + 1 + ], + [ + 626, + 1 + ], + [ + 656, + 1 + ], + [ + 686, + 1 + ], + [ + 716, + 1 + ], + [ + 746, + 1 + ], + [ + 776, + 1 + ], + [ + 806, + 1 + ], + [ + 836, + 1 + ], + [ + 866, + 1 + ], + [ + 896, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 26, + -1 + ], + [ + 56, + -1 + ], + [ + 86, + -1 + ], + [ + 116, + -1 + ], + [ + 146, + -1 + ], + [ + 176, + -1 + ], + [ + 206, + -1 + ], + [ + 236, + -1 + ], + [ + 266, + -1 + ], + [ + 296, + -1 + ], + [ + 326, + -1 + ], + [ + 356, + -1 + ], + [ + 386, + -1 + ], + [ + 416, + -1 + ], + [ + 446, + -1 + ], + [ + 476, + -1 + ], + [ + 506, + -1 + ], + [ + 536, + -1 + ], + [ + 566, + -1 + ], + [ + 596, + -1 + ], + [ + 626, + -1 + ], + [ + 656, + -1 + ], + [ + 686, + -1 + ], + [ + 716, + -1 + ], + [ + 746, + -1 + ], + [ + 776, + -1 + ], + [ + 806, + -1 + ], + [ + 836, + -1 + ], + [ + 866, + -1 + ], + [ + 896, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 57, + 1 + ], + [ + 87, + 1 + ], + [ + 117, + 1 + ], + [ + 147, + 1 + ], + [ + 177, + 1 + ], + [ + 207, + 1 + ], + [ + 237, + 1 + ], + [ + 267, + 1 + ], + [ + 297, + 1 + ], + [ + 327, + 1 + ], + [ + 357, + 1 + ], + [ + 387, + 1 + ], + [ + 417, + 1 + ], + [ + 447, + 1 + ], + [ + 477, + 1 + ], + [ + 507, + 1 + ], + [ + 537, + 1 + ], + [ + 567, + 1 + ], + [ + 597, + 1 + ], + [ + 627, + 1 + ], + [ + 657, + 1 + ], + [ + 687, + 1 + ], + [ + 717, + 1 + ], + [ + 747, + 1 + ], + [ + 777, + 1 + ], + [ + 807, + 1 + ], + [ + 837, + 1 + ], + [ + 867, + 1 + ], + [ + 897, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 57, + -1 + ], + [ + 87, + -1 + ], + [ + 117, + -1 + ], + [ + 147, + -1 + ], + [ + 177, + -1 + ], + [ + 207, + -1 + ], + [ + 237, + -1 + ], + [ + 267, + -1 + ], + [ + 297, + -1 + ], + [ + 327, + -1 + ], + [ + 357, + -1 + ], + [ + 387, + -1 + ], + [ + 417, + -1 + ], + [ + 447, + -1 + ], + [ + 477, + -1 + ], + [ + 507, + -1 + ], + [ + 537, + -1 + ], + [ + 567, + -1 + ], + [ + 597, + -1 + ], + [ + 627, + -1 + ], + [ + 657, + -1 + ], + [ + 687, + -1 + ], + [ + 717, + -1 + ], + [ + 747, + -1 + ], + [ + 777, + -1 + ], + [ + 807, + -1 + ], + [ + 837, + -1 + ], + [ + 867, + -1 + ], + [ + 897, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 28, + 1 + ], + [ + 58, + 1 + ], + [ + 88, + 1 + ], + [ + 118, + 1 + ], + [ + 148, + 1 + ], + [ + 178, + 1 + ], + [ + 208, + 1 + ], + [ + 238, + 1 + ], + [ + 268, + 1 + ], + [ + 298, + 1 + ], + [ + 328, + 1 + ], + [ + 358, + 1 + ], + [ + 388, + 1 + ], + [ + 418, + 1 + ], + [ + 448, + 1 + ], + [ + 478, + 1 + ], + [ + 508, + 1 + ], + [ + 538, + 1 + ], + [ + 568, + 1 + ], + [ + 598, + 1 + ], + [ + 628, + 1 + ], + [ + 658, + 1 + ], + [ + 688, + 1 + ], + [ + 718, + 1 + ], + [ + 748, + 1 + ], + [ + 778, + 1 + ], + [ + 808, + 1 + ], + [ + 838, + 1 + ], + [ + 868, + 1 + ], + [ + 898, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 28, + -1 + ], + [ + 58, + -1 + ], + [ + 88, + -1 + ], + [ + 118, + -1 + ], + [ + 148, + -1 + ], + [ + 178, + -1 + ], + [ + 208, + -1 + ], + [ + 238, + -1 + ], + [ + 268, + -1 + ], + [ + 298, + -1 + ], + [ + 328, + -1 + ], + [ + 358, + -1 + ], + [ + 388, + -1 + ], + [ + 418, + -1 + ], + [ + 448, + -1 + ], + [ + 478, + -1 + ], + [ + 508, + -1 + ], + [ + 538, + -1 + ], + [ + 568, + -1 + ], + [ + 598, + -1 + ], + [ + 628, + -1 + ], + [ + 658, + -1 + ], + [ + 688, + -1 + ], + [ + 718, + -1 + ], + [ + 748, + -1 + ], + [ + 778, + -1 + ], + [ + 808, + -1 + ], + [ + 838, + -1 + ], + [ + 868, + -1 + ], + [ + 898, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 29, + 1 + ], + [ + 59, + 1 + ], + [ + 89, + 1 + ], + [ + 119, + 1 + ], + [ + 149, + 1 + ], + [ + 179, + 1 + ], + [ + 209, + 1 + ], + [ + 239, + 1 + ], + [ + 269, + 1 + ], + [ + 299, + 1 + ], + [ + 329, + 1 + ], + [ + 359, + 1 + ], + [ + 389, + 1 + ], + [ + 419, + 1 + ], + [ + 449, + 1 + ], + [ + 479, + 1 + ], + [ + 509, + 1 + ], + [ + 539, + 1 + ], + [ + 569, + 1 + ], + [ + 599, + 1 + ], + [ + 629, + 1 + ], + [ + 659, + 1 + ], + [ + 689, + 1 + ], + [ + 719, + 1 + ], + [ + 749, + 1 + ], + [ + 779, + 1 + ], + [ + 809, + 1 + ], + [ + 839, + 1 + ], + [ + 869, + 1 + ], + [ + 899, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 29, + -1 + ], + [ + 59, + -1 + ], + [ + 89, + -1 + ], + [ + 119, + -1 + ], + [ + 149, + -1 + ], + [ + 179, + -1 + ], + [ + 209, + -1 + ], + [ + 239, + -1 + ], + [ + 269, + -1 + ], + [ + 299, + -1 + ], + [ + 329, + -1 + ], + [ + 359, + -1 + ], + [ + 389, + -1 + ], + [ + 419, + -1 + ], + [ + 449, + -1 + ], + [ + 479, + -1 + ], + [ + 509, + -1 + ], + [ + 539, + -1 + ], + [ + 569, + -1 + ], + [ + 599, + -1 + ], + [ + 629, + -1 + ], + [ + 659, + -1 + ], + [ + 689, + -1 + ], + [ + 719, + -1 + ], + [ + 749, + -1 + ], + [ + 779, + -1 + ], + [ + 809, + -1 + ], + [ + 839, + -1 + ], + [ + 869, + -1 + ], + [ + 899, + -1 + ] + ] + } + ], + "parameters": { + "size": 30, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38 + ], + [ + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100 + ], + [ + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70 + ], + [ + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23 + ], + [ + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53 + ], + [ + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42 + ], + [ + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 900, + "variables": 900, + "rows": 120, + "nonzeros": 3600, + "globals": 0 + }, + "input_variables": 900, + "model_variables": 900, + "modelled_variables": 900, + "size_unit": "tasks" + }, + "json_sha256": "7ebe7de8e8e96dd74bd3525e858fc1d8d98faed6ca654330482bb84240b16002", + "txt_sha256": "1bbb5e8bac28baa2d0598b50f7c13008335033ebfd23d5f953c54b3044b5d21d" + }, + { + "id": "assignment-31-single", + "category": "assignment", + "size": 31, + "variant": "single", + "model": { + "id": "assignment_single_31", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 31, + "natural_size": 31, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 961, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1, + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11, + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29, + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34, + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96, + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98, + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67, + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42, + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29, + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13, + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80, + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31, + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15, + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ], + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ], + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ], + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ], + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ], + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ], + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 527, + 1 + ], + [ + 528, + 1 + ], + [ + 529, + 1 + ], + [ + 530, + 1 + ], + [ + 531, + 1 + ], + [ + 532, + 1 + ], + [ + 533, + 1 + ], + [ + 534, + 1 + ], + [ + 535, + 1 + ], + [ + 536, + 1 + ], + [ + 537, + 1 + ], + [ + 538, + 1 + ], + [ + 539, + 1 + ], + [ + 540, + 1 + ], + [ + 541, + 1 + ], + [ + 542, + 1 + ], + [ + 543, + 1 + ], + [ + 544, + 1 + ], + [ + 545, + 1 + ], + [ + 546, + 1 + ], + [ + 547, + 1 + ], + [ + 548, + 1 + ], + [ + 549, + 1 + ], + [ + 550, + 1 + ], + [ + 551, + 1 + ], + [ + 552, + 1 + ], + [ + 553, + 1 + ], + [ + 554, + 1 + ], + [ + 555, + 1 + ], + [ + 556, + 1 + ], + [ + 557, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 527, + -1 + ], + [ + 528, + -1 + ], + [ + 529, + -1 + ], + [ + 530, + -1 + ], + [ + 531, + -1 + ], + [ + 532, + -1 + ], + [ + 533, + -1 + ], + [ + 534, + -1 + ], + [ + 535, + -1 + ], + [ + 536, + -1 + ], + [ + 537, + -1 + ], + [ + 538, + -1 + ], + [ + 539, + -1 + ], + [ + 540, + -1 + ], + [ + 541, + -1 + ], + [ + 542, + -1 + ], + [ + 543, + -1 + ], + [ + 544, + -1 + ], + [ + 545, + -1 + ], + [ + 546, + -1 + ], + [ + 547, + -1 + ], + [ + 548, + -1 + ], + [ + 549, + -1 + ], + [ + 550, + -1 + ], + [ + 551, + -1 + ], + [ + 552, + -1 + ], + [ + 553, + -1 + ], + [ + 554, + -1 + ], + [ + 555, + -1 + ], + [ + 556, + -1 + ], + [ + 557, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 558, + 1 + ], + [ + 559, + 1 + ], + [ + 560, + 1 + ], + [ + 561, + 1 + ], + [ + 562, + 1 + ], + [ + 563, + 1 + ], + [ + 564, + 1 + ], + [ + 565, + 1 + ], + [ + 566, + 1 + ], + [ + 567, + 1 + ], + [ + 568, + 1 + ], + [ + 569, + 1 + ], + [ + 570, + 1 + ], + [ + 571, + 1 + ], + [ + 572, + 1 + ], + [ + 573, + 1 + ], + [ + 574, + 1 + ], + [ + 575, + 1 + ], + [ + 576, + 1 + ], + [ + 577, + 1 + ], + [ + 578, + 1 + ], + [ + 579, + 1 + ], + [ + 580, + 1 + ], + [ + 581, + 1 + ], + [ + 582, + 1 + ], + [ + 583, + 1 + ], + [ + 584, + 1 + ], + [ + 585, + 1 + ], + [ + 586, + 1 + ], + [ + 587, + 1 + ], + [ + 588, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 558, + -1 + ], + [ + 559, + -1 + ], + [ + 560, + -1 + ], + [ + 561, + -1 + ], + [ + 562, + -1 + ], + [ + 563, + -1 + ], + [ + 564, + -1 + ], + [ + 565, + -1 + ], + [ + 566, + -1 + ], + [ + 567, + -1 + ], + [ + 568, + -1 + ], + [ + 569, + -1 + ], + [ + 570, + -1 + ], + [ + 571, + -1 + ], + [ + 572, + -1 + ], + [ + 573, + -1 + ], + [ + 574, + -1 + ], + [ + 575, + -1 + ], + [ + 576, + -1 + ], + [ + 577, + -1 + ], + [ + 578, + -1 + ], + [ + 579, + -1 + ], + [ + 580, + -1 + ], + [ + 581, + -1 + ], + [ + 582, + -1 + ], + [ + 583, + -1 + ], + [ + 584, + -1 + ], + [ + 585, + -1 + ], + [ + 586, + -1 + ], + [ + 587, + -1 + ], + [ + 588, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 589, + 1 + ], + [ + 590, + 1 + ], + [ + 591, + 1 + ], + [ + 592, + 1 + ], + [ + 593, + 1 + ], + [ + 594, + 1 + ], + [ + 595, + 1 + ], + [ + 596, + 1 + ], + [ + 597, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ], + [ + 600, + 1 + ], + [ + 601, + 1 + ], + [ + 602, + 1 + ], + [ + 603, + 1 + ], + [ + 604, + 1 + ], + [ + 605, + 1 + ], + [ + 606, + 1 + ], + [ + 607, + 1 + ], + [ + 608, + 1 + ], + [ + 609, + 1 + ], + [ + 610, + 1 + ], + [ + 611, + 1 + ], + [ + 612, + 1 + ], + [ + 613, + 1 + ], + [ + 614, + 1 + ], + [ + 615, + 1 + ], + [ + 616, + 1 + ], + [ + 617, + 1 + ], + [ + 618, + 1 + ], + [ + 619, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 589, + -1 + ], + [ + 590, + -1 + ], + [ + 591, + -1 + ], + [ + 592, + -1 + ], + [ + 593, + -1 + ], + [ + 594, + -1 + ], + [ + 595, + -1 + ], + [ + 596, + -1 + ], + [ + 597, + -1 + ], + [ + 598, + -1 + ], + [ + 599, + -1 + ], + [ + 600, + -1 + ], + [ + 601, + -1 + ], + [ + 602, + -1 + ], + [ + 603, + -1 + ], + [ + 604, + -1 + ], + [ + 605, + -1 + ], + [ + 606, + -1 + ], + [ + 607, + -1 + ], + [ + 608, + -1 + ], + [ + 609, + -1 + ], + [ + 610, + -1 + ], + [ + 611, + -1 + ], + [ + 612, + -1 + ], + [ + 613, + -1 + ], + [ + 614, + -1 + ], + [ + 615, + -1 + ], + [ + 616, + -1 + ], + [ + 617, + -1 + ], + [ + 618, + -1 + ], + [ + 619, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 620, + 1 + ], + [ + 621, + 1 + ], + [ + 622, + 1 + ], + [ + 623, + 1 + ], + [ + 624, + 1 + ], + [ + 625, + 1 + ], + [ + 626, + 1 + ], + [ + 627, + 1 + ], + [ + 628, + 1 + ], + [ + 629, + 1 + ], + [ + 630, + 1 + ], + [ + 631, + 1 + ], + [ + 632, + 1 + ], + [ + 633, + 1 + ], + [ + 634, + 1 + ], + [ + 635, + 1 + ], + [ + 636, + 1 + ], + [ + 637, + 1 + ], + [ + 638, + 1 + ], + [ + 639, + 1 + ], + [ + 640, + 1 + ], + [ + 641, + 1 + ], + [ + 642, + 1 + ], + [ + 643, + 1 + ], + [ + 644, + 1 + ], + [ + 645, + 1 + ], + [ + 646, + 1 + ], + [ + 647, + 1 + ], + [ + 648, + 1 + ], + [ + 649, + 1 + ], + [ + 650, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 620, + -1 + ], + [ + 621, + -1 + ], + [ + 622, + -1 + ], + [ + 623, + -1 + ], + [ + 624, + -1 + ], + [ + 625, + -1 + ], + [ + 626, + -1 + ], + [ + 627, + -1 + ], + [ + 628, + -1 + ], + [ + 629, + -1 + ], + [ + 630, + -1 + ], + [ + 631, + -1 + ], + [ + 632, + -1 + ], + [ + 633, + -1 + ], + [ + 634, + -1 + ], + [ + 635, + -1 + ], + [ + 636, + -1 + ], + [ + 637, + -1 + ], + [ + 638, + -1 + ], + [ + 639, + -1 + ], + [ + 640, + -1 + ], + [ + 641, + -1 + ], + [ + 642, + -1 + ], + [ + 643, + -1 + ], + [ + 644, + -1 + ], + [ + 645, + -1 + ], + [ + 646, + -1 + ], + [ + 647, + -1 + ], + [ + 648, + -1 + ], + [ + 649, + -1 + ], + [ + 650, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 651, + 1 + ], + [ + 652, + 1 + ], + [ + 653, + 1 + ], + [ + 654, + 1 + ], + [ + 655, + 1 + ], + [ + 656, + 1 + ], + [ + 657, + 1 + ], + [ + 658, + 1 + ], + [ + 659, + 1 + ], + [ + 660, + 1 + ], + [ + 661, + 1 + ], + [ + 662, + 1 + ], + [ + 663, + 1 + ], + [ + 664, + 1 + ], + [ + 665, + 1 + ], + [ + 666, + 1 + ], + [ + 667, + 1 + ], + [ + 668, + 1 + ], + [ + 669, + 1 + ], + [ + 670, + 1 + ], + [ + 671, + 1 + ], + [ + 672, + 1 + ], + [ + 673, + 1 + ], + [ + 674, + 1 + ], + [ + 675, + 1 + ], + [ + 676, + 1 + ], + [ + 677, + 1 + ], + [ + 678, + 1 + ], + [ + 679, + 1 + ], + [ + 680, + 1 + ], + [ + 681, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 651, + -1 + ], + [ + 652, + -1 + ], + [ + 653, + -1 + ], + [ + 654, + -1 + ], + [ + 655, + -1 + ], + [ + 656, + -1 + ], + [ + 657, + -1 + ], + [ + 658, + -1 + ], + [ + 659, + -1 + ], + [ + 660, + -1 + ], + [ + 661, + -1 + ], + [ + 662, + -1 + ], + [ + 663, + -1 + ], + [ + 664, + -1 + ], + [ + 665, + -1 + ], + [ + 666, + -1 + ], + [ + 667, + -1 + ], + [ + 668, + -1 + ], + [ + 669, + -1 + ], + [ + 670, + -1 + ], + [ + 671, + -1 + ], + [ + 672, + -1 + ], + [ + 673, + -1 + ], + [ + 674, + -1 + ], + [ + 675, + -1 + ], + [ + 676, + -1 + ], + [ + 677, + -1 + ], + [ + 678, + -1 + ], + [ + 679, + -1 + ], + [ + 680, + -1 + ], + [ + 681, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 682, + 1 + ], + [ + 683, + 1 + ], + [ + 684, + 1 + ], + [ + 685, + 1 + ], + [ + 686, + 1 + ], + [ + 687, + 1 + ], + [ + 688, + 1 + ], + [ + 689, + 1 + ], + [ + 690, + 1 + ], + [ + 691, + 1 + ], + [ + 692, + 1 + ], + [ + 693, + 1 + ], + [ + 694, + 1 + ], + [ + 695, + 1 + ], + [ + 696, + 1 + ], + [ + 697, + 1 + ], + [ + 698, + 1 + ], + [ + 699, + 1 + ], + [ + 700, + 1 + ], + [ + 701, + 1 + ], + [ + 702, + 1 + ], + [ + 703, + 1 + ], + [ + 704, + 1 + ], + [ + 705, + 1 + ], + [ + 706, + 1 + ], + [ + 707, + 1 + ], + [ + 708, + 1 + ], + [ + 709, + 1 + ], + [ + 710, + 1 + ], + [ + 711, + 1 + ], + [ + 712, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 682, + -1 + ], + [ + 683, + -1 + ], + [ + 684, + -1 + ], + [ + 685, + -1 + ], + [ + 686, + -1 + ], + [ + 687, + -1 + ], + [ + 688, + -1 + ], + [ + 689, + -1 + ], + [ + 690, + -1 + ], + [ + 691, + -1 + ], + [ + 692, + -1 + ], + [ + 693, + -1 + ], + [ + 694, + -1 + ], + [ + 695, + -1 + ], + [ + 696, + -1 + ], + [ + 697, + -1 + ], + [ + 698, + -1 + ], + [ + 699, + -1 + ], + [ + 700, + -1 + ], + [ + 701, + -1 + ], + [ + 702, + -1 + ], + [ + 703, + -1 + ], + [ + 704, + -1 + ], + [ + 705, + -1 + ], + [ + 706, + -1 + ], + [ + 707, + -1 + ], + [ + 708, + -1 + ], + [ + 709, + -1 + ], + [ + 710, + -1 + ], + [ + 711, + -1 + ], + [ + 712, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 713, + 1 + ], + [ + 714, + 1 + ], + [ + 715, + 1 + ], + [ + 716, + 1 + ], + [ + 717, + 1 + ], + [ + 718, + 1 + ], + [ + 719, + 1 + ], + [ + 720, + 1 + ], + [ + 721, + 1 + ], + [ + 722, + 1 + ], + [ + 723, + 1 + ], + [ + 724, + 1 + ], + [ + 725, + 1 + ], + [ + 726, + 1 + ], + [ + 727, + 1 + ], + [ + 728, + 1 + ], + [ + 729, + 1 + ], + [ + 730, + 1 + ], + [ + 731, + 1 + ], + [ + 732, + 1 + ], + [ + 733, + 1 + ], + [ + 734, + 1 + ], + [ + 735, + 1 + ], + [ + 736, + 1 + ], + [ + 737, + 1 + ], + [ + 738, + 1 + ], + [ + 739, + 1 + ], + [ + 740, + 1 + ], + [ + 741, + 1 + ], + [ + 742, + 1 + ], + [ + 743, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 713, + -1 + ], + [ + 714, + -1 + ], + [ + 715, + -1 + ], + [ + 716, + -1 + ], + [ + 717, + -1 + ], + [ + 718, + -1 + ], + [ + 719, + -1 + ], + [ + 720, + -1 + ], + [ + 721, + -1 + ], + [ + 722, + -1 + ], + [ + 723, + -1 + ], + [ + 724, + -1 + ], + [ + 725, + -1 + ], + [ + 726, + -1 + ], + [ + 727, + -1 + ], + [ + 728, + -1 + ], + [ + 729, + -1 + ], + [ + 730, + -1 + ], + [ + 731, + -1 + ], + [ + 732, + -1 + ], + [ + 733, + -1 + ], + [ + 734, + -1 + ], + [ + 735, + -1 + ], + [ + 736, + -1 + ], + [ + 737, + -1 + ], + [ + 738, + -1 + ], + [ + 739, + -1 + ], + [ + 740, + -1 + ], + [ + 741, + -1 + ], + [ + 742, + -1 + ], + [ + 743, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 744, + 1 + ], + [ + 745, + 1 + ], + [ + 746, + 1 + ], + [ + 747, + 1 + ], + [ + 748, + 1 + ], + [ + 749, + 1 + ], + [ + 750, + 1 + ], + [ + 751, + 1 + ], + [ + 752, + 1 + ], + [ + 753, + 1 + ], + [ + 754, + 1 + ], + [ + 755, + 1 + ], + [ + 756, + 1 + ], + [ + 757, + 1 + ], + [ + 758, + 1 + ], + [ + 759, + 1 + ], + [ + 760, + 1 + ], + [ + 761, + 1 + ], + [ + 762, + 1 + ], + [ + 763, + 1 + ], + [ + 764, + 1 + ], + [ + 765, + 1 + ], + [ + 766, + 1 + ], + [ + 767, + 1 + ], + [ + 768, + 1 + ], + [ + 769, + 1 + ], + [ + 770, + 1 + ], + [ + 771, + 1 + ], + [ + 772, + 1 + ], + [ + 773, + 1 + ], + [ + 774, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 744, + -1 + ], + [ + 745, + -1 + ], + [ + 746, + -1 + ], + [ + 747, + -1 + ], + [ + 748, + -1 + ], + [ + 749, + -1 + ], + [ + 750, + -1 + ], + [ + 751, + -1 + ], + [ + 752, + -1 + ], + [ + 753, + -1 + ], + [ + 754, + -1 + ], + [ + 755, + -1 + ], + [ + 756, + -1 + ], + [ + 757, + -1 + ], + [ + 758, + -1 + ], + [ + 759, + -1 + ], + [ + 760, + -1 + ], + [ + 761, + -1 + ], + [ + 762, + -1 + ], + [ + 763, + -1 + ], + [ + 764, + -1 + ], + [ + 765, + -1 + ], + [ + 766, + -1 + ], + [ + 767, + -1 + ], + [ + 768, + -1 + ], + [ + 769, + -1 + ], + [ + 770, + -1 + ], + [ + 771, + -1 + ], + [ + 772, + -1 + ], + [ + 773, + -1 + ], + [ + 774, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 775, + 1 + ], + [ + 776, + 1 + ], + [ + 777, + 1 + ], + [ + 778, + 1 + ], + [ + 779, + 1 + ], + [ + 780, + 1 + ], + [ + 781, + 1 + ], + [ + 782, + 1 + ], + [ + 783, + 1 + ], + [ + 784, + 1 + ], + [ + 785, + 1 + ], + [ + 786, + 1 + ], + [ + 787, + 1 + ], + [ + 788, + 1 + ], + [ + 789, + 1 + ], + [ + 790, + 1 + ], + [ + 791, + 1 + ], + [ + 792, + 1 + ], + [ + 793, + 1 + ], + [ + 794, + 1 + ], + [ + 795, + 1 + ], + [ + 796, + 1 + ], + [ + 797, + 1 + ], + [ + 798, + 1 + ], + [ + 799, + 1 + ], + [ + 800, + 1 + ], + [ + 801, + 1 + ], + [ + 802, + 1 + ], + [ + 803, + 1 + ], + [ + 804, + 1 + ], + [ + 805, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 775, + -1 + ], + [ + 776, + -1 + ], + [ + 777, + -1 + ], + [ + 778, + -1 + ], + [ + 779, + -1 + ], + [ + 780, + -1 + ], + [ + 781, + -1 + ], + [ + 782, + -1 + ], + [ + 783, + -1 + ], + [ + 784, + -1 + ], + [ + 785, + -1 + ], + [ + 786, + -1 + ], + [ + 787, + -1 + ], + [ + 788, + -1 + ], + [ + 789, + -1 + ], + [ + 790, + -1 + ], + [ + 791, + -1 + ], + [ + 792, + -1 + ], + [ + 793, + -1 + ], + [ + 794, + -1 + ], + [ + 795, + -1 + ], + [ + 796, + -1 + ], + [ + 797, + -1 + ], + [ + 798, + -1 + ], + [ + 799, + -1 + ], + [ + 800, + -1 + ], + [ + 801, + -1 + ], + [ + 802, + -1 + ], + [ + 803, + -1 + ], + [ + 804, + -1 + ], + [ + 805, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 806, + 1 + ], + [ + 807, + 1 + ], + [ + 808, + 1 + ], + [ + 809, + 1 + ], + [ + 810, + 1 + ], + [ + 811, + 1 + ], + [ + 812, + 1 + ], + [ + 813, + 1 + ], + [ + 814, + 1 + ], + [ + 815, + 1 + ], + [ + 816, + 1 + ], + [ + 817, + 1 + ], + [ + 818, + 1 + ], + [ + 819, + 1 + ], + [ + 820, + 1 + ], + [ + 821, + 1 + ], + [ + 822, + 1 + ], + [ + 823, + 1 + ], + [ + 824, + 1 + ], + [ + 825, + 1 + ], + [ + 826, + 1 + ], + [ + 827, + 1 + ], + [ + 828, + 1 + ], + [ + 829, + 1 + ], + [ + 830, + 1 + ], + [ + 831, + 1 + ], + [ + 832, + 1 + ], + [ + 833, + 1 + ], + [ + 834, + 1 + ], + [ + 835, + 1 + ], + [ + 836, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 806, + -1 + ], + [ + 807, + -1 + ], + [ + 808, + -1 + ], + [ + 809, + -1 + ], + [ + 810, + -1 + ], + [ + 811, + -1 + ], + [ + 812, + -1 + ], + [ + 813, + -1 + ], + [ + 814, + -1 + ], + [ + 815, + -1 + ], + [ + 816, + -1 + ], + [ + 817, + -1 + ], + [ + 818, + -1 + ], + [ + 819, + -1 + ], + [ + 820, + -1 + ], + [ + 821, + -1 + ], + [ + 822, + -1 + ], + [ + 823, + -1 + ], + [ + 824, + -1 + ], + [ + 825, + -1 + ], + [ + 826, + -1 + ], + [ + 827, + -1 + ], + [ + 828, + -1 + ], + [ + 829, + -1 + ], + [ + 830, + -1 + ], + [ + 831, + -1 + ], + [ + 832, + -1 + ], + [ + 833, + -1 + ], + [ + 834, + -1 + ], + [ + 835, + -1 + ], + [ + 836, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 837, + 1 + ], + [ + 838, + 1 + ], + [ + 839, + 1 + ], + [ + 840, + 1 + ], + [ + 841, + 1 + ], + [ + 842, + 1 + ], + [ + 843, + 1 + ], + [ + 844, + 1 + ], + [ + 845, + 1 + ], + [ + 846, + 1 + ], + [ + 847, + 1 + ], + [ + 848, + 1 + ], + [ + 849, + 1 + ], + [ + 850, + 1 + ], + [ + 851, + 1 + ], + [ + 852, + 1 + ], + [ + 853, + 1 + ], + [ + 854, + 1 + ], + [ + 855, + 1 + ], + [ + 856, + 1 + ], + [ + 857, + 1 + ], + [ + 858, + 1 + ], + [ + 859, + 1 + ], + [ + 860, + 1 + ], + [ + 861, + 1 + ], + [ + 862, + 1 + ], + [ + 863, + 1 + ], + [ + 864, + 1 + ], + [ + 865, + 1 + ], + [ + 866, + 1 + ], + [ + 867, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 837, + -1 + ], + [ + 838, + -1 + ], + [ + 839, + -1 + ], + [ + 840, + -1 + ], + [ + 841, + -1 + ], + [ + 842, + -1 + ], + [ + 843, + -1 + ], + [ + 844, + -1 + ], + [ + 845, + -1 + ], + [ + 846, + -1 + ], + [ + 847, + -1 + ], + [ + 848, + -1 + ], + [ + 849, + -1 + ], + [ + 850, + -1 + ], + [ + 851, + -1 + ], + [ + 852, + -1 + ], + [ + 853, + -1 + ], + [ + 854, + -1 + ], + [ + 855, + -1 + ], + [ + 856, + -1 + ], + [ + 857, + -1 + ], + [ + 858, + -1 + ], + [ + 859, + -1 + ], + [ + 860, + -1 + ], + [ + 861, + -1 + ], + [ + 862, + -1 + ], + [ + 863, + -1 + ], + [ + 864, + -1 + ], + [ + 865, + -1 + ], + [ + 866, + -1 + ], + [ + 867, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 868, + 1 + ], + [ + 869, + 1 + ], + [ + 870, + 1 + ], + [ + 871, + 1 + ], + [ + 872, + 1 + ], + [ + 873, + 1 + ], + [ + 874, + 1 + ], + [ + 875, + 1 + ], + [ + 876, + 1 + ], + [ + 877, + 1 + ], + [ + 878, + 1 + ], + [ + 879, + 1 + ], + [ + 880, + 1 + ], + [ + 881, + 1 + ], + [ + 882, + 1 + ], + [ + 883, + 1 + ], + [ + 884, + 1 + ], + [ + 885, + 1 + ], + [ + 886, + 1 + ], + [ + 887, + 1 + ], + [ + 888, + 1 + ], + [ + 889, + 1 + ], + [ + 890, + 1 + ], + [ + 891, + 1 + ], + [ + 892, + 1 + ], + [ + 893, + 1 + ], + [ + 894, + 1 + ], + [ + 895, + 1 + ], + [ + 896, + 1 + ], + [ + 897, + 1 + ], + [ + 898, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 868, + -1 + ], + [ + 869, + -1 + ], + [ + 870, + -1 + ], + [ + 871, + -1 + ], + [ + 872, + -1 + ], + [ + 873, + -1 + ], + [ + 874, + -1 + ], + [ + 875, + -1 + ], + [ + 876, + -1 + ], + [ + 877, + -1 + ], + [ + 878, + -1 + ], + [ + 879, + -1 + ], + [ + 880, + -1 + ], + [ + 881, + -1 + ], + [ + 882, + -1 + ], + [ + 883, + -1 + ], + [ + 884, + -1 + ], + [ + 885, + -1 + ], + [ + 886, + -1 + ], + [ + 887, + -1 + ], + [ + 888, + -1 + ], + [ + 889, + -1 + ], + [ + 890, + -1 + ], + [ + 891, + -1 + ], + [ + 892, + -1 + ], + [ + 893, + -1 + ], + [ + 894, + -1 + ], + [ + 895, + -1 + ], + [ + 896, + -1 + ], + [ + 897, + -1 + ], + [ + 898, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 899, + 1 + ], + [ + 900, + 1 + ], + [ + 901, + 1 + ], + [ + 902, + 1 + ], + [ + 903, + 1 + ], + [ + 904, + 1 + ], + [ + 905, + 1 + ], + [ + 906, + 1 + ], + [ + 907, + 1 + ], + [ + 908, + 1 + ], + [ + 909, + 1 + ], + [ + 910, + 1 + ], + [ + 911, + 1 + ], + [ + 912, + 1 + ], + [ + 913, + 1 + ], + [ + 914, + 1 + ], + [ + 915, + 1 + ], + [ + 916, + 1 + ], + [ + 917, + 1 + ], + [ + 918, + 1 + ], + [ + 919, + 1 + ], + [ + 920, + 1 + ], + [ + 921, + 1 + ], + [ + 922, + 1 + ], + [ + 923, + 1 + ], + [ + 924, + 1 + ], + [ + 925, + 1 + ], + [ + 926, + 1 + ], + [ + 927, + 1 + ], + [ + 928, + 1 + ], + [ + 929, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 899, + -1 + ], + [ + 900, + -1 + ], + [ + 901, + -1 + ], + [ + 902, + -1 + ], + [ + 903, + -1 + ], + [ + 904, + -1 + ], + [ + 905, + -1 + ], + [ + 906, + -1 + ], + [ + 907, + -1 + ], + [ + 908, + -1 + ], + [ + 909, + -1 + ], + [ + 910, + -1 + ], + [ + 911, + -1 + ], + [ + 912, + -1 + ], + [ + 913, + -1 + ], + [ + 914, + -1 + ], + [ + 915, + -1 + ], + [ + 916, + -1 + ], + [ + 917, + -1 + ], + [ + 918, + -1 + ], + [ + 919, + -1 + ], + [ + 920, + -1 + ], + [ + 921, + -1 + ], + [ + 922, + -1 + ], + [ + 923, + -1 + ], + [ + 924, + -1 + ], + [ + 925, + -1 + ], + [ + 926, + -1 + ], + [ + 927, + -1 + ], + [ + 928, + -1 + ], + [ + 929, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 930, + 1 + ], + [ + 931, + 1 + ], + [ + 932, + 1 + ], + [ + 933, + 1 + ], + [ + 934, + 1 + ], + [ + 935, + 1 + ], + [ + 936, + 1 + ], + [ + 937, + 1 + ], + [ + 938, + 1 + ], + [ + 939, + 1 + ], + [ + 940, + 1 + ], + [ + 941, + 1 + ], + [ + 942, + 1 + ], + [ + 943, + 1 + ], + [ + 944, + 1 + ], + [ + 945, + 1 + ], + [ + 946, + 1 + ], + [ + 947, + 1 + ], + [ + 948, + 1 + ], + [ + 949, + 1 + ], + [ + 950, + 1 + ], + [ + 951, + 1 + ], + [ + 952, + 1 + ], + [ + 953, + 1 + ], + [ + 954, + 1 + ], + [ + 955, + 1 + ], + [ + 956, + 1 + ], + [ + 957, + 1 + ], + [ + 958, + 1 + ], + [ + 959, + 1 + ], + [ + 960, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 930, + -1 + ], + [ + 931, + -1 + ], + [ + 932, + -1 + ], + [ + 933, + -1 + ], + [ + 934, + -1 + ], + [ + 935, + -1 + ], + [ + 936, + -1 + ], + [ + 937, + -1 + ], + [ + 938, + -1 + ], + [ + 939, + -1 + ], + [ + 940, + -1 + ], + [ + 941, + -1 + ], + [ + 942, + -1 + ], + [ + 943, + -1 + ], + [ + 944, + -1 + ], + [ + 945, + -1 + ], + [ + 946, + -1 + ], + [ + 947, + -1 + ], + [ + 948, + -1 + ], + [ + 949, + -1 + ], + [ + 950, + -1 + ], + [ + 951, + -1 + ], + [ + 952, + -1 + ], + [ + 953, + -1 + ], + [ + 954, + -1 + ], + [ + 955, + -1 + ], + [ + 956, + -1 + ], + [ + 957, + -1 + ], + [ + 958, + -1 + ], + [ + 959, + -1 + ], + [ + 960, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 31, + 1 + ], + [ + 62, + 1 + ], + [ + 93, + 1 + ], + [ + 124, + 1 + ], + [ + 155, + 1 + ], + [ + 186, + 1 + ], + [ + 217, + 1 + ], + [ + 248, + 1 + ], + [ + 279, + 1 + ], + [ + 310, + 1 + ], + [ + 341, + 1 + ], + [ + 372, + 1 + ], + [ + 403, + 1 + ], + [ + 434, + 1 + ], + [ + 465, + 1 + ], + [ + 496, + 1 + ], + [ + 527, + 1 + ], + [ + 558, + 1 + ], + [ + 589, + 1 + ], + [ + 620, + 1 + ], + [ + 651, + 1 + ], + [ + 682, + 1 + ], + [ + 713, + 1 + ], + [ + 744, + 1 + ], + [ + 775, + 1 + ], + [ + 806, + 1 + ], + [ + 837, + 1 + ], + [ + 868, + 1 + ], + [ + 899, + 1 + ], + [ + 930, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 31, + -1 + ], + [ + 62, + -1 + ], + [ + 93, + -1 + ], + [ + 124, + -1 + ], + [ + 155, + -1 + ], + [ + 186, + -1 + ], + [ + 217, + -1 + ], + [ + 248, + -1 + ], + [ + 279, + -1 + ], + [ + 310, + -1 + ], + [ + 341, + -1 + ], + [ + 372, + -1 + ], + [ + 403, + -1 + ], + [ + 434, + -1 + ], + [ + 465, + -1 + ], + [ + 496, + -1 + ], + [ + 527, + -1 + ], + [ + 558, + -1 + ], + [ + 589, + -1 + ], + [ + 620, + -1 + ], + [ + 651, + -1 + ], + [ + 682, + -1 + ], + [ + 713, + -1 + ], + [ + 744, + -1 + ], + [ + 775, + -1 + ], + [ + 806, + -1 + ], + [ + 837, + -1 + ], + [ + 868, + -1 + ], + [ + 899, + -1 + ], + [ + 930, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 32, + 1 + ], + [ + 63, + 1 + ], + [ + 94, + 1 + ], + [ + 125, + 1 + ], + [ + 156, + 1 + ], + [ + 187, + 1 + ], + [ + 218, + 1 + ], + [ + 249, + 1 + ], + [ + 280, + 1 + ], + [ + 311, + 1 + ], + [ + 342, + 1 + ], + [ + 373, + 1 + ], + [ + 404, + 1 + ], + [ + 435, + 1 + ], + [ + 466, + 1 + ], + [ + 497, + 1 + ], + [ + 528, + 1 + ], + [ + 559, + 1 + ], + [ + 590, + 1 + ], + [ + 621, + 1 + ], + [ + 652, + 1 + ], + [ + 683, + 1 + ], + [ + 714, + 1 + ], + [ + 745, + 1 + ], + [ + 776, + 1 + ], + [ + 807, + 1 + ], + [ + 838, + 1 + ], + [ + 869, + 1 + ], + [ + 900, + 1 + ], + [ + 931, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 32, + -1 + ], + [ + 63, + -1 + ], + [ + 94, + -1 + ], + [ + 125, + -1 + ], + [ + 156, + -1 + ], + [ + 187, + -1 + ], + [ + 218, + -1 + ], + [ + 249, + -1 + ], + [ + 280, + -1 + ], + [ + 311, + -1 + ], + [ + 342, + -1 + ], + [ + 373, + -1 + ], + [ + 404, + -1 + ], + [ + 435, + -1 + ], + [ + 466, + -1 + ], + [ + 497, + -1 + ], + [ + 528, + -1 + ], + [ + 559, + -1 + ], + [ + 590, + -1 + ], + [ + 621, + -1 + ], + [ + 652, + -1 + ], + [ + 683, + -1 + ], + [ + 714, + -1 + ], + [ + 745, + -1 + ], + [ + 776, + -1 + ], + [ + 807, + -1 + ], + [ + 838, + -1 + ], + [ + 869, + -1 + ], + [ + 900, + -1 + ], + [ + 931, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 33, + 1 + ], + [ + 64, + 1 + ], + [ + 95, + 1 + ], + [ + 126, + 1 + ], + [ + 157, + 1 + ], + [ + 188, + 1 + ], + [ + 219, + 1 + ], + [ + 250, + 1 + ], + [ + 281, + 1 + ], + [ + 312, + 1 + ], + [ + 343, + 1 + ], + [ + 374, + 1 + ], + [ + 405, + 1 + ], + [ + 436, + 1 + ], + [ + 467, + 1 + ], + [ + 498, + 1 + ], + [ + 529, + 1 + ], + [ + 560, + 1 + ], + [ + 591, + 1 + ], + [ + 622, + 1 + ], + [ + 653, + 1 + ], + [ + 684, + 1 + ], + [ + 715, + 1 + ], + [ + 746, + 1 + ], + [ + 777, + 1 + ], + [ + 808, + 1 + ], + [ + 839, + 1 + ], + [ + 870, + 1 + ], + [ + 901, + 1 + ], + [ + 932, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 33, + -1 + ], + [ + 64, + -1 + ], + [ + 95, + -1 + ], + [ + 126, + -1 + ], + [ + 157, + -1 + ], + [ + 188, + -1 + ], + [ + 219, + -1 + ], + [ + 250, + -1 + ], + [ + 281, + -1 + ], + [ + 312, + -1 + ], + [ + 343, + -1 + ], + [ + 374, + -1 + ], + [ + 405, + -1 + ], + [ + 436, + -1 + ], + [ + 467, + -1 + ], + [ + 498, + -1 + ], + [ + 529, + -1 + ], + [ + 560, + -1 + ], + [ + 591, + -1 + ], + [ + 622, + -1 + ], + [ + 653, + -1 + ], + [ + 684, + -1 + ], + [ + 715, + -1 + ], + [ + 746, + -1 + ], + [ + 777, + -1 + ], + [ + 808, + -1 + ], + [ + 839, + -1 + ], + [ + 870, + -1 + ], + [ + 901, + -1 + ], + [ + 932, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 34, + 1 + ], + [ + 65, + 1 + ], + [ + 96, + 1 + ], + [ + 127, + 1 + ], + [ + 158, + 1 + ], + [ + 189, + 1 + ], + [ + 220, + 1 + ], + [ + 251, + 1 + ], + [ + 282, + 1 + ], + [ + 313, + 1 + ], + [ + 344, + 1 + ], + [ + 375, + 1 + ], + [ + 406, + 1 + ], + [ + 437, + 1 + ], + [ + 468, + 1 + ], + [ + 499, + 1 + ], + [ + 530, + 1 + ], + [ + 561, + 1 + ], + [ + 592, + 1 + ], + [ + 623, + 1 + ], + [ + 654, + 1 + ], + [ + 685, + 1 + ], + [ + 716, + 1 + ], + [ + 747, + 1 + ], + [ + 778, + 1 + ], + [ + 809, + 1 + ], + [ + 840, + 1 + ], + [ + 871, + 1 + ], + [ + 902, + 1 + ], + [ + 933, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 34, + -1 + ], + [ + 65, + -1 + ], + [ + 96, + -1 + ], + [ + 127, + -1 + ], + [ + 158, + -1 + ], + [ + 189, + -1 + ], + [ + 220, + -1 + ], + [ + 251, + -1 + ], + [ + 282, + -1 + ], + [ + 313, + -1 + ], + [ + 344, + -1 + ], + [ + 375, + -1 + ], + [ + 406, + -1 + ], + [ + 437, + -1 + ], + [ + 468, + -1 + ], + [ + 499, + -1 + ], + [ + 530, + -1 + ], + [ + 561, + -1 + ], + [ + 592, + -1 + ], + [ + 623, + -1 + ], + [ + 654, + -1 + ], + [ + 685, + -1 + ], + [ + 716, + -1 + ], + [ + 747, + -1 + ], + [ + 778, + -1 + ], + [ + 809, + -1 + ], + [ + 840, + -1 + ], + [ + 871, + -1 + ], + [ + 902, + -1 + ], + [ + 933, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 35, + 1 + ], + [ + 66, + 1 + ], + [ + 97, + 1 + ], + [ + 128, + 1 + ], + [ + 159, + 1 + ], + [ + 190, + 1 + ], + [ + 221, + 1 + ], + [ + 252, + 1 + ], + [ + 283, + 1 + ], + [ + 314, + 1 + ], + [ + 345, + 1 + ], + [ + 376, + 1 + ], + [ + 407, + 1 + ], + [ + 438, + 1 + ], + [ + 469, + 1 + ], + [ + 500, + 1 + ], + [ + 531, + 1 + ], + [ + 562, + 1 + ], + [ + 593, + 1 + ], + [ + 624, + 1 + ], + [ + 655, + 1 + ], + [ + 686, + 1 + ], + [ + 717, + 1 + ], + [ + 748, + 1 + ], + [ + 779, + 1 + ], + [ + 810, + 1 + ], + [ + 841, + 1 + ], + [ + 872, + 1 + ], + [ + 903, + 1 + ], + [ + 934, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 35, + -1 + ], + [ + 66, + -1 + ], + [ + 97, + -1 + ], + [ + 128, + -1 + ], + [ + 159, + -1 + ], + [ + 190, + -1 + ], + [ + 221, + -1 + ], + [ + 252, + -1 + ], + [ + 283, + -1 + ], + [ + 314, + -1 + ], + [ + 345, + -1 + ], + [ + 376, + -1 + ], + [ + 407, + -1 + ], + [ + 438, + -1 + ], + [ + 469, + -1 + ], + [ + 500, + -1 + ], + [ + 531, + -1 + ], + [ + 562, + -1 + ], + [ + 593, + -1 + ], + [ + 624, + -1 + ], + [ + 655, + -1 + ], + [ + 686, + -1 + ], + [ + 717, + -1 + ], + [ + 748, + -1 + ], + [ + 779, + -1 + ], + [ + 810, + -1 + ], + [ + 841, + -1 + ], + [ + 872, + -1 + ], + [ + 903, + -1 + ], + [ + 934, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 36, + 1 + ], + [ + 67, + 1 + ], + [ + 98, + 1 + ], + [ + 129, + 1 + ], + [ + 160, + 1 + ], + [ + 191, + 1 + ], + [ + 222, + 1 + ], + [ + 253, + 1 + ], + [ + 284, + 1 + ], + [ + 315, + 1 + ], + [ + 346, + 1 + ], + [ + 377, + 1 + ], + [ + 408, + 1 + ], + [ + 439, + 1 + ], + [ + 470, + 1 + ], + [ + 501, + 1 + ], + [ + 532, + 1 + ], + [ + 563, + 1 + ], + [ + 594, + 1 + ], + [ + 625, + 1 + ], + [ + 656, + 1 + ], + [ + 687, + 1 + ], + [ + 718, + 1 + ], + [ + 749, + 1 + ], + [ + 780, + 1 + ], + [ + 811, + 1 + ], + [ + 842, + 1 + ], + [ + 873, + 1 + ], + [ + 904, + 1 + ], + [ + 935, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 36, + -1 + ], + [ + 67, + -1 + ], + [ + 98, + -1 + ], + [ + 129, + -1 + ], + [ + 160, + -1 + ], + [ + 191, + -1 + ], + [ + 222, + -1 + ], + [ + 253, + -1 + ], + [ + 284, + -1 + ], + [ + 315, + -1 + ], + [ + 346, + -1 + ], + [ + 377, + -1 + ], + [ + 408, + -1 + ], + [ + 439, + -1 + ], + [ + 470, + -1 + ], + [ + 501, + -1 + ], + [ + 532, + -1 + ], + [ + 563, + -1 + ], + [ + 594, + -1 + ], + [ + 625, + -1 + ], + [ + 656, + -1 + ], + [ + 687, + -1 + ], + [ + 718, + -1 + ], + [ + 749, + -1 + ], + [ + 780, + -1 + ], + [ + 811, + -1 + ], + [ + 842, + -1 + ], + [ + 873, + -1 + ], + [ + 904, + -1 + ], + [ + 935, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 37, + 1 + ], + [ + 68, + 1 + ], + [ + 99, + 1 + ], + [ + 130, + 1 + ], + [ + 161, + 1 + ], + [ + 192, + 1 + ], + [ + 223, + 1 + ], + [ + 254, + 1 + ], + [ + 285, + 1 + ], + [ + 316, + 1 + ], + [ + 347, + 1 + ], + [ + 378, + 1 + ], + [ + 409, + 1 + ], + [ + 440, + 1 + ], + [ + 471, + 1 + ], + [ + 502, + 1 + ], + [ + 533, + 1 + ], + [ + 564, + 1 + ], + [ + 595, + 1 + ], + [ + 626, + 1 + ], + [ + 657, + 1 + ], + [ + 688, + 1 + ], + [ + 719, + 1 + ], + [ + 750, + 1 + ], + [ + 781, + 1 + ], + [ + 812, + 1 + ], + [ + 843, + 1 + ], + [ + 874, + 1 + ], + [ + 905, + 1 + ], + [ + 936, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 37, + -1 + ], + [ + 68, + -1 + ], + [ + 99, + -1 + ], + [ + 130, + -1 + ], + [ + 161, + -1 + ], + [ + 192, + -1 + ], + [ + 223, + -1 + ], + [ + 254, + -1 + ], + [ + 285, + -1 + ], + [ + 316, + -1 + ], + [ + 347, + -1 + ], + [ + 378, + -1 + ], + [ + 409, + -1 + ], + [ + 440, + -1 + ], + [ + 471, + -1 + ], + [ + 502, + -1 + ], + [ + 533, + -1 + ], + [ + 564, + -1 + ], + [ + 595, + -1 + ], + [ + 626, + -1 + ], + [ + 657, + -1 + ], + [ + 688, + -1 + ], + [ + 719, + -1 + ], + [ + 750, + -1 + ], + [ + 781, + -1 + ], + [ + 812, + -1 + ], + [ + 843, + -1 + ], + [ + 874, + -1 + ], + [ + 905, + -1 + ], + [ + 936, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 38, + 1 + ], + [ + 69, + 1 + ], + [ + 100, + 1 + ], + [ + 131, + 1 + ], + [ + 162, + 1 + ], + [ + 193, + 1 + ], + [ + 224, + 1 + ], + [ + 255, + 1 + ], + [ + 286, + 1 + ], + [ + 317, + 1 + ], + [ + 348, + 1 + ], + [ + 379, + 1 + ], + [ + 410, + 1 + ], + [ + 441, + 1 + ], + [ + 472, + 1 + ], + [ + 503, + 1 + ], + [ + 534, + 1 + ], + [ + 565, + 1 + ], + [ + 596, + 1 + ], + [ + 627, + 1 + ], + [ + 658, + 1 + ], + [ + 689, + 1 + ], + [ + 720, + 1 + ], + [ + 751, + 1 + ], + [ + 782, + 1 + ], + [ + 813, + 1 + ], + [ + 844, + 1 + ], + [ + 875, + 1 + ], + [ + 906, + 1 + ], + [ + 937, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 38, + -1 + ], + [ + 69, + -1 + ], + [ + 100, + -1 + ], + [ + 131, + -1 + ], + [ + 162, + -1 + ], + [ + 193, + -1 + ], + [ + 224, + -1 + ], + [ + 255, + -1 + ], + [ + 286, + -1 + ], + [ + 317, + -1 + ], + [ + 348, + -1 + ], + [ + 379, + -1 + ], + [ + 410, + -1 + ], + [ + 441, + -1 + ], + [ + 472, + -1 + ], + [ + 503, + -1 + ], + [ + 534, + -1 + ], + [ + 565, + -1 + ], + [ + 596, + -1 + ], + [ + 627, + -1 + ], + [ + 658, + -1 + ], + [ + 689, + -1 + ], + [ + 720, + -1 + ], + [ + 751, + -1 + ], + [ + 782, + -1 + ], + [ + 813, + -1 + ], + [ + 844, + -1 + ], + [ + 875, + -1 + ], + [ + 906, + -1 + ], + [ + 937, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 39, + 1 + ], + [ + 70, + 1 + ], + [ + 101, + 1 + ], + [ + 132, + 1 + ], + [ + 163, + 1 + ], + [ + 194, + 1 + ], + [ + 225, + 1 + ], + [ + 256, + 1 + ], + [ + 287, + 1 + ], + [ + 318, + 1 + ], + [ + 349, + 1 + ], + [ + 380, + 1 + ], + [ + 411, + 1 + ], + [ + 442, + 1 + ], + [ + 473, + 1 + ], + [ + 504, + 1 + ], + [ + 535, + 1 + ], + [ + 566, + 1 + ], + [ + 597, + 1 + ], + [ + 628, + 1 + ], + [ + 659, + 1 + ], + [ + 690, + 1 + ], + [ + 721, + 1 + ], + [ + 752, + 1 + ], + [ + 783, + 1 + ], + [ + 814, + 1 + ], + [ + 845, + 1 + ], + [ + 876, + 1 + ], + [ + 907, + 1 + ], + [ + 938, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 39, + -1 + ], + [ + 70, + -1 + ], + [ + 101, + -1 + ], + [ + 132, + -1 + ], + [ + 163, + -1 + ], + [ + 194, + -1 + ], + [ + 225, + -1 + ], + [ + 256, + -1 + ], + [ + 287, + -1 + ], + [ + 318, + -1 + ], + [ + 349, + -1 + ], + [ + 380, + -1 + ], + [ + 411, + -1 + ], + [ + 442, + -1 + ], + [ + 473, + -1 + ], + [ + 504, + -1 + ], + [ + 535, + -1 + ], + [ + 566, + -1 + ], + [ + 597, + -1 + ], + [ + 628, + -1 + ], + [ + 659, + -1 + ], + [ + 690, + -1 + ], + [ + 721, + -1 + ], + [ + 752, + -1 + ], + [ + 783, + -1 + ], + [ + 814, + -1 + ], + [ + 845, + -1 + ], + [ + 876, + -1 + ], + [ + 907, + -1 + ], + [ + 938, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 40, + 1 + ], + [ + 71, + 1 + ], + [ + 102, + 1 + ], + [ + 133, + 1 + ], + [ + 164, + 1 + ], + [ + 195, + 1 + ], + [ + 226, + 1 + ], + [ + 257, + 1 + ], + [ + 288, + 1 + ], + [ + 319, + 1 + ], + [ + 350, + 1 + ], + [ + 381, + 1 + ], + [ + 412, + 1 + ], + [ + 443, + 1 + ], + [ + 474, + 1 + ], + [ + 505, + 1 + ], + [ + 536, + 1 + ], + [ + 567, + 1 + ], + [ + 598, + 1 + ], + [ + 629, + 1 + ], + [ + 660, + 1 + ], + [ + 691, + 1 + ], + [ + 722, + 1 + ], + [ + 753, + 1 + ], + [ + 784, + 1 + ], + [ + 815, + 1 + ], + [ + 846, + 1 + ], + [ + 877, + 1 + ], + [ + 908, + 1 + ], + [ + 939, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 40, + -1 + ], + [ + 71, + -1 + ], + [ + 102, + -1 + ], + [ + 133, + -1 + ], + [ + 164, + -1 + ], + [ + 195, + -1 + ], + [ + 226, + -1 + ], + [ + 257, + -1 + ], + [ + 288, + -1 + ], + [ + 319, + -1 + ], + [ + 350, + -1 + ], + [ + 381, + -1 + ], + [ + 412, + -1 + ], + [ + 443, + -1 + ], + [ + 474, + -1 + ], + [ + 505, + -1 + ], + [ + 536, + -1 + ], + [ + 567, + -1 + ], + [ + 598, + -1 + ], + [ + 629, + -1 + ], + [ + 660, + -1 + ], + [ + 691, + -1 + ], + [ + 722, + -1 + ], + [ + 753, + -1 + ], + [ + 784, + -1 + ], + [ + 815, + -1 + ], + [ + 846, + -1 + ], + [ + 877, + -1 + ], + [ + 908, + -1 + ], + [ + 939, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 41, + 1 + ], + [ + 72, + 1 + ], + [ + 103, + 1 + ], + [ + 134, + 1 + ], + [ + 165, + 1 + ], + [ + 196, + 1 + ], + [ + 227, + 1 + ], + [ + 258, + 1 + ], + [ + 289, + 1 + ], + [ + 320, + 1 + ], + [ + 351, + 1 + ], + [ + 382, + 1 + ], + [ + 413, + 1 + ], + [ + 444, + 1 + ], + [ + 475, + 1 + ], + [ + 506, + 1 + ], + [ + 537, + 1 + ], + [ + 568, + 1 + ], + [ + 599, + 1 + ], + [ + 630, + 1 + ], + [ + 661, + 1 + ], + [ + 692, + 1 + ], + [ + 723, + 1 + ], + [ + 754, + 1 + ], + [ + 785, + 1 + ], + [ + 816, + 1 + ], + [ + 847, + 1 + ], + [ + 878, + 1 + ], + [ + 909, + 1 + ], + [ + 940, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 41, + -1 + ], + [ + 72, + -1 + ], + [ + 103, + -1 + ], + [ + 134, + -1 + ], + [ + 165, + -1 + ], + [ + 196, + -1 + ], + [ + 227, + -1 + ], + [ + 258, + -1 + ], + [ + 289, + -1 + ], + [ + 320, + -1 + ], + [ + 351, + -1 + ], + [ + 382, + -1 + ], + [ + 413, + -1 + ], + [ + 444, + -1 + ], + [ + 475, + -1 + ], + [ + 506, + -1 + ], + [ + 537, + -1 + ], + [ + 568, + -1 + ], + [ + 599, + -1 + ], + [ + 630, + -1 + ], + [ + 661, + -1 + ], + [ + 692, + -1 + ], + [ + 723, + -1 + ], + [ + 754, + -1 + ], + [ + 785, + -1 + ], + [ + 816, + -1 + ], + [ + 847, + -1 + ], + [ + 878, + -1 + ], + [ + 909, + -1 + ], + [ + 940, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 42, + 1 + ], + [ + 73, + 1 + ], + [ + 104, + 1 + ], + [ + 135, + 1 + ], + [ + 166, + 1 + ], + [ + 197, + 1 + ], + [ + 228, + 1 + ], + [ + 259, + 1 + ], + [ + 290, + 1 + ], + [ + 321, + 1 + ], + [ + 352, + 1 + ], + [ + 383, + 1 + ], + [ + 414, + 1 + ], + [ + 445, + 1 + ], + [ + 476, + 1 + ], + [ + 507, + 1 + ], + [ + 538, + 1 + ], + [ + 569, + 1 + ], + [ + 600, + 1 + ], + [ + 631, + 1 + ], + [ + 662, + 1 + ], + [ + 693, + 1 + ], + [ + 724, + 1 + ], + [ + 755, + 1 + ], + [ + 786, + 1 + ], + [ + 817, + 1 + ], + [ + 848, + 1 + ], + [ + 879, + 1 + ], + [ + 910, + 1 + ], + [ + 941, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 42, + -1 + ], + [ + 73, + -1 + ], + [ + 104, + -1 + ], + [ + 135, + -1 + ], + [ + 166, + -1 + ], + [ + 197, + -1 + ], + [ + 228, + -1 + ], + [ + 259, + -1 + ], + [ + 290, + -1 + ], + [ + 321, + -1 + ], + [ + 352, + -1 + ], + [ + 383, + -1 + ], + [ + 414, + -1 + ], + [ + 445, + -1 + ], + [ + 476, + -1 + ], + [ + 507, + -1 + ], + [ + 538, + -1 + ], + [ + 569, + -1 + ], + [ + 600, + -1 + ], + [ + 631, + -1 + ], + [ + 662, + -1 + ], + [ + 693, + -1 + ], + [ + 724, + -1 + ], + [ + 755, + -1 + ], + [ + 786, + -1 + ], + [ + 817, + -1 + ], + [ + 848, + -1 + ], + [ + 879, + -1 + ], + [ + 910, + -1 + ], + [ + 941, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 43, + 1 + ], + [ + 74, + 1 + ], + [ + 105, + 1 + ], + [ + 136, + 1 + ], + [ + 167, + 1 + ], + [ + 198, + 1 + ], + [ + 229, + 1 + ], + [ + 260, + 1 + ], + [ + 291, + 1 + ], + [ + 322, + 1 + ], + [ + 353, + 1 + ], + [ + 384, + 1 + ], + [ + 415, + 1 + ], + [ + 446, + 1 + ], + [ + 477, + 1 + ], + [ + 508, + 1 + ], + [ + 539, + 1 + ], + [ + 570, + 1 + ], + [ + 601, + 1 + ], + [ + 632, + 1 + ], + [ + 663, + 1 + ], + [ + 694, + 1 + ], + [ + 725, + 1 + ], + [ + 756, + 1 + ], + [ + 787, + 1 + ], + [ + 818, + 1 + ], + [ + 849, + 1 + ], + [ + 880, + 1 + ], + [ + 911, + 1 + ], + [ + 942, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 43, + -1 + ], + [ + 74, + -1 + ], + [ + 105, + -1 + ], + [ + 136, + -1 + ], + [ + 167, + -1 + ], + [ + 198, + -1 + ], + [ + 229, + -1 + ], + [ + 260, + -1 + ], + [ + 291, + -1 + ], + [ + 322, + -1 + ], + [ + 353, + -1 + ], + [ + 384, + -1 + ], + [ + 415, + -1 + ], + [ + 446, + -1 + ], + [ + 477, + -1 + ], + [ + 508, + -1 + ], + [ + 539, + -1 + ], + [ + 570, + -1 + ], + [ + 601, + -1 + ], + [ + 632, + -1 + ], + [ + 663, + -1 + ], + [ + 694, + -1 + ], + [ + 725, + -1 + ], + [ + 756, + -1 + ], + [ + 787, + -1 + ], + [ + 818, + -1 + ], + [ + 849, + -1 + ], + [ + 880, + -1 + ], + [ + 911, + -1 + ], + [ + 942, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 44, + 1 + ], + [ + 75, + 1 + ], + [ + 106, + 1 + ], + [ + 137, + 1 + ], + [ + 168, + 1 + ], + [ + 199, + 1 + ], + [ + 230, + 1 + ], + [ + 261, + 1 + ], + [ + 292, + 1 + ], + [ + 323, + 1 + ], + [ + 354, + 1 + ], + [ + 385, + 1 + ], + [ + 416, + 1 + ], + [ + 447, + 1 + ], + [ + 478, + 1 + ], + [ + 509, + 1 + ], + [ + 540, + 1 + ], + [ + 571, + 1 + ], + [ + 602, + 1 + ], + [ + 633, + 1 + ], + [ + 664, + 1 + ], + [ + 695, + 1 + ], + [ + 726, + 1 + ], + [ + 757, + 1 + ], + [ + 788, + 1 + ], + [ + 819, + 1 + ], + [ + 850, + 1 + ], + [ + 881, + 1 + ], + [ + 912, + 1 + ], + [ + 943, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 44, + -1 + ], + [ + 75, + -1 + ], + [ + 106, + -1 + ], + [ + 137, + -1 + ], + [ + 168, + -1 + ], + [ + 199, + -1 + ], + [ + 230, + -1 + ], + [ + 261, + -1 + ], + [ + 292, + -1 + ], + [ + 323, + -1 + ], + [ + 354, + -1 + ], + [ + 385, + -1 + ], + [ + 416, + -1 + ], + [ + 447, + -1 + ], + [ + 478, + -1 + ], + [ + 509, + -1 + ], + [ + 540, + -1 + ], + [ + 571, + -1 + ], + [ + 602, + -1 + ], + [ + 633, + -1 + ], + [ + 664, + -1 + ], + [ + 695, + -1 + ], + [ + 726, + -1 + ], + [ + 757, + -1 + ], + [ + 788, + -1 + ], + [ + 819, + -1 + ], + [ + 850, + -1 + ], + [ + 881, + -1 + ], + [ + 912, + -1 + ], + [ + 943, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 45, + 1 + ], + [ + 76, + 1 + ], + [ + 107, + 1 + ], + [ + 138, + 1 + ], + [ + 169, + 1 + ], + [ + 200, + 1 + ], + [ + 231, + 1 + ], + [ + 262, + 1 + ], + [ + 293, + 1 + ], + [ + 324, + 1 + ], + [ + 355, + 1 + ], + [ + 386, + 1 + ], + [ + 417, + 1 + ], + [ + 448, + 1 + ], + [ + 479, + 1 + ], + [ + 510, + 1 + ], + [ + 541, + 1 + ], + [ + 572, + 1 + ], + [ + 603, + 1 + ], + [ + 634, + 1 + ], + [ + 665, + 1 + ], + [ + 696, + 1 + ], + [ + 727, + 1 + ], + [ + 758, + 1 + ], + [ + 789, + 1 + ], + [ + 820, + 1 + ], + [ + 851, + 1 + ], + [ + 882, + 1 + ], + [ + 913, + 1 + ], + [ + 944, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 45, + -1 + ], + [ + 76, + -1 + ], + [ + 107, + -1 + ], + [ + 138, + -1 + ], + [ + 169, + -1 + ], + [ + 200, + -1 + ], + [ + 231, + -1 + ], + [ + 262, + -1 + ], + [ + 293, + -1 + ], + [ + 324, + -1 + ], + [ + 355, + -1 + ], + [ + 386, + -1 + ], + [ + 417, + -1 + ], + [ + 448, + -1 + ], + [ + 479, + -1 + ], + [ + 510, + -1 + ], + [ + 541, + -1 + ], + [ + 572, + -1 + ], + [ + 603, + -1 + ], + [ + 634, + -1 + ], + [ + 665, + -1 + ], + [ + 696, + -1 + ], + [ + 727, + -1 + ], + [ + 758, + -1 + ], + [ + 789, + -1 + ], + [ + 820, + -1 + ], + [ + 851, + -1 + ], + [ + 882, + -1 + ], + [ + 913, + -1 + ], + [ + 944, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 46, + 1 + ], + [ + 77, + 1 + ], + [ + 108, + 1 + ], + [ + 139, + 1 + ], + [ + 170, + 1 + ], + [ + 201, + 1 + ], + [ + 232, + 1 + ], + [ + 263, + 1 + ], + [ + 294, + 1 + ], + [ + 325, + 1 + ], + [ + 356, + 1 + ], + [ + 387, + 1 + ], + [ + 418, + 1 + ], + [ + 449, + 1 + ], + [ + 480, + 1 + ], + [ + 511, + 1 + ], + [ + 542, + 1 + ], + [ + 573, + 1 + ], + [ + 604, + 1 + ], + [ + 635, + 1 + ], + [ + 666, + 1 + ], + [ + 697, + 1 + ], + [ + 728, + 1 + ], + [ + 759, + 1 + ], + [ + 790, + 1 + ], + [ + 821, + 1 + ], + [ + 852, + 1 + ], + [ + 883, + 1 + ], + [ + 914, + 1 + ], + [ + 945, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 46, + -1 + ], + [ + 77, + -1 + ], + [ + 108, + -1 + ], + [ + 139, + -1 + ], + [ + 170, + -1 + ], + [ + 201, + -1 + ], + [ + 232, + -1 + ], + [ + 263, + -1 + ], + [ + 294, + -1 + ], + [ + 325, + -1 + ], + [ + 356, + -1 + ], + [ + 387, + -1 + ], + [ + 418, + -1 + ], + [ + 449, + -1 + ], + [ + 480, + -1 + ], + [ + 511, + -1 + ], + [ + 542, + -1 + ], + [ + 573, + -1 + ], + [ + 604, + -1 + ], + [ + 635, + -1 + ], + [ + 666, + -1 + ], + [ + 697, + -1 + ], + [ + 728, + -1 + ], + [ + 759, + -1 + ], + [ + 790, + -1 + ], + [ + 821, + -1 + ], + [ + 852, + -1 + ], + [ + 883, + -1 + ], + [ + 914, + -1 + ], + [ + 945, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 47, + 1 + ], + [ + 78, + 1 + ], + [ + 109, + 1 + ], + [ + 140, + 1 + ], + [ + 171, + 1 + ], + [ + 202, + 1 + ], + [ + 233, + 1 + ], + [ + 264, + 1 + ], + [ + 295, + 1 + ], + [ + 326, + 1 + ], + [ + 357, + 1 + ], + [ + 388, + 1 + ], + [ + 419, + 1 + ], + [ + 450, + 1 + ], + [ + 481, + 1 + ], + [ + 512, + 1 + ], + [ + 543, + 1 + ], + [ + 574, + 1 + ], + [ + 605, + 1 + ], + [ + 636, + 1 + ], + [ + 667, + 1 + ], + [ + 698, + 1 + ], + [ + 729, + 1 + ], + [ + 760, + 1 + ], + [ + 791, + 1 + ], + [ + 822, + 1 + ], + [ + 853, + 1 + ], + [ + 884, + 1 + ], + [ + 915, + 1 + ], + [ + 946, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 47, + -1 + ], + [ + 78, + -1 + ], + [ + 109, + -1 + ], + [ + 140, + -1 + ], + [ + 171, + -1 + ], + [ + 202, + -1 + ], + [ + 233, + -1 + ], + [ + 264, + -1 + ], + [ + 295, + -1 + ], + [ + 326, + -1 + ], + [ + 357, + -1 + ], + [ + 388, + -1 + ], + [ + 419, + -1 + ], + [ + 450, + -1 + ], + [ + 481, + -1 + ], + [ + 512, + -1 + ], + [ + 543, + -1 + ], + [ + 574, + -1 + ], + [ + 605, + -1 + ], + [ + 636, + -1 + ], + [ + 667, + -1 + ], + [ + 698, + -1 + ], + [ + 729, + -1 + ], + [ + 760, + -1 + ], + [ + 791, + -1 + ], + [ + 822, + -1 + ], + [ + 853, + -1 + ], + [ + 884, + -1 + ], + [ + 915, + -1 + ], + [ + 946, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 48, + 1 + ], + [ + 79, + 1 + ], + [ + 110, + 1 + ], + [ + 141, + 1 + ], + [ + 172, + 1 + ], + [ + 203, + 1 + ], + [ + 234, + 1 + ], + [ + 265, + 1 + ], + [ + 296, + 1 + ], + [ + 327, + 1 + ], + [ + 358, + 1 + ], + [ + 389, + 1 + ], + [ + 420, + 1 + ], + [ + 451, + 1 + ], + [ + 482, + 1 + ], + [ + 513, + 1 + ], + [ + 544, + 1 + ], + [ + 575, + 1 + ], + [ + 606, + 1 + ], + [ + 637, + 1 + ], + [ + 668, + 1 + ], + [ + 699, + 1 + ], + [ + 730, + 1 + ], + [ + 761, + 1 + ], + [ + 792, + 1 + ], + [ + 823, + 1 + ], + [ + 854, + 1 + ], + [ + 885, + 1 + ], + [ + 916, + 1 + ], + [ + 947, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 48, + -1 + ], + [ + 79, + -1 + ], + [ + 110, + -1 + ], + [ + 141, + -1 + ], + [ + 172, + -1 + ], + [ + 203, + -1 + ], + [ + 234, + -1 + ], + [ + 265, + -1 + ], + [ + 296, + -1 + ], + [ + 327, + -1 + ], + [ + 358, + -1 + ], + [ + 389, + -1 + ], + [ + 420, + -1 + ], + [ + 451, + -1 + ], + [ + 482, + -1 + ], + [ + 513, + -1 + ], + [ + 544, + -1 + ], + [ + 575, + -1 + ], + [ + 606, + -1 + ], + [ + 637, + -1 + ], + [ + 668, + -1 + ], + [ + 699, + -1 + ], + [ + 730, + -1 + ], + [ + 761, + -1 + ], + [ + 792, + -1 + ], + [ + 823, + -1 + ], + [ + 854, + -1 + ], + [ + 885, + -1 + ], + [ + 916, + -1 + ], + [ + 947, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 49, + 1 + ], + [ + 80, + 1 + ], + [ + 111, + 1 + ], + [ + 142, + 1 + ], + [ + 173, + 1 + ], + [ + 204, + 1 + ], + [ + 235, + 1 + ], + [ + 266, + 1 + ], + [ + 297, + 1 + ], + [ + 328, + 1 + ], + [ + 359, + 1 + ], + [ + 390, + 1 + ], + [ + 421, + 1 + ], + [ + 452, + 1 + ], + [ + 483, + 1 + ], + [ + 514, + 1 + ], + [ + 545, + 1 + ], + [ + 576, + 1 + ], + [ + 607, + 1 + ], + [ + 638, + 1 + ], + [ + 669, + 1 + ], + [ + 700, + 1 + ], + [ + 731, + 1 + ], + [ + 762, + 1 + ], + [ + 793, + 1 + ], + [ + 824, + 1 + ], + [ + 855, + 1 + ], + [ + 886, + 1 + ], + [ + 917, + 1 + ], + [ + 948, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 49, + -1 + ], + [ + 80, + -1 + ], + [ + 111, + -1 + ], + [ + 142, + -1 + ], + [ + 173, + -1 + ], + [ + 204, + -1 + ], + [ + 235, + -1 + ], + [ + 266, + -1 + ], + [ + 297, + -1 + ], + [ + 328, + -1 + ], + [ + 359, + -1 + ], + [ + 390, + -1 + ], + [ + 421, + -1 + ], + [ + 452, + -1 + ], + [ + 483, + -1 + ], + [ + 514, + -1 + ], + [ + 545, + -1 + ], + [ + 576, + -1 + ], + [ + 607, + -1 + ], + [ + 638, + -1 + ], + [ + 669, + -1 + ], + [ + 700, + -1 + ], + [ + 731, + -1 + ], + [ + 762, + -1 + ], + [ + 793, + -1 + ], + [ + 824, + -1 + ], + [ + 855, + -1 + ], + [ + 886, + -1 + ], + [ + 917, + -1 + ], + [ + 948, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 19, + 1 + ], + [ + 50, + 1 + ], + [ + 81, + 1 + ], + [ + 112, + 1 + ], + [ + 143, + 1 + ], + [ + 174, + 1 + ], + [ + 205, + 1 + ], + [ + 236, + 1 + ], + [ + 267, + 1 + ], + [ + 298, + 1 + ], + [ + 329, + 1 + ], + [ + 360, + 1 + ], + [ + 391, + 1 + ], + [ + 422, + 1 + ], + [ + 453, + 1 + ], + [ + 484, + 1 + ], + [ + 515, + 1 + ], + [ + 546, + 1 + ], + [ + 577, + 1 + ], + [ + 608, + 1 + ], + [ + 639, + 1 + ], + [ + 670, + 1 + ], + [ + 701, + 1 + ], + [ + 732, + 1 + ], + [ + 763, + 1 + ], + [ + 794, + 1 + ], + [ + 825, + 1 + ], + [ + 856, + 1 + ], + [ + 887, + 1 + ], + [ + 918, + 1 + ], + [ + 949, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 19, + -1 + ], + [ + 50, + -1 + ], + [ + 81, + -1 + ], + [ + 112, + -1 + ], + [ + 143, + -1 + ], + [ + 174, + -1 + ], + [ + 205, + -1 + ], + [ + 236, + -1 + ], + [ + 267, + -1 + ], + [ + 298, + -1 + ], + [ + 329, + -1 + ], + [ + 360, + -1 + ], + [ + 391, + -1 + ], + [ + 422, + -1 + ], + [ + 453, + -1 + ], + [ + 484, + -1 + ], + [ + 515, + -1 + ], + [ + 546, + -1 + ], + [ + 577, + -1 + ], + [ + 608, + -1 + ], + [ + 639, + -1 + ], + [ + 670, + -1 + ], + [ + 701, + -1 + ], + [ + 732, + -1 + ], + [ + 763, + -1 + ], + [ + 794, + -1 + ], + [ + 825, + -1 + ], + [ + 856, + -1 + ], + [ + 887, + -1 + ], + [ + 918, + -1 + ], + [ + 949, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 20, + 1 + ], + [ + 51, + 1 + ], + [ + 82, + 1 + ], + [ + 113, + 1 + ], + [ + 144, + 1 + ], + [ + 175, + 1 + ], + [ + 206, + 1 + ], + [ + 237, + 1 + ], + [ + 268, + 1 + ], + [ + 299, + 1 + ], + [ + 330, + 1 + ], + [ + 361, + 1 + ], + [ + 392, + 1 + ], + [ + 423, + 1 + ], + [ + 454, + 1 + ], + [ + 485, + 1 + ], + [ + 516, + 1 + ], + [ + 547, + 1 + ], + [ + 578, + 1 + ], + [ + 609, + 1 + ], + [ + 640, + 1 + ], + [ + 671, + 1 + ], + [ + 702, + 1 + ], + [ + 733, + 1 + ], + [ + 764, + 1 + ], + [ + 795, + 1 + ], + [ + 826, + 1 + ], + [ + 857, + 1 + ], + [ + 888, + 1 + ], + [ + 919, + 1 + ], + [ + 950, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 20, + -1 + ], + [ + 51, + -1 + ], + [ + 82, + -1 + ], + [ + 113, + -1 + ], + [ + 144, + -1 + ], + [ + 175, + -1 + ], + [ + 206, + -1 + ], + [ + 237, + -1 + ], + [ + 268, + -1 + ], + [ + 299, + -1 + ], + [ + 330, + -1 + ], + [ + 361, + -1 + ], + [ + 392, + -1 + ], + [ + 423, + -1 + ], + [ + 454, + -1 + ], + [ + 485, + -1 + ], + [ + 516, + -1 + ], + [ + 547, + -1 + ], + [ + 578, + -1 + ], + [ + 609, + -1 + ], + [ + 640, + -1 + ], + [ + 671, + -1 + ], + [ + 702, + -1 + ], + [ + 733, + -1 + ], + [ + 764, + -1 + ], + [ + 795, + -1 + ], + [ + 826, + -1 + ], + [ + 857, + -1 + ], + [ + 888, + -1 + ], + [ + 919, + -1 + ], + [ + 950, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 21, + 1 + ], + [ + 52, + 1 + ], + [ + 83, + 1 + ], + [ + 114, + 1 + ], + [ + 145, + 1 + ], + [ + 176, + 1 + ], + [ + 207, + 1 + ], + [ + 238, + 1 + ], + [ + 269, + 1 + ], + [ + 300, + 1 + ], + [ + 331, + 1 + ], + [ + 362, + 1 + ], + [ + 393, + 1 + ], + [ + 424, + 1 + ], + [ + 455, + 1 + ], + [ + 486, + 1 + ], + [ + 517, + 1 + ], + [ + 548, + 1 + ], + [ + 579, + 1 + ], + [ + 610, + 1 + ], + [ + 641, + 1 + ], + [ + 672, + 1 + ], + [ + 703, + 1 + ], + [ + 734, + 1 + ], + [ + 765, + 1 + ], + [ + 796, + 1 + ], + [ + 827, + 1 + ], + [ + 858, + 1 + ], + [ + 889, + 1 + ], + [ + 920, + 1 + ], + [ + 951, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 21, + -1 + ], + [ + 52, + -1 + ], + [ + 83, + -1 + ], + [ + 114, + -1 + ], + [ + 145, + -1 + ], + [ + 176, + -1 + ], + [ + 207, + -1 + ], + [ + 238, + -1 + ], + [ + 269, + -1 + ], + [ + 300, + -1 + ], + [ + 331, + -1 + ], + [ + 362, + -1 + ], + [ + 393, + -1 + ], + [ + 424, + -1 + ], + [ + 455, + -1 + ], + [ + 486, + -1 + ], + [ + 517, + -1 + ], + [ + 548, + -1 + ], + [ + 579, + -1 + ], + [ + 610, + -1 + ], + [ + 641, + -1 + ], + [ + 672, + -1 + ], + [ + 703, + -1 + ], + [ + 734, + -1 + ], + [ + 765, + -1 + ], + [ + 796, + -1 + ], + [ + 827, + -1 + ], + [ + 858, + -1 + ], + [ + 889, + -1 + ], + [ + 920, + -1 + ], + [ + 951, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 22, + 1 + ], + [ + 53, + 1 + ], + [ + 84, + 1 + ], + [ + 115, + 1 + ], + [ + 146, + 1 + ], + [ + 177, + 1 + ], + [ + 208, + 1 + ], + [ + 239, + 1 + ], + [ + 270, + 1 + ], + [ + 301, + 1 + ], + [ + 332, + 1 + ], + [ + 363, + 1 + ], + [ + 394, + 1 + ], + [ + 425, + 1 + ], + [ + 456, + 1 + ], + [ + 487, + 1 + ], + [ + 518, + 1 + ], + [ + 549, + 1 + ], + [ + 580, + 1 + ], + [ + 611, + 1 + ], + [ + 642, + 1 + ], + [ + 673, + 1 + ], + [ + 704, + 1 + ], + [ + 735, + 1 + ], + [ + 766, + 1 + ], + [ + 797, + 1 + ], + [ + 828, + 1 + ], + [ + 859, + 1 + ], + [ + 890, + 1 + ], + [ + 921, + 1 + ], + [ + 952, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 22, + -1 + ], + [ + 53, + -1 + ], + [ + 84, + -1 + ], + [ + 115, + -1 + ], + [ + 146, + -1 + ], + [ + 177, + -1 + ], + [ + 208, + -1 + ], + [ + 239, + -1 + ], + [ + 270, + -1 + ], + [ + 301, + -1 + ], + [ + 332, + -1 + ], + [ + 363, + -1 + ], + [ + 394, + -1 + ], + [ + 425, + -1 + ], + [ + 456, + -1 + ], + [ + 487, + -1 + ], + [ + 518, + -1 + ], + [ + 549, + -1 + ], + [ + 580, + -1 + ], + [ + 611, + -1 + ], + [ + 642, + -1 + ], + [ + 673, + -1 + ], + [ + 704, + -1 + ], + [ + 735, + -1 + ], + [ + 766, + -1 + ], + [ + 797, + -1 + ], + [ + 828, + -1 + ], + [ + 859, + -1 + ], + [ + 890, + -1 + ], + [ + 921, + -1 + ], + [ + 952, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 23, + 1 + ], + [ + 54, + 1 + ], + [ + 85, + 1 + ], + [ + 116, + 1 + ], + [ + 147, + 1 + ], + [ + 178, + 1 + ], + [ + 209, + 1 + ], + [ + 240, + 1 + ], + [ + 271, + 1 + ], + [ + 302, + 1 + ], + [ + 333, + 1 + ], + [ + 364, + 1 + ], + [ + 395, + 1 + ], + [ + 426, + 1 + ], + [ + 457, + 1 + ], + [ + 488, + 1 + ], + [ + 519, + 1 + ], + [ + 550, + 1 + ], + [ + 581, + 1 + ], + [ + 612, + 1 + ], + [ + 643, + 1 + ], + [ + 674, + 1 + ], + [ + 705, + 1 + ], + [ + 736, + 1 + ], + [ + 767, + 1 + ], + [ + 798, + 1 + ], + [ + 829, + 1 + ], + [ + 860, + 1 + ], + [ + 891, + 1 + ], + [ + 922, + 1 + ], + [ + 953, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 23, + -1 + ], + [ + 54, + -1 + ], + [ + 85, + -1 + ], + [ + 116, + -1 + ], + [ + 147, + -1 + ], + [ + 178, + -1 + ], + [ + 209, + -1 + ], + [ + 240, + -1 + ], + [ + 271, + -1 + ], + [ + 302, + -1 + ], + [ + 333, + -1 + ], + [ + 364, + -1 + ], + [ + 395, + -1 + ], + [ + 426, + -1 + ], + [ + 457, + -1 + ], + [ + 488, + -1 + ], + [ + 519, + -1 + ], + [ + 550, + -1 + ], + [ + 581, + -1 + ], + [ + 612, + -1 + ], + [ + 643, + -1 + ], + [ + 674, + -1 + ], + [ + 705, + -1 + ], + [ + 736, + -1 + ], + [ + 767, + -1 + ], + [ + 798, + -1 + ], + [ + 829, + -1 + ], + [ + 860, + -1 + ], + [ + 891, + -1 + ], + [ + 922, + -1 + ], + [ + 953, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 24, + 1 + ], + [ + 55, + 1 + ], + [ + 86, + 1 + ], + [ + 117, + 1 + ], + [ + 148, + 1 + ], + [ + 179, + 1 + ], + [ + 210, + 1 + ], + [ + 241, + 1 + ], + [ + 272, + 1 + ], + [ + 303, + 1 + ], + [ + 334, + 1 + ], + [ + 365, + 1 + ], + [ + 396, + 1 + ], + [ + 427, + 1 + ], + [ + 458, + 1 + ], + [ + 489, + 1 + ], + [ + 520, + 1 + ], + [ + 551, + 1 + ], + [ + 582, + 1 + ], + [ + 613, + 1 + ], + [ + 644, + 1 + ], + [ + 675, + 1 + ], + [ + 706, + 1 + ], + [ + 737, + 1 + ], + [ + 768, + 1 + ], + [ + 799, + 1 + ], + [ + 830, + 1 + ], + [ + 861, + 1 + ], + [ + 892, + 1 + ], + [ + 923, + 1 + ], + [ + 954, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 24, + -1 + ], + [ + 55, + -1 + ], + [ + 86, + -1 + ], + [ + 117, + -1 + ], + [ + 148, + -1 + ], + [ + 179, + -1 + ], + [ + 210, + -1 + ], + [ + 241, + -1 + ], + [ + 272, + -1 + ], + [ + 303, + -1 + ], + [ + 334, + -1 + ], + [ + 365, + -1 + ], + [ + 396, + -1 + ], + [ + 427, + -1 + ], + [ + 458, + -1 + ], + [ + 489, + -1 + ], + [ + 520, + -1 + ], + [ + 551, + -1 + ], + [ + 582, + -1 + ], + [ + 613, + -1 + ], + [ + 644, + -1 + ], + [ + 675, + -1 + ], + [ + 706, + -1 + ], + [ + 737, + -1 + ], + [ + 768, + -1 + ], + [ + 799, + -1 + ], + [ + 830, + -1 + ], + [ + 861, + -1 + ], + [ + 892, + -1 + ], + [ + 923, + -1 + ], + [ + 954, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 25, + 1 + ], + [ + 56, + 1 + ], + [ + 87, + 1 + ], + [ + 118, + 1 + ], + [ + 149, + 1 + ], + [ + 180, + 1 + ], + [ + 211, + 1 + ], + [ + 242, + 1 + ], + [ + 273, + 1 + ], + [ + 304, + 1 + ], + [ + 335, + 1 + ], + [ + 366, + 1 + ], + [ + 397, + 1 + ], + [ + 428, + 1 + ], + [ + 459, + 1 + ], + [ + 490, + 1 + ], + [ + 521, + 1 + ], + [ + 552, + 1 + ], + [ + 583, + 1 + ], + [ + 614, + 1 + ], + [ + 645, + 1 + ], + [ + 676, + 1 + ], + [ + 707, + 1 + ], + [ + 738, + 1 + ], + [ + 769, + 1 + ], + [ + 800, + 1 + ], + [ + 831, + 1 + ], + [ + 862, + 1 + ], + [ + 893, + 1 + ], + [ + 924, + 1 + ], + [ + 955, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 25, + -1 + ], + [ + 56, + -1 + ], + [ + 87, + -1 + ], + [ + 118, + -1 + ], + [ + 149, + -1 + ], + [ + 180, + -1 + ], + [ + 211, + -1 + ], + [ + 242, + -1 + ], + [ + 273, + -1 + ], + [ + 304, + -1 + ], + [ + 335, + -1 + ], + [ + 366, + -1 + ], + [ + 397, + -1 + ], + [ + 428, + -1 + ], + [ + 459, + -1 + ], + [ + 490, + -1 + ], + [ + 521, + -1 + ], + [ + 552, + -1 + ], + [ + 583, + -1 + ], + [ + 614, + -1 + ], + [ + 645, + -1 + ], + [ + 676, + -1 + ], + [ + 707, + -1 + ], + [ + 738, + -1 + ], + [ + 769, + -1 + ], + [ + 800, + -1 + ], + [ + 831, + -1 + ], + [ + 862, + -1 + ], + [ + 893, + -1 + ], + [ + 924, + -1 + ], + [ + 955, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 26, + 1 + ], + [ + 57, + 1 + ], + [ + 88, + 1 + ], + [ + 119, + 1 + ], + [ + 150, + 1 + ], + [ + 181, + 1 + ], + [ + 212, + 1 + ], + [ + 243, + 1 + ], + [ + 274, + 1 + ], + [ + 305, + 1 + ], + [ + 336, + 1 + ], + [ + 367, + 1 + ], + [ + 398, + 1 + ], + [ + 429, + 1 + ], + [ + 460, + 1 + ], + [ + 491, + 1 + ], + [ + 522, + 1 + ], + [ + 553, + 1 + ], + [ + 584, + 1 + ], + [ + 615, + 1 + ], + [ + 646, + 1 + ], + [ + 677, + 1 + ], + [ + 708, + 1 + ], + [ + 739, + 1 + ], + [ + 770, + 1 + ], + [ + 801, + 1 + ], + [ + 832, + 1 + ], + [ + 863, + 1 + ], + [ + 894, + 1 + ], + [ + 925, + 1 + ], + [ + 956, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 26, + -1 + ], + [ + 57, + -1 + ], + [ + 88, + -1 + ], + [ + 119, + -1 + ], + [ + 150, + -1 + ], + [ + 181, + -1 + ], + [ + 212, + -1 + ], + [ + 243, + -1 + ], + [ + 274, + -1 + ], + [ + 305, + -1 + ], + [ + 336, + -1 + ], + [ + 367, + -1 + ], + [ + 398, + -1 + ], + [ + 429, + -1 + ], + [ + 460, + -1 + ], + [ + 491, + -1 + ], + [ + 522, + -1 + ], + [ + 553, + -1 + ], + [ + 584, + -1 + ], + [ + 615, + -1 + ], + [ + 646, + -1 + ], + [ + 677, + -1 + ], + [ + 708, + -1 + ], + [ + 739, + -1 + ], + [ + 770, + -1 + ], + [ + 801, + -1 + ], + [ + 832, + -1 + ], + [ + 863, + -1 + ], + [ + 894, + -1 + ], + [ + 925, + -1 + ], + [ + 956, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 27, + 1 + ], + [ + 58, + 1 + ], + [ + 89, + 1 + ], + [ + 120, + 1 + ], + [ + 151, + 1 + ], + [ + 182, + 1 + ], + [ + 213, + 1 + ], + [ + 244, + 1 + ], + [ + 275, + 1 + ], + [ + 306, + 1 + ], + [ + 337, + 1 + ], + [ + 368, + 1 + ], + [ + 399, + 1 + ], + [ + 430, + 1 + ], + [ + 461, + 1 + ], + [ + 492, + 1 + ], + [ + 523, + 1 + ], + [ + 554, + 1 + ], + [ + 585, + 1 + ], + [ + 616, + 1 + ], + [ + 647, + 1 + ], + [ + 678, + 1 + ], + [ + 709, + 1 + ], + [ + 740, + 1 + ], + [ + 771, + 1 + ], + [ + 802, + 1 + ], + [ + 833, + 1 + ], + [ + 864, + 1 + ], + [ + 895, + 1 + ], + [ + 926, + 1 + ], + [ + 957, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 27, + -1 + ], + [ + 58, + -1 + ], + [ + 89, + -1 + ], + [ + 120, + -1 + ], + [ + 151, + -1 + ], + [ + 182, + -1 + ], + [ + 213, + -1 + ], + [ + 244, + -1 + ], + [ + 275, + -1 + ], + [ + 306, + -1 + ], + [ + 337, + -1 + ], + [ + 368, + -1 + ], + [ + 399, + -1 + ], + [ + 430, + -1 + ], + [ + 461, + -1 + ], + [ + 492, + -1 + ], + [ + 523, + -1 + ], + [ + 554, + -1 + ], + [ + 585, + -1 + ], + [ + 616, + -1 + ], + [ + 647, + -1 + ], + [ + 678, + -1 + ], + [ + 709, + -1 + ], + [ + 740, + -1 + ], + [ + 771, + -1 + ], + [ + 802, + -1 + ], + [ + 833, + -1 + ], + [ + 864, + -1 + ], + [ + 895, + -1 + ], + [ + 926, + -1 + ], + [ + 957, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 28, + 1 + ], + [ + 59, + 1 + ], + [ + 90, + 1 + ], + [ + 121, + 1 + ], + [ + 152, + 1 + ], + [ + 183, + 1 + ], + [ + 214, + 1 + ], + [ + 245, + 1 + ], + [ + 276, + 1 + ], + [ + 307, + 1 + ], + [ + 338, + 1 + ], + [ + 369, + 1 + ], + [ + 400, + 1 + ], + [ + 431, + 1 + ], + [ + 462, + 1 + ], + [ + 493, + 1 + ], + [ + 524, + 1 + ], + [ + 555, + 1 + ], + [ + 586, + 1 + ], + [ + 617, + 1 + ], + [ + 648, + 1 + ], + [ + 679, + 1 + ], + [ + 710, + 1 + ], + [ + 741, + 1 + ], + [ + 772, + 1 + ], + [ + 803, + 1 + ], + [ + 834, + 1 + ], + [ + 865, + 1 + ], + [ + 896, + 1 + ], + [ + 927, + 1 + ], + [ + 958, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 28, + -1 + ], + [ + 59, + -1 + ], + [ + 90, + -1 + ], + [ + 121, + -1 + ], + [ + 152, + -1 + ], + [ + 183, + -1 + ], + [ + 214, + -1 + ], + [ + 245, + -1 + ], + [ + 276, + -1 + ], + [ + 307, + -1 + ], + [ + 338, + -1 + ], + [ + 369, + -1 + ], + [ + 400, + -1 + ], + [ + 431, + -1 + ], + [ + 462, + -1 + ], + [ + 493, + -1 + ], + [ + 524, + -1 + ], + [ + 555, + -1 + ], + [ + 586, + -1 + ], + [ + 617, + -1 + ], + [ + 648, + -1 + ], + [ + 679, + -1 + ], + [ + 710, + -1 + ], + [ + 741, + -1 + ], + [ + 772, + -1 + ], + [ + 803, + -1 + ], + [ + 834, + -1 + ], + [ + 865, + -1 + ], + [ + 896, + -1 + ], + [ + 927, + -1 + ], + [ + 958, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 29, + 1 + ], + [ + 60, + 1 + ], + [ + 91, + 1 + ], + [ + 122, + 1 + ], + [ + 153, + 1 + ], + [ + 184, + 1 + ], + [ + 215, + 1 + ], + [ + 246, + 1 + ], + [ + 277, + 1 + ], + [ + 308, + 1 + ], + [ + 339, + 1 + ], + [ + 370, + 1 + ], + [ + 401, + 1 + ], + [ + 432, + 1 + ], + [ + 463, + 1 + ], + [ + 494, + 1 + ], + [ + 525, + 1 + ], + [ + 556, + 1 + ], + [ + 587, + 1 + ], + [ + 618, + 1 + ], + [ + 649, + 1 + ], + [ + 680, + 1 + ], + [ + 711, + 1 + ], + [ + 742, + 1 + ], + [ + 773, + 1 + ], + [ + 804, + 1 + ], + [ + 835, + 1 + ], + [ + 866, + 1 + ], + [ + 897, + 1 + ], + [ + 928, + 1 + ], + [ + 959, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 29, + -1 + ], + [ + 60, + -1 + ], + [ + 91, + -1 + ], + [ + 122, + -1 + ], + [ + 153, + -1 + ], + [ + 184, + -1 + ], + [ + 215, + -1 + ], + [ + 246, + -1 + ], + [ + 277, + -1 + ], + [ + 308, + -1 + ], + [ + 339, + -1 + ], + [ + 370, + -1 + ], + [ + 401, + -1 + ], + [ + 432, + -1 + ], + [ + 463, + -1 + ], + [ + 494, + -1 + ], + [ + 525, + -1 + ], + [ + 556, + -1 + ], + [ + 587, + -1 + ], + [ + 618, + -1 + ], + [ + 649, + -1 + ], + [ + 680, + -1 + ], + [ + 711, + -1 + ], + [ + 742, + -1 + ], + [ + 773, + -1 + ], + [ + 804, + -1 + ], + [ + 835, + -1 + ], + [ + 866, + -1 + ], + [ + 897, + -1 + ], + [ + 928, + -1 + ], + [ + 959, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 30, + 1 + ], + [ + 61, + 1 + ], + [ + 92, + 1 + ], + [ + 123, + 1 + ], + [ + 154, + 1 + ], + [ + 185, + 1 + ], + [ + 216, + 1 + ], + [ + 247, + 1 + ], + [ + 278, + 1 + ], + [ + 309, + 1 + ], + [ + 340, + 1 + ], + [ + 371, + 1 + ], + [ + 402, + 1 + ], + [ + 433, + 1 + ], + [ + 464, + 1 + ], + [ + 495, + 1 + ], + [ + 526, + 1 + ], + [ + 557, + 1 + ], + [ + 588, + 1 + ], + [ + 619, + 1 + ], + [ + 650, + 1 + ], + [ + 681, + 1 + ], + [ + 712, + 1 + ], + [ + 743, + 1 + ], + [ + 774, + 1 + ], + [ + 805, + 1 + ], + [ + 836, + 1 + ], + [ + 867, + 1 + ], + [ + 898, + 1 + ], + [ + 929, + 1 + ], + [ + 960, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 30, + -1 + ], + [ + 61, + -1 + ], + [ + 92, + -1 + ], + [ + 123, + -1 + ], + [ + 154, + -1 + ], + [ + 185, + -1 + ], + [ + 216, + -1 + ], + [ + 247, + -1 + ], + [ + 278, + -1 + ], + [ + 309, + -1 + ], + [ + 340, + -1 + ], + [ + 371, + -1 + ], + [ + 402, + -1 + ], + [ + 433, + -1 + ], + [ + 464, + -1 + ], + [ + 495, + -1 + ], + [ + 526, + -1 + ], + [ + 557, + -1 + ], + [ + 588, + -1 + ], + [ + 619, + -1 + ], + [ + 650, + -1 + ], + [ + 681, + -1 + ], + [ + 712, + -1 + ], + [ + 743, + -1 + ], + [ + 774, + -1 + ], + [ + 805, + -1 + ], + [ + 836, + -1 + ], + [ + 867, + -1 + ], + [ + 898, + -1 + ], + [ + 929, + -1 + ], + [ + 960, + -1 + ] + ] + } + ], + "parameters": { + "size": 31, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 73, + 88, + 29, + 92, + 32, + 16, + 41, + 83, + 53, + 39, + 25, + 73, + 60 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 76, + 30, + 29, + 98, + 83, + 93, + 62, + 78, + 91, + 59, + 77, + 12, + 21 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 22, + 29, + 76, + 84, + 3, + 4, + 59, + 20, + 67, + 42, + 9, + 20, + 17 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 32, + 18, + 74, + 25, + 29, + 71, + 7, + 15, + 60, + 79, + 67, + 59, + 14 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 15, + 55, + 18, + 80, + 64, + 50, + 89, + 75, + 9, + 72, + 96, + 45, + 4 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 9, + 59, + 12, + 60, + 49, + 21, + 58, + 1, + 60, + 4, + 22, + 31, + 57 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 74, + 97, + 91, + 19, + 24, + 26, + 46, + 99, + 9, + 29, + 32, + 11, + 27 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 59, + 7, + 70, + 89, + 43, + 73, + 71, + 83, + 1, + 38, + 37, + 35, + 48 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 25, + 6, + 75, + 84, + 47, + 55, + 6, + 95, + 77, + 43, + 89, + 67, + 52 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 58, + 86, + 10, + 46, + 4, + 39, + 52, + 61, + 27, + 50, + 70, + 9, + 47 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 98, + 12, + 4, + 75, + 83, + 12, + 83, + 98, + 74, + 95, + 93, + 99, + 97 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 24, + 96, + 39, + 76, + 43, + 90, + 73, + 66, + 51, + 99, + 20, + 80, + 81 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 26, + 81, + 98, + 46, + 38, + 99, + 81, + 47, + 40, + 100, + 80, + 82, + 96 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 70, + 80, + 15, + 98, + 57, + 44, + 14, + 35, + 17, + 38, + 29, + 46, + 21 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 94, + 24, + 48, + 22, + 31, + 89, + 5, + 84, + 69, + 47, + 68, + 19, + 57 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 76, + 53, + 22, + 73, + 8, + 1, + 76, + 25, + 90, + 12, + 74, + 40, + 7 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 35, + 60, + 21, + 58, + 10, + 36, + 67, + 1, + 10, + 76, + 85, + 86, + 30 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47, + 89, + 45, + 92, + 70, + 15, + 25, + 79, + 21, + 48, + 85, + 73, + 100, + 1 + ], + [ + 2, + 62, + 68, + 66, + 51, + 75, + 5, + 20, + 81, + 31, + 97, + 60, + 85, + 80, + 79, + 72, + 22, + 39, + 39, + 16, + 100, + 53, + 13, + 15, + 89, + 42, + 37, + 56, + 17, + 31, + 11 + ], + [ + 54, + 78, + 73, + 85, + 65, + 74, + 32, + 47, + 42, + 24, + 43, + 73, + 97, + 91, + 84, + 80, + 89, + 72, + 76, + 26, + 61, + 66, + 12, + 10, + 13, + 10, + 34, + 56, + 49, + 15, + 29 + ], + [ + 36, + 47, + 59, + 6, + 80, + 9, + 48, + 76, + 47, + 51, + 85, + 17, + 16, + 25, + 79, + 98, + 57, + 40, + 23, + 79, + 76, + 100, + 96, + 70, + 91, + 72, + 90, + 57, + 51, + 89, + 34 + ], + [ + 80, + 49, + 66, + 12, + 27, + 32, + 56, + 54, + 100, + 16, + 91, + 52, + 6, + 34, + 77, + 97, + 48, + 37, + 75, + 37, + 6, + 7, + 56, + 97, + 3, + 93, + 30, + 74, + 22, + 88, + 96 + ], + [ + 1, + 16, + 27, + 24, + 98, + 15, + 75, + 8, + 13, + 87, + 44, + 31, + 8, + 52, + 20, + 80, + 29, + 78, + 32, + 70, + 87, + 45, + 53, + 26, + 52, + 41, + 91, + 10, + 21, + 88, + 98 + ], + [ + 76, + 78, + 100, + 91, + 95, + 70, + 40, + 25, + 52, + 71, + 100, + 7, + 71, + 61, + 73, + 89, + 49, + 34, + 18, + 23, + 66, + 49, + 78, + 86, + 54, + 35, + 12, + 86, + 16, + 38, + 67 + ], + [ + 68, + 23, + 74, + 89, + 68, + 32, + 21, + 41, + 39, + 38, + 41, + 30, + 80, + 4, + 88, + 62, + 46, + 1, + 82, + 43, + 15, + 59, + 28, + 76, + 89, + 95, + 29, + 33, + 85, + 100, + 42 + ], + [ + 87, + 93, + 3, + 78, + 12, + 14, + 14, + 8, + 75, + 92, + 10, + 16, + 78, + 53, + 80, + 88, + 80, + 88, + 67, + 6, + 74, + 79, + 49, + 61, + 58, + 51, + 34, + 59, + 76, + 70, + 29 + ], + [ + 17, + 39, + 87, + 21, + 68, + 37, + 68, + 72, + 97, + 60, + 90, + 78, + 94, + 77, + 6, + 42, + 64, + 34, + 67, + 83, + 31, + 25, + 68, + 92, + 20, + 47, + 55, + 92, + 59, + 23, + 13 + ], + [ + 56, + 72, + 64, + 48, + 44, + 58, + 43, + 23, + 95, + 17, + 45, + 37, + 47, + 89, + 63, + 35, + 43, + 72, + 75, + 45, + 52, + 13, + 16, + 73, + 81, + 84, + 86, + 74, + 72, + 53, + 80 + ], + [ + 53, + 31, + 59, + 87, + 18, + 57, + 62, + 50, + 91, + 12, + 54, + 45, + 69, + 56, + 29, + 84, + 43, + 16, + 49, + 35, + 72, + 63, + 37, + 80, + 81, + 41, + 21, + 52, + 78, + 42, + 31 + ], + [ + 61, + 38, + 90, + 93, + 68, + 38, + 45, + 22, + 37, + 39, + 82, + 5, + 96, + 82, + 34, + 60, + 56, + 2, + 39, + 25, + 12, + 95, + 46, + 48, + 7, + 48, + 31, + 69, + 77, + 23, + 15 + ], + [ + 90, + 76, + 46, + 63, + 83, + 31, + 77, + 62, + 70, + 8, + 57, + 72, + 80, + 43, + 27, + 76, + 6, + 26, + 93, + 59, + 63, + 46, + 45, + 85, + 88, + 27, + 35, + 68, + 78, + 43, + 97 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 961, + "variables": 961, + "rows": 124, + "nonzeros": 3844, + "globals": 0 + }, + "input_variables": 961, + "model_variables": 961, + "modelled_variables": 961, + "size_unit": "tasks" + }, + "json_sha256": "0b59a820d2bd976fa2e314640b942c8eec745a0e08279d52bf9d90865fce0312", + "txt_sha256": "2f8f4e3e5d87845ccc269525d1aaf3f1d566f8e6cb3edf1d67ca51f071eb515c" + }, + { + "id": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "model": { + "id": "facility_location_single_8", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 8, + "natural_size": 8, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 136, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28 + ], + "rows": [ + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 8, + "customers": 16, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 136, + "variables": 136, + "rows": 160, + "nonzeros": 512, + "globals": 0 + }, + "input_variables": 136, + "model_variables": 136, + "modelled_variables": 136, + "size_unit": "sites" + }, + "json_sha256": "190819fd38a9728383da6dd75a7cebdc550aa46bdf4b25c35da143c99235a6d1", + "txt_sha256": "b0f797de641e8de8333bd11212b36adb4d9df8045fdaa1e19dc69fdce0f61b35" + }, + { + "id": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "model": { + "id": "facility_location_single_16", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 528, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31, + 49, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18, + 13, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19, + 18, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27, + 12, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23, + 26, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22, + 25, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16, + 15, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20, + 15, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29, + 8, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7, + 24, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21, + 26, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9, + 28, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33, + 4, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32, + 25, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48, + 19, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25, + 8, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20, + 11, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18, + 21, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43, + 14, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12, + 35, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38, + 9, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22, + 27, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44, + 15, + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37, + 8, + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19, + 18, + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25, + 18, + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32, + 15, + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12, + 19, + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42, + 13, + 27, + 32, + 11, + 16, + 25, + 11, + 27, + 21, + 10, + 7, + 27, + 20, + 27, + 16, + 32, + 3, + 21, + 10, + 25, + 26, + 7, + 33, + 5, + 27, + 14, + 23, + 19, + 14, + 21, + 8, + 14, + 21 + ], + "rows": [ + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 300, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 301, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 302, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 303, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 304, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 305, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 306, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 307, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 308, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 309, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 310, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 311, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 312, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 313, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 314, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 315, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 316, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 317, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 318, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 319, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 320, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 321, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 322, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 323, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 324, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 325, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 326, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 327, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 328, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 329, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 330, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 331, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 332, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 333, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 334, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 335, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 336, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 337, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 338, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 339, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 340, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 341, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 342, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 343, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 344, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 345, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 346, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 347, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 348, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 349, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 350, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 351, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ], + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ], + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 352, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 353, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 354, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 355, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 356, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 357, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 358, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 359, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 360, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 361, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 362, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 363, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 364, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 365, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 366, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 367, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 368, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 369, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 370, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 371, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 372, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 373, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 374, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 375, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 376, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 377, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 378, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 379, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 380, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 381, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 382, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 383, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ], + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ], + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 384, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 385, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 386, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 387, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 388, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 389, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 390, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 391, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 392, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 393, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 394, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 395, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 396, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 397, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 398, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 399, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ], + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ], + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 400, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 401, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 402, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 403, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 404, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 405, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 406, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 407, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 408, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 409, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 410, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 411, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 412, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 413, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 414, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 415, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ], + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ], + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 416, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 417, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 418, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 419, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 420, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 421, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 422, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 423, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 424, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 425, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 426, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 427, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 428, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 429, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 430, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 431, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ], + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ], + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 432, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 433, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 434, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 435, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 436, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 437, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 438, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 439, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 440, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 441, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 442, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 443, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 444, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 445, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 446, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 447, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 448, + 1 + ], + [ + 449, + 1 + ], + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 448, + -1 + ], + [ + 449, + -1 + ], + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 448, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 449, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 450, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 451, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 452, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 453, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 454, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 455, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 456, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 457, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 458, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 459, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 460, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 461, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 462, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 463, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 464, + 1 + ], + [ + 465, + 1 + ], + [ + 466, + 1 + ], + [ + 467, + 1 + ], + [ + 468, + 1 + ], + [ + 469, + 1 + ], + [ + 470, + 1 + ], + [ + 471, + 1 + ], + [ + 472, + 1 + ], + [ + 473, + 1 + ], + [ + 474, + 1 + ], + [ + 475, + 1 + ], + [ + 476, + 1 + ], + [ + 477, + 1 + ], + [ + 478, + 1 + ], + [ + 479, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 464, + -1 + ], + [ + 465, + -1 + ], + [ + 466, + -1 + ], + [ + 467, + -1 + ], + [ + 468, + -1 + ], + [ + 469, + -1 + ], + [ + 470, + -1 + ], + [ + 471, + -1 + ], + [ + 472, + -1 + ], + [ + 473, + -1 + ], + [ + 474, + -1 + ], + [ + 475, + -1 + ], + [ + 476, + -1 + ], + [ + 477, + -1 + ], + [ + 478, + -1 + ], + [ + 479, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 464, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 465, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 466, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 467, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 468, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 469, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 470, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 471, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 472, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 473, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 474, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 475, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 476, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 477, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 478, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 479, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 480, + 1 + ], + [ + 481, + 1 + ], + [ + 482, + 1 + ], + [ + 483, + 1 + ], + [ + 484, + 1 + ], + [ + 485, + 1 + ], + [ + 486, + 1 + ], + [ + 487, + 1 + ], + [ + 488, + 1 + ], + [ + 489, + 1 + ], + [ + 490, + 1 + ], + [ + 491, + 1 + ], + [ + 492, + 1 + ], + [ + 493, + 1 + ], + [ + 494, + 1 + ], + [ + 495, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 480, + -1 + ], + [ + 481, + -1 + ], + [ + 482, + -1 + ], + [ + 483, + -1 + ], + [ + 484, + -1 + ], + [ + 485, + -1 + ], + [ + 486, + -1 + ], + [ + 487, + -1 + ], + [ + 488, + -1 + ], + [ + 489, + -1 + ], + [ + 490, + -1 + ], + [ + 491, + -1 + ], + [ + 492, + -1 + ], + [ + 493, + -1 + ], + [ + 494, + -1 + ], + [ + 495, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 480, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 481, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 482, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 483, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 484, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 485, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 486, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 487, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 488, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 489, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 490, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 491, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 492, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 493, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 494, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 495, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 496, + 1 + ], + [ + 497, + 1 + ], + [ + 498, + 1 + ], + [ + 499, + 1 + ], + [ + 500, + 1 + ], + [ + 501, + 1 + ], + [ + 502, + 1 + ], + [ + 503, + 1 + ], + [ + 504, + 1 + ], + [ + 505, + 1 + ], + [ + 506, + 1 + ], + [ + 507, + 1 + ], + [ + 508, + 1 + ], + [ + 509, + 1 + ], + [ + 510, + 1 + ], + [ + 511, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 496, + -1 + ], + [ + 497, + -1 + ], + [ + 498, + -1 + ], + [ + 499, + -1 + ], + [ + 500, + -1 + ], + [ + 501, + -1 + ], + [ + 502, + -1 + ], + [ + 503, + -1 + ], + [ + 504, + -1 + ], + [ + 505, + -1 + ], + [ + 506, + -1 + ], + [ + 507, + -1 + ], + [ + 508, + -1 + ], + [ + 509, + -1 + ], + [ + 510, + -1 + ], + [ + 511, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 496, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 497, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 498, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 499, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 500, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 501, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 502, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 503, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 504, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 505, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 506, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 507, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 508, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 509, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 510, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 511, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 512, + 1 + ], + [ + 513, + 1 + ], + [ + 514, + 1 + ], + [ + 515, + 1 + ], + [ + 516, + 1 + ], + [ + 517, + 1 + ], + [ + 518, + 1 + ], + [ + 519, + 1 + ], + [ + 520, + 1 + ], + [ + 521, + 1 + ], + [ + 522, + 1 + ], + [ + 523, + 1 + ], + [ + 524, + 1 + ], + [ + 525, + 1 + ], + [ + 526, + 1 + ], + [ + 527, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 512, + -1 + ], + [ + 513, + -1 + ], + [ + 514, + -1 + ], + [ + 515, + -1 + ], + [ + 516, + -1 + ], + [ + 517, + -1 + ], + [ + 518, + -1 + ], + [ + 519, + -1 + ], + [ + 520, + -1 + ], + [ + 521, + -1 + ], + [ + 522, + -1 + ], + [ + 523, + -1 + ], + [ + 524, + -1 + ], + [ + 525, + -1 + ], + [ + 526, + -1 + ], + [ + 527, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 512, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 513, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 514, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 515, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 516, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 517, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 518, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 519, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 520, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 521, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 522, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 523, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 524, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 525, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 526, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + 1 + ], + [ + 527, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 16, + "customers": 32, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31, + 49 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18, + 13 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19, + 18 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27, + 12 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23, + 26 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22, + 25 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16, + 15 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20, + 15 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29, + 8 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7, + 24 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21, + 26 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9, + 28 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33, + 4 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32, + 25 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48, + 19 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25, + 8 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20, + 11 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 9 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18, + 21 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43, + 14 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12, + 35 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38, + 9 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22, + 27 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44, + 15 + ], + [ + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37, + 8 + ], + [ + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19, + 18 + ], + [ + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25, + 18 + ], + [ + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32, + 15 + ], + [ + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12, + 19 + ], + [ + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42, + 13 + ], + [ + 27, + 32, + 11, + 16, + 25, + 11, + 27, + 21, + 10, + 7, + 27, + 20, + 27, + 16, + 32, + 3 + ], + [ + 21, + 10, + 25, + 26, + 7, + 33, + 5, + 27, + 14, + 23, + 19, + 14, + 21, + 8, + 14, + 21 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 528, + "variables": 528, + "rows": 576, + "nonzeros": 2048, + "globals": 0 + }, + "input_variables": 528, + "model_variables": 528, + "modelled_variables": 528, + "size_unit": "sites" + }, + "json_sha256": "bd68c17069291061eaaf8bfdc47804720bbf0c023502894dc39d214b396a5ee9", + "txt_sha256": "1775ee4193597c4e9921b2ba31b64f1b0a72116a2178c11589ce7ee4f1019bed" + }, + { + "id": "facility_location-12-single", + "category": "facility_location", + "size": 12, + "variant": "single", + "model": { + "id": "facility_location_single_12", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 300, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ], + "rows": [ + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 12, + "customers": 24, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 336, + "nonzeros": 1152, + "globals": 0 + }, + "input_variables": 300, + "model_variables": 300, + "modelled_variables": 300, + "size_unit": "sites" + }, + "json_sha256": "8f45cb4e67eff3884b3744f424d3bec44726b04bc9fdbc20d3543d9947a67669", + "txt_sha256": "6559cee8a28138dbf741000c629fa3e2765bc6d38642235f99ef2da3912540a1" + }, + { + "id": "facility_location-10-single", + "category": "facility_location", + "size": 10, + "variant": "single", + "model": { + "id": "facility_location_single_10", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 10, + "natural_size": 10, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 210, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14 + ], + "rows": [ + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 10, + "customers": 20, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 210, + "variables": 210, + "rows": 240, + "nonzeros": 800, + "globals": 0 + }, + "input_variables": 210, + "model_variables": 210, + "modelled_variables": 210, + "size_unit": "sites" + }, + "json_sha256": "5077f6ef8cb8e4e3e35a7ebb97ddf1c40d5e7942f003ce716a7722e673fcc6f3", + "txt_sha256": "15ab2b917a27e9a09ee3b438de882ad103e8fcde75d5784d36d4427f82aab992" + }, + { + "id": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "model": { + "id": "facility_location_single_9", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 9, + "natural_size": 9, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 171, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + "rows": [ + { + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 9, + "customers": 18, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 171, + "variables": 171, + "rows": 198, + "nonzeros": 648, + "globals": 0 + }, + "input_variables": 171, + "model_variables": 171, + "modelled_variables": 171, + "size_unit": "sites" + }, + "json_sha256": "05f7bcfa7613bffd669d5a7f96940f90cd41684099a00eadd2131825328dbac6", + "txt_sha256": "b26947191b79bcc264afbba5d5b55bc042c4a0d53b7b9306e3ac4dc38be09b03" + }, + { + "id": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "model": { + "id": "facility_location_single_7", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 7, + "natural_size": 7, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 105, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 5, + 24, + 19, + 20, + 25, + 27, + 23 + ], + "rows": [ + { + "a": [ + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 7, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 8, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 7, + "customers": 14, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 105, + "variables": 105, + "rows": 126, + "nonzeros": 392, + "globals": 0 + }, + "input_variables": 105, + "model_variables": 105, + "modelled_variables": 105, + "size_unit": "sites" + }, + "json_sha256": "753831bd59b0ab034951c719d8dcc5de1f794f093cf346034cb520c298dcbbd1", + "txt_sha256": "fd93455ff892b40231f77a40c518d0c62888464ad52ce3d08ecaf136d234b8fb" + }, + { + "id": "facility_location-15-single", + "category": "facility_location", + "size": 15, + "variant": "single", + "model": { + "id": "facility_location_single_15", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 15, + "natural_size": 15, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 465, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22, + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18, + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43, + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12, + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38, + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22, + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44, + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37, + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19, + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25, + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32, + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12, + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42 + ], + "rows": [ + { + "a": [ + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 171, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 172, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 173, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 174, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 175, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 176, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 177, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 178, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 179, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 180, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 181, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 182, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 183, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 184, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 185, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 186, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 187, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 188, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 189, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 190, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 191, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 192, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 200, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 201, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 202, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 203, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 204, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 205, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 206, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 207, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 208, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 209, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 210, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 211, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 212, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 213, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 214, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 215, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 216, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 217, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 218, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 219, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 220, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 221, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 222, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 223, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 224, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 225, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 226, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 227, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 228, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 229, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 230, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 231, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 232, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 233, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 234, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 235, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 236, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 237, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 238, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 239, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 240, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 241, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 242, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 243, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 244, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 245, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 246, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 247, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 248, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 249, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 250, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 251, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 252, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 253, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 254, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 255, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 256, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 257, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 258, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 259, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 260, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 261, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 262, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 263, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 264, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 265, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 266, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 267, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 268, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 269, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 270, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 271, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 272, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 273, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 274, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 275, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 276, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 277, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 278, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 279, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 280, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 290, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 300, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 301, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 302, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 303, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 304, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 305, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 306, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 307, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 308, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 309, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 310, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 311, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 312, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 313, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 314, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 315, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 316, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 317, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 318, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 319, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 320, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 321, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 322, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 323, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 324, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 325, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 326, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 327, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 328, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 329, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 330, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 331, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 332, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 333, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 334, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 335, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 336, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 337, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 338, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 339, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 340, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 341, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 342, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 343, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 344, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ], + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ], + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 345, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 346, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 347, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 348, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 349, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 350, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 351, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 352, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 353, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 354, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 355, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 356, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 357, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 358, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 359, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ], + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ], + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 360, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 361, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 362, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 363, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 364, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 365, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 366, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 367, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 368, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 369, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 370, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 371, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 372, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 373, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 374, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 375, + 1 + ], + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ], + [ + 384, + 1 + ], + [ + 385, + 1 + ], + [ + 386, + 1 + ], + [ + 387, + 1 + ], + [ + 388, + 1 + ], + [ + 389, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 375, + -1 + ], + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ], + [ + 384, + -1 + ], + [ + 385, + -1 + ], + [ + 386, + -1 + ], + [ + 387, + -1 + ], + [ + 388, + -1 + ], + [ + 389, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 375, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 376, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 377, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 378, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 379, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 380, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 381, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 382, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 383, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 384, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 385, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 386, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 387, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 388, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 389, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 390, + 1 + ], + [ + 391, + 1 + ], + [ + 392, + 1 + ], + [ + 393, + 1 + ], + [ + 394, + 1 + ], + [ + 395, + 1 + ], + [ + 396, + 1 + ], + [ + 397, + 1 + ], + [ + 398, + 1 + ], + [ + 399, + 1 + ], + [ + 400, + 1 + ], + [ + 401, + 1 + ], + [ + 402, + 1 + ], + [ + 403, + 1 + ], + [ + 404, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 390, + -1 + ], + [ + 391, + -1 + ], + [ + 392, + -1 + ], + [ + 393, + -1 + ], + [ + 394, + -1 + ], + [ + 395, + -1 + ], + [ + 396, + -1 + ], + [ + 397, + -1 + ], + [ + 398, + -1 + ], + [ + 399, + -1 + ], + [ + 400, + -1 + ], + [ + 401, + -1 + ], + [ + 402, + -1 + ], + [ + 403, + -1 + ], + [ + 404, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 390, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 391, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 392, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 393, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 394, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 395, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 396, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 397, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 398, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 399, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 400, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 401, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 402, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 403, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 404, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 405, + 1 + ], + [ + 406, + 1 + ], + [ + 407, + 1 + ], + [ + 408, + 1 + ], + [ + 409, + 1 + ], + [ + 410, + 1 + ], + [ + 411, + 1 + ], + [ + 412, + 1 + ], + [ + 413, + 1 + ], + [ + 414, + 1 + ], + [ + 415, + 1 + ], + [ + 416, + 1 + ], + [ + 417, + 1 + ], + [ + 418, + 1 + ], + [ + 419, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 405, + -1 + ], + [ + 406, + -1 + ], + [ + 407, + -1 + ], + [ + 408, + -1 + ], + [ + 409, + -1 + ], + [ + 410, + -1 + ], + [ + 411, + -1 + ], + [ + 412, + -1 + ], + [ + 413, + -1 + ], + [ + 414, + -1 + ], + [ + 415, + -1 + ], + [ + 416, + -1 + ], + [ + 417, + -1 + ], + [ + 418, + -1 + ], + [ + 419, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 405, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 406, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 407, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 408, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 409, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 410, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 411, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 412, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 413, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 414, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 415, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 416, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 417, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 418, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 419, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 420, + 1 + ], + [ + 421, + 1 + ], + [ + 422, + 1 + ], + [ + 423, + 1 + ], + [ + 424, + 1 + ], + [ + 425, + 1 + ], + [ + 426, + 1 + ], + [ + 427, + 1 + ], + [ + 428, + 1 + ], + [ + 429, + 1 + ], + [ + 430, + 1 + ], + [ + 431, + 1 + ], + [ + 432, + 1 + ], + [ + 433, + 1 + ], + [ + 434, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 420, + -1 + ], + [ + 421, + -1 + ], + [ + 422, + -1 + ], + [ + 423, + -1 + ], + [ + 424, + -1 + ], + [ + 425, + -1 + ], + [ + 426, + -1 + ], + [ + 427, + -1 + ], + [ + 428, + -1 + ], + [ + 429, + -1 + ], + [ + 430, + -1 + ], + [ + 431, + -1 + ], + [ + 432, + -1 + ], + [ + 433, + -1 + ], + [ + 434, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 420, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 421, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 422, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 423, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 424, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 425, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 426, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 427, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 428, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 429, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 430, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 431, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 432, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 433, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 434, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 435, + 1 + ], + [ + 436, + 1 + ], + [ + 437, + 1 + ], + [ + 438, + 1 + ], + [ + 439, + 1 + ], + [ + 440, + 1 + ], + [ + 441, + 1 + ], + [ + 442, + 1 + ], + [ + 443, + 1 + ], + [ + 444, + 1 + ], + [ + 445, + 1 + ], + [ + 446, + 1 + ], + [ + 447, + 1 + ], + [ + 448, + 1 + ], + [ + 449, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 435, + -1 + ], + [ + 436, + -1 + ], + [ + 437, + -1 + ], + [ + 438, + -1 + ], + [ + 439, + -1 + ], + [ + 440, + -1 + ], + [ + 441, + -1 + ], + [ + 442, + -1 + ], + [ + 443, + -1 + ], + [ + 444, + -1 + ], + [ + 445, + -1 + ], + [ + 446, + -1 + ], + [ + 447, + -1 + ], + [ + 448, + -1 + ], + [ + 449, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 435, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 436, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 437, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 438, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 439, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 440, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 441, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 442, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 443, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 444, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 445, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 446, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 447, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 448, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 449, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 450, + 1 + ], + [ + 451, + 1 + ], + [ + 452, + 1 + ], + [ + 453, + 1 + ], + [ + 454, + 1 + ], + [ + 455, + 1 + ], + [ + 456, + 1 + ], + [ + 457, + 1 + ], + [ + 458, + 1 + ], + [ + 459, + 1 + ], + [ + 460, + 1 + ], + [ + 461, + 1 + ], + [ + 462, + 1 + ], + [ + 463, + 1 + ], + [ + 464, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 450, + -1 + ], + [ + 451, + -1 + ], + [ + 452, + -1 + ], + [ + 453, + -1 + ], + [ + 454, + -1 + ], + [ + 455, + -1 + ], + [ + 456, + -1 + ], + [ + 457, + -1 + ], + [ + 458, + -1 + ], + [ + 459, + -1 + ], + [ + 460, + -1 + ], + [ + 461, + -1 + ], + [ + 462, + -1 + ], + [ + 463, + -1 + ], + [ + 464, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 450, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 451, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 452, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 453, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 454, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 455, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 456, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 457, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 458, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + 1 + ], + [ + 459, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 460, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 461, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 462, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + 1 + ], + [ + 463, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 464, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 15, + "customers": 30, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 54, + 38, + 46, + 45, + 29, + 31 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 17, + 23, + 10, + 17, + 4, + 18 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 14, + 14, + 37, + 44, + 31, + 19 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 18, + 24, + 9, + 16, + 11, + 27 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 28, + 28, + 17, + 14, + 13, + 23 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 19, + 17, + 44, + 51, + 38, + 22 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 17, + 11, + 22, + 29, + 16, + 16 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 19, + 25, + 8, + 15, + 2, + 20 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 14, + 24, + 13, + 20, + 13, + 29 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 26, + 2, + 33, + 40, + 27, + 7 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 20, + 16, + 45, + 52, + 39, + 21 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 30, + 14, + 19, + 26, + 15, + 9 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 10, + 28, + 17, + 24, + 17, + 33 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 31, + 37, + 6, + 3, + 12, + 32 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 17, + 43, + 28, + 31, + 32, + 48 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 14, + 20, + 13, + 20, + 9, + 25 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 13, + 15, + 28, + 35, + 22, + 20 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 11, + 17, + 22, + 29, + 16, + 22 + ], + [ + 47, + 22, + 31, + 36, + 21, + 29, + 23, + 7, + 18, + 15, + 13, + 40, + 47, + 34, + 18 + ], + [ + 24, + 43, + 10, + 9, + 36, + 2, + 38, + 28, + 21, + 14, + 38, + 23, + 26, + 27, + 43 + ], + [ + 25, + 6, + 39, + 40, + 13, + 47, + 11, + 29, + 28, + 37, + 17, + 26, + 23, + 22, + 12 + ], + [ + 23, + 38, + 7, + 12, + 31, + 5, + 33, + 25, + 16, + 11, + 33, + 18, + 23, + 22, + 38 + ], + [ + 53, + 28, + 37, + 42, + 27, + 35, + 29, + 7, + 24, + 21, + 17, + 46, + 53, + 40, + 22 + ], + [ + 25, + 44, + 11, + 14, + 37, + 7, + 39, + 23, + 22, + 13, + 39, + 24, + 27, + 28, + 44 + ], + [ + 34, + 37, + 18, + 23, + 30, + 16, + 32, + 14, + 15, + 6, + 32, + 27, + 34, + 21, + 37 + ], + [ + 16, + 13, + 22, + 23, + 12, + 30, + 10, + 32, + 15, + 20, + 24, + 9, + 16, + 5, + 19 + ], + [ + 10, + 17, + 18, + 19, + 18, + 26, + 16, + 38, + 21, + 24, + 30, + 5, + 10, + 5, + 25 + ], + [ + 41, + 32, + 25, + 30, + 25, + 23, + 27, + 9, + 12, + 9, + 27, + 34, + 41, + 28, + 32 + ], + [ + 39, + 14, + 23, + 28, + 13, + 31, + 15, + 13, + 12, + 21, + 7, + 32, + 39, + 26, + 12 + ], + [ + 31, + 42, + 15, + 20, + 35, + 13, + 37, + 19, + 20, + 11, + 37, + 24, + 31, + 26, + 42 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 465, + "variables": 465, + "rows": 510, + "nonzeros": 1800, + "globals": 0 + }, + "input_variables": 465, + "model_variables": 465, + "modelled_variables": 465, + "size_unit": "sites" + }, + "json_sha256": "ff6511f8ba4ed03e5fcab03138d97458da4d82a884b8305fe2a733aa34331ef3", + "txt_sha256": "cae9724cb3583a976dd4a57d7c933c1e4f97bfef4868b0b3de08cf03af947b9a" + }, + { + "id": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "model": { + "id": "bin_packing_single_16", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 102, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 96, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 97, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 98, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 99, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 100, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 101, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + 18 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 16, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10 + ], + "capacity": 18, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 102, + "variables": 102, + "rows": 139, + "nonzeros": 496, + "globals": 0 + }, + "input_variables": 102, + "model_variables": 102, + "modelled_variables": 102, + "size_unit": "items" + }, + "json_sha256": "ab23b38e4f288cb36da155c3612d1c2d45815c492581fb326e5f8bb42a253c85", + "txt_sha256": "d538c983783ee5d86b07eb018f797508410b687242f61d1c7d0857059c664e6d" + }, + { + "id": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "model": { + "id": "bin_packing_single_32", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 363, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 289, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 290, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 291, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 292, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 293, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 294, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 295, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 296, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 298, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 299, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 300, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 301, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 302, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 303, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 305, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 306, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 307, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 309, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 310, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 311, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 312, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 313, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 314, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 315, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 316, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 317, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 318, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 321, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 322, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 323, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 324, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 325, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 326, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 327, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 328, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 329, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 331, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 332, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 333, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 334, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 335, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 337, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 338, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 339, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 340, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ], + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ], + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 341, + -1 + ], + [ + 352, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 342, + -1 + ], + [ + 353, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 343, + -1 + ], + [ + 354, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 344, + -1 + ], + [ + 355, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 345, + -1 + ], + [ + 356, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 346, + -1 + ], + [ + 357, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 347, + -1 + ], + [ + 358, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 348, + -1 + ], + [ + 359, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 349, + -1 + ], + [ + 360, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 350, + -1 + ], + [ + 361, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 351, + -1 + ], + [ + 362, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 11, + -6 + ], + [ + 22, + -3 + ], + [ + 33, + -4 + ], + [ + 44, + -7 + ], + [ + 55, + -7 + ], + [ + 66, + -6 + ], + [ + 77, + -2 + ], + [ + 88, + -3 + ], + [ + 99, + -4 + ], + [ + 110, + -4 + ], + [ + 121, + -4 + ], + [ + 132, + -8 + ], + [ + 143, + -10 + ], + [ + 154, + -7 + ], + [ + 165, + -10 + ], + [ + 176, + -3 + ], + [ + 187, + -9 + ], + [ + 198, + -6 + ], + [ + 209, + -4 + ], + [ + 220, + -6 + ], + [ + 231, + -3 + ], + [ + 242, + -5 + ], + [ + 253, + -7 + ], + [ + 264, + -8 + ], + [ + 275, + -5 + ], + [ + 286, + -9 + ], + [ + 297, + -10 + ], + [ + 308, + -9 + ], + [ + 319, + -10 + ], + [ + 330, + -4 + ], + [ + 341, + -9 + ], + [ + 352, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 12, + -6 + ], + [ + 23, + -3 + ], + [ + 34, + -4 + ], + [ + 45, + -7 + ], + [ + 56, + -7 + ], + [ + 67, + -6 + ], + [ + 78, + -2 + ], + [ + 89, + -3 + ], + [ + 100, + -4 + ], + [ + 111, + -4 + ], + [ + 122, + -4 + ], + [ + 133, + -8 + ], + [ + 144, + -10 + ], + [ + 155, + -7 + ], + [ + 166, + -10 + ], + [ + 177, + -3 + ], + [ + 188, + -9 + ], + [ + 199, + -6 + ], + [ + 210, + -4 + ], + [ + 221, + -6 + ], + [ + 232, + -3 + ], + [ + 243, + -5 + ], + [ + 254, + -7 + ], + [ + 265, + -8 + ], + [ + 276, + -5 + ], + [ + 287, + -9 + ], + [ + 298, + -10 + ], + [ + 309, + -9 + ], + [ + 320, + -10 + ], + [ + 331, + -4 + ], + [ + 342, + -9 + ], + [ + 353, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 13, + -6 + ], + [ + 24, + -3 + ], + [ + 35, + -4 + ], + [ + 46, + -7 + ], + [ + 57, + -7 + ], + [ + 68, + -6 + ], + [ + 79, + -2 + ], + [ + 90, + -3 + ], + [ + 101, + -4 + ], + [ + 112, + -4 + ], + [ + 123, + -4 + ], + [ + 134, + -8 + ], + [ + 145, + -10 + ], + [ + 156, + -7 + ], + [ + 167, + -10 + ], + [ + 178, + -3 + ], + [ + 189, + -9 + ], + [ + 200, + -6 + ], + [ + 211, + -4 + ], + [ + 222, + -6 + ], + [ + 233, + -3 + ], + [ + 244, + -5 + ], + [ + 255, + -7 + ], + [ + 266, + -8 + ], + [ + 277, + -5 + ], + [ + 288, + -9 + ], + [ + 299, + -10 + ], + [ + 310, + -9 + ], + [ + 321, + -10 + ], + [ + 332, + -4 + ], + [ + 343, + -9 + ], + [ + 354, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 14, + -6 + ], + [ + 25, + -3 + ], + [ + 36, + -4 + ], + [ + 47, + -7 + ], + [ + 58, + -7 + ], + [ + 69, + -6 + ], + [ + 80, + -2 + ], + [ + 91, + -3 + ], + [ + 102, + -4 + ], + [ + 113, + -4 + ], + [ + 124, + -4 + ], + [ + 135, + -8 + ], + [ + 146, + -10 + ], + [ + 157, + -7 + ], + [ + 168, + -10 + ], + [ + 179, + -3 + ], + [ + 190, + -9 + ], + [ + 201, + -6 + ], + [ + 212, + -4 + ], + [ + 223, + -6 + ], + [ + 234, + -3 + ], + [ + 245, + -5 + ], + [ + 256, + -7 + ], + [ + 267, + -8 + ], + [ + 278, + -5 + ], + [ + 289, + -9 + ], + [ + 300, + -10 + ], + [ + 311, + -9 + ], + [ + 322, + -10 + ], + [ + 333, + -4 + ], + [ + 344, + -9 + ], + [ + 355, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 15, + -6 + ], + [ + 26, + -3 + ], + [ + 37, + -4 + ], + [ + 48, + -7 + ], + [ + 59, + -7 + ], + [ + 70, + -6 + ], + [ + 81, + -2 + ], + [ + 92, + -3 + ], + [ + 103, + -4 + ], + [ + 114, + -4 + ], + [ + 125, + -4 + ], + [ + 136, + -8 + ], + [ + 147, + -10 + ], + [ + 158, + -7 + ], + [ + 169, + -10 + ], + [ + 180, + -3 + ], + [ + 191, + -9 + ], + [ + 202, + -6 + ], + [ + 213, + -4 + ], + [ + 224, + -6 + ], + [ + 235, + -3 + ], + [ + 246, + -5 + ], + [ + 257, + -7 + ], + [ + 268, + -8 + ], + [ + 279, + -5 + ], + [ + 290, + -9 + ], + [ + 301, + -10 + ], + [ + 312, + -9 + ], + [ + 323, + -10 + ], + [ + 334, + -4 + ], + [ + 345, + -9 + ], + [ + 356, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 16, + -6 + ], + [ + 27, + -3 + ], + [ + 38, + -4 + ], + [ + 49, + -7 + ], + [ + 60, + -7 + ], + [ + 71, + -6 + ], + [ + 82, + -2 + ], + [ + 93, + -3 + ], + [ + 104, + -4 + ], + [ + 115, + -4 + ], + [ + 126, + -4 + ], + [ + 137, + -8 + ], + [ + 148, + -10 + ], + [ + 159, + -7 + ], + [ + 170, + -10 + ], + [ + 181, + -3 + ], + [ + 192, + -9 + ], + [ + 203, + -6 + ], + [ + 214, + -4 + ], + [ + 225, + -6 + ], + [ + 236, + -3 + ], + [ + 247, + -5 + ], + [ + 258, + -7 + ], + [ + 269, + -8 + ], + [ + 280, + -5 + ], + [ + 291, + -9 + ], + [ + 302, + -10 + ], + [ + 313, + -9 + ], + [ + 324, + -10 + ], + [ + 335, + -4 + ], + [ + 346, + -9 + ], + [ + 357, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 17, + -6 + ], + [ + 28, + -3 + ], + [ + 39, + -4 + ], + [ + 50, + -7 + ], + [ + 61, + -7 + ], + [ + 72, + -6 + ], + [ + 83, + -2 + ], + [ + 94, + -3 + ], + [ + 105, + -4 + ], + [ + 116, + -4 + ], + [ + 127, + -4 + ], + [ + 138, + -8 + ], + [ + 149, + -10 + ], + [ + 160, + -7 + ], + [ + 171, + -10 + ], + [ + 182, + -3 + ], + [ + 193, + -9 + ], + [ + 204, + -6 + ], + [ + 215, + -4 + ], + [ + 226, + -6 + ], + [ + 237, + -3 + ], + [ + 248, + -5 + ], + [ + 259, + -7 + ], + [ + 270, + -8 + ], + [ + 281, + -5 + ], + [ + 292, + -9 + ], + [ + 303, + -10 + ], + [ + 314, + -9 + ], + [ + 325, + -10 + ], + [ + 336, + -4 + ], + [ + 347, + -9 + ], + [ + 358, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 18, + -6 + ], + [ + 29, + -3 + ], + [ + 40, + -4 + ], + [ + 51, + -7 + ], + [ + 62, + -7 + ], + [ + 73, + -6 + ], + [ + 84, + -2 + ], + [ + 95, + -3 + ], + [ + 106, + -4 + ], + [ + 117, + -4 + ], + [ + 128, + -4 + ], + [ + 139, + -8 + ], + [ + 150, + -10 + ], + [ + 161, + -7 + ], + [ + 172, + -10 + ], + [ + 183, + -3 + ], + [ + 194, + -9 + ], + [ + 205, + -6 + ], + [ + 216, + -4 + ], + [ + 227, + -6 + ], + [ + 238, + -3 + ], + [ + 249, + -5 + ], + [ + 260, + -7 + ], + [ + 271, + -8 + ], + [ + 282, + -5 + ], + [ + 293, + -9 + ], + [ + 304, + -10 + ], + [ + 315, + -9 + ], + [ + 326, + -10 + ], + [ + 337, + -4 + ], + [ + 348, + -9 + ], + [ + 359, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 19, + -6 + ], + [ + 30, + -3 + ], + [ + 41, + -4 + ], + [ + 52, + -7 + ], + [ + 63, + -7 + ], + [ + 74, + -6 + ], + [ + 85, + -2 + ], + [ + 96, + -3 + ], + [ + 107, + -4 + ], + [ + 118, + -4 + ], + [ + 129, + -4 + ], + [ + 140, + -8 + ], + [ + 151, + -10 + ], + [ + 162, + -7 + ], + [ + 173, + -10 + ], + [ + 184, + -3 + ], + [ + 195, + -9 + ], + [ + 206, + -6 + ], + [ + 217, + -4 + ], + [ + 228, + -6 + ], + [ + 239, + -3 + ], + [ + 250, + -5 + ], + [ + 261, + -7 + ], + [ + 272, + -8 + ], + [ + 283, + -5 + ], + [ + 294, + -9 + ], + [ + 305, + -10 + ], + [ + 316, + -9 + ], + [ + 327, + -10 + ], + [ + 338, + -4 + ], + [ + 349, + -9 + ], + [ + 360, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 20, + -6 + ], + [ + 31, + -3 + ], + [ + 42, + -4 + ], + [ + 53, + -7 + ], + [ + 64, + -7 + ], + [ + 75, + -6 + ], + [ + 86, + -2 + ], + [ + 97, + -3 + ], + [ + 108, + -4 + ], + [ + 119, + -4 + ], + [ + 130, + -4 + ], + [ + 141, + -8 + ], + [ + 152, + -10 + ], + [ + 163, + -7 + ], + [ + 174, + -10 + ], + [ + 185, + -3 + ], + [ + 196, + -9 + ], + [ + 207, + -6 + ], + [ + 218, + -4 + ], + [ + 229, + -6 + ], + [ + 240, + -3 + ], + [ + 251, + -5 + ], + [ + 262, + -7 + ], + [ + 273, + -8 + ], + [ + 284, + -5 + ], + [ + 295, + -9 + ], + [ + 306, + -10 + ], + [ + 317, + -9 + ], + [ + 328, + -10 + ], + [ + 339, + -4 + ], + [ + 350, + -9 + ], + [ + 361, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -3 + ], + [ + 21, + -6 + ], + [ + 32, + -3 + ], + [ + 43, + -4 + ], + [ + 54, + -7 + ], + [ + 65, + -7 + ], + [ + 76, + -6 + ], + [ + 87, + -2 + ], + [ + 98, + -3 + ], + [ + 109, + -4 + ], + [ + 120, + -4 + ], + [ + 131, + -4 + ], + [ + 142, + -8 + ], + [ + 153, + -10 + ], + [ + 164, + -7 + ], + [ + 175, + -10 + ], + [ + 186, + -3 + ], + [ + 197, + -9 + ], + [ + 208, + -6 + ], + [ + 219, + -4 + ], + [ + 230, + -6 + ], + [ + 241, + -3 + ], + [ + 252, + -5 + ], + [ + 263, + -7 + ], + [ + 274, + -8 + ], + [ + 285, + -5 + ], + [ + 296, + -9 + ], + [ + 307, + -10 + ], + [ + 318, + -9 + ], + [ + 329, + -10 + ], + [ + 340, + -4 + ], + [ + 351, + -9 + ], + [ + 362, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 352, + 1 + ], + [ + 353, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 353, + 1 + ], + [ + 354, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 354, + 1 + ], + [ + 355, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 355, + 1 + ], + [ + 356, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 356, + 1 + ], + [ + 357, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 357, + 1 + ], + [ + 358, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 358, + 1 + ], + [ + 359, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 359, + 1 + ], + [ + 360, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 360, + 1 + ], + [ + 361, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 361, + 1 + ], + [ + 362, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 32, + "bins": 11, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10, + 9, + 10, + 4, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 363, + "variables": 363, + "rows": 437, + "nonzeros": 1791, + "globals": 0 + }, + "input_variables": 363, + "model_variables": 363, + "modelled_variables": 363, + "size_unit": "items" + }, + "json_sha256": "7298fd6ca66193cc1f1fb3311b582f770b210321f0848497aef42640247a3e34", + "txt_sha256": "01f2b0a3fbedc211ab868a4340df6ab66f2f34e214ad28e0d79193152c93e2e5" + }, + { + "id": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "model": { + "id": "bin_packing_single_24", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 200, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 192, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 193, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 194, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 195, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 196, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 197, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 198, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 199, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 8, + -6 + ], + [ + 16, + -3 + ], + [ + 24, + -4 + ], + [ + 32, + -7 + ], + [ + 40, + -7 + ], + [ + 48, + -6 + ], + [ + 56, + -2 + ], + [ + 64, + -3 + ], + [ + 72, + -4 + ], + [ + 80, + -4 + ], + [ + 88, + -4 + ], + [ + 96, + -8 + ], + [ + 104, + -10 + ], + [ + 112, + -7 + ], + [ + 120, + -10 + ], + [ + 128, + -3 + ], + [ + 136, + -9 + ], + [ + 144, + -6 + ], + [ + 152, + -4 + ], + [ + 160, + -6 + ], + [ + 168, + -3 + ], + [ + 176, + -5 + ], + [ + 184, + -7 + ], + [ + 192, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 9, + -6 + ], + [ + 17, + -3 + ], + [ + 25, + -4 + ], + [ + 33, + -7 + ], + [ + 41, + -7 + ], + [ + 49, + -6 + ], + [ + 57, + -2 + ], + [ + 65, + -3 + ], + [ + 73, + -4 + ], + [ + 81, + -4 + ], + [ + 89, + -4 + ], + [ + 97, + -8 + ], + [ + 105, + -10 + ], + [ + 113, + -7 + ], + [ + 121, + -10 + ], + [ + 129, + -3 + ], + [ + 137, + -9 + ], + [ + 145, + -6 + ], + [ + 153, + -4 + ], + [ + 161, + -6 + ], + [ + 169, + -3 + ], + [ + 177, + -5 + ], + [ + 185, + -7 + ], + [ + 193, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 10, + -6 + ], + [ + 18, + -3 + ], + [ + 26, + -4 + ], + [ + 34, + -7 + ], + [ + 42, + -7 + ], + [ + 50, + -6 + ], + [ + 58, + -2 + ], + [ + 66, + -3 + ], + [ + 74, + -4 + ], + [ + 82, + -4 + ], + [ + 90, + -4 + ], + [ + 98, + -8 + ], + [ + 106, + -10 + ], + [ + 114, + -7 + ], + [ + 122, + -10 + ], + [ + 130, + -3 + ], + [ + 138, + -9 + ], + [ + 146, + -6 + ], + [ + 154, + -4 + ], + [ + 162, + -6 + ], + [ + 170, + -3 + ], + [ + 178, + -5 + ], + [ + 186, + -7 + ], + [ + 194, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 11, + -6 + ], + [ + 19, + -3 + ], + [ + 27, + -4 + ], + [ + 35, + -7 + ], + [ + 43, + -7 + ], + [ + 51, + -6 + ], + [ + 59, + -2 + ], + [ + 67, + -3 + ], + [ + 75, + -4 + ], + [ + 83, + -4 + ], + [ + 91, + -4 + ], + [ + 99, + -8 + ], + [ + 107, + -10 + ], + [ + 115, + -7 + ], + [ + 123, + -10 + ], + [ + 131, + -3 + ], + [ + 139, + -9 + ], + [ + 147, + -6 + ], + [ + 155, + -4 + ], + [ + 163, + -6 + ], + [ + 171, + -3 + ], + [ + 179, + -5 + ], + [ + 187, + -7 + ], + [ + 195, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 12, + -6 + ], + [ + 20, + -3 + ], + [ + 28, + -4 + ], + [ + 36, + -7 + ], + [ + 44, + -7 + ], + [ + 52, + -6 + ], + [ + 60, + -2 + ], + [ + 68, + -3 + ], + [ + 76, + -4 + ], + [ + 84, + -4 + ], + [ + 92, + -4 + ], + [ + 100, + -8 + ], + [ + 108, + -10 + ], + [ + 116, + -7 + ], + [ + 124, + -10 + ], + [ + 132, + -3 + ], + [ + 140, + -9 + ], + [ + 148, + -6 + ], + [ + 156, + -4 + ], + [ + 164, + -6 + ], + [ + 172, + -3 + ], + [ + 180, + -5 + ], + [ + 188, + -7 + ], + [ + 196, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 13, + -6 + ], + [ + 21, + -3 + ], + [ + 29, + -4 + ], + [ + 37, + -7 + ], + [ + 45, + -7 + ], + [ + 53, + -6 + ], + [ + 61, + -2 + ], + [ + 69, + -3 + ], + [ + 77, + -4 + ], + [ + 85, + -4 + ], + [ + 93, + -4 + ], + [ + 101, + -8 + ], + [ + 109, + -10 + ], + [ + 117, + -7 + ], + [ + 125, + -10 + ], + [ + 133, + -3 + ], + [ + 141, + -9 + ], + [ + 149, + -6 + ], + [ + 157, + -4 + ], + [ + 165, + -6 + ], + [ + 173, + -3 + ], + [ + 181, + -5 + ], + [ + 189, + -7 + ], + [ + 197, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 14, + -6 + ], + [ + 22, + -3 + ], + [ + 30, + -4 + ], + [ + 38, + -7 + ], + [ + 46, + -7 + ], + [ + 54, + -6 + ], + [ + 62, + -2 + ], + [ + 70, + -3 + ], + [ + 78, + -4 + ], + [ + 86, + -4 + ], + [ + 94, + -4 + ], + [ + 102, + -8 + ], + [ + 110, + -10 + ], + [ + 118, + -7 + ], + [ + 126, + -10 + ], + [ + 134, + -3 + ], + [ + 142, + -9 + ], + [ + 150, + -6 + ], + [ + 158, + -4 + ], + [ + 166, + -6 + ], + [ + 174, + -3 + ], + [ + 182, + -5 + ], + [ + 190, + -7 + ], + [ + 198, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 15, + -6 + ], + [ + 23, + -3 + ], + [ + 31, + -4 + ], + [ + 39, + -7 + ], + [ + 47, + -7 + ], + [ + 55, + -6 + ], + [ + 63, + -2 + ], + [ + 71, + -3 + ], + [ + 79, + -4 + ], + [ + 87, + -4 + ], + [ + 95, + -4 + ], + [ + 103, + -8 + ], + [ + 111, + -10 + ], + [ + 119, + -7 + ], + [ + 127, + -10 + ], + [ + 135, + -3 + ], + [ + 143, + -9 + ], + [ + 151, + -6 + ], + [ + 159, + -4 + ], + [ + 167, + -6 + ], + [ + 175, + -3 + ], + [ + 183, + -5 + ], + [ + 191, + -7 + ], + [ + 199, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + 1 + ], + [ + 194, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + 1 + ], + [ + 195, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + 1 + ], + [ + 196, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + 1 + ], + [ + 197, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + 1 + ], + [ + 198, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + 1 + ], + [ + 199, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 24, + "bins": 8, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 200, + "variables": 200, + "rows": 255, + "nonzeros": 982, + "globals": 0 + }, + "input_variables": 200, + "model_variables": 200, + "modelled_variables": 200, + "size_unit": "items" + }, + "json_sha256": "24dd85d59f39979fed67f9b991924b3423436ea4aeb2e92fcb264123bb515c33", + "txt_sha256": "531a3642198ce1cecaeffef4bc352a18bce764f34fec4107354599527f2d2268" + }, + { + "id": "bin_packing-20-single", + "category": "bin_packing", + "size": 20, + "variant": "single", + "model": { + "id": "bin_packing_single_20", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 147, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 140, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 141, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 142, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 143, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 144, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 145, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 146, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 7, + -6 + ], + [ + 14, + -3 + ], + [ + 21, + -4 + ], + [ + 28, + -7 + ], + [ + 35, + -7 + ], + [ + 42, + -6 + ], + [ + 49, + -2 + ], + [ + 56, + -3 + ], + [ + 63, + -4 + ], + [ + 70, + -4 + ], + [ + 77, + -4 + ], + [ + 84, + -8 + ], + [ + 91, + -10 + ], + [ + 98, + -7 + ], + [ + 105, + -10 + ], + [ + 112, + -3 + ], + [ + 119, + -9 + ], + [ + 126, + -6 + ], + [ + 133, + -4 + ], + [ + 140, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 8, + -6 + ], + [ + 15, + -3 + ], + [ + 22, + -4 + ], + [ + 29, + -7 + ], + [ + 36, + -7 + ], + [ + 43, + -6 + ], + [ + 50, + -2 + ], + [ + 57, + -3 + ], + [ + 64, + -4 + ], + [ + 71, + -4 + ], + [ + 78, + -4 + ], + [ + 85, + -8 + ], + [ + 92, + -10 + ], + [ + 99, + -7 + ], + [ + 106, + -10 + ], + [ + 113, + -3 + ], + [ + 120, + -9 + ], + [ + 127, + -6 + ], + [ + 134, + -4 + ], + [ + 141, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 9, + -6 + ], + [ + 16, + -3 + ], + [ + 23, + -4 + ], + [ + 30, + -7 + ], + [ + 37, + -7 + ], + [ + 44, + -6 + ], + [ + 51, + -2 + ], + [ + 58, + -3 + ], + [ + 65, + -4 + ], + [ + 72, + -4 + ], + [ + 79, + -4 + ], + [ + 86, + -8 + ], + [ + 93, + -10 + ], + [ + 100, + -7 + ], + [ + 107, + -10 + ], + [ + 114, + -3 + ], + [ + 121, + -9 + ], + [ + 128, + -6 + ], + [ + 135, + -4 + ], + [ + 142, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 10, + -6 + ], + [ + 17, + -3 + ], + [ + 24, + -4 + ], + [ + 31, + -7 + ], + [ + 38, + -7 + ], + [ + 45, + -6 + ], + [ + 52, + -2 + ], + [ + 59, + -3 + ], + [ + 66, + -4 + ], + [ + 73, + -4 + ], + [ + 80, + -4 + ], + [ + 87, + -8 + ], + [ + 94, + -10 + ], + [ + 101, + -7 + ], + [ + 108, + -10 + ], + [ + 115, + -3 + ], + [ + 122, + -9 + ], + [ + 129, + -6 + ], + [ + 136, + -4 + ], + [ + 143, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 11, + -6 + ], + [ + 18, + -3 + ], + [ + 25, + -4 + ], + [ + 32, + -7 + ], + [ + 39, + -7 + ], + [ + 46, + -6 + ], + [ + 53, + -2 + ], + [ + 60, + -3 + ], + [ + 67, + -4 + ], + [ + 74, + -4 + ], + [ + 81, + -4 + ], + [ + 88, + -8 + ], + [ + 95, + -10 + ], + [ + 102, + -7 + ], + [ + 109, + -10 + ], + [ + 116, + -3 + ], + [ + 123, + -9 + ], + [ + 130, + -6 + ], + [ + 137, + -4 + ], + [ + 144, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 12, + -6 + ], + [ + 19, + -3 + ], + [ + 26, + -4 + ], + [ + 33, + -7 + ], + [ + 40, + -7 + ], + [ + 47, + -6 + ], + [ + 54, + -2 + ], + [ + 61, + -3 + ], + [ + 68, + -4 + ], + [ + 75, + -4 + ], + [ + 82, + -4 + ], + [ + 89, + -8 + ], + [ + 96, + -10 + ], + [ + 103, + -7 + ], + [ + 110, + -10 + ], + [ + 117, + -3 + ], + [ + 124, + -9 + ], + [ + 131, + -6 + ], + [ + 138, + -4 + ], + [ + 145, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 13, + -6 + ], + [ + 20, + -3 + ], + [ + 27, + -4 + ], + [ + 34, + -7 + ], + [ + 41, + -7 + ], + [ + 48, + -6 + ], + [ + 55, + -2 + ], + [ + 62, + -3 + ], + [ + 69, + -4 + ], + [ + 76, + -4 + ], + [ + 83, + -4 + ], + [ + 90, + -8 + ], + [ + 97, + -10 + ], + [ + 104, + -7 + ], + [ + 111, + -10 + ], + [ + 118, + -3 + ], + [ + 125, + -9 + ], + [ + 132, + -6 + ], + [ + 139, + -4 + ], + [ + 146, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 20, + "bins": 7, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 147, + "variables": 147, + "rows": 193, + "nonzeros": 719, + "globals": 0 + }, + "input_variables": 147, + "model_variables": 147, + "modelled_variables": 147, + "size_unit": "items" + }, + "json_sha256": "b5d72feb251cc62e4b1c353c37ede0f507cc1ac353616644ce4209204957e9b1", + "txt_sha256": "3d1a49d86dbbb883d09f09d54c4116fb90d16b689421cade8a0f1d0fde16b0b5" + }, + { + "id": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "model": { + "id": "bin_packing_single_18", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 114, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + -3 + ], + [ + 102, + -9 + ], + [ + 108, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + -3 + ], + [ + 103, + -9 + ], + [ + 109, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + -3 + ], + [ + 104, + -9 + ], + [ + 110, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + -3 + ], + [ + 105, + -9 + ], + [ + 111, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + -3 + ], + [ + 106, + -9 + ], + [ + 112, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + -3 + ], + [ + 107, + -9 + ], + [ + 113, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 18, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 114, + "variables": 114, + "rows": 155, + "nonzeros": 556, + "globals": 0 + }, + "input_variables": 114, + "model_variables": 114, + "modelled_variables": 114, + "size_unit": "items" + }, + "json_sha256": "be46d22bc3c55ef31810dbe72abf6ae58cfbec40d59051e862a7cd96d5fc5d21", + "txt_sha256": "28c54c1da14a556c1c8a807af4ab9fc0101d60cda4f326a87cdc956a3a97996b" + }, + { + "id": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "model": { + "id": "bin_packing_single_17", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 17, + "natural_size": 17, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 108, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 102, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 103, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 104, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 105, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 106, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 107, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + -3 + ], + [ + 102, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + -3 + ], + [ + 103, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + -3 + ], + [ + 104, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + -3 + ], + [ + 105, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + -3 + ], + [ + 106, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + -3 + ], + [ + 107, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 17, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 108, + "variables": 108, + "rows": 147, + "nonzeros": 526, + "globals": 0 + }, + "input_variables": 108, + "model_variables": 108, + "modelled_variables": 108, + "size_unit": "items" + }, + "json_sha256": "f75e648545e33e44bf4163a7f18a9fa95454d344ff7db1c908ee483b4179e808", + "txt_sha256": "5575c3d1e1c847bc377f83c6385231d828429df31165b3390f48f4e88bfcfc68" + }, + { + "id": "bin_packing-28-single", + "category": "bin_packing", + "size": 28, + "variant": "single", + "model": { + "id": "bin_packing_single_28", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 28, + "natural_size": 28, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 290, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 280, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 281, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 282, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 283, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 284, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 285, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 286, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 287, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 288, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 289, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 10, + -6 + ], + [ + 20, + -3 + ], + [ + 30, + -4 + ], + [ + 40, + -7 + ], + [ + 50, + -7 + ], + [ + 60, + -6 + ], + [ + 70, + -2 + ], + [ + 80, + -3 + ], + [ + 90, + -4 + ], + [ + 100, + -4 + ], + [ + 110, + -4 + ], + [ + 120, + -8 + ], + [ + 130, + -10 + ], + [ + 140, + -7 + ], + [ + 150, + -10 + ], + [ + 160, + -3 + ], + [ + 170, + -9 + ], + [ + 180, + -6 + ], + [ + 190, + -4 + ], + [ + 200, + -6 + ], + [ + 210, + -3 + ], + [ + 220, + -5 + ], + [ + 230, + -7 + ], + [ + 240, + -8 + ], + [ + 250, + -5 + ], + [ + 260, + -9 + ], + [ + 270, + -10 + ], + [ + 280, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 11, + -6 + ], + [ + 21, + -3 + ], + [ + 31, + -4 + ], + [ + 41, + -7 + ], + [ + 51, + -7 + ], + [ + 61, + -6 + ], + [ + 71, + -2 + ], + [ + 81, + -3 + ], + [ + 91, + -4 + ], + [ + 101, + -4 + ], + [ + 111, + -4 + ], + [ + 121, + -8 + ], + [ + 131, + -10 + ], + [ + 141, + -7 + ], + [ + 151, + -10 + ], + [ + 161, + -3 + ], + [ + 171, + -9 + ], + [ + 181, + -6 + ], + [ + 191, + -4 + ], + [ + 201, + -6 + ], + [ + 211, + -3 + ], + [ + 221, + -5 + ], + [ + 231, + -7 + ], + [ + 241, + -8 + ], + [ + 251, + -5 + ], + [ + 261, + -9 + ], + [ + 271, + -10 + ], + [ + 281, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 12, + -6 + ], + [ + 22, + -3 + ], + [ + 32, + -4 + ], + [ + 42, + -7 + ], + [ + 52, + -7 + ], + [ + 62, + -6 + ], + [ + 72, + -2 + ], + [ + 82, + -3 + ], + [ + 92, + -4 + ], + [ + 102, + -4 + ], + [ + 112, + -4 + ], + [ + 122, + -8 + ], + [ + 132, + -10 + ], + [ + 142, + -7 + ], + [ + 152, + -10 + ], + [ + 162, + -3 + ], + [ + 172, + -9 + ], + [ + 182, + -6 + ], + [ + 192, + -4 + ], + [ + 202, + -6 + ], + [ + 212, + -3 + ], + [ + 222, + -5 + ], + [ + 232, + -7 + ], + [ + 242, + -8 + ], + [ + 252, + -5 + ], + [ + 262, + -9 + ], + [ + 272, + -10 + ], + [ + 282, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 13, + -6 + ], + [ + 23, + -3 + ], + [ + 33, + -4 + ], + [ + 43, + -7 + ], + [ + 53, + -7 + ], + [ + 63, + -6 + ], + [ + 73, + -2 + ], + [ + 83, + -3 + ], + [ + 93, + -4 + ], + [ + 103, + -4 + ], + [ + 113, + -4 + ], + [ + 123, + -8 + ], + [ + 133, + -10 + ], + [ + 143, + -7 + ], + [ + 153, + -10 + ], + [ + 163, + -3 + ], + [ + 173, + -9 + ], + [ + 183, + -6 + ], + [ + 193, + -4 + ], + [ + 203, + -6 + ], + [ + 213, + -3 + ], + [ + 223, + -5 + ], + [ + 233, + -7 + ], + [ + 243, + -8 + ], + [ + 253, + -5 + ], + [ + 263, + -9 + ], + [ + 273, + -10 + ], + [ + 283, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 14, + -6 + ], + [ + 24, + -3 + ], + [ + 34, + -4 + ], + [ + 44, + -7 + ], + [ + 54, + -7 + ], + [ + 64, + -6 + ], + [ + 74, + -2 + ], + [ + 84, + -3 + ], + [ + 94, + -4 + ], + [ + 104, + -4 + ], + [ + 114, + -4 + ], + [ + 124, + -8 + ], + [ + 134, + -10 + ], + [ + 144, + -7 + ], + [ + 154, + -10 + ], + [ + 164, + -3 + ], + [ + 174, + -9 + ], + [ + 184, + -6 + ], + [ + 194, + -4 + ], + [ + 204, + -6 + ], + [ + 214, + -3 + ], + [ + 224, + -5 + ], + [ + 234, + -7 + ], + [ + 244, + -8 + ], + [ + 254, + -5 + ], + [ + 264, + -9 + ], + [ + 274, + -10 + ], + [ + 284, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 15, + -6 + ], + [ + 25, + -3 + ], + [ + 35, + -4 + ], + [ + 45, + -7 + ], + [ + 55, + -7 + ], + [ + 65, + -6 + ], + [ + 75, + -2 + ], + [ + 85, + -3 + ], + [ + 95, + -4 + ], + [ + 105, + -4 + ], + [ + 115, + -4 + ], + [ + 125, + -8 + ], + [ + 135, + -10 + ], + [ + 145, + -7 + ], + [ + 155, + -10 + ], + [ + 165, + -3 + ], + [ + 175, + -9 + ], + [ + 185, + -6 + ], + [ + 195, + -4 + ], + [ + 205, + -6 + ], + [ + 215, + -3 + ], + [ + 225, + -5 + ], + [ + 235, + -7 + ], + [ + 245, + -8 + ], + [ + 255, + -5 + ], + [ + 265, + -9 + ], + [ + 275, + -10 + ], + [ + 285, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 16, + -6 + ], + [ + 26, + -3 + ], + [ + 36, + -4 + ], + [ + 46, + -7 + ], + [ + 56, + -7 + ], + [ + 66, + -6 + ], + [ + 76, + -2 + ], + [ + 86, + -3 + ], + [ + 96, + -4 + ], + [ + 106, + -4 + ], + [ + 116, + -4 + ], + [ + 126, + -8 + ], + [ + 136, + -10 + ], + [ + 146, + -7 + ], + [ + 156, + -10 + ], + [ + 166, + -3 + ], + [ + 176, + -9 + ], + [ + 186, + -6 + ], + [ + 196, + -4 + ], + [ + 206, + -6 + ], + [ + 216, + -3 + ], + [ + 226, + -5 + ], + [ + 236, + -7 + ], + [ + 246, + -8 + ], + [ + 256, + -5 + ], + [ + 266, + -9 + ], + [ + 276, + -10 + ], + [ + 286, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 17, + -6 + ], + [ + 27, + -3 + ], + [ + 37, + -4 + ], + [ + 47, + -7 + ], + [ + 57, + -7 + ], + [ + 67, + -6 + ], + [ + 77, + -2 + ], + [ + 87, + -3 + ], + [ + 97, + -4 + ], + [ + 107, + -4 + ], + [ + 117, + -4 + ], + [ + 127, + -8 + ], + [ + 137, + -10 + ], + [ + 147, + -7 + ], + [ + 157, + -10 + ], + [ + 167, + -3 + ], + [ + 177, + -9 + ], + [ + 187, + -6 + ], + [ + 197, + -4 + ], + [ + 207, + -6 + ], + [ + 217, + -3 + ], + [ + 227, + -5 + ], + [ + 237, + -7 + ], + [ + 247, + -8 + ], + [ + 257, + -5 + ], + [ + 267, + -9 + ], + [ + 277, + -10 + ], + [ + 287, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 18, + -6 + ], + [ + 28, + -3 + ], + [ + 38, + -4 + ], + [ + 48, + -7 + ], + [ + 58, + -7 + ], + [ + 68, + -6 + ], + [ + 78, + -2 + ], + [ + 88, + -3 + ], + [ + 98, + -4 + ], + [ + 108, + -4 + ], + [ + 118, + -4 + ], + [ + 128, + -8 + ], + [ + 138, + -10 + ], + [ + 148, + -7 + ], + [ + 158, + -10 + ], + [ + 168, + -3 + ], + [ + 178, + -9 + ], + [ + 188, + -6 + ], + [ + 198, + -4 + ], + [ + 208, + -6 + ], + [ + 218, + -3 + ], + [ + 228, + -5 + ], + [ + 238, + -7 + ], + [ + 248, + -8 + ], + [ + 258, + -5 + ], + [ + 268, + -9 + ], + [ + 278, + -10 + ], + [ + 288, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 19, + -6 + ], + [ + 29, + -3 + ], + [ + 39, + -4 + ], + [ + 49, + -7 + ], + [ + 59, + -7 + ], + [ + 69, + -6 + ], + [ + 79, + -2 + ], + [ + 89, + -3 + ], + [ + 99, + -4 + ], + [ + 109, + -4 + ], + [ + 119, + -4 + ], + [ + 129, + -8 + ], + [ + 139, + -10 + ], + [ + 149, + -7 + ], + [ + 159, + -10 + ], + [ + 169, + -3 + ], + [ + 179, + -9 + ], + [ + 189, + -6 + ], + [ + 199, + -4 + ], + [ + 209, + -6 + ], + [ + 219, + -3 + ], + [ + 229, + -5 + ], + [ + 239, + -7 + ], + [ + 249, + -8 + ], + [ + 259, + -5 + ], + [ + 269, + -9 + ], + [ + 279, + -10 + ], + [ + 289, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + 1 + ], + [ + 281, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + 1 + ], + [ + 282, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + 1 + ], + [ + 283, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + 1 + ], + [ + 284, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + 1 + ], + [ + 285, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + 1 + ], + [ + 286, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + 1 + ], + [ + 287, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + 1 + ], + [ + 288, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 28, + "bins": 10, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 290, + "variables": 290, + "rows": 355, + "nonzeros": 1428, + "globals": 0 + }, + "input_variables": 290, + "model_variables": 290, + "modelled_variables": 290, + "size_unit": "items" + }, + "json_sha256": "5c6f4e51d077b03d0c14cc71cd347e742d6842e9aa6c106bdc0807a811fe7e7f", + "txt_sha256": "766398c909e91dd7fd8da9bc508f62d1cf339acf5fe58e95f9d3bf6e31a1ee24" + }, + { + "id": "bin_packing-30-single", + "category": "bin_packing", + "size": 30, + "variant": "single", + "model": { + "id": "bin_packing_single_30", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 30, + "natural_size": 30, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 310, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 289, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 290, + -1 + ], + [ + 300, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 291, + -1 + ], + [ + 301, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 292, + -1 + ], + [ + 302, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 293, + -1 + ], + [ + 303, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 294, + -1 + ], + [ + 304, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 295, + -1 + ], + [ + 305, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 296, + -1 + ], + [ + 306, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 307, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 298, + -1 + ], + [ + 308, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 299, + -1 + ], + [ + 309, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 10, + -6 + ], + [ + 20, + -3 + ], + [ + 30, + -4 + ], + [ + 40, + -7 + ], + [ + 50, + -7 + ], + [ + 60, + -6 + ], + [ + 70, + -2 + ], + [ + 80, + -3 + ], + [ + 90, + -4 + ], + [ + 100, + -4 + ], + [ + 110, + -4 + ], + [ + 120, + -8 + ], + [ + 130, + -10 + ], + [ + 140, + -7 + ], + [ + 150, + -10 + ], + [ + 160, + -3 + ], + [ + 170, + -9 + ], + [ + 180, + -6 + ], + [ + 190, + -4 + ], + [ + 200, + -6 + ], + [ + 210, + -3 + ], + [ + 220, + -5 + ], + [ + 230, + -7 + ], + [ + 240, + -8 + ], + [ + 250, + -5 + ], + [ + 260, + -9 + ], + [ + 270, + -10 + ], + [ + 280, + -9 + ], + [ + 290, + -10 + ], + [ + 300, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 11, + -6 + ], + [ + 21, + -3 + ], + [ + 31, + -4 + ], + [ + 41, + -7 + ], + [ + 51, + -7 + ], + [ + 61, + -6 + ], + [ + 71, + -2 + ], + [ + 81, + -3 + ], + [ + 91, + -4 + ], + [ + 101, + -4 + ], + [ + 111, + -4 + ], + [ + 121, + -8 + ], + [ + 131, + -10 + ], + [ + 141, + -7 + ], + [ + 151, + -10 + ], + [ + 161, + -3 + ], + [ + 171, + -9 + ], + [ + 181, + -6 + ], + [ + 191, + -4 + ], + [ + 201, + -6 + ], + [ + 211, + -3 + ], + [ + 221, + -5 + ], + [ + 231, + -7 + ], + [ + 241, + -8 + ], + [ + 251, + -5 + ], + [ + 261, + -9 + ], + [ + 271, + -10 + ], + [ + 281, + -9 + ], + [ + 291, + -10 + ], + [ + 301, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 12, + -6 + ], + [ + 22, + -3 + ], + [ + 32, + -4 + ], + [ + 42, + -7 + ], + [ + 52, + -7 + ], + [ + 62, + -6 + ], + [ + 72, + -2 + ], + [ + 82, + -3 + ], + [ + 92, + -4 + ], + [ + 102, + -4 + ], + [ + 112, + -4 + ], + [ + 122, + -8 + ], + [ + 132, + -10 + ], + [ + 142, + -7 + ], + [ + 152, + -10 + ], + [ + 162, + -3 + ], + [ + 172, + -9 + ], + [ + 182, + -6 + ], + [ + 192, + -4 + ], + [ + 202, + -6 + ], + [ + 212, + -3 + ], + [ + 222, + -5 + ], + [ + 232, + -7 + ], + [ + 242, + -8 + ], + [ + 252, + -5 + ], + [ + 262, + -9 + ], + [ + 272, + -10 + ], + [ + 282, + -9 + ], + [ + 292, + -10 + ], + [ + 302, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 13, + -6 + ], + [ + 23, + -3 + ], + [ + 33, + -4 + ], + [ + 43, + -7 + ], + [ + 53, + -7 + ], + [ + 63, + -6 + ], + [ + 73, + -2 + ], + [ + 83, + -3 + ], + [ + 93, + -4 + ], + [ + 103, + -4 + ], + [ + 113, + -4 + ], + [ + 123, + -8 + ], + [ + 133, + -10 + ], + [ + 143, + -7 + ], + [ + 153, + -10 + ], + [ + 163, + -3 + ], + [ + 173, + -9 + ], + [ + 183, + -6 + ], + [ + 193, + -4 + ], + [ + 203, + -6 + ], + [ + 213, + -3 + ], + [ + 223, + -5 + ], + [ + 233, + -7 + ], + [ + 243, + -8 + ], + [ + 253, + -5 + ], + [ + 263, + -9 + ], + [ + 273, + -10 + ], + [ + 283, + -9 + ], + [ + 293, + -10 + ], + [ + 303, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 14, + -6 + ], + [ + 24, + -3 + ], + [ + 34, + -4 + ], + [ + 44, + -7 + ], + [ + 54, + -7 + ], + [ + 64, + -6 + ], + [ + 74, + -2 + ], + [ + 84, + -3 + ], + [ + 94, + -4 + ], + [ + 104, + -4 + ], + [ + 114, + -4 + ], + [ + 124, + -8 + ], + [ + 134, + -10 + ], + [ + 144, + -7 + ], + [ + 154, + -10 + ], + [ + 164, + -3 + ], + [ + 174, + -9 + ], + [ + 184, + -6 + ], + [ + 194, + -4 + ], + [ + 204, + -6 + ], + [ + 214, + -3 + ], + [ + 224, + -5 + ], + [ + 234, + -7 + ], + [ + 244, + -8 + ], + [ + 254, + -5 + ], + [ + 264, + -9 + ], + [ + 274, + -10 + ], + [ + 284, + -9 + ], + [ + 294, + -10 + ], + [ + 304, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 15, + -6 + ], + [ + 25, + -3 + ], + [ + 35, + -4 + ], + [ + 45, + -7 + ], + [ + 55, + -7 + ], + [ + 65, + -6 + ], + [ + 75, + -2 + ], + [ + 85, + -3 + ], + [ + 95, + -4 + ], + [ + 105, + -4 + ], + [ + 115, + -4 + ], + [ + 125, + -8 + ], + [ + 135, + -10 + ], + [ + 145, + -7 + ], + [ + 155, + -10 + ], + [ + 165, + -3 + ], + [ + 175, + -9 + ], + [ + 185, + -6 + ], + [ + 195, + -4 + ], + [ + 205, + -6 + ], + [ + 215, + -3 + ], + [ + 225, + -5 + ], + [ + 235, + -7 + ], + [ + 245, + -8 + ], + [ + 255, + -5 + ], + [ + 265, + -9 + ], + [ + 275, + -10 + ], + [ + 285, + -9 + ], + [ + 295, + -10 + ], + [ + 305, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 16, + -6 + ], + [ + 26, + -3 + ], + [ + 36, + -4 + ], + [ + 46, + -7 + ], + [ + 56, + -7 + ], + [ + 66, + -6 + ], + [ + 76, + -2 + ], + [ + 86, + -3 + ], + [ + 96, + -4 + ], + [ + 106, + -4 + ], + [ + 116, + -4 + ], + [ + 126, + -8 + ], + [ + 136, + -10 + ], + [ + 146, + -7 + ], + [ + 156, + -10 + ], + [ + 166, + -3 + ], + [ + 176, + -9 + ], + [ + 186, + -6 + ], + [ + 196, + -4 + ], + [ + 206, + -6 + ], + [ + 216, + -3 + ], + [ + 226, + -5 + ], + [ + 236, + -7 + ], + [ + 246, + -8 + ], + [ + 256, + -5 + ], + [ + 266, + -9 + ], + [ + 276, + -10 + ], + [ + 286, + -9 + ], + [ + 296, + -10 + ], + [ + 306, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 17, + -6 + ], + [ + 27, + -3 + ], + [ + 37, + -4 + ], + [ + 47, + -7 + ], + [ + 57, + -7 + ], + [ + 67, + -6 + ], + [ + 77, + -2 + ], + [ + 87, + -3 + ], + [ + 97, + -4 + ], + [ + 107, + -4 + ], + [ + 117, + -4 + ], + [ + 127, + -8 + ], + [ + 137, + -10 + ], + [ + 147, + -7 + ], + [ + 157, + -10 + ], + [ + 167, + -3 + ], + [ + 177, + -9 + ], + [ + 187, + -6 + ], + [ + 197, + -4 + ], + [ + 207, + -6 + ], + [ + 217, + -3 + ], + [ + 227, + -5 + ], + [ + 237, + -7 + ], + [ + 247, + -8 + ], + [ + 257, + -5 + ], + [ + 267, + -9 + ], + [ + 277, + -10 + ], + [ + 287, + -9 + ], + [ + 297, + -10 + ], + [ + 307, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 18, + -6 + ], + [ + 28, + -3 + ], + [ + 38, + -4 + ], + [ + 48, + -7 + ], + [ + 58, + -7 + ], + [ + 68, + -6 + ], + [ + 78, + -2 + ], + [ + 88, + -3 + ], + [ + 98, + -4 + ], + [ + 108, + -4 + ], + [ + 118, + -4 + ], + [ + 128, + -8 + ], + [ + 138, + -10 + ], + [ + 148, + -7 + ], + [ + 158, + -10 + ], + [ + 168, + -3 + ], + [ + 178, + -9 + ], + [ + 188, + -6 + ], + [ + 198, + -4 + ], + [ + 208, + -6 + ], + [ + 218, + -3 + ], + [ + 228, + -5 + ], + [ + 238, + -7 + ], + [ + 248, + -8 + ], + [ + 258, + -5 + ], + [ + 268, + -9 + ], + [ + 278, + -10 + ], + [ + 288, + -9 + ], + [ + 298, + -10 + ], + [ + 308, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 19, + -6 + ], + [ + 29, + -3 + ], + [ + 39, + -4 + ], + [ + 49, + -7 + ], + [ + 59, + -7 + ], + [ + 69, + -6 + ], + [ + 79, + -2 + ], + [ + 89, + -3 + ], + [ + 99, + -4 + ], + [ + 109, + -4 + ], + [ + 119, + -4 + ], + [ + 129, + -8 + ], + [ + 139, + -10 + ], + [ + 149, + -7 + ], + [ + 159, + -10 + ], + [ + 169, + -3 + ], + [ + 179, + -9 + ], + [ + 189, + -6 + ], + [ + 199, + -4 + ], + [ + 209, + -6 + ], + [ + 219, + -3 + ], + [ + 229, + -5 + ], + [ + 239, + -7 + ], + [ + 249, + -8 + ], + [ + 259, + -5 + ], + [ + 269, + -9 + ], + [ + 279, + -10 + ], + [ + 289, + -9 + ], + [ + 299, + -10 + ], + [ + 309, + 21 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 300, + 1 + ], + [ + 301, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 301, + 1 + ], + [ + 302, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 302, + 1 + ], + [ + 303, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 303, + 1 + ], + [ + 304, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + 1 + ], + [ + 305, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 305, + 1 + ], + [ + 306, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 306, + 1 + ], + [ + 307, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 307, + 1 + ], + [ + 308, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 308, + 1 + ], + [ + 309, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 30, + "bins": 10, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10, + 9, + 10 + ], + "capacity": 21, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 310, + "variables": 310, + "rows": 379, + "nonzeros": 1528, + "globals": 0 + }, + "input_variables": 310, + "model_variables": 310, + "modelled_variables": 310, + "size_unit": "items" + }, + "json_sha256": "7846177b15c5d3e1c1882680936a043feb2566afd5fbb088d7e0d257ed9b767a", + "txt_sha256": "9c342cbae215a32edab5eb375bf0d628c3c84b39f3e51bd9b71970c3f0c6e663" + }, + { + "id": "bin_packing-31-single", + "category": "bin_packing", + "size": 31, + "variant": "single", + "model": { + "id": "bin_packing_single_31", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 31, + "natural_size": 31, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 352, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 289, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 290, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 291, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 292, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 293, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 294, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 295, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 296, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 297, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 298, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 299, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 300, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 301, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 302, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 303, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 305, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 306, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 307, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 308, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 309, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 310, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 311, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 312, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 313, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 314, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 315, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 316, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 317, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 318, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ], + [ + 328, + 1 + ], + [ + 329, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ], + [ + 328, + -1 + ], + [ + 329, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 319, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 321, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 322, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 323, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 324, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 325, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 326, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 327, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 328, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 329, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ], + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ], + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 330, + -1 + ], + [ + 341, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 331, + -1 + ], + [ + 342, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 332, + -1 + ], + [ + 343, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 333, + -1 + ], + [ + 344, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 334, + -1 + ], + [ + 345, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 335, + -1 + ], + [ + 346, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 347, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 337, + -1 + ], + [ + 348, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 338, + -1 + ], + [ + 349, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 339, + -1 + ], + [ + 350, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 340, + -1 + ], + [ + 351, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 11, + -6 + ], + [ + 22, + -3 + ], + [ + 33, + -4 + ], + [ + 44, + -7 + ], + [ + 55, + -7 + ], + [ + 66, + -6 + ], + [ + 77, + -2 + ], + [ + 88, + -3 + ], + [ + 99, + -4 + ], + [ + 110, + -4 + ], + [ + 121, + -4 + ], + [ + 132, + -8 + ], + [ + 143, + -10 + ], + [ + 154, + -7 + ], + [ + 165, + -10 + ], + [ + 176, + -3 + ], + [ + 187, + -9 + ], + [ + 198, + -6 + ], + [ + 209, + -4 + ], + [ + 220, + -6 + ], + [ + 231, + -3 + ], + [ + 242, + -5 + ], + [ + 253, + -7 + ], + [ + 264, + -8 + ], + [ + 275, + -5 + ], + [ + 286, + -9 + ], + [ + 297, + -10 + ], + [ + 308, + -9 + ], + [ + 319, + -10 + ], + [ + 330, + -4 + ], + [ + 341, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 12, + -6 + ], + [ + 23, + -3 + ], + [ + 34, + -4 + ], + [ + 45, + -7 + ], + [ + 56, + -7 + ], + [ + 67, + -6 + ], + [ + 78, + -2 + ], + [ + 89, + -3 + ], + [ + 100, + -4 + ], + [ + 111, + -4 + ], + [ + 122, + -4 + ], + [ + 133, + -8 + ], + [ + 144, + -10 + ], + [ + 155, + -7 + ], + [ + 166, + -10 + ], + [ + 177, + -3 + ], + [ + 188, + -9 + ], + [ + 199, + -6 + ], + [ + 210, + -4 + ], + [ + 221, + -6 + ], + [ + 232, + -3 + ], + [ + 243, + -5 + ], + [ + 254, + -7 + ], + [ + 265, + -8 + ], + [ + 276, + -5 + ], + [ + 287, + -9 + ], + [ + 298, + -10 + ], + [ + 309, + -9 + ], + [ + 320, + -10 + ], + [ + 331, + -4 + ], + [ + 342, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 13, + -6 + ], + [ + 24, + -3 + ], + [ + 35, + -4 + ], + [ + 46, + -7 + ], + [ + 57, + -7 + ], + [ + 68, + -6 + ], + [ + 79, + -2 + ], + [ + 90, + -3 + ], + [ + 101, + -4 + ], + [ + 112, + -4 + ], + [ + 123, + -4 + ], + [ + 134, + -8 + ], + [ + 145, + -10 + ], + [ + 156, + -7 + ], + [ + 167, + -10 + ], + [ + 178, + -3 + ], + [ + 189, + -9 + ], + [ + 200, + -6 + ], + [ + 211, + -4 + ], + [ + 222, + -6 + ], + [ + 233, + -3 + ], + [ + 244, + -5 + ], + [ + 255, + -7 + ], + [ + 266, + -8 + ], + [ + 277, + -5 + ], + [ + 288, + -9 + ], + [ + 299, + -10 + ], + [ + 310, + -9 + ], + [ + 321, + -10 + ], + [ + 332, + -4 + ], + [ + 343, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 14, + -6 + ], + [ + 25, + -3 + ], + [ + 36, + -4 + ], + [ + 47, + -7 + ], + [ + 58, + -7 + ], + [ + 69, + -6 + ], + [ + 80, + -2 + ], + [ + 91, + -3 + ], + [ + 102, + -4 + ], + [ + 113, + -4 + ], + [ + 124, + -4 + ], + [ + 135, + -8 + ], + [ + 146, + -10 + ], + [ + 157, + -7 + ], + [ + 168, + -10 + ], + [ + 179, + -3 + ], + [ + 190, + -9 + ], + [ + 201, + -6 + ], + [ + 212, + -4 + ], + [ + 223, + -6 + ], + [ + 234, + -3 + ], + [ + 245, + -5 + ], + [ + 256, + -7 + ], + [ + 267, + -8 + ], + [ + 278, + -5 + ], + [ + 289, + -9 + ], + [ + 300, + -10 + ], + [ + 311, + -9 + ], + [ + 322, + -10 + ], + [ + 333, + -4 + ], + [ + 344, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 15, + -6 + ], + [ + 26, + -3 + ], + [ + 37, + -4 + ], + [ + 48, + -7 + ], + [ + 59, + -7 + ], + [ + 70, + -6 + ], + [ + 81, + -2 + ], + [ + 92, + -3 + ], + [ + 103, + -4 + ], + [ + 114, + -4 + ], + [ + 125, + -4 + ], + [ + 136, + -8 + ], + [ + 147, + -10 + ], + [ + 158, + -7 + ], + [ + 169, + -10 + ], + [ + 180, + -3 + ], + [ + 191, + -9 + ], + [ + 202, + -6 + ], + [ + 213, + -4 + ], + [ + 224, + -6 + ], + [ + 235, + -3 + ], + [ + 246, + -5 + ], + [ + 257, + -7 + ], + [ + 268, + -8 + ], + [ + 279, + -5 + ], + [ + 290, + -9 + ], + [ + 301, + -10 + ], + [ + 312, + -9 + ], + [ + 323, + -10 + ], + [ + 334, + -4 + ], + [ + 345, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 16, + -6 + ], + [ + 27, + -3 + ], + [ + 38, + -4 + ], + [ + 49, + -7 + ], + [ + 60, + -7 + ], + [ + 71, + -6 + ], + [ + 82, + -2 + ], + [ + 93, + -3 + ], + [ + 104, + -4 + ], + [ + 115, + -4 + ], + [ + 126, + -4 + ], + [ + 137, + -8 + ], + [ + 148, + -10 + ], + [ + 159, + -7 + ], + [ + 170, + -10 + ], + [ + 181, + -3 + ], + [ + 192, + -9 + ], + [ + 203, + -6 + ], + [ + 214, + -4 + ], + [ + 225, + -6 + ], + [ + 236, + -3 + ], + [ + 247, + -5 + ], + [ + 258, + -7 + ], + [ + 269, + -8 + ], + [ + 280, + -5 + ], + [ + 291, + -9 + ], + [ + 302, + -10 + ], + [ + 313, + -9 + ], + [ + 324, + -10 + ], + [ + 335, + -4 + ], + [ + 346, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 17, + -6 + ], + [ + 28, + -3 + ], + [ + 39, + -4 + ], + [ + 50, + -7 + ], + [ + 61, + -7 + ], + [ + 72, + -6 + ], + [ + 83, + -2 + ], + [ + 94, + -3 + ], + [ + 105, + -4 + ], + [ + 116, + -4 + ], + [ + 127, + -4 + ], + [ + 138, + -8 + ], + [ + 149, + -10 + ], + [ + 160, + -7 + ], + [ + 171, + -10 + ], + [ + 182, + -3 + ], + [ + 193, + -9 + ], + [ + 204, + -6 + ], + [ + 215, + -4 + ], + [ + 226, + -6 + ], + [ + 237, + -3 + ], + [ + 248, + -5 + ], + [ + 259, + -7 + ], + [ + 270, + -8 + ], + [ + 281, + -5 + ], + [ + 292, + -9 + ], + [ + 303, + -10 + ], + [ + 314, + -9 + ], + [ + 325, + -10 + ], + [ + 336, + -4 + ], + [ + 347, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 18, + -6 + ], + [ + 29, + -3 + ], + [ + 40, + -4 + ], + [ + 51, + -7 + ], + [ + 62, + -7 + ], + [ + 73, + -6 + ], + [ + 84, + -2 + ], + [ + 95, + -3 + ], + [ + 106, + -4 + ], + [ + 117, + -4 + ], + [ + 128, + -4 + ], + [ + 139, + -8 + ], + [ + 150, + -10 + ], + [ + 161, + -7 + ], + [ + 172, + -10 + ], + [ + 183, + -3 + ], + [ + 194, + -9 + ], + [ + 205, + -6 + ], + [ + 216, + -4 + ], + [ + 227, + -6 + ], + [ + 238, + -3 + ], + [ + 249, + -5 + ], + [ + 260, + -7 + ], + [ + 271, + -8 + ], + [ + 282, + -5 + ], + [ + 293, + -9 + ], + [ + 304, + -10 + ], + [ + 315, + -9 + ], + [ + 326, + -10 + ], + [ + 337, + -4 + ], + [ + 348, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 19, + -6 + ], + [ + 30, + -3 + ], + [ + 41, + -4 + ], + [ + 52, + -7 + ], + [ + 63, + -7 + ], + [ + 74, + -6 + ], + [ + 85, + -2 + ], + [ + 96, + -3 + ], + [ + 107, + -4 + ], + [ + 118, + -4 + ], + [ + 129, + -4 + ], + [ + 140, + -8 + ], + [ + 151, + -10 + ], + [ + 162, + -7 + ], + [ + 173, + -10 + ], + [ + 184, + -3 + ], + [ + 195, + -9 + ], + [ + 206, + -6 + ], + [ + 217, + -4 + ], + [ + 228, + -6 + ], + [ + 239, + -3 + ], + [ + 250, + -5 + ], + [ + 261, + -7 + ], + [ + 272, + -8 + ], + [ + 283, + -5 + ], + [ + 294, + -9 + ], + [ + 305, + -10 + ], + [ + 316, + -9 + ], + [ + 327, + -10 + ], + [ + 338, + -4 + ], + [ + 349, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 20, + -6 + ], + [ + 31, + -3 + ], + [ + 42, + -4 + ], + [ + 53, + -7 + ], + [ + 64, + -7 + ], + [ + 75, + -6 + ], + [ + 86, + -2 + ], + [ + 97, + -3 + ], + [ + 108, + -4 + ], + [ + 119, + -4 + ], + [ + 130, + -4 + ], + [ + 141, + -8 + ], + [ + 152, + -10 + ], + [ + 163, + -7 + ], + [ + 174, + -10 + ], + [ + 185, + -3 + ], + [ + 196, + -9 + ], + [ + 207, + -6 + ], + [ + 218, + -4 + ], + [ + 229, + -6 + ], + [ + 240, + -3 + ], + [ + 251, + -5 + ], + [ + 262, + -7 + ], + [ + 273, + -8 + ], + [ + 284, + -5 + ], + [ + 295, + -9 + ], + [ + 306, + -10 + ], + [ + 317, + -9 + ], + [ + 328, + -10 + ], + [ + 339, + -4 + ], + [ + 350, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -3 + ], + [ + 21, + -6 + ], + [ + 32, + -3 + ], + [ + 43, + -4 + ], + [ + 54, + -7 + ], + [ + 65, + -7 + ], + [ + 76, + -6 + ], + [ + 87, + -2 + ], + [ + 98, + -3 + ], + [ + 109, + -4 + ], + [ + 120, + -4 + ], + [ + 131, + -4 + ], + [ + 142, + -8 + ], + [ + 153, + -10 + ], + [ + 164, + -7 + ], + [ + 175, + -10 + ], + [ + 186, + -3 + ], + [ + 197, + -9 + ], + [ + 208, + -6 + ], + [ + 219, + -4 + ], + [ + 230, + -6 + ], + [ + 241, + -3 + ], + [ + 252, + -5 + ], + [ + 263, + -7 + ], + [ + 274, + -8 + ], + [ + 285, + -5 + ], + [ + 296, + -9 + ], + [ + 307, + -10 + ], + [ + 318, + -9 + ], + [ + 329, + -10 + ], + [ + 340, + -4 + ], + [ + 351, + 19 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 341, + 1 + ], + [ + 342, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 342, + 1 + ], + [ + 343, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 343, + 1 + ], + [ + 344, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 344, + 1 + ], + [ + 345, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 345, + 1 + ], + [ + 346, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 346, + 1 + ], + [ + 347, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 347, + 1 + ], + [ + 348, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 348, + 1 + ], + [ + 349, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 349, + 1 + ], + [ + 350, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 350, + 1 + ], + [ + 351, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 31, + "bins": 11, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10, + 9, + 10, + 4 + ], + "capacity": 19, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 352, + "variables": 352, + "rows": 424, + "nonzeros": 1736, + "globals": 0 + }, + "input_variables": 352, + "model_variables": 352, + "modelled_variables": 352, + "size_unit": "items" + }, + "json_sha256": "a60ea6cd4fa9fb02160644ba5cded8bcaad70cd3b2ed8e2348e651caedb2c1c3", + "txt_sha256": "b236934b96bb3ba261325922a17edad6dea917811c1fe3e748ca1afb245789f1" + }, + { + "id": "bin_packing-29-single", + "category": "bin_packing", + "size": 29, + "variant": "single", + "model": { + "id": "bin_packing_single_29", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 29, + "natural_size": 29, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 300, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + 1 + ], + [ + 71, + 1 + ], + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 71, + -1 + ], + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 110, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 113, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 114, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 115, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 116, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 118, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 119, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 121, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 122, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 123, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 124, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 125, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 127, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 129, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 130, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 131, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 132, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 133, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 134, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 137, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 138, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 139, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ], + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ], + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 140, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 141, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 142, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 143, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 145, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 146, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 147, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 148, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 149, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 150, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 151, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 154, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 155, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 156, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 157, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 158, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 159, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 161, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 163, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 164, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 165, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 166, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 167, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 169, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 170, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 171, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 172, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 173, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 174, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 175, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 177, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 178, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 179, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 180, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 181, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 182, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 183, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 185, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 186, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 187, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 188, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 189, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 190, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 191, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 193, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 194, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 195, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 196, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 197, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 198, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 199, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 201, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 202, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 203, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 204, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 205, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 206, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 207, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 209, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ], + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ], + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 210, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 211, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 212, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 213, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 214, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 215, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 217, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 218, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 219, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 220, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 221, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 222, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 223, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 225, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 226, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 227, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 228, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 229, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 230, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 231, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 233, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 234, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 235, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 236, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 237, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 238, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 239, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 241, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 242, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 243, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 244, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 245, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 246, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 247, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 249, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 250, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 251, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 252, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 253, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 254, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 255, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 257, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 258, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 259, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 260, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 261, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 262, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 263, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 265, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 266, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 267, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 268, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 269, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 270, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 271, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 273, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 274, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 275, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 276, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 277, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 278, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 279, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ], + [ + 288, + 1 + ], + [ + 289, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ], + [ + 288, + -1 + ], + [ + 289, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 290, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 281, + -1 + ], + [ + 291, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 282, + -1 + ], + [ + 292, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 283, + -1 + ], + [ + 293, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 284, + -1 + ], + [ + 294, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 285, + -1 + ], + [ + 295, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 286, + -1 + ], + [ + 296, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 287, + -1 + ], + [ + 297, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 298, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 289, + -1 + ], + [ + 299, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 10, + -6 + ], + [ + 20, + -3 + ], + [ + 30, + -4 + ], + [ + 40, + -7 + ], + [ + 50, + -7 + ], + [ + 60, + -6 + ], + [ + 70, + -2 + ], + [ + 80, + -3 + ], + [ + 90, + -4 + ], + [ + 100, + -4 + ], + [ + 110, + -4 + ], + [ + 120, + -8 + ], + [ + 130, + -10 + ], + [ + 140, + -7 + ], + [ + 150, + -10 + ], + [ + 160, + -3 + ], + [ + 170, + -9 + ], + [ + 180, + -6 + ], + [ + 190, + -4 + ], + [ + 200, + -6 + ], + [ + 210, + -3 + ], + [ + 220, + -5 + ], + [ + 230, + -7 + ], + [ + 240, + -8 + ], + [ + 250, + -5 + ], + [ + 260, + -9 + ], + [ + 270, + -10 + ], + [ + 280, + -9 + ], + [ + 290, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 11, + -6 + ], + [ + 21, + -3 + ], + [ + 31, + -4 + ], + [ + 41, + -7 + ], + [ + 51, + -7 + ], + [ + 61, + -6 + ], + [ + 71, + -2 + ], + [ + 81, + -3 + ], + [ + 91, + -4 + ], + [ + 101, + -4 + ], + [ + 111, + -4 + ], + [ + 121, + -8 + ], + [ + 131, + -10 + ], + [ + 141, + -7 + ], + [ + 151, + -10 + ], + [ + 161, + -3 + ], + [ + 171, + -9 + ], + [ + 181, + -6 + ], + [ + 191, + -4 + ], + [ + 201, + -6 + ], + [ + 211, + -3 + ], + [ + 221, + -5 + ], + [ + 231, + -7 + ], + [ + 241, + -8 + ], + [ + 251, + -5 + ], + [ + 261, + -9 + ], + [ + 271, + -10 + ], + [ + 281, + -9 + ], + [ + 291, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 12, + -6 + ], + [ + 22, + -3 + ], + [ + 32, + -4 + ], + [ + 42, + -7 + ], + [ + 52, + -7 + ], + [ + 62, + -6 + ], + [ + 72, + -2 + ], + [ + 82, + -3 + ], + [ + 92, + -4 + ], + [ + 102, + -4 + ], + [ + 112, + -4 + ], + [ + 122, + -8 + ], + [ + 132, + -10 + ], + [ + 142, + -7 + ], + [ + 152, + -10 + ], + [ + 162, + -3 + ], + [ + 172, + -9 + ], + [ + 182, + -6 + ], + [ + 192, + -4 + ], + [ + 202, + -6 + ], + [ + 212, + -3 + ], + [ + 222, + -5 + ], + [ + 232, + -7 + ], + [ + 242, + -8 + ], + [ + 252, + -5 + ], + [ + 262, + -9 + ], + [ + 272, + -10 + ], + [ + 282, + -9 + ], + [ + 292, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 13, + -6 + ], + [ + 23, + -3 + ], + [ + 33, + -4 + ], + [ + 43, + -7 + ], + [ + 53, + -7 + ], + [ + 63, + -6 + ], + [ + 73, + -2 + ], + [ + 83, + -3 + ], + [ + 93, + -4 + ], + [ + 103, + -4 + ], + [ + 113, + -4 + ], + [ + 123, + -8 + ], + [ + 133, + -10 + ], + [ + 143, + -7 + ], + [ + 153, + -10 + ], + [ + 163, + -3 + ], + [ + 173, + -9 + ], + [ + 183, + -6 + ], + [ + 193, + -4 + ], + [ + 203, + -6 + ], + [ + 213, + -3 + ], + [ + 223, + -5 + ], + [ + 233, + -7 + ], + [ + 243, + -8 + ], + [ + 253, + -5 + ], + [ + 263, + -9 + ], + [ + 273, + -10 + ], + [ + 283, + -9 + ], + [ + 293, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 14, + -6 + ], + [ + 24, + -3 + ], + [ + 34, + -4 + ], + [ + 44, + -7 + ], + [ + 54, + -7 + ], + [ + 64, + -6 + ], + [ + 74, + -2 + ], + [ + 84, + -3 + ], + [ + 94, + -4 + ], + [ + 104, + -4 + ], + [ + 114, + -4 + ], + [ + 124, + -8 + ], + [ + 134, + -10 + ], + [ + 144, + -7 + ], + [ + 154, + -10 + ], + [ + 164, + -3 + ], + [ + 174, + -9 + ], + [ + 184, + -6 + ], + [ + 194, + -4 + ], + [ + 204, + -6 + ], + [ + 214, + -3 + ], + [ + 224, + -5 + ], + [ + 234, + -7 + ], + [ + 244, + -8 + ], + [ + 254, + -5 + ], + [ + 264, + -9 + ], + [ + 274, + -10 + ], + [ + 284, + -9 + ], + [ + 294, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 15, + -6 + ], + [ + 25, + -3 + ], + [ + 35, + -4 + ], + [ + 45, + -7 + ], + [ + 55, + -7 + ], + [ + 65, + -6 + ], + [ + 75, + -2 + ], + [ + 85, + -3 + ], + [ + 95, + -4 + ], + [ + 105, + -4 + ], + [ + 115, + -4 + ], + [ + 125, + -8 + ], + [ + 135, + -10 + ], + [ + 145, + -7 + ], + [ + 155, + -10 + ], + [ + 165, + -3 + ], + [ + 175, + -9 + ], + [ + 185, + -6 + ], + [ + 195, + -4 + ], + [ + 205, + -6 + ], + [ + 215, + -3 + ], + [ + 225, + -5 + ], + [ + 235, + -7 + ], + [ + 245, + -8 + ], + [ + 255, + -5 + ], + [ + 265, + -9 + ], + [ + 275, + -10 + ], + [ + 285, + -9 + ], + [ + 295, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + -3 + ], + [ + 16, + -6 + ], + [ + 26, + -3 + ], + [ + 36, + -4 + ], + [ + 46, + -7 + ], + [ + 56, + -7 + ], + [ + 66, + -6 + ], + [ + 76, + -2 + ], + [ + 86, + -3 + ], + [ + 96, + -4 + ], + [ + 106, + -4 + ], + [ + 116, + -4 + ], + [ + 126, + -8 + ], + [ + 136, + -10 + ], + [ + 146, + -7 + ], + [ + 156, + -10 + ], + [ + 166, + -3 + ], + [ + 176, + -9 + ], + [ + 186, + -6 + ], + [ + 196, + -4 + ], + [ + 206, + -6 + ], + [ + 216, + -3 + ], + [ + 226, + -5 + ], + [ + 236, + -7 + ], + [ + 246, + -8 + ], + [ + 256, + -5 + ], + [ + 266, + -9 + ], + [ + 276, + -10 + ], + [ + 286, + -9 + ], + [ + 296, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -3 + ], + [ + 17, + -6 + ], + [ + 27, + -3 + ], + [ + 37, + -4 + ], + [ + 47, + -7 + ], + [ + 57, + -7 + ], + [ + 67, + -6 + ], + [ + 77, + -2 + ], + [ + 87, + -3 + ], + [ + 97, + -4 + ], + [ + 107, + -4 + ], + [ + 117, + -4 + ], + [ + 127, + -8 + ], + [ + 137, + -10 + ], + [ + 147, + -7 + ], + [ + 157, + -10 + ], + [ + 167, + -3 + ], + [ + 177, + -9 + ], + [ + 187, + -6 + ], + [ + 197, + -4 + ], + [ + 207, + -6 + ], + [ + 217, + -3 + ], + [ + 227, + -5 + ], + [ + 237, + -7 + ], + [ + 247, + -8 + ], + [ + 257, + -5 + ], + [ + 267, + -9 + ], + [ + 277, + -10 + ], + [ + 287, + -9 + ], + [ + 297, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -3 + ], + [ + 18, + -6 + ], + [ + 28, + -3 + ], + [ + 38, + -4 + ], + [ + 48, + -7 + ], + [ + 58, + -7 + ], + [ + 68, + -6 + ], + [ + 78, + -2 + ], + [ + 88, + -3 + ], + [ + 98, + -4 + ], + [ + 108, + -4 + ], + [ + 118, + -4 + ], + [ + 128, + -8 + ], + [ + 138, + -10 + ], + [ + 148, + -7 + ], + [ + 158, + -10 + ], + [ + 168, + -3 + ], + [ + 178, + -9 + ], + [ + 188, + -6 + ], + [ + 198, + -4 + ], + [ + 208, + -6 + ], + [ + 218, + -3 + ], + [ + 228, + -5 + ], + [ + 238, + -7 + ], + [ + 248, + -8 + ], + [ + 258, + -5 + ], + [ + 268, + -9 + ], + [ + 278, + -10 + ], + [ + 288, + -9 + ], + [ + 298, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -3 + ], + [ + 19, + -6 + ], + [ + 29, + -3 + ], + [ + 39, + -4 + ], + [ + 49, + -7 + ], + [ + 59, + -7 + ], + [ + 69, + -6 + ], + [ + 79, + -2 + ], + [ + 89, + -3 + ], + [ + 99, + -4 + ], + [ + 109, + -4 + ], + [ + 119, + -4 + ], + [ + 129, + -8 + ], + [ + 139, + -10 + ], + [ + 149, + -7 + ], + [ + 159, + -10 + ], + [ + 169, + -3 + ], + [ + 179, + -9 + ], + [ + 189, + -6 + ], + [ + 199, + -4 + ], + [ + 209, + -6 + ], + [ + 219, + -3 + ], + [ + 229, + -5 + ], + [ + 239, + -7 + ], + [ + 249, + -8 + ], + [ + 259, + -5 + ], + [ + 269, + -9 + ], + [ + 279, + -10 + ], + [ + 289, + -9 + ], + [ + 299, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 290, + 1 + ], + [ + 291, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 291, + 1 + ], + [ + 292, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 292, + 1 + ], + [ + 293, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 293, + 1 + ], + [ + 294, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 294, + 1 + ], + [ + 295, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 295, + 1 + ], + [ + 296, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 296, + 1 + ], + [ + 297, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 297, + 1 + ], + [ + 298, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 298, + 1 + ], + [ + 299, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 29, + "bins": 10, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9, + 6, + 4, + 6, + 3, + 5, + 7, + 8, + 5, + 9, + 10, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 300, + "variables": 300, + "rows": 367, + "nonzeros": 1478, + "globals": 0 + }, + "input_variables": 300, + "model_variables": 300, + "modelled_variables": 300, + "size_unit": "items" + }, + "json_sha256": "3b90730d5957dfa5357aa9732fb1dd886542de7e26eb863388024d97e6576c5b", + "txt_sha256": "3f4865f9c9c9e17712d503677e40b19f5fc2736fdfbc04e577521bb8f11bacd7" + }, + { + "id": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "model": { + "id": "production_single_6", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 6, + "natural_size": 6, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 48, + "c": [ + 0, + 39, + 59, + 79, + 99, + 124, + 149, + 174, + 0, + 45, + 72, + 99, + 126, + 158, + 190, + 222, + 0, + 30, + 50, + 70, + 90, + 115, + 140, + 165, + 0, + 29, + 49, + 69, + 89, + 114, + 139, + 164, + 0, + 25, + 33, + 41, + 49, + 62, + 75, + 88, + 0, + 28, + 43, + 58, + 73, + 93, + 113, + 133 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -21 + } + ], + "parameters": { + "periods": 6, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ] + ], + "objective_constant": -273, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 48, + "variables": 48, + "rows": 26, + "nonzeros": 474, + "globals": 0 + }, + "input_variables": 48, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "periods" + }, + "json_sha256": "7864f7faacb3d0f63222f9b9ceff7a3f4a41175f5bc473eef250e29d39586b20", + "txt_sha256": "be37c1e132cdd71a4ade9f6b65fc49f1a5dc7c1efe62aabb83a686f3f6bcefc0" + }, + { + "id": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "model": { + "id": "production_single_12", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 96, + "c": [ + 0, + 57, + 95, + 133, + 171, + 214, + 257, + 300, + 0, + 63, + 108, + 153, + 198, + 248, + 298, + 348, + 0, + 48, + 86, + 124, + 162, + 205, + 248, + 291, + 0, + 47, + 85, + 123, + 161, + 204, + 247, + 290, + 0, + 43, + 69, + 95, + 121, + 152, + 183, + 214, + 0, + 46, + 79, + 112, + 145, + 183, + 221, + 259, + 0, + 34, + 62, + 90, + 118, + 151, + 184, + 217, + 0, + 38, + 64, + 90, + 116, + 147, + 178, + 209, + 0, + 26, + 42, + 58, + 74, + 95, + 116, + 137, + 0, + 25, + 45, + 65, + 85, + 110, + 135, + 160, + 0, + 25, + 34, + 43, + 52, + 66, + 80, + 94, + 0, + 26, + 41, + 56, + 71, + 91, + 111, + 131 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -48 + } + ], + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "input_variables": 96, + "model_variables": 96, + "modelled_variables": 96, + "size_unit": "periods" + }, + "json_sha256": "d281e652807ad9c43e43e86c393a53ae7a5eeb0fcff04480f6dc20f02cd03df9", + "txt_sha256": "766f8af6b209308f8c82f23a8473f99e66ba425dfb8621a08d0cb04418045b0a" + }, + { + "id": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "model": { + "id": "production_single_9", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 9, + "natural_size": 9, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 72, + "c": [ + 0, + 48, + 77, + 106, + 135, + 169, + 203, + 237, + 0, + 54, + 90, + 126, + 162, + 203, + 244, + 285, + 0, + 39, + 68, + 97, + 126, + 160, + 194, + 228, + 0, + 38, + 67, + 96, + 125, + 159, + 193, + 227, + 0, + 34, + 51, + 68, + 85, + 107, + 129, + 151, + 0, + 37, + 61, + 85, + 109, + 138, + 167, + 196, + 0, + 25, + 44, + 63, + 82, + 106, + 130, + 154, + 0, + 29, + 46, + 63, + 80, + 102, + 124, + 146, + 0, + 17, + 24, + 31, + 38, + 50, + 62, + 74 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -34 + } + ], + "parameters": { + "periods": 9, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ] + ], + "objective_constant": -543, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 72, + "variables": 72, + "rows": 38, + "nonzeros": 900, + "globals": 0 + }, + "input_variables": 72, + "model_variables": 72, + "modelled_variables": 72, + "size_unit": "periods" + }, + "json_sha256": "7c386f79595e743d7548ae2910e2bd6267d1b71cdcaeb2ff6b82ff68b6eb0d61", + "txt_sha256": "a0fe8195644a3981517c066266ad3c5832a52321ffc351c92c59b51b25ea5cf9" + }, + { + "id": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "model": { + "id": "production_single_10", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 10, + "natural_size": 10, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 80, + "c": [ + 0, + 51, + 83, + 115, + 147, + 184, + 221, + 258, + 0, + 57, + 96, + 135, + 174, + 218, + 262, + 306, + 0, + 42, + 74, + 106, + 138, + 175, + 212, + 249, + 0, + 41, + 73, + 105, + 137, + 174, + 211, + 248, + 0, + 37, + 57, + 77, + 97, + 122, + 147, + 172, + 0, + 40, + 67, + 94, + 121, + 153, + 185, + 217, + 0, + 28, + 50, + 72, + 94, + 121, + 148, + 175, + 0, + 32, + 52, + 72, + 92, + 117, + 142, + 167, + 0, + 20, + 30, + 40, + 50, + 65, + 80, + 95, + 0, + 19, + 33, + 47, + 61, + 80, + 99, + 118 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -41 + } + ], + "parameters": { + "periods": 10, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ] + ], + "objective_constant": -666, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 80, + "variables": 80, + "rows": 42, + "nonzeros": 1070, + "globals": 0 + }, + "input_variables": 80, + "model_variables": 80, + "modelled_variables": 80, + "size_unit": "periods" + }, + "json_sha256": "bed882f860a8d70c56548ddf90ff112c1ea1c2da262714bf01ee02c5352a2305", + "txt_sha256": "900d70bcbdf298300876b33867d2e76a16c4d5385a6e1677cf4648e2aefdb6e8" + }, + { + "id": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "model": { + "id": "production_single_11", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 11, + "natural_size": 11, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 88, + "c": [ + 0, + 54, + 89, + 124, + 159, + 199, + 239, + 279, + 0, + 60, + 102, + 144, + 186, + 233, + 280, + 327, + 0, + 45, + 80, + 115, + 150, + 190, + 230, + 270, + 0, + 44, + 79, + 114, + 149, + 189, + 229, + 269, + 0, + 40, + 63, + 86, + 109, + 137, + 165, + 193, + 0, + 43, + 73, + 103, + 133, + 168, + 203, + 238, + 0, + 31, + 56, + 81, + 106, + 136, + 166, + 196, + 0, + 35, + 58, + 81, + 104, + 132, + 160, + 188, + 0, + 23, + 36, + 49, + 62, + 80, + 98, + 116, + 0, + 22, + 39, + 56, + 73, + 95, + 117, + 139, + 0, + 22, + 28, + 34, + 40, + 51, + 62, + 73 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -45 + } + ], + "parameters": { + "periods": 11, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ] + ], + "objective_constant": -801, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 88, + "variables": 88, + "rows": 46, + "nonzeros": 1254, + "globals": 0 + }, + "input_variables": 88, + "model_variables": 88, + "modelled_variables": 88, + "size_unit": "periods" + }, + "json_sha256": "697e33f65e86285e0b3537f962c1597cdd592ddea4e658966636b59e087f5285", + "txt_sha256": "b04d76d9245e929c364a91e45d55f97f510b018e7cc14c42f4390d1f21ac6446" + }, + { + "id": "production-24-single", + "category": "production", + "size": 24, + "variant": "single", + "model": { + "id": "production_single_24", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 192, + "c": [ + 0, + 93, + 167, + 241, + 315, + 394, + 473, + 552, + 0, + 99, + 180, + 261, + 342, + 428, + 514, + 600, + 0, + 84, + 158, + 232, + 306, + 385, + 464, + 543, + 0, + 83, + 157, + 231, + 305, + 384, + 463, + 542, + 0, + 79, + 141, + 203, + 265, + 332, + 399, + 466, + 0, + 82, + 151, + 220, + 289, + 363, + 437, + 511, + 0, + 70, + 134, + 198, + 262, + 331, + 400, + 469, + 0, + 74, + 136, + 198, + 260, + 327, + 394, + 461, + 0, + 62, + 114, + 166, + 218, + 275, + 332, + 389, + 0, + 61, + 117, + 173, + 229, + 290, + 351, + 412, + 0, + 61, + 106, + 151, + 196, + 246, + 296, + 346, + 0, + 62, + 113, + 164, + 215, + 271, + 327, + 383, + 0, + 60, + 100, + 140, + 180, + 225, + 270, + 315, + 0, + 65, + 110, + 155, + 200, + 250, + 300, + 350, + 0, + 43, + 76, + 109, + 142, + 180, + 218, + 256, + 0, + 54, + 92, + 130, + 168, + 211, + 254, + 297, + 0, + 42, + 71, + 100, + 129, + 163, + 197, + 231, + 0, + 40, + 70, + 100, + 130, + 165, + 200, + 235, + 0, + 40, + 65, + 90, + 115, + 145, + 175, + 205, + 0, + 36, + 60, + 84, + 108, + 137, + 166, + 195, + 0, + 37, + 59, + 81, + 103, + 130, + 157, + 184, + 0, + 24, + 41, + 58, + 75, + 97, + 119, + 141, + 0, + 20, + 33, + 46, + 59, + 77, + 95, + 113, + 0, + 25, + 38, + 51, + 64, + 82, + 100, + 118 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -94 + } + ], + "parameters": { + "periods": 24, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ] + ], + "objective_constant": -3618, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 192, + "variables": 192, + "rows": 98, + "nonzeros": 4920, + "globals": 0 + }, + "input_variables": 192, + "model_variables": 192, + "modelled_variables": 192, + "size_unit": "periods" + }, + "json_sha256": "13e9ce1c8c4fb2db0ed4befcf31157ab562d918a677becdaf049ca5c9cd342d4", + "txt_sha256": "ab783a3301e11e387509adabb2d6461c867f597aabe9ac11c8498d381165a3c9" + }, + { + "id": "production-48-single", + "category": "production", + "size": 48, + "variant": "single", + "model": { + "id": "production_single_48", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 48, + "natural_size": 48, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 384, + "c": [ + 0, + 165, + 311, + 457, + 603, + 754, + 905, + 1056, + 0, + 171, + 324, + 477, + 630, + 788, + 946, + 1104, + 0, + 156, + 302, + 448, + 594, + 745, + 896, + 1047, + 0, + 155, + 301, + 447, + 593, + 744, + 895, + 1046, + 0, + 151, + 285, + 419, + 553, + 692, + 831, + 970, + 0, + 154, + 295, + 436, + 577, + 723, + 869, + 1015, + 0, + 142, + 278, + 414, + 550, + 691, + 832, + 973, + 0, + 146, + 280, + 414, + 548, + 687, + 826, + 965, + 0, + 134, + 258, + 382, + 506, + 635, + 764, + 893, + 0, + 133, + 261, + 389, + 517, + 650, + 783, + 916, + 0, + 133, + 250, + 367, + 484, + 606, + 728, + 850, + 0, + 134, + 257, + 380, + 503, + 631, + 759, + 887, + 0, + 132, + 244, + 356, + 468, + 585, + 702, + 819, + 0, + 137, + 254, + 371, + 488, + 610, + 732, + 854, + 0, + 115, + 220, + 325, + 430, + 540, + 650, + 760, + 0, + 126, + 236, + 346, + 456, + 571, + 686, + 801, + 0, + 114, + 215, + 316, + 417, + 523, + 629, + 735, + 0, + 112, + 214, + 316, + 418, + 525, + 632, + 739, + 0, + 112, + 209, + 306, + 403, + 505, + 607, + 709, + 0, + 108, + 204, + 300, + 396, + 497, + 598, + 699, + 0, + 109, + 203, + 297, + 391, + 490, + 589, + 688, + 0, + 96, + 185, + 274, + 363, + 457, + 551, + 645, + 0, + 92, + 177, + 262, + 347, + 437, + 527, + 617, + 0, + 97, + 182, + 267, + 352, + 442, + 532, + 622, + 0, + 93, + 171, + 249, + 327, + 410, + 493, + 576, + 0, + 84, + 163, + 242, + 321, + 405, + 489, + 573, + 0, + 86, + 161, + 236, + 311, + 391, + 471, + 551, + 0, + 89, + 163, + 237, + 311, + 390, + 469, + 548, + 0, + 70, + 135, + 200, + 265, + 335, + 405, + 475, + 0, + 82, + 150, + 218, + 286, + 359, + 432, + 505, + 0, + 65, + 124, + 183, + 242, + 306, + 370, + 434, + 0, + 79, + 140, + 201, + 262, + 328, + 394, + 460, + 0, + 61, + 115, + 169, + 223, + 282, + 341, + 400, + 0, + 62, + 117, + 172, + 227, + 287, + 347, + 407, + 0, + 59, + 109, + 159, + 209, + 264, + 319, + 374, + 0, + 47, + 89, + 131, + 173, + 220, + 267, + 314, + 0, + 56, + 97, + 138, + 179, + 225, + 271, + 317, + 0, + 51, + 87, + 123, + 159, + 200, + 241, + 282, + 0, + 49, + 85, + 121, + 157, + 198, + 239, + 280, + 0, + 42, + 71, + 100, + 129, + 163, + 197, + 231, + 0, + 44, + 78, + 112, + 146, + 185, + 224, + 263, + 0, + 32, + 56, + 80, + 104, + 133, + 162, + 191, + 0, + 46, + 73, + 100, + 127, + 159, + 191, + 223, + 0, + 31, + 52, + 73, + 94, + 120, + 146, + 172, + 0, + 29, + 45, + 61, + 77, + 98, + 119, + 140, + 0, + 21, + 37, + 53, + 69, + 90, + 111, + 132, + 0, + 20, + 32, + 44, + 56, + 73, + 90, + 107, + 0, + 27, + 39, + 51, + 63, + 80, + 97, + 114 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -117 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ] + ], + "b": 114 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ] + ], + "b": -124 + }, + { + "a": [ + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ] + ], + "b": 117 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ] + ], + "b": -127 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ] + ], + "b": 122 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ] + ], + "b": -132 + }, + { + "a": [ + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ] + ], + "b": 129 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ] + ], + "b": -139 + }, + { + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ] + ], + "b": 135 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ] + ], + "b": -145 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ] + ], + "b": 139 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ] + ], + "b": -149 + }, + { + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ] + ], + "b": 145 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ] + ], + "b": -155 + }, + { + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ] + ], + "b": 150 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ] + ], + "b": -160 + }, + { + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ] + ], + "b": 156 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ] + ], + "b": -166 + }, + { + "a": [ + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ] + ], + "b": 160 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ] + ], + "b": -170 + }, + { + "a": [ + [ + 304, + 1 + ], + [ + 305, + 1 + ], + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 304, + -1 + ], + [ + 305, + -1 + ], + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ] + ], + "b": 163 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ] + ], + "b": -173 + }, + { + "a": [ + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ] + ], + "b": 168 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ] + ], + "b": -178 + }, + { + "a": [ + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ], + [ + 324, + 1 + ], + [ + 325, + 1 + ], + [ + 326, + 1 + ], + [ + 327, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ], + [ + 324, + -1 + ], + [ + 325, + -1 + ], + [ + 326, + -1 + ], + [ + 327, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ] + ], + "b": 171 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ] + ], + "b": -181 + }, + { + "a": [ + [ + 328, + 1 + ], + [ + 329, + 1 + ], + [ + 330, + 1 + ], + [ + 331, + 1 + ], + [ + 332, + 1 + ], + [ + 333, + 1 + ], + [ + 334, + 1 + ], + [ + 335, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 328, + -1 + ], + [ + 329, + -1 + ], + [ + 330, + -1 + ], + [ + 331, + -1 + ], + [ + 332, + -1 + ], + [ + 333, + -1 + ], + [ + 334, + -1 + ], + [ + 335, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ] + ], + "b": 173 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ] + ], + "b": -183 + }, + { + "a": [ + [ + 336, + 1 + ], + [ + 337, + 1 + ], + [ + 338, + 1 + ], + [ + 339, + 1 + ], + [ + 340, + 1 + ], + [ + 341, + 1 + ], + [ + 342, + 1 + ], + [ + 343, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 336, + -1 + ], + [ + 337, + -1 + ], + [ + 338, + -1 + ], + [ + 339, + -1 + ], + [ + 340, + -1 + ], + [ + 341, + -1 + ], + [ + 342, + -1 + ], + [ + 343, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ] + ], + "b": 179 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ] + ], + "b": -189 + }, + { + "a": [ + [ + 344, + 1 + ], + [ + 345, + 1 + ], + [ + 346, + 1 + ], + [ + 347, + 1 + ], + [ + 348, + 1 + ], + [ + 349, + 1 + ], + [ + 350, + 1 + ], + [ + 351, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 344, + -1 + ], + [ + 345, + -1 + ], + [ + 346, + -1 + ], + [ + 347, + -1 + ], + [ + 348, + -1 + ], + [ + 349, + -1 + ], + [ + 350, + -1 + ], + [ + 351, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ] + ], + "b": 186 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ] + ], + "b": -196 + }, + { + "a": [ + [ + 352, + 1 + ], + [ + 353, + 1 + ], + [ + 354, + 1 + ], + [ + 355, + 1 + ], + [ + 356, + 1 + ], + [ + 357, + 1 + ], + [ + 358, + 1 + ], + [ + 359, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 352, + -1 + ], + [ + 353, + -1 + ], + [ + 354, + -1 + ], + [ + 355, + -1 + ], + [ + 356, + -1 + ], + [ + 357, + -1 + ], + [ + 358, + -1 + ], + [ + 359, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ], + [ + 353, + 1 + ], + [ + 354, + 2 + ], + [ + 355, + 3 + ], + [ + 356, + 4 + ], + [ + 357, + 5 + ], + [ + 358, + 6 + ], + [ + 359, + 7 + ] + ], + "b": 187 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ], + [ + 353, + -1 + ], + [ + 354, + -2 + ], + [ + 355, + -3 + ], + [ + 356, + -4 + ], + [ + 357, + -5 + ], + [ + 358, + -6 + ], + [ + 359, + -7 + ] + ], + "b": -197 + }, + { + "a": [ + [ + 360, + 1 + ], + [ + 361, + 1 + ], + [ + 362, + 1 + ], + [ + 363, + 1 + ], + [ + 364, + 1 + ], + [ + 365, + 1 + ], + [ + 366, + 1 + ], + [ + 367, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 360, + -1 + ], + [ + 361, + -1 + ], + [ + 362, + -1 + ], + [ + 363, + -1 + ], + [ + 364, + -1 + ], + [ + 365, + -1 + ], + [ + 366, + -1 + ], + [ + 367, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ], + [ + 353, + 1 + ], + [ + 354, + 2 + ], + [ + 355, + 3 + ], + [ + 356, + 4 + ], + [ + 357, + 5 + ], + [ + 358, + 6 + ], + [ + 359, + 7 + ], + [ + 361, + 1 + ], + [ + 362, + 2 + ], + [ + 363, + 3 + ], + [ + 364, + 4 + ], + [ + 365, + 5 + ], + [ + 366, + 6 + ], + [ + 367, + 7 + ] + ], + "b": 194 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ], + [ + 353, + -1 + ], + [ + 354, + -2 + ], + [ + 355, + -3 + ], + [ + 356, + -4 + ], + [ + 357, + -5 + ], + [ + 358, + -6 + ], + [ + 359, + -7 + ], + [ + 361, + -1 + ], + [ + 362, + -2 + ], + [ + 363, + -3 + ], + [ + 364, + -4 + ], + [ + 365, + -5 + ], + [ + 366, + -6 + ], + [ + 367, + -7 + ] + ], + "b": -204 + }, + { + "a": [ + [ + 368, + 1 + ], + [ + 369, + 1 + ], + [ + 370, + 1 + ], + [ + 371, + 1 + ], + [ + 372, + 1 + ], + [ + 373, + 1 + ], + [ + 374, + 1 + ], + [ + 375, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 368, + -1 + ], + [ + 369, + -1 + ], + [ + 370, + -1 + ], + [ + 371, + -1 + ], + [ + 372, + -1 + ], + [ + 373, + -1 + ], + [ + 374, + -1 + ], + [ + 375, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ], + [ + 353, + 1 + ], + [ + 354, + 2 + ], + [ + 355, + 3 + ], + [ + 356, + 4 + ], + [ + 357, + 5 + ], + [ + 358, + 6 + ], + [ + 359, + 7 + ], + [ + 361, + 1 + ], + [ + 362, + 2 + ], + [ + 363, + 3 + ], + [ + 364, + 4 + ], + [ + 365, + 5 + ], + [ + 366, + 6 + ], + [ + 367, + 7 + ], + [ + 369, + 1 + ], + [ + 370, + 2 + ], + [ + 371, + 3 + ], + [ + 372, + 4 + ], + [ + 373, + 5 + ], + [ + 374, + 6 + ], + [ + 375, + 7 + ] + ], + "b": 196 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ], + [ + 353, + -1 + ], + [ + 354, + -2 + ], + [ + 355, + -3 + ], + [ + 356, + -4 + ], + [ + 357, + -5 + ], + [ + 358, + -6 + ], + [ + 359, + -7 + ], + [ + 361, + -1 + ], + [ + 362, + -2 + ], + [ + 363, + -3 + ], + [ + 364, + -4 + ], + [ + 365, + -5 + ], + [ + 366, + -6 + ], + [ + 367, + -7 + ], + [ + 369, + -1 + ], + [ + 370, + -2 + ], + [ + 371, + -3 + ], + [ + 372, + -4 + ], + [ + 373, + -5 + ], + [ + 374, + -6 + ], + [ + 375, + -7 + ] + ], + "b": -206 + }, + { + "a": [ + [ + 376, + 1 + ], + [ + 377, + 1 + ], + [ + 378, + 1 + ], + [ + 379, + 1 + ], + [ + 380, + 1 + ], + [ + 381, + 1 + ], + [ + 382, + 1 + ], + [ + 383, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 376, + -1 + ], + [ + 377, + -1 + ], + [ + 378, + -1 + ], + [ + 379, + -1 + ], + [ + 380, + -1 + ], + [ + 381, + -1 + ], + [ + 382, + -1 + ], + [ + 383, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ], + [ + 353, + 1 + ], + [ + 354, + 2 + ], + [ + 355, + 3 + ], + [ + 356, + 4 + ], + [ + 357, + 5 + ], + [ + 358, + 6 + ], + [ + 359, + 7 + ], + [ + 361, + 1 + ], + [ + 362, + 2 + ], + [ + 363, + 3 + ], + [ + 364, + 4 + ], + [ + 365, + 5 + ], + [ + 366, + 6 + ], + [ + 367, + 7 + ], + [ + 369, + 1 + ], + [ + 370, + 2 + ], + [ + 371, + 3 + ], + [ + 372, + 4 + ], + [ + 373, + 5 + ], + [ + 374, + 6 + ], + [ + 375, + 7 + ], + [ + 377, + 1 + ], + [ + 378, + 2 + ], + [ + 379, + 3 + ], + [ + 380, + 4 + ], + [ + 381, + 5 + ], + [ + 382, + 6 + ], + [ + 383, + 7 + ] + ], + "b": 202 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ], + [ + 353, + -1 + ], + [ + 354, + -2 + ], + [ + 355, + -3 + ], + [ + 356, + -4 + ], + [ + 357, + -5 + ], + [ + 358, + -6 + ], + [ + 359, + -7 + ], + [ + 361, + -1 + ], + [ + 362, + -2 + ], + [ + 363, + -3 + ], + [ + 364, + -4 + ], + [ + 365, + -5 + ], + [ + 366, + -6 + ], + [ + 367, + -7 + ], + [ + 369, + -1 + ], + [ + 370, + -2 + ], + [ + 371, + -3 + ], + [ + 372, + -4 + ], + [ + 373, + -5 + ], + [ + 374, + -6 + ], + [ + 375, + -7 + ], + [ + 377, + -1 + ], + [ + 378, + -2 + ], + [ + 379, + -3 + ], + [ + 380, + -4 + ], + [ + 381, + -5 + ], + [ + 382, + -6 + ], + [ + 383, + -7 + ] + ], + "b": -212 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ], + [ + 289, + 1 + ], + [ + 290, + 2 + ], + [ + 291, + 3 + ], + [ + 292, + 4 + ], + [ + 293, + 5 + ], + [ + 294, + 6 + ], + [ + 295, + 7 + ], + [ + 297, + 1 + ], + [ + 298, + 2 + ], + [ + 299, + 3 + ], + [ + 300, + 4 + ], + [ + 301, + 5 + ], + [ + 302, + 6 + ], + [ + 303, + 7 + ], + [ + 305, + 1 + ], + [ + 306, + 2 + ], + [ + 307, + 3 + ], + [ + 308, + 4 + ], + [ + 309, + 5 + ], + [ + 310, + 6 + ], + [ + 311, + 7 + ], + [ + 313, + 1 + ], + [ + 314, + 2 + ], + [ + 315, + 3 + ], + [ + 316, + 4 + ], + [ + 317, + 5 + ], + [ + 318, + 6 + ], + [ + 319, + 7 + ], + [ + 321, + 1 + ], + [ + 322, + 2 + ], + [ + 323, + 3 + ], + [ + 324, + 4 + ], + [ + 325, + 5 + ], + [ + 326, + 6 + ], + [ + 327, + 7 + ], + [ + 329, + 1 + ], + [ + 330, + 2 + ], + [ + 331, + 3 + ], + [ + 332, + 4 + ], + [ + 333, + 5 + ], + [ + 334, + 6 + ], + [ + 335, + 7 + ], + [ + 337, + 1 + ], + [ + 338, + 2 + ], + [ + 339, + 3 + ], + [ + 340, + 4 + ], + [ + 341, + 5 + ], + [ + 342, + 6 + ], + [ + 343, + 7 + ], + [ + 345, + 1 + ], + [ + 346, + 2 + ], + [ + 347, + 3 + ], + [ + 348, + 4 + ], + [ + 349, + 5 + ], + [ + 350, + 6 + ], + [ + 351, + 7 + ], + [ + 353, + 1 + ], + [ + 354, + 2 + ], + [ + 355, + 3 + ], + [ + 356, + 4 + ], + [ + 357, + 5 + ], + [ + 358, + 6 + ], + [ + 359, + 7 + ], + [ + 361, + 1 + ], + [ + 362, + 2 + ], + [ + 363, + 3 + ], + [ + 364, + 4 + ], + [ + 365, + 5 + ], + [ + 366, + 6 + ], + [ + 367, + 7 + ], + [ + 369, + 1 + ], + [ + 370, + 2 + ], + [ + 371, + 3 + ], + [ + 372, + 4 + ], + [ + 373, + 5 + ], + [ + 374, + 6 + ], + [ + 375, + 7 + ], + [ + 377, + 1 + ], + [ + 378, + 2 + ], + [ + 379, + 3 + ], + [ + 380, + 4 + ], + [ + 381, + 5 + ], + [ + 382, + 6 + ], + [ + 383, + 7 + ] + ], + "b": 202 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ], + [ + 289, + -1 + ], + [ + 290, + -2 + ], + [ + 291, + -3 + ], + [ + 292, + -4 + ], + [ + 293, + -5 + ], + [ + 294, + -6 + ], + [ + 295, + -7 + ], + [ + 297, + -1 + ], + [ + 298, + -2 + ], + [ + 299, + -3 + ], + [ + 300, + -4 + ], + [ + 301, + -5 + ], + [ + 302, + -6 + ], + [ + 303, + -7 + ], + [ + 305, + -1 + ], + [ + 306, + -2 + ], + [ + 307, + -3 + ], + [ + 308, + -4 + ], + [ + 309, + -5 + ], + [ + 310, + -6 + ], + [ + 311, + -7 + ], + [ + 313, + -1 + ], + [ + 314, + -2 + ], + [ + 315, + -3 + ], + [ + 316, + -4 + ], + [ + 317, + -5 + ], + [ + 318, + -6 + ], + [ + 319, + -7 + ], + [ + 321, + -1 + ], + [ + 322, + -2 + ], + [ + 323, + -3 + ], + [ + 324, + -4 + ], + [ + 325, + -5 + ], + [ + 326, + -6 + ], + [ + 327, + -7 + ], + [ + 329, + -1 + ], + [ + 330, + -2 + ], + [ + 331, + -3 + ], + [ + 332, + -4 + ], + [ + 333, + -5 + ], + [ + 334, + -6 + ], + [ + 335, + -7 + ], + [ + 337, + -1 + ], + [ + 338, + -2 + ], + [ + 339, + -3 + ], + [ + 340, + -4 + ], + [ + 341, + -5 + ], + [ + 342, + -6 + ], + [ + 343, + -7 + ], + [ + 345, + -1 + ], + [ + 346, + -2 + ], + [ + 347, + -3 + ], + [ + 348, + -4 + ], + [ + 349, + -5 + ], + [ + 350, + -6 + ], + [ + 351, + -7 + ], + [ + 353, + -1 + ], + [ + 354, + -2 + ], + [ + 355, + -3 + ], + [ + 356, + -4 + ], + [ + 357, + -5 + ], + [ + 358, + -6 + ], + [ + 359, + -7 + ], + [ + 361, + -1 + ], + [ + 362, + -2 + ], + [ + 363, + -3 + ], + [ + 364, + -4 + ], + [ + 365, + -5 + ], + [ + 366, + -6 + ], + [ + 367, + -7 + ], + [ + 369, + -1 + ], + [ + 370, + -2 + ], + [ + 371, + -3 + ], + [ + 372, + -4 + ], + [ + 373, + -5 + ], + [ + 374, + -6 + ], + [ + 375, + -7 + ], + [ + 377, + -1 + ], + [ + 378, + -2 + ], + [ + 379, + -3 + ], + [ + 380, + -4 + ], + [ + 381, + -5 + ], + [ + 382, + -6 + ], + [ + 383, + -7 + ] + ], + "b": -202 + } + ], + "parameters": { + "periods": 48, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1, + 6, + 7, + 3, + 5, + 7, + 6, + 4, + 6, + 5, + 6, + 4, + 3, + 5, + 3, + 2, + 6, + 7, + 1, + 7, + 2, + 6 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ], + [ + 0, + 26, + 37, + 48, + 59, + 75, + 91, + 107 + ], + [ + 0, + 10, + 15, + 20, + 25, + 35, + 45, + 55 + ], + [ + 0, + 25, + 36, + 47, + 58, + 74, + 90, + 106 + ], + [ + 0, + 11, + 16, + 21, + 26, + 36, + 46, + 56 + ], + [ + 0, + 28, + 38, + 48, + 58, + 73, + 88, + 103 + ], + [ + 0, + 13, + 19, + 25, + 31, + 42, + 53, + 64 + ], + [ + 0, + 17, + 27, + 37, + 47, + 62, + 77, + 92 + ], + [ + 0, + 17, + 25, + 33, + 41, + 54, + 67, + 80 + ], + [ + 0, + 8, + 11, + 14, + 17, + 25, + 33, + 41 + ], + [ + 0, + 20, + 25, + 30, + 35, + 45, + 55, + 65 + ], + [ + 0, + 18, + 21, + 24, + 27, + 35, + 43, + 51 + ], + [ + 0, + 19, + 25, + 31, + 37, + 48, + 59, + 70 + ], + [ + 0, + 15, + 17, + 19, + 21, + 28, + 35, + 42 + ], + [ + 0, + 20, + 30, + 40, + 50, + 65, + 80, + 95 + ], + [ + 0, + 11, + 14, + 17, + 20, + 28, + 36, + 44 + ], + [ + 0, + 28, + 37, + 46, + 55, + 69, + 83, + 97 + ], + [ + 0, + 16, + 22, + 28, + 34, + 45, + 56, + 67 + ], + [ + 0, + 17, + 21, + 25, + 29, + 38, + 47, + 56 + ], + [ + 0, + 12, + 19, + 26, + 33, + 45, + 57, + 69 + ], + [ + 0, + 14, + 20, + 26, + 32, + 43, + 54, + 65 + ], + [ + 0, + 24, + 33, + 42, + 51, + 65, + 79, + 93 + ] + ], + "objective_constant": -14388, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 384, + "variables": 384, + "rows": 194, + "nonzeros": 17904, + "globals": 0 + }, + "input_variables": 384, + "model_variables": 384, + "modelled_variables": 384, + "size_unit": "periods" + }, + "json_sha256": "40cec25b5cbd571ecca858c3bf4880127e3470ce03270e02b4640a8bb5e6e5d2", + "txt_sha256": "b1cdca08f808a2fd83cdf69012b29359a4b2de156ea335661147475870baf365" + }, + { + "id": "production-36-single", + "category": "production", + "size": 36, + "variant": "single", + "model": { + "id": "production_single_36", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 36, + "natural_size": 36, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 288, + "c": [ + 0, + 129, + 239, + 349, + 459, + 574, + 689, + 804, + 0, + 135, + 252, + 369, + 486, + 608, + 730, + 852, + 0, + 120, + 230, + 340, + 450, + 565, + 680, + 795, + 0, + 119, + 229, + 339, + 449, + 564, + 679, + 794, + 0, + 115, + 213, + 311, + 409, + 512, + 615, + 718, + 0, + 118, + 223, + 328, + 433, + 543, + 653, + 763, + 0, + 106, + 206, + 306, + 406, + 511, + 616, + 721, + 0, + 110, + 208, + 306, + 404, + 507, + 610, + 713, + 0, + 98, + 186, + 274, + 362, + 455, + 548, + 641, + 0, + 97, + 189, + 281, + 373, + 470, + 567, + 664, + 0, + 97, + 178, + 259, + 340, + 426, + 512, + 598, + 0, + 98, + 185, + 272, + 359, + 451, + 543, + 635, + 0, + 96, + 172, + 248, + 324, + 405, + 486, + 567, + 0, + 101, + 182, + 263, + 344, + 430, + 516, + 602, + 0, + 79, + 148, + 217, + 286, + 360, + 434, + 508, + 0, + 90, + 164, + 238, + 312, + 391, + 470, + 549, + 0, + 78, + 143, + 208, + 273, + 343, + 413, + 483, + 0, + 76, + 142, + 208, + 274, + 345, + 416, + 487, + 0, + 76, + 137, + 198, + 259, + 325, + 391, + 457, + 0, + 72, + 132, + 192, + 252, + 317, + 382, + 447, + 0, + 73, + 131, + 189, + 247, + 310, + 373, + 436, + 0, + 60, + 113, + 166, + 219, + 277, + 335, + 393, + 0, + 56, + 105, + 154, + 203, + 257, + 311, + 365, + 0, + 61, + 110, + 159, + 208, + 262, + 316, + 370, + 0, + 57, + 99, + 141, + 183, + 230, + 277, + 324, + 0, + 48, + 91, + 134, + 177, + 225, + 273, + 321, + 0, + 50, + 89, + 128, + 167, + 211, + 255, + 299, + 0, + 53, + 91, + 129, + 167, + 210, + 253, + 296, + 0, + 34, + 63, + 92, + 121, + 155, + 189, + 223, + 0, + 46, + 78, + 110, + 142, + 179, + 216, + 253, + 0, + 29, + 52, + 75, + 98, + 126, + 154, + 182, + 0, + 43, + 68, + 93, + 118, + 148, + 178, + 208, + 0, + 25, + 43, + 61, + 79, + 102, + 125, + 148, + 0, + 26, + 45, + 64, + 83, + 107, + 131, + 155, + 0, + 23, + 37, + 51, + 65, + 84, + 103, + 122, + 0, + 11, + 17, + 23, + 29, + 40, + 51, + 62 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -117 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ] + ], + "b": 114 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ] + ], + "b": -124 + }, + { + "a": [ + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ] + ], + "b": 117 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ] + ], + "b": -127 + }, + { + "a": [ + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ] + ], + "b": 122 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ] + ], + "b": -132 + }, + { + "a": [ + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ], + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ], + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ] + ], + "b": 129 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ] + ], + "b": -139 + }, + { + "a": [ + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ] + ], + "b": 135 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ] + ], + "b": -145 + }, + { + "a": [ + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ], + [ + 270, + 1 + ], + [ + 271, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ], + [ + 270, + -1 + ], + [ + 271, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ] + ], + "b": 139 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ] + ], + "b": -149 + }, + { + "a": [ + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ] + ], + "b": 145 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ] + ], + "b": -155 + }, + { + "a": [ + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ] + ], + "b": 150 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ] + ], + "b": -160 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ], + [ + 241, + 1 + ], + [ + 242, + 2 + ], + [ + 243, + 3 + ], + [ + 244, + 4 + ], + [ + 245, + 5 + ], + [ + 246, + 6 + ], + [ + 247, + 7 + ], + [ + 249, + 1 + ], + [ + 250, + 2 + ], + [ + 251, + 3 + ], + [ + 252, + 4 + ], + [ + 253, + 5 + ], + [ + 254, + 6 + ], + [ + 255, + 7 + ], + [ + 257, + 1 + ], + [ + 258, + 2 + ], + [ + 259, + 3 + ], + [ + 260, + 4 + ], + [ + 261, + 5 + ], + [ + 262, + 6 + ], + [ + 263, + 7 + ], + [ + 265, + 1 + ], + [ + 266, + 2 + ], + [ + 267, + 3 + ], + [ + 268, + 4 + ], + [ + 269, + 5 + ], + [ + 270, + 6 + ], + [ + 271, + 7 + ], + [ + 273, + 1 + ], + [ + 274, + 2 + ], + [ + 275, + 3 + ], + [ + 276, + 4 + ], + [ + 277, + 5 + ], + [ + 278, + 6 + ], + [ + 279, + 7 + ], + [ + 281, + 1 + ], + [ + 282, + 2 + ], + [ + 283, + 3 + ], + [ + 284, + 4 + ], + [ + 285, + 5 + ], + [ + 286, + 6 + ], + [ + 287, + 7 + ] + ], + "b": 150 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ], + [ + 241, + -1 + ], + [ + 242, + -2 + ], + [ + 243, + -3 + ], + [ + 244, + -4 + ], + [ + 245, + -5 + ], + [ + 246, + -6 + ], + [ + 247, + -7 + ], + [ + 249, + -1 + ], + [ + 250, + -2 + ], + [ + 251, + -3 + ], + [ + 252, + -4 + ], + [ + 253, + -5 + ], + [ + 254, + -6 + ], + [ + 255, + -7 + ], + [ + 257, + -1 + ], + [ + 258, + -2 + ], + [ + 259, + -3 + ], + [ + 260, + -4 + ], + [ + 261, + -5 + ], + [ + 262, + -6 + ], + [ + 263, + -7 + ], + [ + 265, + -1 + ], + [ + 266, + -2 + ], + [ + 267, + -3 + ], + [ + 268, + -4 + ], + [ + 269, + -5 + ], + [ + 270, + -6 + ], + [ + 271, + -7 + ], + [ + 273, + -1 + ], + [ + 274, + -2 + ], + [ + 275, + -3 + ], + [ + 276, + -4 + ], + [ + 277, + -5 + ], + [ + 278, + -6 + ], + [ + 279, + -7 + ], + [ + 281, + -1 + ], + [ + 282, + -2 + ], + [ + 283, + -3 + ], + [ + 284, + -4 + ], + [ + 285, + -5 + ], + [ + 286, + -6 + ], + [ + 287, + -7 + ] + ], + "b": -150 + } + ], + "parameters": { + "periods": 36, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1, + 6, + 7, + 3, + 5, + 7, + 6, + 4, + 6, + 5 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ], + [ + 0, + 26, + 37, + 48, + 59, + 75, + 91, + 107 + ], + [ + 0, + 10, + 15, + 20, + 25, + 35, + 45, + 55 + ], + [ + 0, + 25, + 36, + 47, + 58, + 74, + 90, + 106 + ], + [ + 0, + 11, + 16, + 21, + 26, + 36, + 46, + 56 + ], + [ + 0, + 28, + 38, + 48, + 58, + 73, + 88, + 103 + ], + [ + 0, + 13, + 19, + 25, + 31, + 42, + 53, + 64 + ], + [ + 0, + 17, + 27, + 37, + 47, + 62, + 77, + 92 + ], + [ + 0, + 17, + 25, + 33, + 41, + 54, + 67, + 80 + ], + [ + 0, + 8, + 11, + 14, + 17, + 25, + 33, + 41 + ] + ], + "objective_constant": -7983, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 288, + "variables": 288, + "rows": 146, + "nonzeros": 10404, + "globals": 0 + }, + "input_variables": 288, + "model_variables": 288, + "modelled_variables": 288, + "size_unit": "periods" + }, + "json_sha256": "8eb77f14fb385b440a5ae469f9ead7c228d44ecb7d24786abacc403e04147ecf", + "txt_sha256": "64b481bf62138a96a4d84dae3eb57406db3797c12a05edcf00887f8e59a2f199" + }, + { + "id": "production-30-single", + "category": "production", + "size": 30, + "variant": "single", + "model": { + "id": "production_single_30", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 30, + "natural_size": 30, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 240, + "c": [ + 0, + 111, + 203, + 295, + 387, + 484, + 581, + 678, + 0, + 117, + 216, + 315, + 414, + 518, + 622, + 726, + 0, + 102, + 194, + 286, + 378, + 475, + 572, + 669, + 0, + 101, + 193, + 285, + 377, + 474, + 571, + 668, + 0, + 97, + 177, + 257, + 337, + 422, + 507, + 592, + 0, + 100, + 187, + 274, + 361, + 453, + 545, + 637, + 0, + 88, + 170, + 252, + 334, + 421, + 508, + 595, + 0, + 92, + 172, + 252, + 332, + 417, + 502, + 587, + 0, + 80, + 150, + 220, + 290, + 365, + 440, + 515, + 0, + 79, + 153, + 227, + 301, + 380, + 459, + 538, + 0, + 79, + 142, + 205, + 268, + 336, + 404, + 472, + 0, + 80, + 149, + 218, + 287, + 361, + 435, + 509, + 0, + 78, + 136, + 194, + 252, + 315, + 378, + 441, + 0, + 83, + 146, + 209, + 272, + 340, + 408, + 476, + 0, + 61, + 112, + 163, + 214, + 270, + 326, + 382, + 0, + 72, + 128, + 184, + 240, + 301, + 362, + 423, + 0, + 60, + 107, + 154, + 201, + 253, + 305, + 357, + 0, + 58, + 106, + 154, + 202, + 255, + 308, + 361, + 0, + 58, + 101, + 144, + 187, + 235, + 283, + 331, + 0, + 54, + 96, + 138, + 180, + 227, + 274, + 321, + 0, + 55, + 95, + 135, + 175, + 220, + 265, + 310, + 0, + 42, + 77, + 112, + 147, + 187, + 227, + 267, + 0, + 38, + 69, + 100, + 131, + 167, + 203, + 239, + 0, + 43, + 74, + 105, + 136, + 172, + 208, + 244, + 0, + 39, + 63, + 87, + 111, + 140, + 169, + 198, + 0, + 30, + 55, + 80, + 105, + 135, + 165, + 195, + 0, + 32, + 53, + 74, + 95, + 121, + 147, + 173, + 0, + 35, + 55, + 75, + 95, + 120, + 145, + 170, + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97, + 0, + 28, + 42, + 56, + 70, + 89, + 108, + 127 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -117 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ] + ], + "b": 114 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ] + ], + "b": -124 + }, + { + "a": [ + [ + 232, + 1 + ], + [ + 233, + 1 + ], + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 232, + -1 + ], + [ + 233, + -1 + ], + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ] + ], + "b": 117 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ] + ], + "b": -127 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ], + [ + 233, + 1 + ], + [ + 234, + 2 + ], + [ + 235, + 3 + ], + [ + 236, + 4 + ], + [ + 237, + 5 + ], + [ + 238, + 6 + ], + [ + 239, + 7 + ] + ], + "b": 117 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ], + [ + 233, + -1 + ], + [ + 234, + -2 + ], + [ + 235, + -3 + ], + [ + 236, + -4 + ], + [ + 237, + -5 + ], + [ + 238, + -6 + ], + [ + 239, + -7 + ] + ], + "b": -117 + } + ], + "parameters": { + "periods": 30, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1, + 6, + 7, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ], + [ + 0, + 26, + 37, + 48, + 59, + 75, + 91, + 107 + ], + [ + 0, + 10, + 15, + 20, + 25, + 35, + 45, + 55 + ], + [ + 0, + 25, + 36, + 47, + 58, + 74, + 90, + 106 + ] + ], + "objective_constant": -5523, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 240, + "variables": 240, + "rows": 122, + "nonzeros": 7410, + "globals": 0 + }, + "input_variables": 240, + "model_variables": 240, + "modelled_variables": 240, + "size_unit": "periods" + }, + "json_sha256": "b8cc459ad020ffefef2ea84dfd9fb243451b0afc5f3787deba5b585fb52a802a", + "txt_sha256": "5f646e7a0c7f6202ed459de82b2499a008afd6afb80e12c53a1063059e2e79c6" + }, + { + "id": "production-27-single", + "category": "production", + "size": 27, + "variant": "single", + "model": { + "id": "production_single_27", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 27, + "natural_size": 27, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 216, + "c": [ + 0, + 102, + 185, + 268, + 351, + 439, + 527, + 615, + 0, + 108, + 198, + 288, + 378, + 473, + 568, + 663, + 0, + 93, + 176, + 259, + 342, + 430, + 518, + 606, + 0, + 92, + 175, + 258, + 341, + 429, + 517, + 605, + 0, + 88, + 159, + 230, + 301, + 377, + 453, + 529, + 0, + 91, + 169, + 247, + 325, + 408, + 491, + 574, + 0, + 79, + 152, + 225, + 298, + 376, + 454, + 532, + 0, + 83, + 154, + 225, + 296, + 372, + 448, + 524, + 0, + 71, + 132, + 193, + 254, + 320, + 386, + 452, + 0, + 70, + 135, + 200, + 265, + 335, + 405, + 475, + 0, + 70, + 124, + 178, + 232, + 291, + 350, + 409, + 0, + 71, + 131, + 191, + 251, + 316, + 381, + 446, + 0, + 69, + 118, + 167, + 216, + 270, + 324, + 378, + 0, + 74, + 128, + 182, + 236, + 295, + 354, + 413, + 0, + 52, + 94, + 136, + 178, + 225, + 272, + 319, + 0, + 63, + 110, + 157, + 204, + 256, + 308, + 360, + 0, + 51, + 89, + 127, + 165, + 208, + 251, + 294, + 0, + 49, + 88, + 127, + 166, + 210, + 254, + 298, + 0, + 49, + 83, + 117, + 151, + 190, + 229, + 268, + 0, + 45, + 78, + 111, + 144, + 182, + 220, + 258, + 0, + 46, + 77, + 108, + 139, + 175, + 211, + 247, + 0, + 33, + 59, + 85, + 111, + 142, + 173, + 204, + 0, + 29, + 51, + 73, + 95, + 122, + 149, + 176, + 0, + 34, + 56, + 78, + 100, + 127, + 154, + 181, + 0, + 30, + 45, + 60, + 75, + 95, + 115, + 135, + 0, + 21, + 37, + 53, + 69, + 90, + 111, + 132, + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -101 + } + ], + "parameters": { + "periods": 27, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ] + ], + "objective_constant": -4509, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 216, + "variables": 216, + "rows": 110, + "nonzeros": 6102, + "globals": 0 + }, + "input_variables": 216, + "model_variables": 216, + "modelled_variables": 216, + "size_unit": "periods" + }, + "json_sha256": "a722f6886627dcd4fbda333973ed334b6f1956b8e6168b726f0b5df5f8a3850d", + "txt_sha256": "51edc2ca5e87fee50e96faacce7ea7a93ac64a1aed57659e9e0489ee9a7ef6b3" + }, + { + "id": "production-28-single", + "category": "production", + "size": 28, + "variant": "single", + "model": { + "id": "production_single_28", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 28, + "natural_size": 28, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 224, + "c": [ + 0, + 105, + 191, + 277, + 363, + 454, + 545, + 636, + 0, + 111, + 204, + 297, + 390, + 488, + 586, + 684, + 0, + 96, + 182, + 268, + 354, + 445, + 536, + 627, + 0, + 95, + 181, + 267, + 353, + 444, + 535, + 626, + 0, + 91, + 165, + 239, + 313, + 392, + 471, + 550, + 0, + 94, + 175, + 256, + 337, + 423, + 509, + 595, + 0, + 82, + 158, + 234, + 310, + 391, + 472, + 553, + 0, + 86, + 160, + 234, + 308, + 387, + 466, + 545, + 0, + 74, + 138, + 202, + 266, + 335, + 404, + 473, + 0, + 73, + 141, + 209, + 277, + 350, + 423, + 496, + 0, + 73, + 130, + 187, + 244, + 306, + 368, + 430, + 0, + 74, + 137, + 200, + 263, + 331, + 399, + 467, + 0, + 72, + 124, + 176, + 228, + 285, + 342, + 399, + 0, + 77, + 134, + 191, + 248, + 310, + 372, + 434, + 0, + 55, + 100, + 145, + 190, + 240, + 290, + 340, + 0, + 66, + 116, + 166, + 216, + 271, + 326, + 381, + 0, + 54, + 95, + 136, + 177, + 223, + 269, + 315, + 0, + 52, + 94, + 136, + 178, + 225, + 272, + 319, + 0, + 52, + 89, + 126, + 163, + 205, + 247, + 289, + 0, + 48, + 84, + 120, + 156, + 197, + 238, + 279, + 0, + 49, + 83, + 117, + 151, + 190, + 229, + 268, + 0, + 36, + 65, + 94, + 123, + 157, + 191, + 225, + 0, + 32, + 57, + 82, + 107, + 137, + 167, + 197, + 0, + 37, + 62, + 87, + 112, + 142, + 172, + 202, + 0, + 33, + 51, + 69, + 87, + 110, + 133, + 156, + 0, + 24, + 43, + 62, + 81, + 105, + 129, + 153, + 0, + 26, + 41, + 56, + 71, + 91, + 111, + 131, + 0, + 29, + 43, + 57, + 71, + 90, + 109, + 128 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -117 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -107 + } + ], + "parameters": { + "periods": 28, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1, + 6 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ], + [ + 0, + 26, + 37, + 48, + 59, + 75, + 91, + 107 + ] + ], + "objective_constant": -4830, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 224, + "variables": 224, + "rows": 114, + "nonzeros": 6524, + "globals": 0 + }, + "input_variables": 224, + "model_variables": 224, + "modelled_variables": 224, + "size_unit": "periods" + }, + "json_sha256": "5c9f090ed3da469c30b846d281bc37897e85204c70a97bd07b8bd2f1501015d2", + "txt_sha256": "a224bccca0558c4d70b1f33aae447f0b46766b1a5cedffd2a5954f8579bcce9a" + }, + { + "id": "production-29-single", + "category": "production", + "size": 29, + "variant": "single", + "model": { + "id": "production_single_29", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 29, + "natural_size": 29, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 232, + "c": [ + 0, + 108, + 197, + 286, + 375, + 469, + 563, + 657, + 0, + 114, + 210, + 306, + 402, + 503, + 604, + 705, + 0, + 99, + 188, + 277, + 366, + 460, + 554, + 648, + 0, + 98, + 187, + 276, + 365, + 459, + 553, + 647, + 0, + 94, + 171, + 248, + 325, + 407, + 489, + 571, + 0, + 97, + 181, + 265, + 349, + 438, + 527, + 616, + 0, + 85, + 164, + 243, + 322, + 406, + 490, + 574, + 0, + 89, + 166, + 243, + 320, + 402, + 484, + 566, + 0, + 77, + 144, + 211, + 278, + 350, + 422, + 494, + 0, + 76, + 147, + 218, + 289, + 365, + 441, + 517, + 0, + 76, + 136, + 196, + 256, + 321, + 386, + 451, + 0, + 77, + 143, + 209, + 275, + 346, + 417, + 488, + 0, + 75, + 130, + 185, + 240, + 300, + 360, + 420, + 0, + 80, + 140, + 200, + 260, + 325, + 390, + 455, + 0, + 58, + 106, + 154, + 202, + 255, + 308, + 361, + 0, + 69, + 122, + 175, + 228, + 286, + 344, + 402, + 0, + 57, + 101, + 145, + 189, + 238, + 287, + 336, + 0, + 55, + 100, + 145, + 190, + 240, + 290, + 340, + 0, + 55, + 95, + 135, + 175, + 220, + 265, + 310, + 0, + 51, + 90, + 129, + 168, + 212, + 256, + 300, + 0, + 52, + 89, + 126, + 163, + 205, + 247, + 289, + 0, + 39, + 71, + 103, + 135, + 172, + 209, + 246, + 0, + 35, + 63, + 91, + 119, + 152, + 185, + 218, + 0, + 40, + 68, + 96, + 124, + 157, + 190, + 223, + 0, + 36, + 57, + 78, + 99, + 125, + 151, + 177, + 0, + 27, + 49, + 71, + 93, + 120, + 147, + 174, + 0, + 29, + 47, + 65, + 83, + 106, + 129, + 152, + 0, + 32, + 49, + 66, + 83, + 105, + 127, + 149, + 0, + 13, + 21, + 29, + 37, + 50, + 63, + 76 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ] + ], + "b": 52 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ] + ], + "b": -62 + }, + { + "a": [ + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ], + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ], + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ] + ], + "b": 55 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ] + ], + "b": -65 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ] + ], + "b": 57 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ] + ], + "b": -67 + }, + { + "a": [ + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ], + [ + 126, + 1 + ], + [ + 127, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ], + [ + 126, + -1 + ], + [ + 127, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ] + ], + "b": 62 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ] + ], + "b": -72 + }, + { + "a": [ + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ] + ], + "b": 69 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ] + ], + "b": -79 + }, + { + "a": [ + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ] + ], + "b": 72 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ] + ], + "b": -82 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ] + ], + "b": 79 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ] + ], + "b": -89 + }, + { + "a": [ + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ] + ], + "b": 84 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ] + ], + "b": -94 + }, + { + "a": [ + [ + 160, + 1 + ], + [ + 161, + 1 + ], + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 160, + -1 + ], + [ + 161, + -1 + ], + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ] + ], + "b": 85 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ] + ], + "b": -95 + }, + { + "a": [ + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ] + ], + "b": 89 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ] + ], + "b": -99 + }, + { + "a": [ + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ], + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ], + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ] + ], + "b": 93 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ] + ], + "b": -103 + }, + { + "a": [ + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ] + ], + "b": 94 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ] + ], + "b": -104 + }, + { + "a": [ + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ], + [ + 198, + 1 + ], + [ + 199, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ], + [ + 198, + -1 + ], + [ + 199, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ] + ], + "b": 96 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ] + ], + "b": -106 + }, + { + "a": [ + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ] + ], + "b": 100 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ] + ], + "b": -110 + }, + { + "a": [ + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ] + ], + "b": 101 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ] + ], + "b": -111 + }, + { + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ] + ], + "b": 107 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ] + ], + "b": -117 + }, + { + "a": [ + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ] + ], + "b": 114 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ] + ], + "b": -124 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ], + [ + 97, + 1 + ], + [ + 98, + 2 + ], + [ + 99, + 3 + ], + [ + 100, + 4 + ], + [ + 101, + 5 + ], + [ + 102, + 6 + ], + [ + 103, + 7 + ], + [ + 105, + 1 + ], + [ + 106, + 2 + ], + [ + 107, + 3 + ], + [ + 108, + 4 + ], + [ + 109, + 5 + ], + [ + 110, + 6 + ], + [ + 111, + 7 + ], + [ + 113, + 1 + ], + [ + 114, + 2 + ], + [ + 115, + 3 + ], + [ + 116, + 4 + ], + [ + 117, + 5 + ], + [ + 118, + 6 + ], + [ + 119, + 7 + ], + [ + 121, + 1 + ], + [ + 122, + 2 + ], + [ + 123, + 3 + ], + [ + 124, + 4 + ], + [ + 125, + 5 + ], + [ + 126, + 6 + ], + [ + 127, + 7 + ], + [ + 129, + 1 + ], + [ + 130, + 2 + ], + [ + 131, + 3 + ], + [ + 132, + 4 + ], + [ + 133, + 5 + ], + [ + 134, + 6 + ], + [ + 135, + 7 + ], + [ + 137, + 1 + ], + [ + 138, + 2 + ], + [ + 139, + 3 + ], + [ + 140, + 4 + ], + [ + 141, + 5 + ], + [ + 142, + 6 + ], + [ + 143, + 7 + ], + [ + 145, + 1 + ], + [ + 146, + 2 + ], + [ + 147, + 3 + ], + [ + 148, + 4 + ], + [ + 149, + 5 + ], + [ + 150, + 6 + ], + [ + 151, + 7 + ], + [ + 153, + 1 + ], + [ + 154, + 2 + ], + [ + 155, + 3 + ], + [ + 156, + 4 + ], + [ + 157, + 5 + ], + [ + 158, + 6 + ], + [ + 159, + 7 + ], + [ + 161, + 1 + ], + [ + 162, + 2 + ], + [ + 163, + 3 + ], + [ + 164, + 4 + ], + [ + 165, + 5 + ], + [ + 166, + 6 + ], + [ + 167, + 7 + ], + [ + 169, + 1 + ], + [ + 170, + 2 + ], + [ + 171, + 3 + ], + [ + 172, + 4 + ], + [ + 173, + 5 + ], + [ + 174, + 6 + ], + [ + 175, + 7 + ], + [ + 177, + 1 + ], + [ + 178, + 2 + ], + [ + 179, + 3 + ], + [ + 180, + 4 + ], + [ + 181, + 5 + ], + [ + 182, + 6 + ], + [ + 183, + 7 + ], + [ + 185, + 1 + ], + [ + 186, + 2 + ], + [ + 187, + 3 + ], + [ + 188, + 4 + ], + [ + 189, + 5 + ], + [ + 190, + 6 + ], + [ + 191, + 7 + ], + [ + 193, + 1 + ], + [ + 194, + 2 + ], + [ + 195, + 3 + ], + [ + 196, + 4 + ], + [ + 197, + 5 + ], + [ + 198, + 6 + ], + [ + 199, + 7 + ], + [ + 201, + 1 + ], + [ + 202, + 2 + ], + [ + 203, + 3 + ], + [ + 204, + 4 + ], + [ + 205, + 5 + ], + [ + 206, + 6 + ], + [ + 207, + 7 + ], + [ + 209, + 1 + ], + [ + 210, + 2 + ], + [ + 211, + 3 + ], + [ + 212, + 4 + ], + [ + 213, + 5 + ], + [ + 214, + 6 + ], + [ + 215, + 7 + ], + [ + 217, + 1 + ], + [ + 218, + 2 + ], + [ + 219, + 3 + ], + [ + 220, + 4 + ], + [ + 221, + 5 + ], + [ + 222, + 6 + ], + [ + 223, + 7 + ], + [ + 225, + 1 + ], + [ + 226, + 2 + ], + [ + 227, + 3 + ], + [ + 228, + 4 + ], + [ + 229, + 5 + ], + [ + 230, + 6 + ], + [ + 231, + 7 + ] + ], + "b": 114 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ], + [ + 97, + -1 + ], + [ + 98, + -2 + ], + [ + 99, + -3 + ], + [ + 100, + -4 + ], + [ + 101, + -5 + ], + [ + 102, + -6 + ], + [ + 103, + -7 + ], + [ + 105, + -1 + ], + [ + 106, + -2 + ], + [ + 107, + -3 + ], + [ + 108, + -4 + ], + [ + 109, + -5 + ], + [ + 110, + -6 + ], + [ + 111, + -7 + ], + [ + 113, + -1 + ], + [ + 114, + -2 + ], + [ + 115, + -3 + ], + [ + 116, + -4 + ], + [ + 117, + -5 + ], + [ + 118, + -6 + ], + [ + 119, + -7 + ], + [ + 121, + -1 + ], + [ + 122, + -2 + ], + [ + 123, + -3 + ], + [ + 124, + -4 + ], + [ + 125, + -5 + ], + [ + 126, + -6 + ], + [ + 127, + -7 + ], + [ + 129, + -1 + ], + [ + 130, + -2 + ], + [ + 131, + -3 + ], + [ + 132, + -4 + ], + [ + 133, + -5 + ], + [ + 134, + -6 + ], + [ + 135, + -7 + ], + [ + 137, + -1 + ], + [ + 138, + -2 + ], + [ + 139, + -3 + ], + [ + 140, + -4 + ], + [ + 141, + -5 + ], + [ + 142, + -6 + ], + [ + 143, + -7 + ], + [ + 145, + -1 + ], + [ + 146, + -2 + ], + [ + 147, + -3 + ], + [ + 148, + -4 + ], + [ + 149, + -5 + ], + [ + 150, + -6 + ], + [ + 151, + -7 + ], + [ + 153, + -1 + ], + [ + 154, + -2 + ], + [ + 155, + -3 + ], + [ + 156, + -4 + ], + [ + 157, + -5 + ], + [ + 158, + -6 + ], + [ + 159, + -7 + ], + [ + 161, + -1 + ], + [ + 162, + -2 + ], + [ + 163, + -3 + ], + [ + 164, + -4 + ], + [ + 165, + -5 + ], + [ + 166, + -6 + ], + [ + 167, + -7 + ], + [ + 169, + -1 + ], + [ + 170, + -2 + ], + [ + 171, + -3 + ], + [ + 172, + -4 + ], + [ + 173, + -5 + ], + [ + 174, + -6 + ], + [ + 175, + -7 + ], + [ + 177, + -1 + ], + [ + 178, + -2 + ], + [ + 179, + -3 + ], + [ + 180, + -4 + ], + [ + 181, + -5 + ], + [ + 182, + -6 + ], + [ + 183, + -7 + ], + [ + 185, + -1 + ], + [ + 186, + -2 + ], + [ + 187, + -3 + ], + [ + 188, + -4 + ], + [ + 189, + -5 + ], + [ + 190, + -6 + ], + [ + 191, + -7 + ], + [ + 193, + -1 + ], + [ + 194, + -2 + ], + [ + 195, + -3 + ], + [ + 196, + -4 + ], + [ + 197, + -5 + ], + [ + 198, + -6 + ], + [ + 199, + -7 + ], + [ + 201, + -1 + ], + [ + 202, + -2 + ], + [ + 203, + -3 + ], + [ + 204, + -4 + ], + [ + 205, + -5 + ], + [ + 206, + -6 + ], + [ + 207, + -7 + ], + [ + 209, + -1 + ], + [ + 210, + -2 + ], + [ + 211, + -3 + ], + [ + 212, + -4 + ], + [ + 213, + -5 + ], + [ + 214, + -6 + ], + [ + 215, + -7 + ], + [ + 217, + -1 + ], + [ + 218, + -2 + ], + [ + 219, + -3 + ], + [ + 220, + -4 + ], + [ + 221, + -5 + ], + [ + 222, + -6 + ], + [ + 223, + -7 + ], + [ + 225, + -1 + ], + [ + 226, + -2 + ], + [ + 227, + -3 + ], + [ + 228, + -4 + ], + [ + 229, + -5 + ], + [ + 230, + -6 + ], + [ + 231, + -7 + ] + ], + "b": -114 + } + ], + "parameters": { + "periods": 29, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3, + 4, + 3, + 2, + 5, + 7, + 3, + 7, + 5, + 1, + 4, + 4, + 1, + 2, + 4, + 1, + 6, + 7 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ], + [ + 0, + 24, + 28, + 32, + 36, + 45, + 54, + 63 + ], + [ + 0, + 32, + 44, + 56, + 68, + 85, + 102, + 119 + ], + [ + 0, + 13, + 16, + 19, + 22, + 30, + 38, + 46 + ], + [ + 0, + 27, + 38, + 49, + 60, + 76, + 92, + 108 + ], + [ + 0, + 18, + 23, + 28, + 33, + 43, + 53, + 63 + ], + [ + 0, + 19, + 28, + 37, + 46, + 60, + 74, + 88 + ], + [ + 0, + 22, + 29, + 36, + 43, + 55, + 67, + 79 + ], + [ + 0, + 21, + 30, + 39, + 48, + 62, + 76, + 90 + ], + [ + 0, + 25, + 35, + 45, + 55, + 70, + 85, + 100 + ], + [ + 0, + 15, + 23, + 31, + 39, + 52, + 65, + 78 + ], + [ + 0, + 14, + 21, + 28, + 35, + 47, + 59, + 71 + ], + [ + 0, + 22, + 32, + 42, + 52, + 67, + 82, + 97 + ], + [ + 0, + 21, + 27, + 33, + 39, + 50, + 61, + 72 + ], + [ + 0, + 15, + 25, + 35, + 45, + 60, + 75, + 90 + ], + [ + 0, + 20, + 29, + 38, + 47, + 61, + 75, + 89 + ], + [ + 0, + 26, + 37, + 48, + 59, + 75, + 91, + 107 + ], + [ + 0, + 10, + 15, + 20, + 25, + 35, + 45, + 55 + ] + ], + "objective_constant": -5172, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 232, + "variables": 232, + "rows": 118, + "nonzeros": 6960, + "globals": 0 + }, + "input_variables": 232, + "model_variables": 232, + "modelled_variables": 232, + "size_unit": "periods" + }, + "json_sha256": "7b3175f572aac667ad09e261c2784e901a2bf55bc3167effd3219b1e79423d35", + "txt_sha256": "b0f4bb9612669bab4a73192bc9ee6977d740ffbbb374efb7e597ef7c414e798c" + }, + { + "id": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "model": { + "id": "native_tsp_single_16", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 16, + "natural_size": 16, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 16, + "size": 16, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0 + ] + ], + "parameters": { + "size": 16 + }, + "dimensions": { + "input_variables": 16, + "variables": 32, + "rows": 0, + "nonzeros": 0, + "globals": 17 + }, + "input_variables": 16, + "model_variables": 32, + "modelled_variables": 32, + "size_unit": "cities" + }, + "json_sha256": "121e140c9a4565bf0bd95d7d1880c59a52fc77688d7c1bd48a2e24995569de02", + "txt_sha256": "3ea0e6d39fe10c3f3f27d4d03c536036a771ae1a2a052702ca4648ed8e4e6492" + }, + { + "id": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "model": { + "id": "native_tsp_single_32", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 32, + "natural_size": 32, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 32, + "size": 32, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70, + 21, + 39, + 85, + 16, + 42, + 125, + 76, + 85, + 36, + 145 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40, + 103, + 81, + 53, + 96, + 68, + 17, + 34, + 73, + 76, + 41 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56, + 97, + 115, + 13, + 92, + 78, + 53, + 58, + 11, + 112, + 105 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96, + 65, + 43, + 139, + 60, + 74, + 99, + 94, + 159, + 40, + 75 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 62, + 40, + 130, + 55, + 65, + 90, + 85, + 150, + 35, + 78 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64, + 91, + 69, + 107, + 84, + 56, + 67, + 62, + 127, + 64, + 49 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39, + 80, + 98, + 20, + 75, + 61, + 60, + 41, + 26, + 95, + 88 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90, + 153, + 131, + 75, + 146, + 118, + 35, + 84, + 89, + 126, + 25 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47, + 80, + 58, + 90, + 73, + 45, + 50, + 45, + 110, + 53, + 60 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 58, + 36, + 130, + 51, + 65, + 90, + 85, + 150, + 31, + 82 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77, + 140, + 118, + 62, + 133, + 105, + 22, + 71, + 70, + 113, + 44 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 84, + 62, + 130, + 77, + 65, + 90, + 85, + 150, + 57, + 56 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24, + 65, + 83, + 39, + 60, + 46, + 79, + 30, + 41, + 80, + 99 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84, + 95, + 73, + 127, + 88, + 62, + 87, + 82, + 147, + 68, + 45 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70, + 133, + 111, + 55, + 126, + 98, + 15, + 64, + 59, + 106, + 55 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50, + 67, + 45, + 93, + 60, + 32, + 53, + 48, + 113, + 40, + 73 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37, + 42, + 60, + 52, + 37, + 23, + 92, + 43, + 64, + 57, + 112 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60, + 123, + 101, + 45, + 116, + 88, + 7, + 54, + 55, + 96, + 59 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26, + 67, + 85, + 19, + 62, + 48, + 55, + 28, + 39, + 82, + 75 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46, + 27, + 45, + 61, + 22, + 18, + 101, + 52, + 79, + 42, + 121 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32, + 73, + 91, + 21, + 68, + 54, + 61, + 34, + 33, + 88, + 81 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0, + 64, + 60, + 44, + 57, + 29, + 56, + 7, + 64, + 57, + 76 + ], + [ + 21, + 103, + 97, + 65, + 62, + 91, + 80, + 153, + 80, + 58, + 140, + 84, + 65, + 95, + 133, + 67, + 42, + 123, + 67, + 27, + 73, + 64, + 0, + 23, + 85, + 8, + 36, + 119, + 70, + 105, + 28, + 139 + ], + [ + 39, + 81, + 115, + 43, + 40, + 69, + 98, + 131, + 58, + 36, + 118, + 62, + 83, + 73, + 111, + 45, + 60, + 101, + 85, + 45, + 91, + 60, + 23, + 0, + 103, + 24, + 38, + 97, + 58, + 123, + 6, + 117 + ], + [ + 85, + 53, + 13, + 139, + 130, + 107, + 20, + 75, + 90, + 130, + 62, + 130, + 39, + 127, + 55, + 93, + 52, + 45, + 19, + 61, + 21, + 44, + 85, + 103, + 0, + 80, + 66, + 41, + 46, + 21, + 100, + 93 + ], + [ + 16, + 96, + 92, + 60, + 55, + 84, + 75, + 146, + 73, + 51, + 133, + 77, + 60, + 88, + 126, + 60, + 37, + 116, + 62, + 22, + 68, + 57, + 8, + 24, + 80, + 0, + 29, + 112, + 63, + 100, + 21, + 132 + ], + [ + 42, + 68, + 78, + 74, + 65, + 56, + 61, + 118, + 45, + 65, + 105, + 65, + 46, + 62, + 98, + 32, + 23, + 88, + 48, + 18, + 54, + 29, + 36, + 38, + 66, + 29, + 0, + 84, + 35, + 86, + 35, + 104 + ], + [ + 125, + 17, + 53, + 99, + 90, + 67, + 60, + 35, + 50, + 90, + 22, + 90, + 79, + 87, + 15, + 53, + 92, + 7, + 55, + 101, + 61, + 56, + 119, + 97, + 41, + 112, + 84, + 0, + 50, + 61, + 92, + 53 + ], + [ + 76, + 34, + 58, + 94, + 85, + 62, + 41, + 84, + 45, + 85, + 71, + 85, + 30, + 82, + 64, + 48, + 43, + 54, + 28, + 52, + 34, + 7, + 70, + 58, + 46, + 63, + 35, + 50, + 0, + 66, + 55, + 70 + ], + [ + 85, + 73, + 11, + 159, + 150, + 127, + 26, + 89, + 110, + 150, + 70, + 150, + 41, + 147, + 59, + 113, + 64, + 55, + 39, + 79, + 33, + 64, + 105, + 123, + 21, + 100, + 86, + 61, + 66, + 0, + 120, + 113 + ], + [ + 36, + 76, + 112, + 40, + 35, + 64, + 95, + 126, + 53, + 31, + 113, + 57, + 80, + 68, + 106, + 40, + 57, + 96, + 82, + 42, + 88, + 57, + 28, + 6, + 100, + 21, + 35, + 92, + 55, + 120, + 0, + 112 + ], + [ + 145, + 41, + 105, + 75, + 78, + 49, + 88, + 25, + 60, + 82, + 44, + 56, + 99, + 45, + 55, + 73, + 112, + 59, + 75, + 121, + 81, + 76, + 139, + 117, + 93, + 132, + 104, + 53, + 70, + 113, + 112, + 0 + ] + ], + "parameters": { + "size": 32 + }, + "dimensions": { + "input_variables": 32, + "variables": 64, + "rows": 0, + "nonzeros": 0, + "globals": 33 + }, + "input_variables": 32, + "model_variables": 64, + "modelled_variables": 64, + "size_unit": "cities" + }, + "json_sha256": "d10241d34fc8901bfa98d4aae944975bedc9f381a5e89e4cca8bf8ab2a52f354", + "txt_sha256": "e48910606a4762b47870e83936ddeebee40f030d343524c3f502e4f63ffe4746" + }, + { + "id": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "model": { + "id": "native_tsp_single_24", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 24, + "size": 24, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70, + 21, + 39 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40, + 103, + 81 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56, + 97, + 115 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96, + 65, + 43 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 62, + 40 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64, + 91, + 69 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39, + 80, + 98 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90, + 153, + 131 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47, + 80, + 58 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 58, + 36 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77, + 140, + 118 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87, + 84, + 62 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24, + 65, + 83 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84, + 95, + 73 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70, + 133, + 111 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50, + 67, + 45 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37, + 42, + 60 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60, + 123, + 101 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26, + 67, + 85 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46, + 27, + 45 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32, + 73, + 91 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0, + 64, + 60 + ], + [ + 21, + 103, + 97, + 65, + 62, + 91, + 80, + 153, + 80, + 58, + 140, + 84, + 65, + 95, + 133, + 67, + 42, + 123, + 67, + 27, + 73, + 64, + 0, + 23 + ], + [ + 39, + 81, + 115, + 43, + 40, + 69, + 98, + 131, + 58, + 36, + 118, + 62, + 83, + 73, + 111, + 45, + 60, + 101, + 85, + 45, + 91, + 60, + 23, + 0 + ] + ], + "parameters": { + "size": 24 + }, + "dimensions": { + "input_variables": 24, + "variables": 48, + "rows": 0, + "nonzeros": 0, + "globals": 25 + }, + "input_variables": 24, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "cities" + }, + "json_sha256": "293e12a1e1e1fd89c14ef8da9435bfdfec0f21da0fa7ed3e39a4453393b8df0f", + "txt_sha256": "33c69492ea94c1dc978650b54ee6717641d377404e4a3bdddd0cc8bff1b3d80c" + }, + { + "id": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "model": { + "id": "native_tsp_single_20", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 20, + "natural_size": 20, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 20, + "size": 20, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0 + ] + ], + "parameters": { + "size": 20 + }, + "dimensions": { + "input_variables": 20, + "variables": 40, + "rows": 0, + "nonzeros": 0, + "globals": 21 + }, + "input_variables": 20, + "model_variables": 40, + "modelled_variables": 40, + "size_unit": "cities" + }, + "json_sha256": "8c783de32bb0b170f986d61ded202e1c9c2c3b8d629c6a04e1c8cb007c328811", + "txt_sha256": "8d944a60ff4a02e0147d31b941ab120bedff9260a4b8ae6cad3ae9ae3049d62d" + }, + { + "id": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "model": { + "id": "native_tsp_single_22", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 22, + "natural_size": 22, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 22, + "size": 22, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65, + 70 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45, + 40 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29, + 56 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127, + 96 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95, + 64 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8, + 39 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95, + 90 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78, + 47 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82, + 77 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118, + 87 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19, + 24 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115, + 84 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75, + 70 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81, + 50 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32, + 37 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65, + 60 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7, + 26 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47, + 46 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0, + 32 + ], + [ + 70, + 40, + 56, + 96, + 87, + 64, + 39, + 90, + 47, + 87, + 77, + 87, + 24, + 84, + 70, + 50, + 37, + 60, + 26, + 46, + 32, + 0 + ] + ], + "parameters": { + "size": 22 + }, + "dimensions": { + "input_variables": 22, + "variables": 44, + "rows": 0, + "nonzeros": 0, + "globals": 23 + }, + "input_variables": 22, + "model_variables": 44, + "modelled_variables": 44, + "size_unit": "cities" + }, + "json_sha256": "5e238ec4bfcba52720af6fbd752c9fb24a833d44a833526624a6fb4b603685d9", + "txt_sha256": "d6da030ef84ccc18e6b2c899f783c5451e5dfaecbae502b2f93d510048668045" + }, + { + "id": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "model": { + "id": "native_tsp_single_21", + "category": "native_tsp", + "family": "native_tsp", + "variant": "single", + "kind": "native_tsp", + "tier": "adaptive", + "tier_size": 21, + "natural_size": 21, + "seed": 20260912, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 21, + "size": 21, + "machines": 0, + "data": [ + [ + 0, + 109, + 93, + 75, + 68, + 97, + 66, + 159, + 86, + 66, + 146, + 90, + 47, + 101, + 139, + 73, + 34, + 129, + 71, + 25, + 65 + ], + [ + 109, + 0, + 65, + 87, + 78, + 55, + 48, + 51, + 38, + 78, + 38, + 78, + 63, + 75, + 31, + 41, + 76, + 21, + 39, + 85, + 45 + ], + [ + 93, + 65, + 0, + 151, + 142, + 119, + 28, + 81, + 102, + 142, + 62, + 142, + 47, + 139, + 51, + 105, + 60, + 47, + 31, + 71, + 29 + ], + [ + 75, + 87, + 151, + 0, + 10, + 33, + 134, + 89, + 50, + 10, + 90, + 20, + 119, + 31, + 101, + 47, + 96, + 105, + 121, + 81, + 127 + ], + [ + 68, + 78, + 142, + 10, + 0, + 30, + 125, + 92, + 41, + 5, + 81, + 23, + 110, + 34, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 97, + 55, + 119, + 33, + 30, + 0, + 102, + 63, + 18, + 34, + 58, + 24, + 87, + 21, + 69, + 25, + 64, + 73, + 89, + 73, + 95 + ], + [ + 66, + 48, + 28, + 134, + 125, + 102, + 0, + 94, + 85, + 125, + 81, + 125, + 20, + 122, + 74, + 88, + 39, + 64, + 14, + 54, + 8 + ], + [ + 159, + 51, + 81, + 89, + 92, + 63, + 94, + 0, + 74, + 96, + 20, + 70, + 113, + 59, + 31, + 87, + 126, + 35, + 89, + 135, + 95 + ], + [ + 86, + 38, + 102, + 50, + 41, + 18, + 85, + 74, + 0, + 41, + 61, + 41, + 70, + 38, + 54, + 14, + 53, + 56, + 72, + 62, + 78 + ], + [ + 66, + 78, + 142, + 10, + 5, + 34, + 125, + 96, + 41, + 0, + 83, + 27, + 110, + 38, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 146, + 38, + 62, + 90, + 81, + 58, + 81, + 20, + 61, + 83, + 0, + 81, + 100, + 78, + 12, + 74, + 113, + 18, + 76, + 122, + 82 + ], + [ + 90, + 78, + 142, + 20, + 23, + 24, + 125, + 70, + 41, + 27, + 81, + 0, + 110, + 12, + 92, + 38, + 87, + 96, + 112, + 72, + 118 + ], + [ + 47, + 63, + 47, + 119, + 110, + 87, + 20, + 113, + 70, + 110, + 100, + 110, + 0, + 107, + 93, + 73, + 24, + 83, + 25, + 39, + 19 + ], + [ + 101, + 75, + 139, + 31, + 34, + 21, + 122, + 59, + 38, + 38, + 78, + 12, + 107, + 0, + 89, + 35, + 84, + 93, + 109, + 77, + 115 + ], + [ + 139, + 31, + 51, + 101, + 92, + 69, + 74, + 31, + 54, + 92, + 12, + 92, + 93, + 89, + 0, + 67, + 106, + 11, + 69, + 115, + 75 + ], + [ + 73, + 41, + 105, + 47, + 38, + 25, + 88, + 87, + 14, + 38, + 74, + 38, + 73, + 35, + 67, + 0, + 50, + 59, + 75, + 49, + 81 + ], + [ + 34, + 76, + 60, + 96, + 87, + 64, + 39, + 126, + 53, + 87, + 113, + 87, + 24, + 84, + 106, + 50, + 0, + 96, + 38, + 16, + 32 + ], + [ + 129, + 21, + 47, + 105, + 96, + 73, + 64, + 35, + 56, + 96, + 18, + 96, + 83, + 93, + 11, + 59, + 96, + 0, + 59, + 105, + 65 + ], + [ + 71, + 39, + 31, + 121, + 112, + 89, + 14, + 89, + 72, + 112, + 76, + 112, + 25, + 109, + 69, + 75, + 38, + 59, + 0, + 47, + 7 + ], + [ + 25, + 85, + 71, + 81, + 72, + 73, + 54, + 135, + 62, + 72, + 122, + 72, + 39, + 77, + 115, + 49, + 16, + 105, + 47, + 0, + 47 + ], + [ + 65, + 45, + 29, + 127, + 118, + 95, + 8, + 95, + 78, + 118, + 82, + 118, + 19, + 115, + 75, + 81, + 32, + 65, + 7, + 47, + 0 + ] + ], + "parameters": { + "size": 21 + }, + "dimensions": { + "input_variables": 21, + "variables": 42, + "rows": 0, + "nonzeros": 0, + "globals": 22 + }, + "input_variables": 21, + "model_variables": 42, + "modelled_variables": 42, + "size_unit": "cities" + }, + "json_sha256": "1ffb0456495705677709a48968ca92a8fd15e0caf1cec1a35ff0fdbb2e929a9c", + "txt_sha256": "896abb9ed75bba7251ec62f8a52e1b6d9c295f411a534e5756ea185f12a5719b" + }, + { + "id": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "model": { + "id": "weighted_queens_single_12", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 12, + "size": 12, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10 + ] + ], + "parameters": { + "size": 12 + }, + "dimensions": { + "input_variables": 12, + "variables": 48, + "rows": 24, + "nonzeros": 48, + "globals": 15 + }, + "input_variables": 12, + "model_variables": 48, + "modelled_variables": 48, + "size_unit": "queens" + }, + "json_sha256": "24f11216157b9fa653aad18549ecf9e273dc78a97269251c6594cf68b15bee41", + "txt_sha256": "54882e539a49f6fbad775422f801a03194cc224560b7dfa52f8c8b662b1b2384" + }, + { + "id": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "model": { + "id": "weighted_queens_single_24", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 24, + "natural_size": 24, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 24, + "size": 24, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24, + 36, + 41 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43, + 35, + 30 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2, + 24, + 28 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33, + 24, + 37 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43, + 38, + 39 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30, + 3, + 19 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31, + 17, + 49 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22, + 20, + 49 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6, + 32, + 17 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24, + 9, + 29 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36, + 31, + 45 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35, + 21, + 23 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19, + 21, + 28 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43, + 9, + 50 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35, + 37, + 43 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17, + 26, + 33 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48, + 50, + 27 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48, + 7, + 6 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17, + 7, + 12 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12, + 41, + 46 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7, + 48, + 15 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4, + 32, + 5 + ], + [ + 35, + 36, + 36, + 42, + 10, + 28, + 35, + 37, + 12, + 30, + 26, + 1, + 13, + 13, + 46, + 45, + 40, + 14, + 14, + 11, + 38, + 29, + 49, + 11 + ], + [ + 1, + 10, + 17, + 8, + 12, + 34, + 10, + 22, + 43, + 46, + 43, + 26, + 34, + 16, + 17, + 42, + 42, + 43, + 49, + 49, + 3, + 7, + 29, + 47 + ] + ], + "parameters": { + "size": 24 + }, + "dimensions": { + "input_variables": 24, + "variables": 96, + "rows": 48, + "nonzeros": 96, + "globals": 27 + }, + "input_variables": 24, + "model_variables": 96, + "modelled_variables": 96, + "size_unit": "queens" + }, + "json_sha256": "f0747cdd4c707787111f4add6d5203db3b0d7ee72677fa8587f3ac6860b27508", + "txt_sha256": "9946060eafc937524e83ffb72b2597b6c55751e7c46f497e89080842e48f8112" + }, + { + "id": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "model": { + "id": "weighted_queens_single_18", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 18, + "size": 18, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24 + ] + ], + "parameters": { + "size": 18 + }, + "dimensions": { + "input_variables": 18, + "variables": 72, + "rows": 36, + "nonzeros": 72, + "globals": 21 + }, + "input_variables": 18, + "model_variables": 72, + "modelled_variables": 72, + "size_unit": "queens" + }, + "json_sha256": "dc98fb609b6d1fcb64a690e1759c3f5e9602191e307ff4847ae9106cdaf09293", + "txt_sha256": "e5423ecc66be6cd244a1198880f311c60b745cbefe401d21859382e5cfce31fd" + }, + { + "id": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "model": { + "id": "weighted_queens_single_21", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 21, + "natural_size": 21, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 21, + "size": 21, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46 + ] + ], + "parameters": { + "size": 21 + }, + "dimensions": { + "input_variables": 21, + "variables": 84, + "rows": 42, + "nonzeros": 84, + "globals": 24 + }, + "input_variables": 21, + "model_variables": 84, + "modelled_variables": 84, + "size_unit": "queens" + }, + "json_sha256": "badd42498e3f6c0600eec3e3eb55fb9e44a9b6977db1612e41e42fafc485013e", + "txt_sha256": "e472cdac1f5b96e5b4cf33d88905e3f70963d2135556b8cca452d3aab512b446" + }, + { + "id": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "model": { + "id": "weighted_queens_single_22", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 22, + "natural_size": 22, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 22, + "size": 22, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4 + ] + ], + "parameters": { + "size": 22 + }, + "dimensions": { + "input_variables": 22, + "variables": 88, + "rows": 44, + "nonzeros": 88, + "globals": 25 + }, + "input_variables": 22, + "model_variables": 88, + "modelled_variables": 88, + "size_unit": "queens" + }, + "json_sha256": "9e8b11d1d2cf5ca8212c52c2c01e57620982fb2276d2039a1c2a54bb7fdfdd83", + "txt_sha256": "91e669c247c7697ddbe01782db8e862417dfa7edd312a2e9b5dcf08e9fa55f8b" + }, + { + "id": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "model": { + "id": "weighted_queens_single_23", + "category": "weighted_queens", + "family": "weighted_queens", + "variant": "single", + "kind": "weighted_queens", + "tier": "adaptive", + "tier_size": 23, + "natural_size": 23, + "seed": 20260913, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 23, + "size": 23, + "machines": 0, + "data": [ + [ + 7, + 40, + 13, + 15, + 24, + 25, + 27, + 22, + 4, + 24, + 26, + 14, + 46, + 49, + 29, + 38, + 1, + 19, + 36, + 47, + 33, + 24, + 36 + ], + [ + 35, + 45, + 9, + 45, + 11, + 45, + 4, + 32, + 32, + 10, + 26, + 32, + 14, + 35, + 45, + 14, + 9, + 39, + 32, + 11, + 48, + 43, + 35 + ], + [ + 28, + 8, + 46, + 17, + 47, + 6, + 43, + 20, + 24, + 34, + 14, + 30, + 41, + 36, + 26, + 35, + 10, + 47, + 2, + 12, + 48, + 2, + 24 + ], + [ + 14, + 40, + 34, + 33, + 38, + 3, + 47, + 19, + 23, + 30, + 31, + 32, + 17, + 36, + 32, + 10, + 19, + 45, + 15, + 19, + 48, + 33, + 24 + ], + [ + 22, + 3, + 34, + 49, + 12, + 17, + 47, + 47, + 1, + 29, + 50, + 32, + 28, + 11, + 24, + 33, + 15, + 43, + 39, + 35, + 12, + 43, + 38 + ], + [ + 10, + 22, + 4, + 42, + 39, + 15, + 23, + 6, + 44, + 1, + 37, + 9, + 21, + 32, + 33, + 5, + 25, + 30, + 28, + 33, + 13, + 30, + 3 + ], + [ + 20, + 21, + 46, + 47, + 10, + 33, + 26, + 4, + 49, + 19, + 47, + 46, + 38, + 43, + 40, + 29, + 19, + 26, + 12, + 40, + 35, + 31, + 17 + ], + [ + 46, + 17, + 38, + 34, + 5, + 47, + 37, + 2, + 36, + 14, + 7, + 42, + 32, + 42, + 12, + 26, + 5, + 7, + 50, + 48, + 16, + 22, + 20 + ], + [ + 41, + 36, + 2, + 27, + 30, + 37, + 40, + 39, + 8, + 49, + 9, + 41, + 26, + 38, + 15, + 19, + 21, + 6, + 28, + 12, + 7, + 6, + 32 + ], + [ + 2, + 6, + 26, + 25, + 29, + 8, + 16, + 44, + 32, + 2, + 20, + 18, + 23, + 46, + 50, + 17, + 35, + 32, + 44, + 4, + 26, + 24, + 9 + ], + [ + 3, + 18, + 1, + 7, + 33, + 13, + 38, + 8, + 47, + 34, + 16, + 12, + 33, + 32, + 44, + 2, + 11, + 30, + 35, + 3, + 34, + 36, + 31 + ], + [ + 1, + 7, + 40, + 4, + 29, + 38, + 25, + 13, + 35, + 4, + 33, + 10, + 24, + 2, + 37, + 1, + 40, + 18, + 16, + 14, + 49, + 35, + 21 + ], + [ + 1, + 5, + 4, + 7, + 9, + 33, + 48, + 39, + 42, + 9, + 3, + 12, + 3, + 50, + 24, + 16, + 13, + 7, + 24, + 9, + 45, + 19, + 21 + ], + [ + 22, + 35, + 16, + 9, + 27, + 19, + 7, + 11, + 2, + 14, + 27, + 38, + 46, + 39, + 18, + 41, + 14, + 20, + 1, + 40, + 4, + 43, + 9 + ], + [ + 8, + 2, + 44, + 21, + 48, + 8, + 1, + 44, + 20, + 44, + 8, + 10, + 22, + 32, + 48, + 21, + 13, + 40, + 12, + 31, + 41, + 35, + 37 + ], + [ + 48, + 15, + 13, + 21, + 43, + 43, + 29, + 8, + 39, + 34, + 32, + 35, + 3, + 9, + 46, + 31, + 46, + 28, + 12, + 39, + 44, + 17, + 26 + ], + [ + 25, + 5, + 35, + 36, + 34, + 5, + 28, + 26, + 10, + 22, + 38, + 5, + 13, + 20, + 7, + 39, + 11, + 23, + 9, + 31, + 24, + 48, + 50 + ], + [ + 23, + 15, + 48, + 6, + 8, + 10, + 42, + 47, + 40, + 38, + 5, + 13, + 49, + 49, + 25, + 17, + 18, + 24, + 35, + 9, + 37, + 48, + 7 + ], + [ + 24, + 19, + 9, + 9, + 38, + 6, + 5, + 39, + 47, + 21, + 23, + 32, + 1, + 39, + 14, + 37, + 19, + 11, + 28, + 46, + 15, + 17, + 7 + ], + [ + 39, + 34, + 11, + 25, + 34, + 35, + 6, + 4, + 49, + 26, + 36, + 8, + 33, + 38, + 11, + 28, + 20, + 26, + 15, + 35, + 43, + 12, + 41 + ], + [ + 1, + 35, + 27, + 10, + 42, + 43, + 3, + 39, + 8, + 1, + 46, + 25, + 37, + 9, + 14, + 36, + 38, + 18, + 12, + 33, + 46, + 7, + 48 + ], + [ + 9, + 26, + 31, + 13, + 40, + 6, + 17, + 6, + 47, + 12, + 10, + 37, + 31, + 8, + 23, + 19, + 34, + 34, + 11, + 18, + 9, + 4, + 32 + ], + [ + 35, + 36, + 36, + 42, + 10, + 28, + 35, + 37, + 12, + 30, + 26, + 1, + 13, + 13, + 46, + 45, + 40, + 14, + 14, + 11, + 38, + 29, + 49 + ] + ], + "parameters": { + "size": 23 + }, + "dimensions": { + "input_variables": 23, + "variables": 92, + "rows": 46, + "nonzeros": 92, + "globals": 26 + }, + "input_variables": 23, + "model_variables": 92, + "modelled_variables": 92, + "size_unit": "queens" + }, + "json_sha256": "c17e1b78bdf74203a9ecb42c886dcebbf402a4551b3c93c16739c1a2c5457b14", + "txt_sha256": "585bd834efa6c69ccd15c62368f371a059c4c54984f17eee16b6c242e32b1ec3" + } + ], + "records": [ + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 0, + "route": "native", + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.05207233399960387, + "offset_end": 0.06965245899937145, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2474, + "stderr_bytes_observed": 98173, + "external_seconds": 0.017283832999964943, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000108083, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 3.8209e-05, + "solve_seconds": 0.000108083, + "backend_solve_seconds": 0.000106292, + "driver_seconds": 0.000164917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 0, + "route": "native", + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.08216291699955036, + "offset_end": 0.10186433399940142, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2485, + "stderr_bytes_observed": 98173, + "external_seconds": 0.019459874999483873, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000122625, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.7916e-05, + "solve_seconds": 0.000122625, + "backend_solve_seconds": 0.000120208, + "driver_seconds": 0.000187458, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.11622199999965233, + "offset_end": 0.12592995899922244, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2607, + "stderr_bytes_observed": 0, + "external_seconds": 0.009579666999343317, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00028175, + "objective": -1096, + "best_bound": -1096, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.1125e-05, + "solve_seconds": 0.00028175, + "backend_solve_seconds": 0.000276791, + "driver_seconds": 0.00033725, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.13007041699984256, + "offset_end": 0.13997091700002784, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2605, + "stderr_bytes_observed": 0, + "external_seconds": 0.009714208000332292, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000303208, + "objective": -312, + "best_bound": -312, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.7167e-05, + "solve_seconds": 0.000303208, + "backend_solve_seconds": 0.000300667, + "driver_seconds": 0.000378375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.14522262499940553, + "offset_end": 0.15728474999923492, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2724, + "stderr_bytes_observed": 0, + "external_seconds": 0.011909333000403421, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000848542, + "objective": -2355, + "best_bound": -2355, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -2355, + "best_bound": -2355, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.05e-05, + "solve_seconds": 0.000848542, + "backend_solve_seconds": 0.000845875, + "driver_seconds": 0.000936125, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.16218908399969223, + "offset_end": 0.17188533399985317, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2733, + "stderr_bytes_observed": 0, + "external_seconds": 0.009522416999971028, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000882833, + "objective": -613, + "best_bound": -613, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -613, + "best_bound": -613, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 5.5667e-05, + "solve_seconds": 0.000882833, + "backend_solve_seconds": 0.000880417, + "driver_seconds": 0.000955875, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-128-uncorrelated", + "category": "knapsack", + "size": 128, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.1788879169998836, + "offset_end": 0.1909118749999834, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2969, + "stderr_bytes_observed": 0, + "external_seconds": 0.01190187500014872, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002856833, + "objective": -4318, + "best_bound": -4318, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.4875e-05, + "solve_seconds": 0.002856833, + "backend_solve_seconds": 0.002854167, + "driver_seconds": 0.002934875, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-128-correlated", + "category": "knapsack", + "size": 128, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.19793187499999476, + "offset_end": 0.209828541999741, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2979, + "stderr_bytes_observed": 0, + "external_seconds": 0.011781709000388219, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002898458, + "objective": -1211, + "best_bound": -1211, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.9583e-05, + "solve_seconds": 0.002898458, + "backend_solve_seconds": 0.002895709, + "driver_seconds": 0.002985125, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-256-uncorrelated", + "category": "knapsack", + "size": 256, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.2193632089993116, + "offset_end": 0.24158349999925122, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3486, + "stderr_bytes_observed": 0, + "external_seconds": 0.02210195899988321, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.011110625, + "objective": -9157, + "best_bound": -9157, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -9157, + "best_bound": -9157, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.5292e-05, + "solve_seconds": 0.011110625, + "backend_solve_seconds": 0.011108, + "driver_seconds": 0.011229792, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-256-correlated", + "category": "knapsack", + "size": 256, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 0.25180420899960154, + "offset_end": 0.2742619169994214, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3479, + "stderr_bytes_observed": 0, + "external_seconds": 0.022341167000377027, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.010819833, + "objective": -2397, + "best_bound": -2397, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -2397, + "best_bound": -2397, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.7542e-05, + "solve_seconds": 0.010819833, + "backend_solve_seconds": 0.010817208, + "driver_seconds": 0.01093425, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 0.289821249999477, + "offset_end": 10.30142533399976, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4456, + "stderr_bytes_observed": 0, + "external_seconds": 10.011059583000133, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000266041, + "objective": -11574, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -11574, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000147167, + "solve_seconds": 10.000266041, + "backend_solve_seconds": 10.000262583, + "driver_seconds": 10.000443125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 10.318990666999525, + "offset_end": 20.332453874999374, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4471, + "stderr_bytes_observed": 0, + "external_seconds": 10.012891416999992, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00068675, + "objective": -4104, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -4104, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00015025, + "solve_seconds": 10.00068675, + "backend_solve_seconds": 10.000684209, + "driver_seconds": 10.000878833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-384-uncorrelated", + "category": "knapsack", + "size": 384, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 20.356163999999808, + "offset_end": 20.392301874999248, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4012, + "stderr_bytes_observed": 0, + "external_seconds": 0.03597350000018196, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.024584, + "objective": -13832, + "best_bound": -13832, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000186333, + "solve_seconds": 0.024584, + "backend_solve_seconds": 0.024581291, + "driver_seconds": 0.024793917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-384-correlated", + "category": "knapsack", + "size": 384, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 20.412625624999237, + "offset_end": 20.451035249999222, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4010, + "stderr_bytes_observed": 0, + "external_seconds": 0.03828150000026653, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0283885, + "objective": -3648, + "best_bound": -3648, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000161334, + "solve_seconds": 0.0283885, + "backend_solve_seconds": 0.028385333, + "driver_seconds": 0.028573459, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-448-uncorrelated", + "category": "knapsack", + "size": 448, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 20.47933112499959, + "offset_end": 30.493373333999443, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4216, + "stderr_bytes_observed": 0, + "external_seconds": 10.013684833000298, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000231083, + "objective": -9749, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 448, + "model_rows": 1, + "model_globals": 0, + "objective": -9749, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000129709, + "solve_seconds": 10.000231083, + "backend_solve_seconds": 10.000228042, + "driver_seconds": 10.000389167, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-448-correlated", + "category": "knapsack", + "size": 448, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 30.520183791999443, + "offset_end": 40.53247662499962, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4210, + "stderr_bytes_observed": 0, + "external_seconds": 10.012005666000732, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000521417, + "objective": -3617, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 448, + "model_rows": 1, + "model_globals": 0, + "objective": -3617, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000125292, + "solve_seconds": 10.000521417, + "backend_solve_seconds": 10.000518416, + "driver_seconds": 10.000675625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-416-uncorrelated", + "category": "knapsack", + "size": 416, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 40.571927874999346, + "offset_end": 50.58485179199943, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4070, + "stderr_bytes_observed": 0, + "external_seconds": 10.012749250000525, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000406458, + "objective": -8889, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 416, + "model_rows": 1, + "model_globals": 0, + "objective": -8889, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000149958, + "solve_seconds": 10.000406458, + "backend_solve_seconds": 10.000403209, + "driver_seconds": 10.00058875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-416-correlated", + "category": "knapsack", + "size": 416, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 50.61443029199927, + "offset_end": 60.62615245899997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4089, + "stderr_bytes_observed": 0, + "external_seconds": 10.011502542000017, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000241666, + "objective": -3320, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 416, + "model_rows": 1, + "model_globals": 0, + "objective": -3320, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000163833, + "solve_seconds": 10.000241666, + "backend_solve_seconds": 10.000234792, + "driver_seconds": 10.000427541, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-400-uncorrelated", + "category": "knapsack", + "size": 400, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 60.66655995899964, + "offset_end": 60.70658704199923, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4067, + "stderr_bytes_observed": 0, + "external_seconds": 0.03991833400050382, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027249375, + "objective": -14402, + "best_bound": -14402, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -14402, + "best_bound": -14402, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000149458, + "solve_seconds": 0.027249375, + "backend_solve_seconds": 0.027245541, + "driver_seconds": 0.027419208, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-400-correlated", + "category": "knapsack", + "size": 400, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 60.74401379199935, + "offset_end": 60.781532833999336, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4053, + "stderr_bytes_observed": 0, + "external_seconds": 0.037393708000308834, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026590791, + "objective": -3797, + "best_bound": -3797, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -3797, + "best_bound": -3797, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000118584, + "solve_seconds": 0.026590791, + "backend_solve_seconds": 0.02658775, + "driver_seconds": 0.026734, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 60.827906249999614, + "offset_end": 70.8397195839998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4045, + "stderr_bytes_observed": 0, + "external_seconds": 10.011401417000343, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000230917, + "objective": -8628, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8628, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000119541, + "solve_seconds": 10.000230917, + "backend_solve_seconds": 10.000228167, + "driver_seconds": 10.000374083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 70.87914620899937, + "offset_end": 80.89124374999938, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4056, + "stderr_bytes_observed": 0, + "external_seconds": 10.01193450000028, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000245208, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000154583, + "solve_seconds": 10.000245208, + "backend_solve_seconds": 10.000242125, + "driver_seconds": 10.000424166, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-404-uncorrelated", + "category": "knapsack", + "size": 404, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 80.94723087500006, + "offset_end": 80.98719449999953, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4074, + "stderr_bytes_observed": 0, + "external_seconds": 0.03986695800085727, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027344875, + "objective": -14476, + "best_bound": -14476, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -14476, + "best_bound": -14476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00013075, + "solve_seconds": 0.027344875, + "backend_solve_seconds": 0.027341958, + "driver_seconds": 0.027498833, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-404-correlated", + "category": "knapsack", + "size": 404, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.02973108399965, + "offset_end": 81.06722920899938, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4066, + "stderr_bytes_observed": 0, + "external_seconds": 0.037370375000136846, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027197792, + "objective": -3828, + "best_bound": -3828, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -3828, + "best_bound": -3828, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00011825, + "solve_seconds": 0.027197792, + "backend_solve_seconds": 0.027195, + "driver_seconds": 0.027336541, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.12600949999978, + "offset_end": 81.1641919169997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4100, + "stderr_bytes_observed": 0, + "external_seconds": 0.03800575000059325, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027203375, + "objective": -14512, + "best_bound": -14512, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -14512, + "best_bound": -14512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000124667, + "solve_seconds": 0.027203375, + "backend_solve_seconds": 0.027200625, + "driver_seconds": 0.027346625, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.2138454169999, + "offset_end": 81.2515483749994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4098, + "stderr_bytes_observed": 0, + "external_seconds": 0.037535292000029585, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027523417, + "objective": -3844, + "best_bound": -3844, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -3844, + "best_bound": -3844, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00012425, + "solve_seconds": 0.027523417, + "backend_solve_seconds": 0.027519875, + "driver_seconds": 0.027669083, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.3168126669998, + "offset_end": 81.35474704199987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4071, + "stderr_bytes_observed": 0, + "external_seconds": 0.03771362499992392, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.02736075, + "objective": -14531, + "best_bound": -14531, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -14531, + "best_bound": -14531, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001225, + "solve_seconds": 0.02736075, + "backend_solve_seconds": 0.02735775, + "driver_seconds": 0.027502917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.40741341699959, + "offset_end": 81.44514891699964, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4102, + "stderr_bytes_observed": 0, + "external_seconds": 0.03760920900003839, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027660458, + "objective": -3858, + "best_bound": -3858, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -3858, + "best_bound": -3858, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000123334, + "solve_seconds": 0.027660458, + "backend_solve_seconds": 0.027657084, + "driver_seconds": 0.027804, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.49624583399964, + "offset_end": 81.53349399999934, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4091, + "stderr_bytes_observed": 0, + "external_seconds": 0.03713000000061584, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027255333, + "objective": -14512, + "best_bound": -14512, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -14512, + "best_bound": -14512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000124875, + "solve_seconds": 0.027255333, + "backend_solve_seconds": 0.027252, + "driver_seconds": 0.027401334, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.5711367089998, + "offset_end": 81.61209099999996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4087, + "stderr_bytes_observed": 0, + "external_seconds": 0.040785291000247526, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027908416, + "objective": -3844, + "best_bound": -3844, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -3844, + "best_bound": -3844, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000116958, + "solve_seconds": 0.027908416, + "backend_solve_seconds": 0.027905666, + "driver_seconds": 0.028072041, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.66498087499986, + "offset_end": 81.70318729199971, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4095, + "stderr_bytes_observed": 0, + "external_seconds": 0.03810404100022424, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.02793225, + "objective": -14531, + "best_bound": -14531, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -14531, + "best_bound": -14531, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000126583, + "solve_seconds": 0.02793225, + "backend_solve_seconds": 0.027929333, + "driver_seconds": 0.028079125, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 81.74000479200004, + "offset_end": 81.77793983399988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4093, + "stderr_bytes_observed": 0, + "external_seconds": 0.037689292000322894, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027676083, + "objective": -3858, + "best_bound": -3858, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -3858, + "best_bound": -3858, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000123083, + "solve_seconds": 0.027676083, + "backend_solve_seconds": 0.027673125, + "driver_seconds": 0.027821375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 81.83158774999993, + "offset_end": 91.84196341699953, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4039, + "stderr_bytes_observed": 0, + "external_seconds": 10.010218542000075, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000150625, + "objective": -8628, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8628, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000146291, + "solve_seconds": 10.000150625, + "backend_solve_seconds": 10.000147208, + "driver_seconds": 10.000320833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 91.88507070899959, + "offset_end": 101.90216712499932, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4045, + "stderr_bytes_observed": 0, + "external_seconds": 10.016923541999859, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000219208, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000300208, + "solve_seconds": 10.000219208, + "backend_solve_seconds": 10.000215959, + "driver_seconds": 10.000542583, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-32-uncorrelated", + "category": "knapsack", + "size": 32, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 101.95796424999935, + "offset_end": 101.97055979199922, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2581, + "stderr_bytes_observed": 0, + "external_seconds": 0.012434625000423694, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000856958, + "objective": -1096, + "best_bound": -1096, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -1096, + "best_bound": -1096, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000213, + "solve_seconds": 0.000856958, + "backend_solve_seconds": 0.000854084, + "driver_seconds": 0.001086958, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-32-correlated", + "category": "knapsack", + "size": 32, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.00740649999989, + "offset_end": 102.01713316699988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2594, + "stderr_bytes_observed": 0, + "external_seconds": 0.009622667000257934, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00030725, + "objective": -312, + "best_bound": -312, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 32, + "model_rows": 1, + "model_globals": 0, + "objective": -312, + "best_bound": -312, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000236958, + "solve_seconds": 0.00030725, + "backend_solve_seconds": 0.000302667, + "driver_seconds": 0.00055925, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-64-uncorrelated", + "category": "knapsack", + "size": 64, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.0721522089998, + "offset_end": 102.0846529169994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2723, + "stderr_bytes_observed": 0, + "external_seconds": 0.012364250000246102, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000820333, + "objective": -2355, + "best_bound": -2355, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -2355, + "best_bound": -2355, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000246209, + "solve_seconds": 0.000820333, + "backend_solve_seconds": 0.000815084, + "driver_seconds": 0.001084, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-64-correlated", + "category": "knapsack", + "size": 64, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.1222540839999, + "offset_end": 102.13505083399923, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2699, + "stderr_bytes_observed": 0, + "external_seconds": 0.01262429200050974, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000809667, + "objective": -613, + "best_bound": -613, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 64, + "model_rows": 1, + "model_globals": 0, + "objective": -613, + "best_bound": -613, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000298208, + "solve_seconds": 0.000809667, + "backend_solve_seconds": 0.000807042, + "driver_seconds": 0.00112375, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-128-uncorrelated", + "category": "knapsack", + "size": 128, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.19359779199931, + "offset_end": 102.20602483399944, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2968, + "stderr_bytes_observed": 0, + "external_seconds": 0.012345707999884326, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00283475, + "objective": -4318, + "best_bound": -4318, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -4318, + "best_bound": -4318, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000263041, + "solve_seconds": 0.00283475, + "backend_solve_seconds": 0.0028325, + "driver_seconds": 0.003113041, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-128-correlated", + "category": "knapsack", + "size": 128, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.24399749999975, + "offset_end": 102.25639324999975, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2979, + "stderr_bytes_observed": 0, + "external_seconds": 0.012298374999772932, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.002831416, + "objective": -1211, + "best_bound": -1211, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 1, + "model_globals": 0, + "objective": -1211, + "best_bound": -1211, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000281125, + "solve_seconds": 0.002831416, + "backend_solve_seconds": 0.002829, + "driver_seconds": 0.003127917, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-256-uncorrelated", + "category": "knapsack", + "size": 256, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.31263975000002, + "offset_end": 102.3351494589997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3478, + "stderr_bytes_observed": 0, + "external_seconds": 0.022381208000297192, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.011345, + "objective": -9157, + "best_bound": -9157, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -9157, + "best_bound": -9157, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000313417, + "solve_seconds": 0.011345, + "backend_solve_seconds": 0.011342375, + "driver_seconds": 0.0116775, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-256-correlated", + "category": "knapsack", + "size": 256, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.3744433339998, + "offset_end": 102.39690916699965, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3477, + "stderr_bytes_observed": 0, + "external_seconds": 0.022355125000103726, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.010938667, + "objective": -2397, + "best_bound": -2397, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 1, + "model_globals": 0, + "objective": -2397, + "best_bound": -2397, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00030275, + "solve_seconds": 0.010938667, + "backend_solve_seconds": 0.010936, + "driver_seconds": 0.011263959, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 102.45498616699933, + "offset_end": 105.70823612499953, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5139, + "stderr_bytes_observed": 0, + "external_seconds": 3.2529812909997418, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.241757875, + "objective": -18731, + "best_bound": -18731, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -18731, + "best_bound": -18731, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000341625, + "solve_seconds": 3.241757875, + "backend_solve_seconds": 3.241715542, + "driver_seconds": 3.24211425, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "nodes": 63273, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 31636, + "budget_nodes": 63401, + "peak_open_nodes": 209, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 23248, + "lp_seconds": 2.2972496990000004, + "valid_bounds": 23248, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 69141, + "conditional_checks": 2042865, + "variable_fixings": 420729, + "variable_bound_tightenings": 420729, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 796, + "work": 352166, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001230833 + } + }, + "branching": { + "requested": true, + "decisions": 31636, + "manual_splits": 42, + "fallback_decisions": 31594, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1000, + "budget_nodes": 63401, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.003928878000000001 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 105.75055420899935, + "offset_end": 106.384889209, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5129, + "stderr_bytes_observed": 0, + "external_seconds": 0.634146750000582, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.622251667, + "objective": -4874, + "best_bound": -4874, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -4874, + "best_bound": -4874, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000375292, + "solve_seconds": 0.622251667, + "backend_solve_seconds": 0.622197834, + "driver_seconds": 0.622643334, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": 9443, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 4721, + "budget_nodes": 9571, + "peak_open_nodes": 201, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4247, + "lp_seconds": 0.4316531769999995, + "valid_bounds": 4247, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 11902, + "conditional_checks": 923080, + "variable_fixings": 166905, + "variable_bound_tightenings": 166905, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 774, + "work": 346644, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0013789160000000002 + } + }, + "branching": { + "requested": true, + "decisions": 4721, + "manual_splits": 45, + "fallback_decisions": 4676, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 68, + "failed_directions": 0, + "reliable_candidates": 256, + "probe_propagations": 904, + "budget_nodes": 9571, + "work": 100000, + "history_entries": 46, + "probe_lp_calls": 26, + "probe_lp_seconds": 0.0028358769999999984 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-511-uncorrelated", + "category": "knapsack", + "size": 511, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 106.46674329199959, + "offset_end": 109.77022912499979, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5138, + "stderr_bytes_observed": 0, + "external_seconds": 3.3029246659998535, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.291254833, + "objective": -18712, + "best_bound": -18712, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 511, + "model_rows": 1, + "model_globals": 0, + "objective": -18712, + "best_bound": -18712, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000160083, + "solve_seconds": 3.291254833, + "backend_solve_seconds": 3.291200209, + "driver_seconds": 3.291435375, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": 63439, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 31719, + "budget_nodes": 63567, + "peak_open_nodes": 209, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 23342, + "lp_seconds": 2.3292101260000106, + "valid_bounds": 23342, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 69288, + "conditional_checks": 2036348, + "variable_fixings": 418674, + "variable_bound_tightenings": 418674, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 796, + "work": 351633, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001200583 + } + }, + "branching": { + "requested": true, + "decisions": 31719, + "manual_splits": 42, + "fallback_decisions": 31677, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1000, + "budget_nodes": 63567, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.004332789 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-511-correlated", + "category": "knapsack", + "size": 511, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 109.83614220899926, + "offset_end": 110.54191374999937, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5126, + "stderr_bytes_observed": 0, + "external_seconds": 0.7055054160000509, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.6924035, + "objective": -4860, + "best_bound": -4860, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 511, + "model_rows": 1, + "model_globals": 0, + "objective": -4860, + "best_bound": -4860, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000172, + "solve_seconds": 0.6924035, + "backend_solve_seconds": 0.692356708, + "driver_seconds": 0.692593667, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": 9495, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 4747, + "budget_nodes": 9623, + "peak_open_nodes": 201, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4262, + "lp_seconds": 0.4840020340000003, + "valid_bounds": 4262, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 11993, + "conditional_checks": 928812, + "variable_fixings": 169524, + "variable_bound_tightenings": 169524, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 777, + "work": 346141, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001364292 + } + }, + "branching": { + "requested": true, + "decisions": 4747, + "manual_splits": 44, + "fallback_decisions": 4703, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 63, + "failed_directions": 0, + "reliable_candidates": 234, + "probe_propagations": 914, + "budget_nodes": 9623, + "work": 100000, + "history_entries": 44, + "probe_lp_calls": 28, + "probe_lp_seconds": 0.003148043 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-511-uncorrelated", + "category": "knapsack", + "size": 511, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 110.5886375, + "offset_end": 113.89580566699988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5135, + "stderr_bytes_observed": 0, + "external_seconds": 3.306963708000694, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.295617417, + "objective": -18712, + "best_bound": -18712, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 511, + "model_rows": 1, + "model_globals": 0, + "objective": -18712, + "best_bound": -18712, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000143959, + "solve_seconds": 3.295617417, + "backend_solve_seconds": 3.295570708, + "driver_seconds": 3.295779, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1 + ], + "nodes": 63439, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 31719, + "budget_nodes": 63567, + "peak_open_nodes": 209, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 23342, + "lp_seconds": 2.3332779180000283, + "valid_bounds": 23342, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 69288, + "conditional_checks": 2036348, + "variable_fixings": 418674, + "variable_bound_tightenings": 418674, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 796, + "work": 351633, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001271167 + } + }, + "branching": { + "requested": true, + "decisions": 31719, + "manual_splits": 42, + "fallback_decisions": 31677, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1000, + "budget_nodes": 63567, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.004361000999999999 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-511-correlated", + "category": "knapsack", + "size": 511, + "variant": "correlated", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 113.94111350000003, + "offset_end": 114.590241375, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5119, + "stderr_bytes_observed": 0, + "external_seconds": 0.6487881250004648, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.638706416, + "objective": -4860, + "best_bound": -4860, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 511, + "model_rows": 1, + "model_globals": 0, + "objective": -4860, + "best_bound": -4860, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000143042, + "solve_seconds": 0.638706416, + "backend_solve_seconds": 0.638668125, + "driver_seconds": 0.638871417, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": 9495, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 4747, + "budget_nodes": 9623, + "peak_open_nodes": 201, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4262, + "lp_seconds": 0.4418470039999982, + "valid_bounds": 4262, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 11993, + "conditional_checks": 928812, + "variable_fixings": 169524, + "variable_bound_tightenings": 169524, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 777, + "work": 346141, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001415667 + } + }, + "branching": { + "requested": true, + "decisions": 4747, + "manual_splits": 44, + "fallback_decisions": 4703, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 63, + "failed_directions": 0, + "reliable_candidates": 234, + "probe_propagations": 914, + "budget_nodes": 9623, + "work": 100000, + "history_entries": 44, + "probe_lp_calls": 28, + "probe_lp_seconds": 0.0032515409999999993 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-uncorrelated", + "category": "knapsack", + "size": 512, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 114.6586742089994, + "offset_end": 117.92908920899936, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5148, + "stderr_bytes_observed": 0, + "external_seconds": 3.2700886249995165, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.2593045, + "objective": -18731, + "best_bound": -18731, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -18731, + "best_bound": -18731, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000147542, + "solve_seconds": 3.2593045, + "backend_solve_seconds": 3.259258708, + "driver_seconds": 3.259467417, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + ], + "nodes": 63273, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 31636, + "budget_nodes": 63401, + "peak_open_nodes": 209, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 23248, + "lp_seconds": 2.299961033000006, + "valid_bounds": 23248, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 69141, + "conditional_checks": 2042865, + "variable_fixings": 420729, + "variable_bound_tightenings": 420729, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 796, + "work": 352166, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0011506659999999998 + } + }, + "branching": { + "requested": true, + "decisions": 31636, + "manual_splits": 42, + "fallback_decisions": 31594, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1000, + "budget_nodes": 63401, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.003890584999999999 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-512-correlated", + "category": "knapsack", + "size": 512, + "variant": "correlated", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 117.97767233400009, + "offset_end": 118.62091858399981, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5141, + "stderr_bytes_observed": 0, + "external_seconds": 0.6430573330007974, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.629437875, + "objective": -4874, + "best_bound": -4874, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 512, + "model_rows": 1, + "model_globals": 0, + "objective": -4874, + "best_bound": -4874, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000363292, + "solve_seconds": 0.629437875, + "backend_solve_seconds": 0.629396333, + "driver_seconds": 0.629818584, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": 9443, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 4721, + "budget_nodes": 9571, + "peak_open_nodes": 201, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4247, + "lp_seconds": 0.435216939, + "valid_bounds": 4247, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 11902, + "conditional_checks": 923080, + "variable_fixings": 166905, + "variable_bound_tightenings": 166905, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 774, + "work": 346644, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0013396249999999999 + } + }, + "branching": { + "requested": true, + "decisions": 4721, + "manual_splits": 45, + "fallback_decisions": 4676, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 68, + "failed_directions": 0, + "reliable_candidates": 256, + "probe_propagations": 904, + "budget_nodes": 9571, + "work": 100000, + "history_entries": 46, + "probe_lp_calls": 26, + "probe_lp_seconds": 0.0030337059999999993 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-384-uncorrelated", + "category": "knapsack", + "size": 384, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 118.77711070899932, + "offset_end": 118.81477204199928, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4012, + "stderr_bytes_observed": 0, + "external_seconds": 0.037498333000257844, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.025050583, + "objective": -13832, + "best_bound": -13832, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -13832, + "best_bound": -13832, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000338958, + "solve_seconds": 0.025050583, + "backend_solve_seconds": 0.025047792, + "driver_seconds": 0.025408166, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-384-correlated", + "category": "knapsack", + "size": 384, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 118.86411933399995, + "offset_end": 118.89992570899994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4010, + "stderr_bytes_observed": 0, + "external_seconds": 0.03563958300037484, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.024725458, + "objective": -3648, + "best_bound": -3648, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 1, + "model_globals": 0, + "objective": -3648, + "best_bound": -3648, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000344125, + "solve_seconds": 0.024725458, + "backend_solve_seconds": 0.024722334, + "driver_seconds": 0.025090625, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-400-uncorrelated", + "category": "knapsack", + "size": 400, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 118.96744620899972, + "offset_end": 119.00543558399931, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4058, + "stderr_bytes_observed": 0, + "external_seconds": 0.03785425000023679, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026925209, + "objective": -14402, + "best_bound": -14402, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -14402, + "best_bound": -14402, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000411125, + "solve_seconds": 0.026925209, + "backend_solve_seconds": 0.026922042, + "driver_seconds": 0.027358917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-400-correlated", + "category": "knapsack", + "size": 400, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.05356645899974, + "offset_end": 119.09174320900001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4074, + "stderr_bytes_observed": 0, + "external_seconds": 0.038026666000405385, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.026398084, + "objective": -3797, + "best_bound": -3797, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 1, + "model_globals": 0, + "objective": -3797, + "best_bound": -3797, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00035425, + "solve_seconds": 0.026398084, + "backend_solve_seconds": 0.026395791, + "driver_seconds": 0.026775209, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-404-uncorrelated", + "category": "knapsack", + "size": 404, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.16417816699959, + "offset_end": 119.20233624999946, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4083, + "stderr_bytes_observed": 0, + "external_seconds": 0.03799104200061265, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027234958, + "objective": -14476, + "best_bound": -14476, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -14476, + "best_bound": -14476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000378292, + "solve_seconds": 0.027234958, + "backend_solve_seconds": 0.027232125, + "driver_seconds": 0.027636084, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-404-correlated", + "category": "knapsack", + "size": 404, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.25106362499992, + "offset_end": 119.28908449999926, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4090, + "stderr_bytes_observed": 0, + "external_seconds": 0.037891707999733626, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027158125, + "objective": -3828, + "best_bound": -3828, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 404, + "model_rows": 1, + "model_globals": 0, + "objective": -3828, + "best_bound": -3828, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000380667, + "solve_seconds": 0.027158125, + "backend_solve_seconds": 0.027154792, + "driver_seconds": 0.027558792, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-uncorrelated", + "category": "knapsack", + "size": 406, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.36316549999992, + "offset_end": 119.40131883399954, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4091, + "stderr_bytes_observed": 0, + "external_seconds": 0.0380229580005107, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027160333, + "objective": -14512, + "best_bound": -14512, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -14512, + "best_bound": -14512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000363375, + "solve_seconds": 0.027160333, + "backend_solve_seconds": 0.027156708, + "driver_seconds": 0.027550709, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-406-correlated", + "category": "knapsack", + "size": 406, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.45262249999996, + "offset_end": 119.49031141699925, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4069, + "stderr_bytes_observed": 0, + "external_seconds": 0.03757729199969617, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027437292, + "objective": -3844, + "best_bound": -3844, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 406, + "model_rows": 1, + "model_globals": 0, + "objective": -3844, + "best_bound": -3844, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000319792, + "solve_seconds": 0.027437292, + "backend_solve_seconds": 0.027431541, + "driver_seconds": 0.027780334, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-uncorrelated", + "category": "knapsack", + "size": 407, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.56479108399981, + "offset_end": 119.60318024999924, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4104, + "stderr_bytes_observed": 0, + "external_seconds": 0.038173625000126776, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0276265, + "objective": -14531, + "best_bound": -14531, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -14531, + "best_bound": -14531, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000342458, + "solve_seconds": 0.0276265, + "backend_solve_seconds": 0.027621875, + "driver_seconds": 0.027995292, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-407-correlated", + "category": "knapsack", + "size": 407, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.65349545899971, + "offset_end": 119.69176604199947, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4102, + "stderr_bytes_observed": 0, + "external_seconds": 0.038108083000224724, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.027352208, + "objective": -3858, + "best_bound": -3858, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 407, + "model_rows": 1, + "model_globals": 0, + "objective": -3858, + "best_bound": -3858, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000345417, + "solve_seconds": 0.027352208, + "backend_solve_seconds": 0.027346375, + "driver_seconds": 0.027717084, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 119.7681909999992, + "offset_end": 121.56858258400007, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4707, + "stderr_bytes_observed": 0, + "external_seconds": 1.8000394159998905, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.786478834, + "objective": -14567, + "best_bound": -14567, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -14567, + "best_bound": -14567, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000369917, + "solve_seconds": 1.786478834, + "backend_solve_seconds": 1.78643525, + "driver_seconds": 1.786863333, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 40267, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 20133, + "budget_nodes": 40395, + "peak_open_nodes": 175, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 14864, + "lp_seconds": 1.2736054289999996, + "valid_bounds": 14864, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 44532, + "conditional_checks": 1291082, + "variable_fixings": 260966, + "variable_bound_tightenings": 260966, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 607, + "work": 271985, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00103425 + } + }, + "branching": { + "requested": true, + "decisions": 20133, + "manual_splits": 43, + "fallback_decisions": 20090, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 57, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1004, + "budget_nodes": 40395, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.0034148789999999996 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 121.61997704199985, + "offset_end": 122.00341129199933, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4725, + "stderr_bytes_observed": 0, + "external_seconds": 0.38324291600019933, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.370396042, + "objective": -3873, + "best_bound": -3873, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3873, + "best_bound": -3873, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000352917, + "solve_seconds": 0.370396042, + "backend_solve_seconds": 0.370358792, + "driver_seconds": 0.37076575, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": 6599, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 3299, + "budget_nodes": 6727, + "peak_open_nodes": 163, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 2933, + "lp_seconds": 0.25666592800000004, + "valid_bounds": 2933, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 8301, + "conditional_checks": 579921, + "variable_fixings": 104290, + "variable_bound_tightenings": 104290, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 2, + "nonzeros": 394, + "work": 194425, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000872376 + } + }, + "branching": { + "requested": true, + "decisions": 3299, + "manual_splits": 44, + "fallback_decisions": 3255, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 67, + "failed_directions": 0, + "reliable_candidates": 248, + "probe_propagations": 866, + "budget_nodes": 6727, + "work": 100000, + "history_entries": 45, + "probe_lp_calls": 24, + "probe_lp_seconds": 0.002099706999999999 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 122.10993416699966, + "offset_end": 125.15637341699949, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3489, + "stderr_bytes_observed": 0, + "external_seconds": 3.0461785000006785, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.033768583, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000165208, + "solve_seconds": 3.033768583, + "backend_solve_seconds": 3.033765708, + "driver_seconds": 3.033959208, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 125.27798270899984, + "offset_end": 135.29432058399925, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6521, + "stderr_bytes_observed": 0, + "external_seconds": 10.016133959000399, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00048275, + "objective": 1197, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 1024, + "model_rows": 128, + "model_globals": 0, + "objective": 1197, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000598042, + "solve_seconds": 10.00048275, + "backend_solve_seconds": 10.000480042, + "driver_seconds": 10.00110275, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 135.42839862499932, + "offset_end": 145.44183704199986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4733, + "stderr_bytes_observed": 0, + "external_seconds": 10.013017000000218, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000221333, + "objective": 579, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 576, + "model_rows": 96, + "model_globals": 0, + "objective": 579, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000492, + "solve_seconds": 10.000221333, + "backend_solve_seconds": 10.000218208, + "driver_seconds": 10.000732125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-20-single", + "category": "assignment", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 145.58170941699973, + "offset_end": 155.5945783749994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4016, + "stderr_bytes_observed": 0, + "external_seconds": 10.012541583000711, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000135125, + "objective": 334, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 400, + "model_rows": 80, + "model_globals": 0, + "objective": 334, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000314792, + "solve_seconds": 10.000135125, + "backend_solve_seconds": 10.00013175, + "driver_seconds": 10.000477584, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 155.7367379999996, + "offset_end": 165.7502937499994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3719, + "stderr_bytes_observed": 0, + "external_seconds": 10.013062834000266, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000090708, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0002415, + "solve_seconds": 10.000090708, + "backend_solve_seconds": 10.000087292, + "driver_seconds": 10.000350667, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 165.89873429199997, + "offset_end": 172.853760084, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3621, + "stderr_bytes_observed": 0, + "external_seconds": 6.954459458000201, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.942326042, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000262292, + "solve_seconds": 6.942326042, + "backend_solve_seconds": 6.942323042, + "driver_seconds": 6.942614167, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 172.96573445899958, + "offset_end": 175.99227862499993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3482, + "stderr_bytes_observed": 0, + "external_seconds": 3.0263343340002393, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.014694417, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000371334, + "solve_seconds": 3.014694417, + "backend_solve_seconds": 3.014691333, + "driver_seconds": 3.015096334, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 176.10135649999938, + "offset_end": 183.07176312499996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3601, + "stderr_bytes_observed": 0, + "external_seconds": 6.970025417000215, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.957151208, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001875, + "solve_seconds": 6.957151208, + "backend_solve_seconds": 6.957147125, + "driver_seconds": 6.95736175, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 183.18560041699948, + "offset_end": 193.1994642919999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3719, + "stderr_bytes_observed": 0, + "external_seconds": 10.013634625000122, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000113208, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000419959, + "solve_seconds": 10.000113208, + "backend_solve_seconds": 10.000109917, + "driver_seconds": 10.0005555, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-16-single", + "category": "assignment", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 193.3105909169999, + "offset_end": 193.35936104199936, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3561, + "stderr_bytes_observed": 0, + "external_seconds": 0.04848054099966248, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.034762166, + "objective": 145, + "best_bound": 145, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 256, + "model_rows": 64, + "model_globals": 0, + "objective": 145, + "best_bound": 145, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000354625, + "solve_seconds": 0.034762166, + "backend_solve_seconds": 0.034714625, + "driver_seconds": 0.035134166, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.00027587499999999997, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 5449, + "conditional_checks": 186059, + "variable_fixings": 23999, + "variable_bound_tightenings": 23999, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 193.47481416699975, + "offset_end": 203.48949033400004, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6595, + "stderr_bytes_observed": 0, + "external_seconds": 10.014290916999926, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000582916, + "objective": 598, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 1024, + "model_rows": 128, + "model_globals": 0, + "objective": 598, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000989959, + "solve_seconds": 10.000582916, + "backend_solve_seconds": 10.000451833, + "driver_seconds": 10.001597167, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.0005746670000000001, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 651527, + "conditional_checks": 37956215, + "variable_fixings": 7326256, + "variable_bound_tightenings": 7326256, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-24-single", + "category": "assignment", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 203.60919287499928, + "offset_end": 204.03574274999937, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4834, + "stderr_bytes_observed": 0, + "external_seconds": 0.4263188330005505, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.412178333, + "objective": 177, + "best_bound": 177, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 576, + "model_rows": 96, + "model_globals": 0, + "objective": 177, + "best_bound": 177, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000679792, + "solve_seconds": 0.412178333, + "backend_solve_seconds": 0.412106292, + "driver_seconds": 0.412898125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000503416, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 40450, + "conditional_checks": 2236414, + "variable_fixings": 274476, + "variable_bound_tightenings": 274476, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-28-single", + "category": "assignment", + "size": 28, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 204.1972345839995, + "offset_end": 212.22837566699945, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5676, + "stderr_bytes_observed": 0, + "external_seconds": 8.030956458999754, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.016678375, + "objective": 167, + "best_bound": 167, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 784, + "model_rows": 112, + "model_globals": 0, + "objective": 167, + "best_bound": 167, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000406667, + "solve_seconds": 8.016678375, + "backend_solve_seconds": 8.016618791, + "driver_seconds": 8.01711, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000469916, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 641278, + "conditional_checks": 32155979, + "variable_fixings": 4907823, + "variable_bound_tightenings": 4907823, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-30-single", + "category": "assignment", + "size": 30, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 212.40559754199967, + "offset_end": 217.07731862499986, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6129, + "stderr_bytes_observed": 0, + "external_seconds": 4.6714624159994855, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 4.657813125, + "objective": 192, + "best_bound": 192, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 900, + "model_rows": 120, + "model_globals": 0, + "objective": 192, + "best_bound": 192, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000528542, + "solve_seconds": 4.657813125, + "backend_solve_seconds": 4.657689917, + "driver_seconds": 4.6583665, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000558667, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 326907, + "conditional_checks": 17884732, + "variable_fixings": 3486373, + "variable_bound_tightenings": 3486373, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-31-single", + "category": "assignment", + "size": 31, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 217.27312433399948, + "offset_end": 226.14813824999965, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6377, + "stderr_bytes_observed": 0, + "external_seconds": 8.874568416999864, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.858807083, + "objective": 189, + "best_bound": 189, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 961, + "model_rows": 124, + "model_globals": 0, + "objective": 189, + "best_bound": 189, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000526458, + "solve_seconds": 8.858807083, + "backend_solve_seconds": 8.858742708, + "driver_seconds": 8.859355291, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000571875, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 607910, + "conditional_checks": 32946308, + "variable_fixings": 6407509, + "variable_bound_tightenings": 6407509, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-30-single", + "category": "assignment", + "size": 30, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 226.29731608399925, + "offset_end": 230.85859854199953, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6140, + "stderr_bytes_observed": 0, + "external_seconds": 4.561095916999875, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 4.546650167, + "objective": 192, + "best_bound": 192, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 900, + "model_rows": 120, + "model_globals": 0, + "objective": 192, + "best_bound": 192, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000579458, + "solve_seconds": 4.546650167, + "backend_solve_seconds": 4.546499166, + "driver_seconds": 4.54725375, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000596916, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 326907, + "conditional_checks": 17884732, + "variable_fixings": 3486373, + "variable_bound_tightenings": 3486373, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-31-single", + "category": "assignment", + "size": 31, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 231.00970241699997, + "offset_end": 239.88945966699976, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6384, + "stderr_bytes_observed": 0, + "external_seconds": 8.879351833999863, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.866236208, + "objective": 189, + "best_bound": 189, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 961, + "model_rows": 124, + "model_globals": 0, + "objective": 189, + "best_bound": 189, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000503541, + "solve_seconds": 8.866236208, + "backend_solve_seconds": 8.866168083, + "driver_seconds": 8.86676825, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000531875, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 607910, + "conditional_checks": 32946308, + "variable_fixings": 6407509, + "variable_bound_tightenings": 6407509, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-32-single", + "category": "assignment", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 240.041201, + "offset_end": 250.05864649999967, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 6586, + "stderr_bytes_observed": 0, + "external_seconds": 10.0172085410004, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000479, + "objective": 598, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 1024, + "model_rows": 128, + "model_globals": 0, + "objective": 598, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00086025, + "solve_seconds": 10.000479, + "backend_solve_seconds": 10.000391125, + "driver_seconds": 10.001361417, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000585291, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 651200, + "conditional_checks": 37931043, + "variable_fixings": 7322352, + "variable_bound_tightenings": 7322352, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-17-single", + "category": "assignment", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 250.26054762500007, + "offset_end": 250.3170444999996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3669, + "stderr_bytes_observed": 0, + "external_seconds": 0.056371874999967986, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.044166333, + "objective": 140, + "best_bound": 140, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 289, + "model_rows": 68, + "model_globals": 0, + "objective": 140, + "best_bound": 140, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0004305, + "solve_seconds": 0.044166333, + "backend_solve_seconds": 0.044117583, + "driver_seconds": 0.044619042, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000271208, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 6540, + "conditional_checks": 232230, + "variable_fixings": 26894, + "variable_bound_tightenings": 26894, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 250.4691654999997, + "offset_end": 250.51346916700004, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3812, + "stderr_bytes_observed": 0, + "external_seconds": 0.044056875000023865, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.032008458, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0004365, + "solve_seconds": 0.032008458, + "backend_solve_seconds": 0.031966333, + "driver_seconds": 0.032463583, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.00029775, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 4004, + "conditional_checks": 179852, + "variable_fixings": 22014, + "variable_bound_tightenings": 22014, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 250.720821375, + "offset_end": 253.41924704199937, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2999, + "stderr_bytes_observed": 0, + "external_seconds": 2.6982703339999716, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.686181417, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000141333, + "solve_seconds": 2.686181417, + "backend_solve_seconds": 2.686178209, + "driver_seconds": 2.686346292, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 253.63317708399973, + "offset_end": 263.64712791700003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4536, + "stderr_bytes_observed": 0, + "external_seconds": 10.01357787500001, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000118375, + "objective": 519, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 528, + "model_rows": 576, + "model_globals": 0, + "objective": 519, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000389, + "solve_seconds": 10.000118375, + "backend_solve_seconds": 10.000116042, + "driver_seconds": 10.000532834, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-12-single", + "category": "facility_location", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 263.8686024589997, + "offset_end": 273.8824170839998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3624, + "stderr_bytes_observed": 0, + "external_seconds": 10.013417250000202, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000097834, + "objective": 435, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 336, + "model_globals": 0, + "objective": 435, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000250667, + "solve_seconds": 10.000097834, + "backend_solve_seconds": 10.000095041, + "driver_seconds": 10.000371, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-10-single", + "category": "facility_location", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 274.1081133339994, + "offset_end": 284.1222377089998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3261, + "stderr_bytes_observed": 0, + "external_seconds": 10.01392854200003, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000093, + "objective": 341, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 210, + "model_rows": 240, + "model_globals": 0, + "objective": 341, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000199458, + "solve_seconds": 10.000093, + "backend_solve_seconds": 10.000089875, + "driver_seconds": 10.000310625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 284.3520481249998, + "offset_end": 294.36627574999966, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3102, + "stderr_bytes_observed": 0, + "external_seconds": 10.014076915999794, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000066834, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000188167, + "solve_seconds": 10.000066834, + "backend_solve_seconds": 10.000064042, + "driver_seconds": 10.000277042, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 294.60369195899966, + "offset_end": 295.0311755419998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2889, + "stderr_bytes_observed": 0, + "external_seconds": 0.42712808300075267, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.413165625, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00015075, + "solve_seconds": 0.413165625, + "backend_solve_seconds": 0.413162875, + "driver_seconds": 0.413336209, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 295.1519243749999, + "offset_end": 295.57801595899946, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2878, + "stderr_bytes_observed": 0, + "external_seconds": 0.42573224999978265, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.410454334, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000114041, + "solve_seconds": 0.410454334, + "backend_solve_seconds": 0.410450334, + "driver_seconds": 0.410593666, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 295.74735704199975, + "offset_end": 298.458339625, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3001, + "stderr_bytes_observed": 0, + "external_seconds": 2.7104121249994932, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.6977655, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000299292, + "solve_seconds": 2.6977655, + "backend_solve_seconds": 2.697762541, + "driver_seconds": 2.698091584, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 298.6319032089996, + "offset_end": 308.6430701249992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3114, + "stderr_bytes_observed": 0, + "external_seconds": 10.010960832999444, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000085459, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000177792, + "solve_seconds": 10.000085459, + "backend_solve_seconds": 10.000082709, + "driver_seconds": 10.000285833, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-8-single", + "category": "facility_location", + "size": 8, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 308.8171592919998, + "offset_end": 308.84408616699966, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3302, + "stderr_bytes_observed": 0, + "external_seconds": 0.026602332999573264, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.011244458, + "objective": 276, + "best_bound": 276, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 136, + "model_rows": 160, + "model_globals": 0, + "objective": 276, + "best_bound": 276, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000147, + "solve_seconds": 0.011244458, + "backend_solve_seconds": 0.011208209, + "driver_seconds": 0.011407, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 149, + "lp_seconds": 0.008181378999999996, + "valid_bounds": 149, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 249, + "conditional_checks": 5389, + "variable_fixings": 305, + "variable_bound_tightenings": 305, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 31413, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00031012499999999996 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 309.01961108399973, + "offset_end": 309.09369945899925, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4904, + "stderr_bytes_observed": 0, + "external_seconds": 0.07393504100036807, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.060817167, + "objective": 417, + "best_bound": 417, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 528, + "model_rows": 576, + "model_globals": 0, + "objective": 417, + "best_bound": 417, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000600709, + "solve_seconds": 0.060817167, + "backend_solve_seconds": 0.060781666, + "driver_seconds": 0.061436167, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 353, + "lp_seconds": 0.046409175999999976, + "valid_bounds": 353, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 637, + "conditional_checks": 28999, + "variable_fixings": 1545, + "variable_bound_tightenings": 1545, + "root_cover": { + "requested": true, + "completion": "SeparationLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 73910, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000604375 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-15-single", + "category": "facility_location", + "size": 15, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 309.3419485839995, + "offset_end": 309.4214710419992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4641, + "stderr_bytes_observed": 0, + "external_seconds": 0.07935287500004051, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.066067125, + "objective": 398, + "best_bound": 398, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 465, + "model_rows": 510, + "model_globals": 0, + "objective": 398, + "best_bound": 398, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000350458, + "solve_seconds": 0.066067125, + "backend_solve_seconds": 0.066021625, + "driver_seconds": 0.066434958, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 417, + "lp_seconds": 0.04947463100000002, + "valid_bounds": 417, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 762, + "conditional_checks": 29266, + "variable_fixings": 1647, + "variable_bound_tightenings": 1647, + "root_cover": { + "requested": true, + "completion": "SeparationLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 70966, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0005425419999999999 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-15-single", + "category": "facility_location", + "size": 15, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 309.5467644169994, + "offset_end": 309.62672054199993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4660, + "stderr_bytes_observed": 0, + "external_seconds": 0.0795391669998935, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.065922125, + "objective": 398, + "best_bound": 398, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 465, + "model_rows": 510, + "model_globals": 0, + "objective": 398, + "best_bound": 398, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000349917, + "solve_seconds": 0.065922125, + "backend_solve_seconds": 0.065883292, + "driver_seconds": 0.066286667, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 417, + "lp_seconds": 0.04939086999999999, + "valid_bounds": 417, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 762, + "conditional_checks": 29266, + "variable_fixings": 1647, + "variable_bound_tightenings": 1647, + "root_cover": { + "requested": true, + "completion": "SeparationLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 70966, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000568625 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-16-single", + "category": "facility_location", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 309.8132959169998, + "offset_end": 309.8879552089993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4903, + "stderr_bytes_observed": 0, + "external_seconds": 0.0744999580001604, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.061922834, + "objective": 417, + "best_bound": 417, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 528, + "model_rows": 576, + "model_globals": 0, + "objective": 417, + "best_bound": 417, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000399375, + "solve_seconds": 0.061922834, + "backend_solve_seconds": 0.061878625, + "driver_seconds": 0.06233825, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 353, + "lp_seconds": 0.04713962700000001, + "valid_bounds": 353, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 637, + "conditional_checks": 28999, + "variable_fixings": 1545, + "variable_bound_tightenings": 1545, + "root_cover": { + "requested": true, + "completion": "SeparationLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 73910, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000571292 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-7-single", + "category": "facility_location", + "size": 7, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 310.0750828749997, + "offset_end": 310.0930172089993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3202, + "stderr_bytes_observed": 0, + "external_seconds": 0.017531416999190697, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00536, + "objective": 257, + "best_bound": 257, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 105, + "model_rows": 126, + "model_globals": 0, + "objective": 257, + "best_bound": 257, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00032625, + "solve_seconds": 0.00536, + "backend_solve_seconds": 0.005323834, + "driver_seconds": 0.005701583, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 70, + "lp_seconds": 0.003816748, + "valid_bounds": 70, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 111, + "conditional_checks": 2611, + "variable_fixings": 84, + "variable_bound_tightenings": 84, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 24146, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00026033400000000003 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 310.33841920899977, + "offset_end": 310.35864537499947, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3466, + "stderr_bytes_observed": 0, + "external_seconds": 0.019773666000219237, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.007289667, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000175667, + "solve_seconds": 0.007289667, + "backend_solve_seconds": 0.007253375, + "driver_seconds": 0.007482125, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 65, + "lp_seconds": 0.005081373999999997, + "valid_bounds": 65, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 101, + "conditional_checks": 3599, + "variable_fixings": 189, + "variable_bound_tightenings": 189, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 43231, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000342333 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 310.61001820899946, + "offset_end": 311.4270313749994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2873, + "stderr_bytes_observed": 0, + "external_seconds": 0.8168824579997818, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.803698084, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000132, + "solve_seconds": 0.803698084, + "backend_solve_seconds": 0.803694541, + "driver_seconds": 0.803857625, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 311.68609333399945, + "offset_end": 321.7189855839997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3875, + "stderr_bytes_observed": 0, + "external_seconds": 10.03216304200032, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.003867041, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 363, + "model_rows": 437, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000323833, + "solve_seconds": 10.003867041, + "backend_solve_seconds": 10.003859167, + "driver_seconds": 10.004369708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 322.0299124589992, + "offset_end": 332.04338658399956, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3211, + "stderr_bytes_observed": 0, + "external_seconds": 10.013288707999891, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000099291, + "objective": 7, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 200, + "model_rows": 255, + "model_globals": 0, + "objective": 7, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000221917, + "solve_seconds": 10.000099291, + "backend_solve_seconds": 10.000096583, + "driver_seconds": 10.000339167, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-20-single", + "category": "bin_packing", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 332.31015899999966, + "offset_end": 342.3246394589996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3005, + "stderr_bytes_observed": 0, + "external_seconds": 10.014340667000397, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000125042, + "objective": 6, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 147, + "model_rows": 193, + "model_globals": 0, + "objective": 6, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000170292, + "solve_seconds": 10.000125042, + "backend_solve_seconds": 10.000122708, + "driver_seconds": 10.000318083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 342.59037304199956, + "offset_end": 352.60555908399965, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2884, + "stderr_bytes_observed": 0, + "external_seconds": 10.014812874999734, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000084208, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000164667, + "solve_seconds": 10.000084208, + "backend_solve_seconds": 10.000081584, + "driver_seconds": 10.000275584, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 352.87606329199934, + "offset_end": 355.79813775, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2883, + "stderr_bytes_observed": 0, + "external_seconds": 2.9216484580001634, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.90620275, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000156458, + "solve_seconds": 2.90620275, + "backend_solve_seconds": 2.906191458, + "driver_seconds": 2.906383708, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 356.00511474999985, + "offset_end": 356.82064345899926, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2873, + "stderr_bytes_observed": 0, + "external_seconds": 0.815373625000575, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.801821125, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000321666, + "solve_seconds": 0.801821125, + "backend_solve_seconds": 0.801817416, + "driver_seconds": 0.802164208, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 357.0205476249994, + "offset_end": 359.9309074169996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2894, + "stderr_bytes_observed": 0, + "external_seconds": 2.909914457999548, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 2.897185166, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000132333, + "solve_seconds": 2.897185166, + "backend_solve_seconds": 2.897182083, + "driver_seconds": 2.897336125, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 360.13440850000006, + "offset_end": 370.1487176669998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2872, + "stderr_bytes_observed": 0, + "external_seconds": 10.01389491700047, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000093542, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00014425, + "solve_seconds": 10.000093542, + "backend_solve_seconds": 10.000090875, + "driver_seconds": 10.000267375, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-16-single", + "category": "bin_packing", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 370.3557792920001, + "offset_end": 370.373996542, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2912, + "stderr_bytes_observed": 0, + "external_seconds": 0.01811958300004335, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.00185575, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 102, + "model_rows": 139, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000274625, + "solve_seconds": 0.00185575, + "backend_solve_seconds": 0.001800333, + "driver_seconds": 0.002148708, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.00052925, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 92, + "conditional_checks": 4505, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-32-single", + "category": "bin_packing", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 370.57863674999953, + "offset_end": 380.5920518749999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3925, + "stderr_bytes_observed": 0, + "external_seconds": 10.012957083999936, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000209292, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 363, + "model_rows": 437, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.00058925, + "solve_seconds": 10.000209292, + "backend_solve_seconds": 10.000136333, + "driver_seconds": 10.0008205, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.001040167, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1594642, + "conditional_checks": 25935666, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-24-single", + "category": "bin_packing", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 380.8001125840001, + "offset_end": 387.29260020899983, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3325, + "stderr_bytes_observed": 0, + "external_seconds": 6.492253749999691, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.478602417, + "objective": 7, + "best_bound": 7, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 200, + "model_rows": 255, + "model_globals": 0, + "objective": 7, + "best_bound": 7, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00036525, + "solve_seconds": 6.478602417, + "backend_solve_seconds": 6.478509875, + "driver_seconds": 6.478987334, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000709167, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1513108, + "conditional_checks": 23670429, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-28-single", + "category": "bin_packing", + "size": 28, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 387.57877087499946, + "offset_end": 387.60537037499944, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3676, + "stderr_bytes_observed": 0, + "external_seconds": 0.02615908300049341, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.003788084, + "objective": 9, + "best_bound": 9, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 290, + "model_rows": 355, + "model_globals": 0, + "objective": 9, + "best_bound": 9, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00030175, + "solve_seconds": 0.003788084, + "backend_solve_seconds": 0.003755042, + "driver_seconds": 0.004106416, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.001088875, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 323, + "conditional_checks": 39483, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-30-single", + "category": "bin_packing", + "size": 30, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 387.89144379199934, + "offset_end": 387.90881462499965, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3767, + "stderr_bytes_observed": 0, + "external_seconds": 0.016959916999439884, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004832792, + "objective": 9, + "best_bound": 9, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 310, + "model_rows": 379, + "model_globals": 0, + "objective": 9, + "best_bound": 9, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000287667, + "solve_seconds": 0.004832792, + "backend_solve_seconds": 0.004793, + "driver_seconds": 0.005136792, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000958916, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 602, + "conditional_checks": 48360, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-31-single", + "category": "bin_packing", + "size": 31, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 388.2026847089992, + "offset_end": 398.2172010839995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3888, + "stderr_bytes_observed": 0, + "external_seconds": 10.014396874999875, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000186292, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 352, + "model_rows": 424, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000313584, + "solve_seconds": 10.000186292, + "backend_solve_seconds": 10.00014025, + "driver_seconds": 10.000520875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.0010305, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1640129, + "conditional_checks": 24786096, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-29-single", + "category": "bin_packing", + "size": 29, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 398.5236696669999, + "offset_end": 398.5410031249994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3727, + "stderr_bytes_observed": 0, + "external_seconds": 0.01719391699953121, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.003336167, + "objective": 9, + "best_bound": 9, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 367, + "model_globals": 0, + "objective": 9, + "best_bound": 9, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000315583, + "solve_seconds": 0.003336167, + "backend_solve_seconds": 0.003303, + "driver_seconds": 0.0036675, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000892666, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 289, + "conditional_checks": 41523, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-29-single", + "category": "bin_packing", + "size": 29, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 398.6925118749996, + "offset_end": 398.7080314999994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3727, + "stderr_bytes_observed": 0, + "external_seconds": 0.015119124999728228, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.003243375, + "objective": 9, + "best_bound": 9, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 300, + "model_rows": 367, + "model_globals": 0, + "objective": 9, + "best_bound": 9, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00027675, + "solve_seconds": 0.003243375, + "backend_solve_seconds": 0.003210958, + "driver_seconds": 0.003533084, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000878875, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 289, + "conditional_checks": 41523, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-30-single", + "category": "bin_packing", + "size": 30, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 398.9440679999998, + "offset_end": 398.9615427919998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3747, + "stderr_bytes_observed": 0, + "external_seconds": 0.01695679200020095, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004794375, + "objective": 9, + "best_bound": 9, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 310, + "model_rows": 379, + "model_globals": 0, + "objective": 9, + "best_bound": 9, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000287041, + "solve_seconds": 0.004794375, + "backend_solve_seconds": 0.004752292, + "driver_seconds": 0.005099708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.00091125, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 602, + "conditional_checks": 48360, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-31-single", + "category": "bin_packing", + "size": 31, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 399.1923113339999, + "offset_end": 409.20623041699946, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3883, + "stderr_bytes_observed": 0, + "external_seconds": 10.013486458000443, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000287959, + "objective": 11, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 352, + "model_rows": 424, + "model_globals": 0, + "objective": 11, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.0003515, + "solve_seconds": 10.000287959, + "backend_solve_seconds": 10.00021575, + "driver_seconds": 10.000659166, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.001042875, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1645155, + "conditional_checks": 24860975, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-17-single", + "category": "bin_packing", + "size": 17, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 409.51136204199975, + "offset_end": 409.5295238339995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2938, + "stderr_bytes_observed": 0, + "external_seconds": 0.018060082999909355, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.001848541, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 108, + "model_rows": 147, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000154333, + "solve_seconds": 0.001848541, + "backend_solve_seconds": 0.001810208, + "driver_seconds": 0.002021, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000489125, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 155, + "conditional_checks": 5813, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 409.8330916669993, + "offset_end": 409.85057824999967, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2960, + "stderr_bytes_observed": 0, + "external_seconds": 0.01701629099989077, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004628958, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000232, + "solve_seconds": 0.004628958, + "backend_solve_seconds": 0.004583958, + "driver_seconds": 0.004878333, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000496833, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1163, + "conditional_checks": 20537, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 410.1621989589994, + "offset_end": 410.17601037499935, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2668, + "stderr_bytes_observed": 0, + "external_seconds": 0.013678124999387364, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000523458, + "objective": 484, + "best_bound": 484, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.1291e-05, + "solve_seconds": 0.000523458, + "backend_solve_seconds": 0.000521083, + "driver_seconds": 0.000630041, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 410.4940854589995, + "offset_end": 420.50662608399944, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2802, + "stderr_bytes_observed": 0, + "external_seconds": 10.012050207999891, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000071541, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000179459, + "solve_seconds": 10.000071541, + "backend_solve_seconds": 10.000068667, + "driver_seconds": 10.000271709, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 420.8229483339992, + "offset_end": 420.8919875419997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2758, + "stderr_bytes_observed": 0, + "external_seconds": 0.06890587499947287, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.054790209, + "objective": 895, + "best_bound": 895, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 72, + "model_rows": 38, + "model_globals": 0, + "objective": 895, + "best_bound": 895, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000142209, + "solve_seconds": 0.054790209, + "backend_solve_seconds": 0.054786708, + "driver_seconds": 0.054956792, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 421.20693949999986, + "offset_end": 422.38991016699947, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2775, + "stderr_bytes_observed": 0, + "external_seconds": 1.1825654579997718, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.167269834, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000158584, + "solve_seconds": 1.167269834, + "backend_solve_seconds": 1.167266834, + "driver_seconds": 1.167452542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 422.7225646249999, + "offset_end": 426.5779167089995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2807, + "stderr_bytes_observed": 0, + "external_seconds": 3.855214166999758, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.842317959, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000175334, + "solve_seconds": 3.842317959, + "backend_solve_seconds": 3.84231475, + "driver_seconds": 3.842523542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 426.8272481669992, + "offset_end": 428.0197578749994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2786, + "stderr_bytes_observed": 0, + "external_seconds": 1.1923412090000056, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.173759084, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000178375, + "solve_seconds": 1.173759084, + "backend_solve_seconds": 1.173756458, + "driver_seconds": 1.173957333, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 428.26813066699924, + "offset_end": 432.1166226669993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2807, + "stderr_bytes_observed": 0, + "external_seconds": 3.848109000000477, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.8333235, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000166625, + "solve_seconds": 3.8333235, + "backend_solve_seconds": 3.833320334, + "driver_seconds": 3.833511416, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 432.3648601669993, + "offset_end": 442.37859112499973, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2813, + "stderr_bytes_observed": 0, + "external_seconds": 10.013628666999466, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00007075, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000391208, + "solve_seconds": 10.00007075, + "backend_solve_seconds": 10.000065917, + "driver_seconds": 10.000483208, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-6-single", + "category": "production", + "size": 6, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 442.63095641699965, + "offset_end": 442.71867433399984, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3260, + "stderr_bytes_observed": 0, + "external_seconds": 0.08756758300023648, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.008730708, + "objective": 484, + "best_bound": 484, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 48, + "model_rows": 26, + "model_globals": 0, + "objective": 484, + "best_bound": 484, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000374792, + "solve_seconds": 0.008730708, + "backend_solve_seconds": 0.008696208, + "driver_seconds": 0.009118334, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 97, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 48, + "budget_nodes": 225, + "peak_open_nodes": 5, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 82, + "lp_seconds": 0.0051336670000000015, + "valid_bounds": 82, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 12, + "certificate_evaluations": 159, + "conditional_checks": 3793, + "variable_fixings": 75, + "variable_bound_tightenings": 75, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 4, + "nonzeros": 92, + "work": 151146, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 4, + "duplicate_cuts": 1, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000630916 + } + }, + "branching": { + "requested": true, + "decisions": 48, + "manual_splits": 33, + "fallback_decisions": 15, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 30, + "finite_samples": 60, + "zero_gain_samples": 30, + "failed_directions": 36, + "reliable_candidates": 63, + "probe_propagations": 3945, + "budget_nodes": 225, + "work": 6620, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.00235963 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 442.97106687499945, + "offset_end": 443.0298660419994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3456, + "stderr_bytes_observed": 0, + "external_seconds": 0.0586785420000524, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.044861875, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000196791, + "solve_seconds": 0.044861875, + "backend_solve_seconds": 0.044817875, + "driver_seconds": 0.045073833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 963, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 481, + "budget_nodes": 1091, + "peak_open_nodes": 11, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 412, + "lp_seconds": 0.03185924400000001, + "valid_bounds": 412, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 6, + "certificate_evaluations": 869, + "conditional_checks": 25716, + "variable_fixings": 1158, + "variable_bound_tightenings": 1158, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 127219, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00033754099999999996 + } + }, + "branching": { + "requested": true, + "decisions": 481, + "manual_splits": 32, + "fallback_decisions": 449, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 30, + "failed_directions": 37, + "reliable_candidates": 38, + "probe_propagations": 6444, + "budget_nodes": 1091, + "work": 100000, + "history_entries": 21, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.0034137100000000017 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-24-single", + "category": "production", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 443.3832951249997, + "offset_end": 444.1373374169998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3862, + "stderr_bytes_observed": 0, + "external_seconds": 0.7535379169994485, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.737804708, + "objective": 4600, + "best_bound": 4600, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 192, + "model_rows": 98, + "model_globals": 0, + "objective": 4600, + "best_bound": 4600, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000494792, + "solve_seconds": 0.737804708, + "backend_solve_seconds": 0.737768, + "driver_seconds": 0.738314958, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 12781, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 6390, + "budget_nodes": 12909, + "peak_open_nodes": 20, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4399, + "lp_seconds": 0.5702581739999997, + "valid_bounds": 4399, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 53, + "certificate_evaluations": 8909, + "conditional_checks": 373460, + "variable_fixings": 13413, + "variable_bound_tightenings": 13413, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 129, + "work": 186638, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00063725 + } + }, + "branching": { + "requested": true, + "decisions": 6390, + "manual_splits": 21, + "fallback_decisions": 6369, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 30, + "finite_samples": 60, + "zero_gain_samples": 30, + "failed_directions": 35, + "reliable_candidates": 11, + "probe_propagations": 12583, + "budget_nodes": 12909, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 44, + "probe_lp_seconds": 0.006519381 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-48-single", + "category": "production", + "size": 48, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 444.54221095899993, + "offset_end": 454.5592961249995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4636, + "stderr_bytes_observed": 0, + "external_seconds": 10.01684000000023, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000651958, + "objective": 16629, + "best_bound": 16417, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "time_limit", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 384, + "model_rows": 194, + "model_globals": 0, + "objective": 16629, + "best_bound": 16417, + "absolute_gap": 212, + "relative_gap": 0.012748812315833784, + "build_seconds": 0.001925625, + "solve_seconds": 10.000651958, + "backend_solve_seconds": 10.00055325, + "driver_seconds": 10.0025965, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": 51053, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 25526, + "budget_nodes": 51181, + "peak_open_nodes": 41, + "unresolved_regions": 28, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 24389, + "lp_seconds": 8.60566240800001, + "valid_bounds": 24389, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 23, + "certificate_evaluations": 44526, + "conditional_checks": 1844377, + "variable_fixings": 96138, + "variable_bound_tightenings": 96138, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 399955, + "projected_coordinates": 4, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001925 + } + }, + "branching": { + "requested": true, + "decisions": 25526, + "manual_splits": 21, + "fallback_decisions": 25505, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 29, + "finite_samples": 58, + "zero_gain_samples": 30, + "failed_directions": 36, + "reliable_candidates": 10, + "probe_propagations": 24024, + "budget_nodes": 51181, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.015201709999999995 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-36-single", + "category": "production", + "size": 36, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 455.01539004200004, + "offset_end": 465.0353302499998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4245, + "stderr_bytes_observed": 0, + "external_seconds": 10.01927279100073, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000432667, + "objective": 9655, + "best_bound": 9542, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "time_limit", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 288, + "model_rows": 146, + "model_globals": 0, + "objective": 9655, + "best_bound": 9542, + "absolute_gap": 113, + "relative_gap": 0.01170378042465044, + "build_seconds": 0.00099925, + "solve_seconds": 10.000432667, + "backend_solve_seconds": 10.000382458, + "driver_seconds": 10.00144675, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": 69059, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 34529, + "budget_nodes": 69187, + "peak_open_nodes": 31, + "unresolved_regions": 7, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 35883, + "lp_seconds": 8.159878880000052, + "valid_bounds": 35883, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 26, + "certificate_evaluations": 63402, + "conditional_checks": 4145426, + "variable_fixings": 185313, + "variable_bound_tightenings": 185313, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 276787, + "projected_coordinates": 4, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001263833 + } + }, + "branching": { + "requested": true, + "decisions": 34529, + "manual_splits": 21, + "fallback_decisions": 34508, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 29, + "finite_samples": 58, + "zero_gain_samples": 30, + "failed_directions": 36, + "reliable_candidates": 10, + "probe_propagations": 18168, + "budget_nodes": 69187, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.010006122000000003 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-30-single", + "category": "production", + "size": 30, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 465.5020093339999, + "offset_end": 475.51713270899927, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4058, + "stderr_bytes_observed": 0, + "external_seconds": 10.014847500000542, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000341542, + "objective": 6838, + "best_bound": 6755, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "time_limit", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 240, + "model_rows": 122, + "model_globals": 0, + "objective": 6838, + "best_bound": 6755, + "absolute_gap": 83, + "relative_gap": 0.012138052062006435, + "build_seconds": 0.000758792, + "solve_seconds": 10.000341542, + "backend_solve_seconds": 10.000284666, + "driver_seconds": 10.001115125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + "nodes": 100485, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 50242, + "budget_nodes": 100613, + "peak_open_nodes": 26, + "unresolved_regions": 15, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 47903, + "lp_seconds": 8.310197055999952, + "valid_bounds": 47903, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 35, + "certificate_evaluations": 87783, + "conditional_checks": 3777400, + "variable_fixings": 196148, + "variable_bound_tightenings": 196148, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 227499, + "projected_coordinates": 2, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000882542 + } + }, + "branching": { + "requested": true, + "decisions": 50242, + "manual_splits": 21, + "fallback_decisions": 50221, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 29, + "finite_samples": 58, + "zero_gain_samples": 28, + "failed_directions": 36, + "reliable_candidates": 10, + "probe_propagations": 15274, + "budget_nodes": 100613, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.007669873999999997 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-27-single", + "category": "production", + "size": 27, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 475.9917599999999, + "offset_end": 481.3363333339994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3963, + "stderr_bytes_observed": 0, + "external_seconds": 5.344272541000464, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 5.33010225, + "objective": 5574, + "best_bound": 5574, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 216, + "model_rows": 110, + "model_globals": 0, + "objective": 5574, + "best_bound": 5574, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000642542, + "solve_seconds": 5.33010225, + "backend_solve_seconds": 5.330058625, + "driver_seconds": 5.330759584, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 72383, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 36191, + "budget_nodes": 72511, + "peak_open_nodes": 23, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 28447, + "lp_seconds": 4.276754164000033, + "valid_bounds": 28447, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 71, + "certificate_evaluations": 55348, + "conditional_checks": 2541270, + "variable_fixings": 107836, + "variable_bound_tightenings": 107836, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 205779, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000827584 + } + }, + "branching": { + "requested": true, + "decisions": 36191, + "manual_splits": 21, + "fallback_decisions": 36170, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 29, + "finite_samples": 58, + "zero_gain_samples": 28, + "failed_directions": 36, + "reliable_candidates": 10, + "probe_propagations": 13816, + "budget_nodes": 72511, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.0067256630000000015 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-28-single", + "category": "production", + "size": 28, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 481.8555837089998, + "offset_end": 491.41718175000005, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3999, + "stderr_bytes_observed": 0, + "external_seconds": 9.5611377919995, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.547965833, + "objective": 5985, + "best_bound": 5985, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 224, + "model_rows": 114, + "model_globals": 0, + "objective": 5985, + "best_bound": 5985, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000716417, + "solve_seconds": 9.547965833, + "backend_solve_seconds": 9.54791875, + "driver_seconds": 9.548701125, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": 118183, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 59091, + "budget_nodes": 118311, + "peak_open_nodes": 25, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 50052, + "lp_seconds": 7.7285450349999705, + "valid_bounds": 50052, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 124, + "certificate_evaluations": 95370, + "conditional_checks": 4279737, + "variable_fixings": 195308, + "variable_bound_tightenings": 195308, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 212795, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000846833 + } + }, + "branching": { + "requested": true, + "decisions": 59091, + "manual_splits": 20, + "fallback_decisions": 59071, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 29, + "failed_directions": 37, + "reliable_candidates": 10, + "probe_propagations": 14186, + "budget_nodes": 118311, + "work": 100000, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.0067422950000000014 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-29-single", + "category": "production", + "size": 29, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 491.93174716699923, + "offset_end": 501.9467085419992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4038, + "stderr_bytes_observed": 0, + "external_seconds": 10.014817959000538, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000286834, + "objective": 6384, + "best_bound": 6360, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "time_limit", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 232, + "model_rows": 118, + "model_globals": 0, + "objective": 6384, + "best_bound": 6360, + "absolute_gap": 24, + "relative_gap": 0.0037593984962406013, + "build_seconds": 0.000708541, + "solve_seconds": 10.000286834, + "backend_solve_seconds": 10.00017325, + "driver_seconds": 10.001014833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 112725, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 56362, + "budget_nodes": 112853, + "peak_open_nodes": 26, + "unresolved_regions": 10, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 49349, + "lp_seconds": 8.115328547000013, + "valid_bounds": 49349, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 110, + "certificate_evaluations": 92973, + "conditional_checks": 4167631, + "variable_fixings": 193618, + "variable_bound_tightenings": 193618, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 220035, + "projected_coordinates": 3, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0009522080000000001 + } + }, + "branching": { + "requested": true, + "decisions": 56362, + "manual_splits": 20, + "fallback_decisions": 56342, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 29, + "failed_directions": 37, + "reliable_candidates": 10, + "probe_propagations": 14670, + "budget_nodes": 112853, + "work": 100000, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.006956580000000001 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-27-single", + "category": "production", + "size": 27, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 502.3484122919999, + "offset_end": 507.70258970899977, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3945, + "stderr_bytes_observed": 0, + "external_seconds": 5.35397466700033, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 5.338047542, + "objective": 5574, + "best_bound": 5574, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 216, + "model_rows": 110, + "model_globals": 0, + "objective": 5574, + "best_bound": 5574, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.001064375, + "solve_seconds": 5.338047542, + "backend_solve_seconds": 5.337999125, + "driver_seconds": 5.339126084, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 72383, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 36191, + "budget_nodes": 72511, + "peak_open_nodes": 23, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 28447, + "lp_seconds": 4.278951520000002, + "valid_bounds": 28447, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 71, + "certificate_evaluations": 55348, + "conditional_checks": 2541270, + "variable_fixings": 107836, + "variable_bound_tightenings": 107836, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 205779, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000808083 + } + }, + "branching": { + "requested": true, + "decisions": 36191, + "manual_splits": 21, + "fallback_decisions": 36170, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 29, + "finite_samples": 58, + "zero_gain_samples": 28, + "failed_directions": 36, + "reliable_candidates": 10, + "probe_propagations": 13816, + "budget_nodes": 72511, + "work": 100000, + "history_entries": 19, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.0067476629999999975 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-28-single", + "category": "production", + "size": 28, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 508.10384837499987, + "offset_end": 517.6991920419996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3987, + "stderr_bytes_observed": 0, + "external_seconds": 9.594860541999878, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.581998708, + "objective": 5985, + "best_bound": 5985, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 224, + "model_rows": 114, + "model_globals": 0, + "objective": 5985, + "best_bound": 5985, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00101925, + "solve_seconds": 9.581998708, + "backend_solve_seconds": 9.58195975, + "driver_seconds": 9.583033708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": 118183, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 59091, + "budget_nodes": 118311, + "peak_open_nodes": 25, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 50052, + "lp_seconds": 7.766210176000047, + "valid_bounds": 50052, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 124, + "certificate_evaluations": 95370, + "conditional_checks": 4279737, + "variable_fixings": 195308, + "variable_bound_tightenings": 195308, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 212795, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000783709 + } + }, + "branching": { + "requested": true, + "decisions": 59091, + "manual_splits": 20, + "fallback_decisions": 59071, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 29, + "failed_directions": 37, + "reliable_candidates": 10, + "probe_propagations": 14186, + "budget_nodes": 118311, + "work": 100000, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.007023166000000001 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-29-single", + "category": "production", + "size": 29, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "lp-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 518.1004126669995, + "offset_end": 528.1188734999996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4021, + "stderr_bytes_observed": 0, + "external_seconds": 10.01807749999989, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000172208, + "objective": 6384, + "best_bound": 6360, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "time_limit", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 232, + "model_rows": 118, + "model_globals": 0, + "objective": 6384, + "best_bound": 6360, + "absolute_gap": 24, + "relative_gap": 0.0037593984962406013, + "build_seconds": 0.001046167, + "solve_seconds": 10.000172208, + "backend_solve_seconds": 10.000115166, + "driver_seconds": 10.001237083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 112490, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 56245, + "budget_nodes": 112618, + "peak_open_nodes": 26, + "unresolved_regions": 8, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 49257, + "lp_seconds": 8.12250000699995, + "valid_bounds": 49257, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 110, + "certificate_evaluations": 92796, + "conditional_checks": 4158759, + "variable_fixings": 193249, + "variable_bound_tightenings": 193249, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 220035, + "projected_coordinates": 3, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000830792 + } + }, + "branching": { + "requested": true, + "decisions": 56245, + "manual_splits": 20, + "fallback_decisions": 56225, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 29, + "failed_directions": 37, + "reliable_candidates": 10, + "probe_propagations": 14670, + "budget_nodes": 112618, + "work": 100000, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.007046414999999998 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-9-single", + "category": "production", + "size": 9, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 528.6438139169995, + "offset_end": 528.6806081249997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3344, + "stderr_bytes_observed": 0, + "external_seconds": 0.036692957999548526, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.023441125, + "objective": 895, + "best_bound": 895, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 72, + "model_rows": 38, + "model_globals": 0, + "objective": 895, + "best_bound": 895, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000419583, + "solve_seconds": 0.023441125, + "backend_solve_seconds": 0.023392375, + "driver_seconds": 0.023874541, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": 565, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 282, + "budget_nodes": 693, + "peak_open_nodes": 9, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 229, + "lp_seconds": 0.015090913000000001, + "valid_bounds": 229, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 5, + "certificate_evaluations": 505, + "conditional_checks": 13053, + "variable_fixings": 405, + "variable_bound_tightenings": 405, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 5, + "nonzeros": 148, + "work": 295833, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 5, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0007103750000000001 + } + }, + "branching": { + "requested": true, + "decisions": 282, + "manual_splits": 28, + "fallback_decisions": 254, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 30, + "failed_directions": 37, + "reliable_candidates": 25, + "probe_propagations": 5185, + "budget_nodes": 693, + "work": 65390, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.0028050010000000005 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-10-single", + "category": "production", + "size": 10, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 529.0811964589993, + "offset_end": 529.1244966669992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3398, + "stderr_bytes_observed": 0, + "external_seconds": 0.043171040999368415, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.031420458, + "objective": 1107, + "best_bound": 1107, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 42, + "model_globals": 0, + "objective": 1107, + "best_bound": 1107, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0003475, + "solve_seconds": 0.031420458, + "backend_solve_seconds": 0.031379375, + "driver_seconds": 0.031780959, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + "nodes": 681, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 340, + "budget_nodes": 809, + "peak_open_nodes": 10, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 317, + "lp_seconds": 0.02208504400000001, + "valid_bounds": 317, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 10, + "certificate_evaluations": 662, + "conditional_checks": 17700, + "variable_fixings": 744, + "variable_bound_tightenings": 744, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 129, + "work": 121342, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 1, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00027825 + } + }, + "branching": { + "requested": true, + "decisions": 340, + "manual_splits": 32, + "fallback_decisions": 308, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 30, + "failed_directions": 37, + "reliable_candidates": 38, + "probe_propagations": 5595, + "budget_nodes": 809, + "work": 77771, + "history_entries": 21, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.003169582 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-11-single", + "category": "production", + "size": 11, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 529.5142639999995, + "offset_end": 529.560275625, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3428, + "stderr_bytes_observed": 0, + "external_seconds": 0.045884707999903185, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.033637833, + "objective": 1270, + "best_bound": 1270, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 88, + "model_rows": 46, + "model_globals": 0, + "objective": 1270, + "best_bound": 1270, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000387333, + "solve_seconds": 0.033637833, + "backend_solve_seconds": 0.033592542, + "driver_seconds": 0.034039708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + "nodes": 789, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 394, + "budget_nodes": 917, + "peak_open_nodes": 11, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 345, + "lp_seconds": 0.022746707999999994, + "valid_bounds": 345, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 5, + "certificate_evaluations": 722, + "conditional_checks": 22382, + "variable_fixings": 959, + "variable_bound_tightenings": 959, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 3, + "nonzeros": 81, + "work": 123987, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000356334 + } + }, + "branching": { + "requested": true, + "decisions": 394, + "manual_splits": 29, + "fallback_decisions": 365, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 29, + "failed_directions": 37, + "reliable_candidates": 26, + "probe_propagations": 5958, + "budget_nodes": 917, + "work": 96030, + "history_entries": 22, + "probe_lp_calls": 41, + "probe_lp_seconds": 0.0026946269999999994 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 530.2135355419996, + "offset_end": 530.2798987919996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2598, + "stderr_bytes_observed": 0, + "external_seconds": 0.06621591600014654, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.053515916, + "objective": 436, + "best_bound": 436, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.0459e-05, + "solve_seconds": 0.053515916, + "backend_solve_seconds": 0.053513459, + "driver_seconds": 0.053624042, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 530.8020463339999, + "offset_end": 540.8147467919998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2687, + "stderr_bytes_observed": 0, + "external_seconds": 10.01244512500034, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.0004635, + "objective": 624, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 98, + "model_columns": 64, + "model_rows": 0, + "model_globals": 33, + "objective": 624, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000213333, + "solve_seconds": 10.0004635, + "backend_solve_seconds": 10.000460417, + "driver_seconds": 10.000703458, + "assignment": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7 + ], + "full_values": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7, + 16, + 41, + 11, + 20, + 10, + 25, + 14, + 20, + 38, + 5, + 12, + 12, + 19, + 21, + 11, + 14, + 16, + 7, + 26, + 25, + 8, + 7, + 23, + 6, + 13, + 8, + 23, + 41, + 35, + 41, + 31, + 25 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 541.3570856249999, + "offset_end": 551.3696318339998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2615, + "stderr_bytes_observed": 0, + "external_seconds": 10.012282792000406, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000105167, + "objective": 518, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 48, + "model_rows": 0, + "model_globals": 25, + "objective": 518, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000197166, + "solve_seconds": 10.000105167, + "backend_solve_seconds": 10.000101834, + "driver_seconds": 10.000324875, + "assignment": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9 + ], + "full_values": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9, + 21, + 21, + 28, + 20, + 10, + 18, + 8, + 20, + 14, + 5, + 12, + 12, + 24, + 21, + 51, + 41, + 16, + 35, + 26, + 25, + 7, + 24, + 23, + 36 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 551.9056817499995, + "offset_end": 555.0740840839999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2607, + "stderr_bytes_observed": 0, + "external_seconds": 3.168242500000815, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.157481083, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000116, + "solve_seconds": 3.157481083, + "backend_solve_seconds": 3.157478458, + "driver_seconds": 3.157620125, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 555.5993599169997, + "offset_end": 565.6117939999995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2591, + "stderr_bytes_observed": 0, + "external_seconds": 10.012085792000107, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000377958, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000139042, + "solve_seconds": 10.000377958, + "backend_solve_seconds": 10.000374583, + "driver_seconds": 10.000535292, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 566.1426846669992, + "offset_end": 575.6581797089993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2624, + "stderr_bytes_observed": 0, + "external_seconds": 9.515184625000074, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.501285125, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000153208, + "solve_seconds": 9.501285125, + "backend_solve_seconds": 9.501282125, + "driver_seconds": 9.50146875, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 576.0603432919997, + "offset_end": 579.2409634999995, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2614, + "stderr_bytes_observed": 0, + "external_seconds": 3.1800896249997095, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.164990917, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000255167, + "solve_seconds": 3.164990917, + "backend_solve_seconds": 3.164988041, + "driver_seconds": 3.165269833, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 579.6454462089996, + "offset_end": 589.2137428749993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2617, + "stderr_bytes_observed": 0, + "external_seconds": 9.568209207999644, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.556836875, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000144542, + "solve_seconds": 9.556836875, + "backend_solve_seconds": 9.556834083, + "driver_seconds": 9.5570035, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 589.6131358749999, + "offset_end": 599.6265923749997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2614, + "stderr_bytes_observed": 0, + "external_seconds": 10.013323541999853, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000389375, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000271417, + "solve_seconds": 10.000389375, + "backend_solve_seconds": 10.000385916, + "driver_seconds": 10.000682792, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-16-single", + "category": "native_tsp", + "size": 16, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 600.0206158749997, + "offset_end": 600.0895129589999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2598, + "stderr_bytes_observed": 0, + "external_seconds": 0.06849058300031174, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.054756542, + "objective": 436, + "best_bound": 436, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 50, + "model_columns": 32, + "model_rows": 0, + "model_globals": 17, + "objective": 436, + "best_bound": 436, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000227, + "solve_seconds": 0.054756542, + "backend_solve_seconds": 0.054752583, + "driver_seconds": 0.055006166, + "assignment": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8 + ], + "full_values": [ + 12, + 15, + 14, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 47, + 41, + 51, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-32-single", + "category": "native_tsp", + "size": 32, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 600.4914829589998, + "offset_end": 610.5036264999999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2695, + "stderr_bytes_observed": 0, + "external_seconds": 10.012030792000587, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000421916, + "objective": 624, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 98, + "model_columns": 64, + "model_rows": 0, + "model_globals": 33, + "objective": 624, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000447583, + "solve_seconds": 10.000421916, + "backend_solve_seconds": 10.00041675, + "driver_seconds": 10.000890625, + "assignment": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7 + ], + "full_values": [ + 25, + 31, + 29, + 11, + 3, + 15, + 18, + 10, + 1, + 4, + 14, + 13, + 20, + 5, + 17, + 8, + 19, + 27, + 21, + 0, + 6, + 28, + 23, + 30, + 2, + 22, + 16, + 24, + 26, + 12, + 9, + 7, + 16, + 41, + 11, + 20, + 10, + 25, + 14, + 20, + 38, + 5, + 12, + 12, + 19, + 21, + 11, + 14, + 16, + 7, + 26, + 25, + 8, + 7, + 23, + 6, + 13, + 8, + 23, + 41, + 35, + 41, + 31, + 25 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-24-single", + "category": "native_tsp", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 610.9009214170001, + "offset_end": 620.915615334, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2620, + "stderr_bytes_observed": 0, + "external_seconds": 10.014287334000073, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000351958, + "objective": 518, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 74, + "model_columns": 48, + "model_rows": 0, + "model_globals": 25, + "objective": 518, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000316208, + "solve_seconds": 10.000351958, + "backend_solve_seconds": 10.000348917, + "driver_seconds": 10.00068775, + "assignment": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9 + ], + "full_values": [ + 22, + 17, + 6, + 11, + 3, + 8, + 20, + 10, + 15, + 4, + 14, + 13, + 16, + 5, + 2, + 1, + 19, + 7, + 21, + 0, + 18, + 12, + 23, + 9, + 21, + 21, + 28, + 20, + 10, + 18, + 8, + 20, + 14, + 5, + 12, + 12, + 24, + 21, + 51, + 41, + 16, + 35, + 26, + 25, + 7, + 24, + 23, + 36 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 621.3100991669999, + "offset_end": 624.4842470419999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2610, + "stderr_bytes_observed": 0, + "external_seconds": 3.173580416999357, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.158837958, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000273167, + "solve_seconds": 3.158837958, + "backend_solve_seconds": 3.158835125, + "driver_seconds": 3.15913425, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 624.8883437919994, + "offset_end": 634.9005895419996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2602, + "stderr_bytes_observed": 0, + "external_seconds": 10.011909000000742, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000390583, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000375334, + "solve_seconds": 10.000390583, + "backend_solve_seconds": 10.00038725, + "driver_seconds": 10.000786709, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 635.2978738749998, + "offset_end": 644.8047831669992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2635, + "stderr_bytes_observed": 0, + "external_seconds": 9.506739375000507, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.492514541, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000275, + "solve_seconds": 9.492514541, + "backend_solve_seconds": 9.49251025, + "driver_seconds": 9.492818833, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-20-single", + "category": "native_tsp", + "size": 20, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 645.2071765000001, + "offset_end": 648.3810319999993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2621, + "stderr_bytes_observed": 0, + "external_seconds": 3.173684292000871, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.162010375, + "objective": 476, + "best_bound": 476, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 62, + "model_columns": 40, + "model_rows": 0, + "model_globals": 21, + "objective": 476, + "best_bound": 476, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00013075, + "solve_seconds": 3.162010375, + "backend_solve_seconds": 3.162007834, + "driver_seconds": 3.162162125, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 18, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 25, + 41, + 51, + 10, + 5, + 21, + 14, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-21-single", + "category": "native_tsp", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 648.7908420419999, + "offset_end": 658.3032254169993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2624, + "stderr_bytes_observed": 0, + "external_seconds": 9.512189459000183, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 9.499514375, + "objective": 477, + "best_bound": 477, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 65, + "model_columns": 42, + "model_rows": 0, + "model_globals": 22, + "objective": 477, + "best_bound": 477, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000153375, + "solve_seconds": 9.499514375, + "backend_solve_seconds": 9.499511208, + "driver_seconds": 9.499694583, + "assignment": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18 + ], + "full_values": [ + 19, + 15, + 14, + 4, + 9, + 13, + 20, + 17, + 5, + 0, + 7, + 3, + 6, + 11, + 10, + 8, + 12, + 1, + 2, + 16, + 18, + 25, + 41, + 51, + 10, + 5, + 21, + 8, + 35, + 18, + 66, + 20, + 20, + 20, + 12, + 12, + 14, + 24, + 21, + 31, + 16, + 7 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "native_tsp-22-single", + "category": "native_tsp", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 658.6973629999993, + "offset_end": 668.7106899589999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2594, + "stderr_bytes_observed": 0, + "external_seconds": 10.013176667000153, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000138042, + "objective": 506, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 68, + "model_columns": 44, + "model_rows": 0, + "model_globals": 23, + "objective": 506, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000146, + "solve_seconds": 10.000138042, + "backend_solve_seconds": 10.0001355, + "driver_seconds": 10.00030725, + "assignment": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18 + ], + "full_values": [ + 19, + 15, + 17, + 4, + 9, + 13, + 2, + 1, + 5, + 0, + 7, + 3, + 21, + 11, + 10, + 8, + 12, + 14, + 20, + 16, + 6, + 18, + 25, + 41, + 47, + 10, + 5, + 21, + 28, + 51, + 18, + 66, + 20, + 20, + 24, + 12, + 12, + 14, + 24, + 11, + 7, + 16, + 8, + 26 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 669.7779252499995, + "offset_end": 669.7944345420001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2622, + "stderr_bytes_observed": 0, + "external_seconds": 0.01638849999926606, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004132917, + "objective": 98, + "best_bound": 98, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.2333e-05, + "solve_seconds": 0.004132917, + "backend_solve_seconds": 0.004130667, + "driver_seconds": 0.004241291, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 670.3360881669996, + "offset_end": 680.3491482089994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2761, + "stderr_bytes_observed": 0, + "external_seconds": 10.01295595800002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000142458, + "objective": 167, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 167, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000151375, + "solve_seconds": 10.000142458, + "backend_solve_seconds": 10.00013975, + "driver_seconds": 10.000312583, + "assignment": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4 + ], + "full_values": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4, + 16, + 16, + 7, + 5, + 23, + 19, + 8, + 2, + 12, + 4, + 20, + 10, + 24, + 12, + 17, + 3, + 10, + -6, + 9, + -9, + 13, + -7, + 22, + 0, + 31, + 7, + 35, + 9, + 15, + -13, + 28, + -2, + 33, + 1, + 40, + 6, + 32, + -4, + 26, + -12, + 29, + -11, + 41, + -1, + 34, + -10, + 27, + -19, + 1, + 4, + 2, + 3, + 1, + 5, + 12, + 7, + 2, + 2, + 7, + 10, + 9, + 9, + 2, + 9, + 23, + 6, + 14, + 4, + 1, + 9, + 13, + 12 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 680.8872772919995, + "offset_end": 681.556847584, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2700, + "stderr_bytes_observed": 0, + "external_seconds": 0.6691820830001234, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.656011041, + "objective": 121, + "best_bound": 121, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 130, + "model_columns": 72, + "model_rows": 36, + "model_globals": 21, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000113667, + "solve_seconds": 0.656011041, + "backend_solve_seconds": 0.656008042, + "driver_seconds": 0.656148167, + "assignment": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3 + ], + "full_values": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3, + 16, + 16, + 5, + 3, + 12, + 8, + 8, + 2, + 17, + 9, + 14, + 4, + 13, + 1, + 21, + 7, + 10, + -6, + 9, + -9, + 25, + 5, + 28, + 6, + 23, + -1, + 19, + -7, + 15, + -13, + 27, + -3, + 24, + -8, + 20, + -14, + 1, + 11, + 14, + 3, + 11, + 1, + 4, + 12, + 2, + 2, + 2, + 18, + 12, + 7, + 2, + 3, + 10, + 6 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 682.0951257919996, + "offset_end": 688.2591887499993, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2746, + "stderr_bytes_observed": 0, + "external_seconds": 6.163893958999324, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.150616792, + "objective": 128, + "best_bound": 128, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 151, + "model_columns": 84, + "model_rows": 42, + "model_globals": 24, + "objective": 128, + "best_bound": 128, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000128459, + "solve_seconds": 6.150616792, + "backend_solve_seconds": 6.150610916, + "driver_seconds": 6.150767625, + "assignment": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6 + ], + "full_values": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6, + 8, + 8, + 17, + 15, + 7, + 3, + 18, + 12, + 24, + 16, + 14, + 4, + 13, + 1, + 11, + -3, + 25, + 9, + 9, + -9, + 12, + -8, + 22, + 0, + 31, + 7, + 16, + -10, + 15, + -13, + 28, + -2, + 34, + 2, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 4, + 9, + 6, + 10, + 12, + 1, + 4, + 5, + 6, + 2, + 1, + 10, + 9, + 9, + 2, + 9, + 9, + 5, + 1, + 11, + 3 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 688.7999719999998, + "offset_end": 695.466462417, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2760, + "stderr_bytes_observed": 0, + "external_seconds": 6.666370375000042, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.653586792, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00014425, + "solve_seconds": 6.653586792, + "backend_solve_seconds": 6.65358375, + "driver_seconds": 6.653752292, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "before", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 696.0049818339994, + "offset_end": 704.8487411249998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2778, + "stderr_bytes_observed": 0, + "external_seconds": 8.843639917000473, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.830469917, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000177625, + "solve_seconds": 8.830469917, + "backend_solve_seconds": 8.83046675, + "driver_seconds": 8.830673417, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 705.2539325839998, + "offset_end": 711.9100765839994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2742, + "stderr_bytes_observed": 0, + "external_seconds": 6.655992541999694, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.641742833, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000186916, + "solve_seconds": 6.641742833, + "backend_solve_seconds": 6.641739666, + "driver_seconds": 6.641950875, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 712.3268889999999, + "offset_end": 721.1894545839996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2778, + "stderr_bytes_observed": 0, + "external_seconds": 8.862453833000473, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.84666375, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000205125, + "solve_seconds": 8.84666375, + "backend_solve_seconds": 8.846659916, + "driver_seconds": 8.84689675, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "before", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 721.5969628339999, + "offset_end": 731.6099408339996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2749, + "stderr_bytes_observed": 0, + "external_seconds": 10.012876333999884, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000267375, + "objective": 167, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 167, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000301834, + "solve_seconds": 10.000267375, + "backend_solve_seconds": 10.000264208, + "driver_seconds": 10.000592584, + "assignment": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4 + ], + "full_values": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4, + 16, + 16, + 7, + 5, + 23, + 19, + 8, + 2, + 12, + 4, + 20, + 10, + 24, + 12, + 17, + 3, + 10, + -6, + 9, + -9, + 13, + -7, + 22, + 0, + 31, + 7, + 35, + 9, + 15, + -13, + 28, + -2, + 33, + 1, + 40, + 6, + 32, + -4, + 26, + -12, + 29, + -11, + 41, + -1, + 34, + -10, + 27, + -19, + 1, + 4, + 2, + 3, + 1, + 5, + 12, + 7, + 2, + 2, + 7, + 10, + 9, + 9, + 2, + 9, + 23, + 6, + 14, + 4, + 1, + 9, + 13, + 12 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-12-single", + "category": "weighted_queens", + "size": 12, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 732.0116718749996, + "offset_end": 732.0294986669996, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2622, + "stderr_bytes_observed": 0, + "external_seconds": 0.01767266600018047, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.004807667, + "objective": 98, + "best_bound": 98, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 98, + "best_bound": 98, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000240209, + "solve_seconds": 0.004807667, + "backend_solve_seconds": 0.00480525, + "driver_seconds": 0.005073917, + "assignment": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7 + ], + "full_values": [ + 0, + 6, + 1, + 5, + 8, + 11, + 9, + 4, + 2, + 10, + 3, + 7, + 0, + 0, + 7, + 5, + 3, + -1, + 8, + 2, + 12, + 4, + 16, + 6, + 15, + 3, + 11, + -3, + 10, + -6, + 19, + 1, + 13, + -7, + 18, + -4, + 7, + 4, + 8, + 3, + 1, + 9, + 19, + 5, + 2, + 20, + 7, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 732.4366827919994, + "offset_end": 742.4482506669992, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2738, + "stderr_bytes_observed": 0, + "external_seconds": 10.01120154199998, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000371333, + "objective": 167, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 167, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000170917, + "solve_seconds": 10.000371333, + "backend_solve_seconds": 10.000367958, + "driver_seconds": 10.000560958, + "assignment": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4 + ], + "full_values": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4, + 16, + 16, + 7, + 5, + 23, + 19, + 8, + 2, + 12, + 4, + 20, + 10, + 24, + 12, + 17, + 3, + 10, + -6, + 9, + -9, + 13, + -7, + 22, + 0, + 31, + 7, + 35, + 9, + 15, + -13, + 28, + -2, + 33, + 1, + 40, + 6, + 32, + -4, + 26, + -12, + 29, + -11, + 41, + -1, + 34, + -10, + 27, + -19, + 1, + 4, + 2, + 3, + 1, + 5, + 12, + 7, + 2, + 2, + 7, + 10, + 9, + 9, + 2, + 9, + 23, + 6, + 14, + 4, + 1, + 9, + 13, + 12 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-18-single", + "category": "weighted_queens", + "size": 18, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 742.8531837089995, + "offset_end": 743.521367667, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2708, + "stderr_bytes_observed": 0, + "external_seconds": 0.6680794579997382, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.654761291, + "objective": 121, + "best_bound": 121, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 130, + "model_columns": 72, + "model_rows": 36, + "model_globals": 21, + "objective": 121, + "best_bound": 121, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000281958, + "solve_seconds": 0.654761291, + "backend_solve_seconds": 0.654757917, + "driver_seconds": 0.655063875, + "assignment": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3 + ], + "full_values": [ + 16, + 4, + 10, + 5, + 13, + 9, + 7, + 14, + 2, + 0, + 15, + 17, + 11, + 6, + 1, + 12, + 8, + 3, + 16, + 16, + 5, + 3, + 12, + 8, + 8, + 2, + 17, + 9, + 14, + 4, + 13, + 1, + 21, + 7, + 10, + -6, + 9, + -9, + 25, + 5, + 28, + 6, + 23, + -1, + 19, + -7, + 15, + -13, + 27, + -3, + 24, + -8, + 20, + -14, + 1, + 11, + 14, + 3, + 11, + 1, + 4, + 12, + 2, + 2, + 2, + 18, + 12, + 7, + 2, + 3, + 10, + 6 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-21-single", + "category": "weighted_queens", + "size": 21, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 743.9364761669995, + "offset_end": 750.11368425, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2739, + "stderr_bytes_observed": 0, + "external_seconds": 6.177090041999691, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.1654135, + "objective": 128, + "best_bound": 128, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 151, + "model_columns": 84, + "model_rows": 42, + "model_globals": 24, + "objective": 128, + "best_bound": 128, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000422125, + "solve_seconds": 6.1654135, + "backend_solve_seconds": 6.165410541, + "driver_seconds": 6.165861458, + "assignment": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6 + ], + "full_values": [ + 8, + 16, + 5, + 15, + 20, + 9, + 7, + 4, + 17, + 0, + 2, + 11, + 19, + 3, + 1, + 13, + 18, + 10, + 12, + 14, + 6, + 8, + 8, + 17, + 15, + 7, + 3, + 18, + 12, + 24, + 16, + 14, + 4, + 13, + 1, + 11, + -3, + 25, + 9, + 9, + -9, + 12, + -8, + 22, + 0, + 31, + 7, + 16, + -10, + 15, + -13, + 28, + -2, + 34, + 2, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 4, + 9, + 6, + 10, + 12, + 1, + 4, + 5, + 6, + 2, + 1, + 10, + 9, + 9, + 2, + 9, + 9, + 5, + 1, + 11, + 3 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 750.5216157089999, + "offset_end": 757.1803799999998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2748, + "stderr_bytes_observed": 0, + "external_seconds": 6.658633666999776, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.644579, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00031325, + "solve_seconds": 6.644579, + "backend_solve_seconds": 6.644576, + "driver_seconds": 6.644913708, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "after", + "repetition": 1, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 757.5881915, + "offset_end": 766.4153592499997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2767, + "stderr_bytes_observed": 0, + "external_seconds": 8.826751292000154, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.815511, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000392125, + "solve_seconds": 8.815511, + "backend_solve_seconds": 8.815507417, + "driver_seconds": 8.815924625, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-22-single", + "category": "weighted_queens", + "size": 22, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 766.8293310419995, + "offset_end": 773.5085724169994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2741, + "stderr_bytes_observed": 0, + "external_seconds": 6.679115416999593, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 6.66508375, + "objective": 134, + "best_bound": 134, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 158, + "model_columns": 88, + "model_rows": 44, + "model_globals": 25, + "objective": 134, + "best_bound": 134, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000170333, + "solve_seconds": 6.66508375, + "backend_solve_seconds": 6.665079333, + "driver_seconds": 6.665275041, + "assignment": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20 + ], + "full_values": [ + 11, + 4, + 18, + 5, + 8, + 2, + 7, + 17, + 21, + 0, + 15, + 3, + 19, + 9, + 1, + 13, + 16, + 10, + 12, + 14, + 6, + 20, + 11, + 11, + 5, + 3, + 20, + 16, + 8, + 2, + 12, + 4, + 7, + -3, + 13, + 1, + 24, + 10, + 29, + 13, + 9, + -9, + 25, + 5, + 14, + -8, + 31, + 7, + 22, + -4, + 15, + -13, + 28, + -2, + 32, + 0, + 27, + -7, + 30, + -6, + 33, + -5, + 26, + -14, + 41, + -1, + 14, + 11, + 2, + 3, + 1, + 4, + 4, + 7, + 6, + 2, + 2, + 4, + 9, + 14, + 2, + 9, + 11, + 5, + 1, + 11, + 3, + 9 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-23-single", + "category": "weighted_queens", + "size": 23, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 773.9196953339997, + "offset_end": 782.7985747089997, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2767, + "stderr_bytes_observed": 0, + "external_seconds": 8.8784501250002, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 8.865580333, + "objective": 132, + "best_bound": 132, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 165, + "model_columns": 92, + "model_rows": 46, + "model_globals": 26, + "objective": 132, + "best_bound": 132, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000166625, + "solve_seconds": 8.865580333, + "backend_solve_seconds": 8.865576875, + "driver_seconds": 8.865777708, + "assignment": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13 + ], + "full_values": [ + 16, + 6, + 21, + 15, + 4, + 9, + 7, + 17, + 2, + 22, + 19, + 0, + 10, + 20, + 1, + 12, + 18, + 3, + 14, + 11, + 8, + 5, + 13, + 16, + 16, + 7, + 5, + 23, + 19, + 18, + 12, + 8, + 0, + 14, + 4, + 13, + 1, + 24, + 10, + 10, + -6, + 31, + 13, + 29, + 9, + 11, + -11, + 22, + -2, + 33, + 7, + 15, + -13, + 27, + -3, + 34, + 2, + 20, + -14, + 32, + -4, + 30, + -8, + 28, + -12, + 26, + -16, + 35, + -9, + 1, + 4, + 2, + 10, + 12, + 1, + 4, + 7, + 2, + 9, + 3, + 1, + 3, + 4, + 2, + 3, + 9, + 6, + 14, + 8, + 8, + 6, + 13 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "weighted_queens-24-single", + "category": "weighted_queens", + "size": 24, + "variant": "single", + "cohort": "after", + "repetition": 2, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 783.2054537499998, + "offset_end": 793.2190031669998, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2741, + "stderr_bytes_observed": 0, + "external_seconds": 10.013098625000566, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000393416, + "objective": 167, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 172, + "model_columns": 96, + "model_rows": 48, + "model_globals": 27, + "objective": 167, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000298209, + "solve_seconds": 10.000393416, + "backend_solve_seconds": 10.0003905, + "driver_seconds": 10.000713334, + "assignment": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4 + ], + "full_values": [ + 16, + 6, + 21, + 5, + 8, + 15, + 18, + 10, + 2, + 0, + 3, + 11, + 19, + 22, + 1, + 13, + 17, + 23, + 14, + 7, + 9, + 20, + 12, + 4, + 16, + 16, + 7, + 5, + 23, + 19, + 8, + 2, + 12, + 4, + 20, + 10, + 24, + 12, + 17, + 3, + 10, + -6, + 9, + -9, + 13, + -7, + 22, + 0, + 31, + 7, + 35, + 9, + 15, + -13, + 28, + -2, + 33, + 1, + 40, + 6, + 32, + -4, + 26, + -12, + 29, + -11, + 41, + -1, + 34, + -10, + 27, + -19, + 1, + 4, + 2, + 3, + 1, + 5, + 12, + 7, + 2, + 2, + 7, + 10, + 9, + 9, + 2, + 9, + 23, + 6, + 14, + 4, + 1, + 9, + 13, + 12 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + } + ], + "decisions": [ + { + "category": "knapsack", + "size": 32, + "reason": "before starting size", + "repeats": 1, + "after_records": 2, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 64, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 4, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 128, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 6, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 256, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 8, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 512, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 10, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 384, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 12, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 448, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 14, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 416, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 16, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 400, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 18, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 408, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 20, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 404, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 22, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 406, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 24, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 407, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 26, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 406, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 28, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 407, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 30, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 408, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 32, + "cohorts": [ + "before" + ] + }, + { + "category": "knapsack", + "size": 32, + "reason": "after starting size", + "repeats": 1, + "after_records": 34, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 64, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 36, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 128, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 38, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 256, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 40, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 512, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 42, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 511, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 44, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 512, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 48, + "cohorts": [ + "after" + ] + }, + { + "category": "knapsack", + "size": 32, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 50, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 64, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 50, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 128, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 50, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 256, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 50, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 384, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 50, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 400, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 52, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 404, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 54, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 406, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 56, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 407, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 58, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "knapsack", + "size": 408, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 60, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 62, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 63, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 64, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 65, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 66, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 67, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 68, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 69, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 70, + "cohorts": [ + "before" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 71, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 72, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 73, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 28, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 74, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 30, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 75, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 31, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 76, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 30, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 77, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 31, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 78, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 32, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 79, + "cohorts": [ + "after" + ] + }, + { + "category": "assignment", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 80, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 17, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 80, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "assignment", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 81, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "before starting size", + "repeats": 1, + "after_records": 82, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 16, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 83, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 12, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 84, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 10, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 85, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 86, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 7, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 87, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 89, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 90, + "cohorts": [ + "before" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "after starting size", + "repeats": 1, + "after_records": 91, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 16, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 92, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 15, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 93, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 16, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 95, + "cohorts": [ + "after" + ] + }, + { + "category": "facility_location", + "size": 7, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 96, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 8, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 97, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "facility_location", + "size": 9, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 97, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 98, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 99, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 100, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 101, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 102, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 103, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 104, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 105, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 106, + "cohorts": [ + "before" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 107, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 108, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 109, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 28, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 110, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 30, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 111, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 31, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 112, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 29, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 113, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 30, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 115, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 31, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 116, + "cohorts": [ + "after" + ] + }, + { + "category": "bin_packing", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 117, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 17, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 117, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "bin_packing", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 118, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 6, + "reason": "before starting size", + "repeats": 1, + "after_records": 119, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 12, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 120, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 9, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 121, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 10, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 122, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 11, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 123, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 10, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 124, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 11, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 125, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 12, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 126, + "cohorts": [ + "before" + ] + }, + { + "category": "production", + "size": 6, + "reason": "after starting size", + "repeats": 1, + "after_records": 127, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 12, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 128, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 24, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 129, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 48, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 130, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 36, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 131, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 30, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 132, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 27, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 133, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 28, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 134, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 29, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 135, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 27, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 136, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 28, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 137, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 29, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 138, + "cohorts": [ + "after" + ] + }, + { + "category": "production", + "size": 6, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 139, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 9, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 139, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 10, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 140, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 11, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 141, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "production", + "size": 12, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 142, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "before starting size", + "repeats": 1, + "after_records": 142, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 32, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 143, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 24, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 144, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 145, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 146, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 147, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 148, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 149, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 150, + "cohorts": [ + "before" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "after starting size", + "repeats": 1, + "after_records": 151, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 32, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 152, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 24, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 153, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 154, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 155, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 156, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 157, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 158, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 159, + "cohorts": [ + "after" + ] + }, + { + "category": "native_tsp", + "size": 16, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 20, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 21, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "native_tsp", + "size": 22, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "before starting size", + "repeats": 1, + "after_records": 160, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "before exponential bracket", + "repeats": 1, + "after_records": 161, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 162, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 163, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 164, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "before integer bisection", + "repeats": 1, + "after_records": 165, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 166, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 167, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "before boundary confirmation", + "repeats": 2, + "after_records": 168, + "cohorts": [ + "before" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "after starting size", + "repeats": 1, + "after_records": 169, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "after exponential bracket", + "repeats": 1, + "after_records": 170, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 171, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 172, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 173, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "after integer bisection", + "repeats": 1, + "after_records": 174, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 175, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 176, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "after boundary confirmation", + "repeats": 2, + "after_records": 177, + "cohorts": [ + "after" + ] + }, + { + "category": "weighted_queens", + "size": 12, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 18, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 21, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 22, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 23, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + }, + { + "category": "weighted_queens", + "size": 24, + "reason": "shared timing point within smaller boundary", + "repeats": 1, + "after_records": 178, + "cohorts": [ + "before", + "after" + ] + } + ] + }, + "pilot": { + "protocol": { + "seconds": 10, + "capture_seconds": 11, + "whole_seconds": 2400, + "max_attempts": 480, + "max_sizes_per_category": 32, + "limits": { + "knapsack": [ + 8, + 32, + 512 + ], + "assignment": [ + 3, + 16, + 32 + ], + "facility_location": [ + 2, + 8, + 16 + ], + "bin_packing": [ + 4, + 16, + 32 + ], + "production": [ + 3, + 6, + 48 + ], + "native_tsp": [ + 4, + 16, + 96 + ], + "weighted_queens": [ + 4, + 12, + 32 + ] + }, + "pilot": true, + "pilot_cases": [ + [ + "assignment", + 18 + ], + [ + "facility_location", + 9 + ], + [ + "bin_packing", + 18 + ], + [ + "production", + 12 + ], + [ + "knapsack", + 408 + ] + ], + "candidate_routes": [ + "native", + "lp-root", + "lp-cuts", + "lp-updated", + "dfs-reliability", + "lp-reliability", + "lp-reliability-neighborhood" + ], + "policy": null, + "cohort_labels": { + "before": "Previous settings", + "after": "Configured" + }, + "selection": "Pilot is exploratory and preserves every candidate. Adaptive policy is fixed before timing; independent doubling/bisection and adjacent two-repeat confirmation.", + "optimality": "Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.", + "capacity": "Largest sampled size with all variants passing both repetitions. Untested sizes remain unknown.", + "timing": "Steady-clock wall time around the entire owning solve call; ten seconds per solve. No supplied starts.", + "generalization": "Policy selection and adaptive measurement reuse seeded families; this is not an independent holdout." + }, + "provenance": { + "source_head": "f738271f178a1f3b0b33034f849a3a1da081e990", + "sources": { + "experiments/optimize/benchmark_configured.py": "aef5f4e10ed667381bab3edba42fdf1d691260a777d751fb8fe794de67cae49c", + "experiments/optimize/configured_benchmark.cpp": "a1d2207ab84955d84e8fee90972a6baf6dd371b93256767a4cc97308fc930229", + "experiments/optimize/build_configured_benchmark.py": "722c04a8ff1e3804b90cac3caacb9fdd12cd900f7297abccf2c78795ecf14ea4", + "build/configured-bench/build.local.json": "28fea13fd66d92bbf10465eb72c5a2a67922322e3565358206969637482a2fe0", + "experiments/optimize/benchmark_boundaries.py": "fe6cae5ba528a8d11072d7fffc72e0b0041590d8eb8cb8d7fe16603d78d7af5a", + "experiments/optimize/boundary_instances.py": "e1a7ec77414b1f6902c6d4dd255acf400cd7cccc491ad3519a6642a73a990561", + "experiments/optimize/category_instances.py": "277dabb3a21f0aa75cd3d07ebd2eb7dc3c96c96eda32aed794b33607571080c0", + "experiments/optimize/scaling_instances.py": "e3d6fd5c90d8a0884da3237ac384623fed29d57cd2a61d6b0ebbf0f0a0f82ff0", + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "runtime_sources": { + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b", + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505" + }, + "driver_sha256": "2d2df4b80262962bd596be55c3b8a0a0f0a4a967fe3f21f9a68d0b343666270b", + "expected_libraries": { + "before": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 790, + "stderr_bytes_observed": 98182, + "external_seconds": 0.11836354155093431, + "started_utc": "2026-09-06T04:39:57.671091+00:00", + "invocation_offset_start_seconds": 0.4138679997995496, + "invocation_offset_end_seconds": 0.5327559169381857, + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr", + "command": [ + "BINARY", + "--input", + "models/capacity_uncorrelated_sanity_8.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "10" + ] + } + } + }, + "driver_build": { + "source_sha256": "a1d2207ab84955d84e8fee90972a6baf6dd371b93256767a4cc97308fc930229", + "binary_sha256": "2d2df4b80262962bd596be55c3b8a0a0f0a4a967fe3f21f9a68d0b343666270b", + "compiler_flags_sha256": "91b7101668f12e009f893c9910e7e22e155f6c21905de9ae73ded7c656af6178", + "link_metadata_sha256": "8f2472c3651f9a6ded2526fc9b5f015b572336310a0f82c9f2887c725aad246c" + }, + "comparison": "Same accepted current solver libraries; ordinary settings versus selected explicit settings.", + "before_loaded": [ + [ + "libgecodeint.6.4.0.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.6.4.0.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + ], + [ + "libgecodesearch.6.4.0.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.6.4.0.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "after_loaded": [ + [ + "libgecodeint.6.4.0.dylib", + "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + ], + [ + "libgecodekernel.6.4.0.dylib", + "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + ], + [ + "libgecodeoptimize.dylib", + "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + ], + [ + "libgecodesearch.6.4.0.dylib", + "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + ], + [ + "libgecodesupport.6.4.0.dylib", + "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + ] + ], + "integrity": { + "sources_unchanged": true, + "runtime_sources_unchanged": true, + "driver_unchanged": true, + "models_unchanged": true, + "libraries_unchanged": true + } + }, + "started_utc": null, + "elapsed_seconds": 181.3339944170002, + "complete": true, + "models": [ + { + "id": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_8", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 8, + "natural_size": 8, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 8, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26 + ], + "rows": [ + { + "b": -48, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26 + ], + "capacities": [ + 48 + ], + "capacity": 48, + "table_cells": 441, + "dp_eligible": true, + "dp_eligibility_reason": "eligible" + }, + "dimensions": { + "input_variables": 8, + "variables": 8, + "rows": 1, + "nonzeros": 8, + "globals": 0 + }, + "input_variables": 8, + "model_variables": 8, + "modelled_variables": 8, + "size_unit": "items" + }, + "json_sha256": "0fa6b80ec5f7fba53d7b94a6f7498c8faf91295bc00c57057d71fab478bee544", + "txt_sha256": "ea9569a056bb6fad19798ad3bb6a18ea93003f9cff5ea6106c2ea429237949bb" + }, + { + "id": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "model": { + "id": "assignment_single_18", + "category": "assignment", + "family": "assignment", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260908, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 324, + "c": [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70, + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36, + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29, + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82, + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59, + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70, + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30, + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95, + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89, + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12, + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61, + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55, + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93, + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42, + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76, + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68, + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33, + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ], + "rows": [ + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ], + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ], + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ], + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ], + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ], + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ], + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ], + [ + 171, + 1 + ], + [ + 172, + 1 + ], + [ + 173, + 1 + ], + [ + 174, + 1 + ], + [ + 175, + 1 + ], + [ + 176, + 1 + ], + [ + 177, + 1 + ], + [ + 178, + 1 + ], + [ + 179, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ], + [ + 171, + -1 + ], + [ + 172, + -1 + ], + [ + 173, + -1 + ], + [ + 174, + -1 + ], + [ + 175, + -1 + ], + [ + 176, + -1 + ], + [ + 177, + -1 + ], + [ + 178, + -1 + ], + [ + 179, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 180, + 1 + ], + [ + 181, + 1 + ], + [ + 182, + 1 + ], + [ + 183, + 1 + ], + [ + 184, + 1 + ], + [ + 185, + 1 + ], + [ + 186, + 1 + ], + [ + 187, + 1 + ], + [ + 188, + 1 + ], + [ + 189, + 1 + ], + [ + 190, + 1 + ], + [ + 191, + 1 + ], + [ + 192, + 1 + ], + [ + 193, + 1 + ], + [ + 194, + 1 + ], + [ + 195, + 1 + ], + [ + 196, + 1 + ], + [ + 197, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 180, + -1 + ], + [ + 181, + -1 + ], + [ + 182, + -1 + ], + [ + 183, + -1 + ], + [ + 184, + -1 + ], + [ + 185, + -1 + ], + [ + 186, + -1 + ], + [ + 187, + -1 + ], + [ + 188, + -1 + ], + [ + 189, + -1 + ], + [ + 190, + -1 + ], + [ + 191, + -1 + ], + [ + 192, + -1 + ], + [ + 193, + -1 + ], + [ + 194, + -1 + ], + [ + 195, + -1 + ], + [ + 196, + -1 + ], + [ + 197, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 198, + 1 + ], + [ + 199, + 1 + ], + [ + 200, + 1 + ], + [ + 201, + 1 + ], + [ + 202, + 1 + ], + [ + 203, + 1 + ], + [ + 204, + 1 + ], + [ + 205, + 1 + ], + [ + 206, + 1 + ], + [ + 207, + 1 + ], + [ + 208, + 1 + ], + [ + 209, + 1 + ], + [ + 210, + 1 + ], + [ + 211, + 1 + ], + [ + 212, + 1 + ], + [ + 213, + 1 + ], + [ + 214, + 1 + ], + [ + 215, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 198, + -1 + ], + [ + 199, + -1 + ], + [ + 200, + -1 + ], + [ + 201, + -1 + ], + [ + 202, + -1 + ], + [ + 203, + -1 + ], + [ + 204, + -1 + ], + [ + 205, + -1 + ], + [ + 206, + -1 + ], + [ + 207, + -1 + ], + [ + 208, + -1 + ], + [ + 209, + -1 + ], + [ + 210, + -1 + ], + [ + 211, + -1 + ], + [ + 212, + -1 + ], + [ + 213, + -1 + ], + [ + 214, + -1 + ], + [ + 215, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 216, + 1 + ], + [ + 217, + 1 + ], + [ + 218, + 1 + ], + [ + 219, + 1 + ], + [ + 220, + 1 + ], + [ + 221, + 1 + ], + [ + 222, + 1 + ], + [ + 223, + 1 + ], + [ + 224, + 1 + ], + [ + 225, + 1 + ], + [ + 226, + 1 + ], + [ + 227, + 1 + ], + [ + 228, + 1 + ], + [ + 229, + 1 + ], + [ + 230, + 1 + ], + [ + 231, + 1 + ], + [ + 232, + 1 + ], + [ + 233, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 216, + -1 + ], + [ + 217, + -1 + ], + [ + 218, + -1 + ], + [ + 219, + -1 + ], + [ + 220, + -1 + ], + [ + 221, + -1 + ], + [ + 222, + -1 + ], + [ + 223, + -1 + ], + [ + 224, + -1 + ], + [ + 225, + -1 + ], + [ + 226, + -1 + ], + [ + 227, + -1 + ], + [ + 228, + -1 + ], + [ + 229, + -1 + ], + [ + 230, + -1 + ], + [ + 231, + -1 + ], + [ + 232, + -1 + ], + [ + 233, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 234, + 1 + ], + [ + 235, + 1 + ], + [ + 236, + 1 + ], + [ + 237, + 1 + ], + [ + 238, + 1 + ], + [ + 239, + 1 + ], + [ + 240, + 1 + ], + [ + 241, + 1 + ], + [ + 242, + 1 + ], + [ + 243, + 1 + ], + [ + 244, + 1 + ], + [ + 245, + 1 + ], + [ + 246, + 1 + ], + [ + 247, + 1 + ], + [ + 248, + 1 + ], + [ + 249, + 1 + ], + [ + 250, + 1 + ], + [ + 251, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 234, + -1 + ], + [ + 235, + -1 + ], + [ + 236, + -1 + ], + [ + 237, + -1 + ], + [ + 238, + -1 + ], + [ + 239, + -1 + ], + [ + 240, + -1 + ], + [ + 241, + -1 + ], + [ + 242, + -1 + ], + [ + 243, + -1 + ], + [ + 244, + -1 + ], + [ + 245, + -1 + ], + [ + 246, + -1 + ], + [ + 247, + -1 + ], + [ + 248, + -1 + ], + [ + 249, + -1 + ], + [ + 250, + -1 + ], + [ + 251, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 252, + 1 + ], + [ + 253, + 1 + ], + [ + 254, + 1 + ], + [ + 255, + 1 + ], + [ + 256, + 1 + ], + [ + 257, + 1 + ], + [ + 258, + 1 + ], + [ + 259, + 1 + ], + [ + 260, + 1 + ], + [ + 261, + 1 + ], + [ + 262, + 1 + ], + [ + 263, + 1 + ], + [ + 264, + 1 + ], + [ + 265, + 1 + ], + [ + 266, + 1 + ], + [ + 267, + 1 + ], + [ + 268, + 1 + ], + [ + 269, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 252, + -1 + ], + [ + 253, + -1 + ], + [ + 254, + -1 + ], + [ + 255, + -1 + ], + [ + 256, + -1 + ], + [ + 257, + -1 + ], + [ + 258, + -1 + ], + [ + 259, + -1 + ], + [ + 260, + -1 + ], + [ + 261, + -1 + ], + [ + 262, + -1 + ], + [ + 263, + -1 + ], + [ + 264, + -1 + ], + [ + 265, + -1 + ], + [ + 266, + -1 + ], + [ + 267, + -1 + ], + [ + 268, + -1 + ], + [ + 269, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 270, + 1 + ], + [ + 271, + 1 + ], + [ + 272, + 1 + ], + [ + 273, + 1 + ], + [ + 274, + 1 + ], + [ + 275, + 1 + ], + [ + 276, + 1 + ], + [ + 277, + 1 + ], + [ + 278, + 1 + ], + [ + 279, + 1 + ], + [ + 280, + 1 + ], + [ + 281, + 1 + ], + [ + 282, + 1 + ], + [ + 283, + 1 + ], + [ + 284, + 1 + ], + [ + 285, + 1 + ], + [ + 286, + 1 + ], + [ + 287, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 270, + -1 + ], + [ + 271, + -1 + ], + [ + 272, + -1 + ], + [ + 273, + -1 + ], + [ + 274, + -1 + ], + [ + 275, + -1 + ], + [ + 276, + -1 + ], + [ + 277, + -1 + ], + [ + 278, + -1 + ], + [ + 279, + -1 + ], + [ + 280, + -1 + ], + [ + 281, + -1 + ], + [ + 282, + -1 + ], + [ + 283, + -1 + ], + [ + 284, + -1 + ], + [ + 285, + -1 + ], + [ + 286, + -1 + ], + [ + 287, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 288, + 1 + ], + [ + 289, + 1 + ], + [ + 290, + 1 + ], + [ + 291, + 1 + ], + [ + 292, + 1 + ], + [ + 293, + 1 + ], + [ + 294, + 1 + ], + [ + 295, + 1 + ], + [ + 296, + 1 + ], + [ + 297, + 1 + ], + [ + 298, + 1 + ], + [ + 299, + 1 + ], + [ + 300, + 1 + ], + [ + 301, + 1 + ], + [ + 302, + 1 + ], + [ + 303, + 1 + ], + [ + 304, + 1 + ], + [ + 305, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 288, + -1 + ], + [ + 289, + -1 + ], + [ + 290, + -1 + ], + [ + 291, + -1 + ], + [ + 292, + -1 + ], + [ + 293, + -1 + ], + [ + 294, + -1 + ], + [ + 295, + -1 + ], + [ + 296, + -1 + ], + [ + 297, + -1 + ], + [ + 298, + -1 + ], + [ + 299, + -1 + ], + [ + 300, + -1 + ], + [ + 301, + -1 + ], + [ + 302, + -1 + ], + [ + 303, + -1 + ], + [ + 304, + -1 + ], + [ + 305, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 306, + 1 + ], + [ + 307, + 1 + ], + [ + 308, + 1 + ], + [ + 309, + 1 + ], + [ + 310, + 1 + ], + [ + 311, + 1 + ], + [ + 312, + 1 + ], + [ + 313, + 1 + ], + [ + 314, + 1 + ], + [ + 315, + 1 + ], + [ + 316, + 1 + ], + [ + 317, + 1 + ], + [ + 318, + 1 + ], + [ + 319, + 1 + ], + [ + 320, + 1 + ], + [ + 321, + 1 + ], + [ + 322, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 306, + -1 + ], + [ + 307, + -1 + ], + [ + 308, + -1 + ], + [ + 309, + -1 + ], + [ + 310, + -1 + ], + [ + 311, + -1 + ], + [ + 312, + -1 + ], + [ + 313, + -1 + ], + [ + 314, + -1 + ], + [ + 315, + -1 + ], + [ + 316, + -1 + ], + [ + 317, + -1 + ], + [ + 318, + -1 + ], + [ + 319, + -1 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -1 + ], + [ + 323, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 0, + 1 + ], + [ + 18, + 1 + ], + [ + 36, + 1 + ], + [ + 54, + 1 + ], + [ + 72, + 1 + ], + [ + 90, + 1 + ], + [ + 108, + 1 + ], + [ + 126, + 1 + ], + [ + 144, + 1 + ], + [ + 162, + 1 + ], + [ + 180, + 1 + ], + [ + 198, + 1 + ], + [ + 216, + 1 + ], + [ + 234, + 1 + ], + [ + 252, + 1 + ], + [ + 270, + 1 + ], + [ + 288, + 1 + ], + [ + 306, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 0, + -1 + ], + [ + 18, + -1 + ], + [ + 36, + -1 + ], + [ + 54, + -1 + ], + [ + 72, + -1 + ], + [ + 90, + -1 + ], + [ + 108, + -1 + ], + [ + 126, + -1 + ], + [ + 144, + -1 + ], + [ + 162, + -1 + ], + [ + 180, + -1 + ], + [ + 198, + -1 + ], + [ + 216, + -1 + ], + [ + 234, + -1 + ], + [ + 252, + -1 + ], + [ + 270, + -1 + ], + [ + 288, + -1 + ], + [ + 306, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 1, + 1 + ], + [ + 19, + 1 + ], + [ + 37, + 1 + ], + [ + 55, + 1 + ], + [ + 73, + 1 + ], + [ + 91, + 1 + ], + [ + 109, + 1 + ], + [ + 127, + 1 + ], + [ + 145, + 1 + ], + [ + 163, + 1 + ], + [ + 181, + 1 + ], + [ + 199, + 1 + ], + [ + 217, + 1 + ], + [ + 235, + 1 + ], + [ + 253, + 1 + ], + [ + 271, + 1 + ], + [ + 289, + 1 + ], + [ + 307, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 1, + -1 + ], + [ + 19, + -1 + ], + [ + 37, + -1 + ], + [ + 55, + -1 + ], + [ + 73, + -1 + ], + [ + 91, + -1 + ], + [ + 109, + -1 + ], + [ + 127, + -1 + ], + [ + 145, + -1 + ], + [ + 163, + -1 + ], + [ + 181, + -1 + ], + [ + 199, + -1 + ], + [ + 217, + -1 + ], + [ + 235, + -1 + ], + [ + 253, + -1 + ], + [ + 271, + -1 + ], + [ + 289, + -1 + ], + [ + 307, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 2, + 1 + ], + [ + 20, + 1 + ], + [ + 38, + 1 + ], + [ + 56, + 1 + ], + [ + 74, + 1 + ], + [ + 92, + 1 + ], + [ + 110, + 1 + ], + [ + 128, + 1 + ], + [ + 146, + 1 + ], + [ + 164, + 1 + ], + [ + 182, + 1 + ], + [ + 200, + 1 + ], + [ + 218, + 1 + ], + [ + 236, + 1 + ], + [ + 254, + 1 + ], + [ + 272, + 1 + ], + [ + 290, + 1 + ], + [ + 308, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 2, + -1 + ], + [ + 20, + -1 + ], + [ + 38, + -1 + ], + [ + 56, + -1 + ], + [ + 74, + -1 + ], + [ + 92, + -1 + ], + [ + 110, + -1 + ], + [ + 128, + -1 + ], + [ + 146, + -1 + ], + [ + 164, + -1 + ], + [ + 182, + -1 + ], + [ + 200, + -1 + ], + [ + 218, + -1 + ], + [ + 236, + -1 + ], + [ + 254, + -1 + ], + [ + 272, + -1 + ], + [ + 290, + -1 + ], + [ + 308, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 3, + 1 + ], + [ + 21, + 1 + ], + [ + 39, + 1 + ], + [ + 57, + 1 + ], + [ + 75, + 1 + ], + [ + 93, + 1 + ], + [ + 111, + 1 + ], + [ + 129, + 1 + ], + [ + 147, + 1 + ], + [ + 165, + 1 + ], + [ + 183, + 1 + ], + [ + 201, + 1 + ], + [ + 219, + 1 + ], + [ + 237, + 1 + ], + [ + 255, + 1 + ], + [ + 273, + 1 + ], + [ + 291, + 1 + ], + [ + 309, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 3, + -1 + ], + [ + 21, + -1 + ], + [ + 39, + -1 + ], + [ + 57, + -1 + ], + [ + 75, + -1 + ], + [ + 93, + -1 + ], + [ + 111, + -1 + ], + [ + 129, + -1 + ], + [ + 147, + -1 + ], + [ + 165, + -1 + ], + [ + 183, + -1 + ], + [ + 201, + -1 + ], + [ + 219, + -1 + ], + [ + 237, + -1 + ], + [ + 255, + -1 + ], + [ + 273, + -1 + ], + [ + 291, + -1 + ], + [ + 309, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 4, + 1 + ], + [ + 22, + 1 + ], + [ + 40, + 1 + ], + [ + 58, + 1 + ], + [ + 76, + 1 + ], + [ + 94, + 1 + ], + [ + 112, + 1 + ], + [ + 130, + 1 + ], + [ + 148, + 1 + ], + [ + 166, + 1 + ], + [ + 184, + 1 + ], + [ + 202, + 1 + ], + [ + 220, + 1 + ], + [ + 238, + 1 + ], + [ + 256, + 1 + ], + [ + 274, + 1 + ], + [ + 292, + 1 + ], + [ + 310, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 4, + -1 + ], + [ + 22, + -1 + ], + [ + 40, + -1 + ], + [ + 58, + -1 + ], + [ + 76, + -1 + ], + [ + 94, + -1 + ], + [ + 112, + -1 + ], + [ + 130, + -1 + ], + [ + 148, + -1 + ], + [ + 166, + -1 + ], + [ + 184, + -1 + ], + [ + 202, + -1 + ], + [ + 220, + -1 + ], + [ + 238, + -1 + ], + [ + 256, + -1 + ], + [ + 274, + -1 + ], + [ + 292, + -1 + ], + [ + 310, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 5, + 1 + ], + [ + 23, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 77, + 1 + ], + [ + 95, + 1 + ], + [ + 113, + 1 + ], + [ + 131, + 1 + ], + [ + 149, + 1 + ], + [ + 167, + 1 + ], + [ + 185, + 1 + ], + [ + 203, + 1 + ], + [ + 221, + 1 + ], + [ + 239, + 1 + ], + [ + 257, + 1 + ], + [ + 275, + 1 + ], + [ + 293, + 1 + ], + [ + 311, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 5, + -1 + ], + [ + 23, + -1 + ], + [ + 41, + -1 + ], + [ + 59, + -1 + ], + [ + 77, + -1 + ], + [ + 95, + -1 + ], + [ + 113, + -1 + ], + [ + 131, + -1 + ], + [ + 149, + -1 + ], + [ + 167, + -1 + ], + [ + 185, + -1 + ], + [ + 203, + -1 + ], + [ + 221, + -1 + ], + [ + 239, + -1 + ], + [ + 257, + -1 + ], + [ + 275, + -1 + ], + [ + 293, + -1 + ], + [ + 311, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 6, + 1 + ], + [ + 24, + 1 + ], + [ + 42, + 1 + ], + [ + 60, + 1 + ], + [ + 78, + 1 + ], + [ + 96, + 1 + ], + [ + 114, + 1 + ], + [ + 132, + 1 + ], + [ + 150, + 1 + ], + [ + 168, + 1 + ], + [ + 186, + 1 + ], + [ + 204, + 1 + ], + [ + 222, + 1 + ], + [ + 240, + 1 + ], + [ + 258, + 1 + ], + [ + 276, + 1 + ], + [ + 294, + 1 + ], + [ + 312, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 6, + -1 + ], + [ + 24, + -1 + ], + [ + 42, + -1 + ], + [ + 60, + -1 + ], + [ + 78, + -1 + ], + [ + 96, + -1 + ], + [ + 114, + -1 + ], + [ + 132, + -1 + ], + [ + 150, + -1 + ], + [ + 168, + -1 + ], + [ + 186, + -1 + ], + [ + 204, + -1 + ], + [ + 222, + -1 + ], + [ + 240, + -1 + ], + [ + 258, + -1 + ], + [ + 276, + -1 + ], + [ + 294, + -1 + ], + [ + 312, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 7, + 1 + ], + [ + 25, + 1 + ], + [ + 43, + 1 + ], + [ + 61, + 1 + ], + [ + 79, + 1 + ], + [ + 97, + 1 + ], + [ + 115, + 1 + ], + [ + 133, + 1 + ], + [ + 151, + 1 + ], + [ + 169, + 1 + ], + [ + 187, + 1 + ], + [ + 205, + 1 + ], + [ + 223, + 1 + ], + [ + 241, + 1 + ], + [ + 259, + 1 + ], + [ + 277, + 1 + ], + [ + 295, + 1 + ], + [ + 313, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 7, + -1 + ], + [ + 25, + -1 + ], + [ + 43, + -1 + ], + [ + 61, + -1 + ], + [ + 79, + -1 + ], + [ + 97, + -1 + ], + [ + 115, + -1 + ], + [ + 133, + -1 + ], + [ + 151, + -1 + ], + [ + 169, + -1 + ], + [ + 187, + -1 + ], + [ + 205, + -1 + ], + [ + 223, + -1 + ], + [ + 241, + -1 + ], + [ + 259, + -1 + ], + [ + 277, + -1 + ], + [ + 295, + -1 + ], + [ + 313, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 8, + 1 + ], + [ + 26, + 1 + ], + [ + 44, + 1 + ], + [ + 62, + 1 + ], + [ + 80, + 1 + ], + [ + 98, + 1 + ], + [ + 116, + 1 + ], + [ + 134, + 1 + ], + [ + 152, + 1 + ], + [ + 170, + 1 + ], + [ + 188, + 1 + ], + [ + 206, + 1 + ], + [ + 224, + 1 + ], + [ + 242, + 1 + ], + [ + 260, + 1 + ], + [ + 278, + 1 + ], + [ + 296, + 1 + ], + [ + 314, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 8, + -1 + ], + [ + 26, + -1 + ], + [ + 44, + -1 + ], + [ + 62, + -1 + ], + [ + 80, + -1 + ], + [ + 98, + -1 + ], + [ + 116, + -1 + ], + [ + 134, + -1 + ], + [ + 152, + -1 + ], + [ + 170, + -1 + ], + [ + 188, + -1 + ], + [ + 206, + -1 + ], + [ + 224, + -1 + ], + [ + 242, + -1 + ], + [ + 260, + -1 + ], + [ + 278, + -1 + ], + [ + 296, + -1 + ], + [ + 314, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 9, + 1 + ], + [ + 27, + 1 + ], + [ + 45, + 1 + ], + [ + 63, + 1 + ], + [ + 81, + 1 + ], + [ + 99, + 1 + ], + [ + 117, + 1 + ], + [ + 135, + 1 + ], + [ + 153, + 1 + ], + [ + 171, + 1 + ], + [ + 189, + 1 + ], + [ + 207, + 1 + ], + [ + 225, + 1 + ], + [ + 243, + 1 + ], + [ + 261, + 1 + ], + [ + 279, + 1 + ], + [ + 297, + 1 + ], + [ + 315, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 9, + -1 + ], + [ + 27, + -1 + ], + [ + 45, + -1 + ], + [ + 63, + -1 + ], + [ + 81, + -1 + ], + [ + 99, + -1 + ], + [ + 117, + -1 + ], + [ + 135, + -1 + ], + [ + 153, + -1 + ], + [ + 171, + -1 + ], + [ + 189, + -1 + ], + [ + 207, + -1 + ], + [ + 225, + -1 + ], + [ + 243, + -1 + ], + [ + 261, + -1 + ], + [ + 279, + -1 + ], + [ + 297, + -1 + ], + [ + 315, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 10, + 1 + ], + [ + 28, + 1 + ], + [ + 46, + 1 + ], + [ + 64, + 1 + ], + [ + 82, + 1 + ], + [ + 100, + 1 + ], + [ + 118, + 1 + ], + [ + 136, + 1 + ], + [ + 154, + 1 + ], + [ + 172, + 1 + ], + [ + 190, + 1 + ], + [ + 208, + 1 + ], + [ + 226, + 1 + ], + [ + 244, + 1 + ], + [ + 262, + 1 + ], + [ + 280, + 1 + ], + [ + 298, + 1 + ], + [ + 316, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 10, + -1 + ], + [ + 28, + -1 + ], + [ + 46, + -1 + ], + [ + 64, + -1 + ], + [ + 82, + -1 + ], + [ + 100, + -1 + ], + [ + 118, + -1 + ], + [ + 136, + -1 + ], + [ + 154, + -1 + ], + [ + 172, + -1 + ], + [ + 190, + -1 + ], + [ + 208, + -1 + ], + [ + 226, + -1 + ], + [ + 244, + -1 + ], + [ + 262, + -1 + ], + [ + 280, + -1 + ], + [ + 298, + -1 + ], + [ + 316, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 11, + 1 + ], + [ + 29, + 1 + ], + [ + 47, + 1 + ], + [ + 65, + 1 + ], + [ + 83, + 1 + ], + [ + 101, + 1 + ], + [ + 119, + 1 + ], + [ + 137, + 1 + ], + [ + 155, + 1 + ], + [ + 173, + 1 + ], + [ + 191, + 1 + ], + [ + 209, + 1 + ], + [ + 227, + 1 + ], + [ + 245, + 1 + ], + [ + 263, + 1 + ], + [ + 281, + 1 + ], + [ + 299, + 1 + ], + [ + 317, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 11, + -1 + ], + [ + 29, + -1 + ], + [ + 47, + -1 + ], + [ + 65, + -1 + ], + [ + 83, + -1 + ], + [ + 101, + -1 + ], + [ + 119, + -1 + ], + [ + 137, + -1 + ], + [ + 155, + -1 + ], + [ + 173, + -1 + ], + [ + 191, + -1 + ], + [ + 209, + -1 + ], + [ + 227, + -1 + ], + [ + 245, + -1 + ], + [ + 263, + -1 + ], + [ + 281, + -1 + ], + [ + 299, + -1 + ], + [ + 317, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 12, + 1 + ], + [ + 30, + 1 + ], + [ + 48, + 1 + ], + [ + 66, + 1 + ], + [ + 84, + 1 + ], + [ + 102, + 1 + ], + [ + 120, + 1 + ], + [ + 138, + 1 + ], + [ + 156, + 1 + ], + [ + 174, + 1 + ], + [ + 192, + 1 + ], + [ + 210, + 1 + ], + [ + 228, + 1 + ], + [ + 246, + 1 + ], + [ + 264, + 1 + ], + [ + 282, + 1 + ], + [ + 300, + 1 + ], + [ + 318, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 12, + -1 + ], + [ + 30, + -1 + ], + [ + 48, + -1 + ], + [ + 66, + -1 + ], + [ + 84, + -1 + ], + [ + 102, + -1 + ], + [ + 120, + -1 + ], + [ + 138, + -1 + ], + [ + 156, + -1 + ], + [ + 174, + -1 + ], + [ + 192, + -1 + ], + [ + 210, + -1 + ], + [ + 228, + -1 + ], + [ + 246, + -1 + ], + [ + 264, + -1 + ], + [ + 282, + -1 + ], + [ + 300, + -1 + ], + [ + 318, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 13, + 1 + ], + [ + 31, + 1 + ], + [ + 49, + 1 + ], + [ + 67, + 1 + ], + [ + 85, + 1 + ], + [ + 103, + 1 + ], + [ + 121, + 1 + ], + [ + 139, + 1 + ], + [ + 157, + 1 + ], + [ + 175, + 1 + ], + [ + 193, + 1 + ], + [ + 211, + 1 + ], + [ + 229, + 1 + ], + [ + 247, + 1 + ], + [ + 265, + 1 + ], + [ + 283, + 1 + ], + [ + 301, + 1 + ], + [ + 319, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 13, + -1 + ], + [ + 31, + -1 + ], + [ + 49, + -1 + ], + [ + 67, + -1 + ], + [ + 85, + -1 + ], + [ + 103, + -1 + ], + [ + 121, + -1 + ], + [ + 139, + -1 + ], + [ + 157, + -1 + ], + [ + 175, + -1 + ], + [ + 193, + -1 + ], + [ + 211, + -1 + ], + [ + 229, + -1 + ], + [ + 247, + -1 + ], + [ + 265, + -1 + ], + [ + 283, + -1 + ], + [ + 301, + -1 + ], + [ + 319, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 14, + 1 + ], + [ + 32, + 1 + ], + [ + 50, + 1 + ], + [ + 68, + 1 + ], + [ + 86, + 1 + ], + [ + 104, + 1 + ], + [ + 122, + 1 + ], + [ + 140, + 1 + ], + [ + 158, + 1 + ], + [ + 176, + 1 + ], + [ + 194, + 1 + ], + [ + 212, + 1 + ], + [ + 230, + 1 + ], + [ + 248, + 1 + ], + [ + 266, + 1 + ], + [ + 284, + 1 + ], + [ + 302, + 1 + ], + [ + 320, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 14, + -1 + ], + [ + 32, + -1 + ], + [ + 50, + -1 + ], + [ + 68, + -1 + ], + [ + 86, + -1 + ], + [ + 104, + -1 + ], + [ + 122, + -1 + ], + [ + 140, + -1 + ], + [ + 158, + -1 + ], + [ + 176, + -1 + ], + [ + 194, + -1 + ], + [ + 212, + -1 + ], + [ + 230, + -1 + ], + [ + 248, + -1 + ], + [ + 266, + -1 + ], + [ + 284, + -1 + ], + [ + 302, + -1 + ], + [ + 320, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 15, + 1 + ], + [ + 33, + 1 + ], + [ + 51, + 1 + ], + [ + 69, + 1 + ], + [ + 87, + 1 + ], + [ + 105, + 1 + ], + [ + 123, + 1 + ], + [ + 141, + 1 + ], + [ + 159, + 1 + ], + [ + 177, + 1 + ], + [ + 195, + 1 + ], + [ + 213, + 1 + ], + [ + 231, + 1 + ], + [ + 249, + 1 + ], + [ + 267, + 1 + ], + [ + 285, + 1 + ], + [ + 303, + 1 + ], + [ + 321, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 15, + -1 + ], + [ + 33, + -1 + ], + [ + 51, + -1 + ], + [ + 69, + -1 + ], + [ + 87, + -1 + ], + [ + 105, + -1 + ], + [ + 123, + -1 + ], + [ + 141, + -1 + ], + [ + 159, + -1 + ], + [ + 177, + -1 + ], + [ + 195, + -1 + ], + [ + 213, + -1 + ], + [ + 231, + -1 + ], + [ + 249, + -1 + ], + [ + 267, + -1 + ], + [ + 285, + -1 + ], + [ + 303, + -1 + ], + [ + 321, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 16, + 1 + ], + [ + 34, + 1 + ], + [ + 52, + 1 + ], + [ + 70, + 1 + ], + [ + 88, + 1 + ], + [ + 106, + 1 + ], + [ + 124, + 1 + ], + [ + 142, + 1 + ], + [ + 160, + 1 + ], + [ + 178, + 1 + ], + [ + 196, + 1 + ], + [ + 214, + 1 + ], + [ + 232, + 1 + ], + [ + 250, + 1 + ], + [ + 268, + 1 + ], + [ + 286, + 1 + ], + [ + 304, + 1 + ], + [ + 322, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 16, + -1 + ], + [ + 34, + -1 + ], + [ + 52, + -1 + ], + [ + 70, + -1 + ], + [ + 88, + -1 + ], + [ + 106, + -1 + ], + [ + 124, + -1 + ], + [ + 142, + -1 + ], + [ + 160, + -1 + ], + [ + 178, + -1 + ], + [ + 196, + -1 + ], + [ + 214, + -1 + ], + [ + 232, + -1 + ], + [ + 250, + -1 + ], + [ + 268, + -1 + ], + [ + 286, + -1 + ], + [ + 304, + -1 + ], + [ + 322, + -1 + ] + ] + }, + { + "b": 1, + "a": [ + [ + 17, + 1 + ], + [ + 35, + 1 + ], + [ + 53, + 1 + ], + [ + 71, + 1 + ], + [ + 89, + 1 + ], + [ + 107, + 1 + ], + [ + 125, + 1 + ], + [ + 143, + 1 + ], + [ + 161, + 1 + ], + [ + 179, + 1 + ], + [ + 197, + 1 + ], + [ + 215, + 1 + ], + [ + 233, + 1 + ], + [ + 251, + 1 + ], + [ + 269, + 1 + ], + [ + 287, + 1 + ], + [ + 305, + 1 + ], + [ + 323, + 1 + ] + ] + }, + { + "b": -1, + "a": [ + [ + 17, + -1 + ], + [ + 35, + -1 + ], + [ + 53, + -1 + ], + [ + 71, + -1 + ], + [ + 89, + -1 + ], + [ + 107, + -1 + ], + [ + 125, + -1 + ], + [ + 143, + -1 + ], + [ + 161, + -1 + ], + [ + 179, + -1 + ], + [ + 197, + -1 + ], + [ + 215, + -1 + ], + [ + 233, + -1 + ], + [ + 251, + -1 + ], + [ + 269, + -1 + ], + [ + 287, + -1 + ], + [ + 305, + -1 + ], + [ + 323, + -1 + ] + ] + } + ], + "parameters": { + "size": 18, + "costs": [ + [ + 32, + 25, + 46, + 17, + 25, + 81, + 60, + 45, + 33, + 2, + 24, + 62, + 15, + 65, + 28, + 53, + 63, + 70 + ], + [ + 56, + 78, + 26, + 29, + 97, + 53, + 91, + 54, + 35, + 51, + 11, + 6, + 94, + 54, + 95, + 10, + 98, + 36 + ], + [ + 36, + 64, + 23, + 65, + 34, + 7, + 11, + 16, + 25, + 47, + 37, + 98, + 47, + 31, + 12, + 46, + 35, + 29 + ], + [ + 97, + 68, + 44, + 98, + 44, + 45, + 3, + 15, + 26, + 21, + 29, + 35, + 39, + 93, + 5, + 60, + 77, + 82 + ], + [ + 41, + 68, + 59, + 39, + 77, + 61, + 81, + 90, + 47, + 74, + 79, + 72, + 97, + 66, + 80, + 76, + 19, + 59 + ], + [ + 53, + 26, + 17, + 42, + 5, + 55, + 98, + 24, + 6, + 63, + 27, + 16, + 82, + 46, + 79, + 55, + 61, + 70 + ], + [ + 95, + 33, + 52, + 16, + 82, + 86, + 73, + 73, + 95, + 90, + 39, + 17, + 99, + 57, + 66, + 17, + 33, + 30 + ], + [ + 27, + 5, + 17, + 3, + 39, + 55, + 69, + 36, + 13, + 73, + 97, + 78, + 76, + 84, + 4, + 72, + 67, + 95 + ], + [ + 27, + 48, + 14, + 70, + 1, + 8, + 18, + 57, + 75, + 48, + 54, + 87, + 57, + 85, + 49, + 56, + 51, + 89 + ], + [ + 24, + 5, + 46, + 31, + 7, + 28, + 73, + 45, + 76, + 18, + 12, + 51, + 26, + 63, + 24, + 73, + 41, + 12 + ], + [ + 72, + 43, + 47, + 27, + 36, + 24, + 12, + 89, + 59, + 95, + 31, + 54, + 15, + 39, + 87, + 9, + 57, + 61 + ], + [ + 61, + 14, + 95, + 81, + 17, + 23, + 69, + 17, + 15, + 27, + 52, + 40, + 6, + 42, + 36, + 76, + 6, + 55 + ], + [ + 85, + 77, + 7, + 5, + 78, + 3, + 84, + 51, + 42, + 42, + 3, + 37, + 43, + 6, + 13, + 54, + 87, + 93 + ], + [ + 19, + 98, + 70, + 9, + 79, + 91, + 83, + 67, + 48, + 22, + 33, + 7, + 77, + 69, + 99, + 59, + 91, + 42 + ], + [ + 51, + 23, + 30, + 20, + 73, + 22, + 84, + 90, + 6, + 10, + 80, + 34, + 82, + 16, + 5, + 46, + 8, + 76 + ], + [ + 82, + 28, + 49, + 33, + 89, + 24, + 71, + 4, + 10, + 23, + 64, + 3, + 93, + 93, + 46, + 61, + 48, + 68 + ], + [ + 72, + 3, + 82, + 83, + 10, + 31, + 10, + 6, + 12, + 13, + 20, + 73, + 25, + 94, + 33, + 16, + 60, + 33 + ], + [ + 24, + 94, + 73, + 41, + 14, + 55, + 89, + 76, + 29, + 17, + 10, + 72, + 36, + 70, + 21, + 89, + 34, + 47 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_assignment_equality_rows" + }, + "dimensions": { + "input_variables": 324, + "variables": 324, + "rows": 72, + "nonzeros": 1296, + "globals": 0 + }, + "input_variables": 324, + "model_variables": 324, + "modelled_variables": 324, + "size_unit": "tasks" + }, + "json_sha256": "f7aec878b0d183145a18e4a617de998b1de1367b4d786aed6bd6f3c04e94ec14", + "txt_sha256": "da55d2790da690ed9f306d2169173379e76528f1c7760cdc7978b7294cdcf80a" + }, + { + "id": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "model": { + "id": "facility_location_single_9", + "category": "facility_location", + "family": "facility_location", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 9, + "natural_size": 9, + "seed": 20260909, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 171, + "c": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56, + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14, + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15, + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15, + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19, + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22, + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8, + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16, + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11, + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17, + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2, + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21, + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11, + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28, + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26, + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11, + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6, + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + "rows": [ + { + "a": [ + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 9, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 10, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 11, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 12, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 13, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 14, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 15, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 16, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 17, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ], + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ], + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 18, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 19, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 20, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 21, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 22, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 23, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 24, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 25, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 26, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 27, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 28, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 29, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 30, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 31, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 32, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 33, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 34, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 35, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 36, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 37, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 38, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 39, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 40, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 41, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 42, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 43, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 44, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ], + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ], + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 45, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 46, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 47, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 48, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 49, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 50, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 51, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 52, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 53, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 54, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 55, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 56, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 57, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 58, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 59, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 60, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 61, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 62, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 63, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 64, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 65, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 66, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 67, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 68, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 69, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 70, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 71, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 72, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 73, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 74, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 75, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 76, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 77, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 78, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 79, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 80, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 81, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 82, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 83, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 84, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 85, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 86, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 87, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 88, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 89, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ], + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ], + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 90, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 91, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 92, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 93, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 94, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 95, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 96, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 97, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 98, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ], + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ], + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 99, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 100, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 101, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 102, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 103, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 104, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 105, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 106, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 107, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + 1 + ], + [ + 110, + 1 + ], + [ + 111, + 1 + ], + [ + 112, + 1 + ], + [ + 113, + 1 + ], + [ + 114, + 1 + ], + [ + 115, + 1 + ], + [ + 116, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 108, + -1 + ], + [ + 109, + -1 + ], + [ + 110, + -1 + ], + [ + 111, + -1 + ], + [ + 112, + -1 + ], + [ + 113, + -1 + ], + [ + 114, + -1 + ], + [ + 115, + -1 + ], + [ + 116, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 108, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 114, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 115, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 116, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 117, + 1 + ], + [ + 118, + 1 + ], + [ + 119, + 1 + ], + [ + 120, + 1 + ], + [ + 121, + 1 + ], + [ + 122, + 1 + ], + [ + 123, + 1 + ], + [ + 124, + 1 + ], + [ + 125, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 117, + -1 + ], + [ + 118, + -1 + ], + [ + 119, + -1 + ], + [ + 120, + -1 + ], + [ + 121, + -1 + ], + [ + 122, + -1 + ], + [ + 123, + -1 + ], + [ + 124, + -1 + ], + [ + 125, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 117, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 118, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 119, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 120, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 121, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 122, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 123, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 124, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 125, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 126, + 1 + ], + [ + 127, + 1 + ], + [ + 128, + 1 + ], + [ + 129, + 1 + ], + [ + 130, + 1 + ], + [ + 131, + 1 + ], + [ + 132, + 1 + ], + [ + 133, + 1 + ], + [ + 134, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 126, + -1 + ], + [ + 127, + -1 + ], + [ + 128, + -1 + ], + [ + 129, + -1 + ], + [ + 130, + -1 + ], + [ + 131, + -1 + ], + [ + 132, + -1 + ], + [ + 133, + -1 + ], + [ + 134, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 126, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 127, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 128, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 129, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 130, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 131, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 132, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 133, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 134, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 135, + 1 + ], + [ + 136, + 1 + ], + [ + 137, + 1 + ], + [ + 138, + 1 + ], + [ + 139, + 1 + ], + [ + 140, + 1 + ], + [ + 141, + 1 + ], + [ + 142, + 1 + ], + [ + 143, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 135, + -1 + ], + [ + 136, + -1 + ], + [ + 137, + -1 + ], + [ + 138, + -1 + ], + [ + 139, + -1 + ], + [ + 140, + -1 + ], + [ + 141, + -1 + ], + [ + 142, + -1 + ], + [ + 143, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 135, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 136, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 137, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 138, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 139, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 140, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 141, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 142, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 143, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 144, + 1 + ], + [ + 145, + 1 + ], + [ + 146, + 1 + ], + [ + 147, + 1 + ], + [ + 148, + 1 + ], + [ + 149, + 1 + ], + [ + 150, + 1 + ], + [ + 151, + 1 + ], + [ + 152, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 144, + -1 + ], + [ + 145, + -1 + ], + [ + 146, + -1 + ], + [ + 147, + -1 + ], + [ + 148, + -1 + ], + [ + 149, + -1 + ], + [ + 150, + -1 + ], + [ + 151, + -1 + ], + [ + 152, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 144, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 145, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 146, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 147, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 148, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 149, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 150, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 151, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 152, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 153, + 1 + ], + [ + 154, + 1 + ], + [ + 155, + 1 + ], + [ + 156, + 1 + ], + [ + 157, + 1 + ], + [ + 158, + 1 + ], + [ + 159, + 1 + ], + [ + 160, + 1 + ], + [ + 161, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 153, + -1 + ], + [ + 154, + -1 + ], + [ + 155, + -1 + ], + [ + 156, + -1 + ], + [ + 157, + -1 + ], + [ + 158, + -1 + ], + [ + 159, + -1 + ], + [ + 160, + -1 + ], + [ + 161, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 153, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 154, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 155, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 156, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 157, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 158, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 159, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 160, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 161, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 162, + 1 + ], + [ + 163, + 1 + ], + [ + 164, + 1 + ], + [ + 165, + 1 + ], + [ + 166, + 1 + ], + [ + 167, + 1 + ], + [ + 168, + 1 + ], + [ + 169, + 1 + ], + [ + 170, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 162, + -1 + ], + [ + 163, + -1 + ], + [ + 164, + -1 + ], + [ + 165, + -1 + ], + [ + 166, + -1 + ], + [ + 167, + -1 + ], + [ + 168, + -1 + ], + [ + 169, + -1 + ], + [ + 170, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + 1 + ], + [ + 162, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 163, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + 1 + ], + [ + 164, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + 1 + ], + [ + 165, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + 1 + ], + [ + 166, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + 1 + ], + [ + 167, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 168, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + 1 + ], + [ + 169, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 170, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "facilities": 9, + "customers": 18, + "opening_costs": [ + 17, + 26, + 23, + 47, + 45, + 22, + 42, + 49, + 56 + ], + "assignment_costs": [ + [ + 17, + 18, + 17, + 18, + 11, + 25, + 13, + 31, + 14 + ], + [ + 44, + 19, + 28, + 33, + 18, + 26, + 20, + 6, + 15 + ], + [ + 16, + 27, + 8, + 9, + 20, + 16, + 22, + 32, + 15 + ], + [ + 16, + 15, + 30, + 31, + 16, + 38, + 14, + 36, + 19 + ], + [ + 51, + 26, + 35, + 40, + 25, + 33, + 27, + 5, + 22 + ], + [ + 29, + 16, + 19, + 20, + 9, + 27, + 11, + 19, + 8 + ], + [ + 15, + 16, + 19, + 20, + 13, + 27, + 11, + 33, + 16 + ], + [ + 20, + 29, + 6, + 9, + 22, + 14, + 24, + 28, + 11 + ], + [ + 40, + 15, + 28, + 29, + 14, + 36, + 16, + 18, + 17 + ], + [ + 52, + 27, + 36, + 41, + 26, + 34, + 28, + 6, + 23 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ], + [ + 26, + 3, + 32, + 33, + 6, + 40, + 4, + 22, + 21 + ], + [ + 24, + 33, + 8, + 13, + 26, + 10, + 28, + 24, + 11 + ], + [ + 5, + 24, + 19, + 20, + 25, + 27, + 23, + 45, + 28 + ], + [ + 29, + 48, + 15, + 16, + 41, + 9, + 43, + 25, + 26 + ], + [ + 20, + 25, + 10, + 11, + 18, + 18, + 20, + 28, + 11 + ], + [ + 35, + 20, + 19, + 24, + 13, + 23, + 15, + 13, + 6 + ], + [ + 29, + 22, + 13, + 18, + 15, + 21, + 17, + 19, + 2 + ] + ], + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 171, + "variables": 171, + "rows": 198, + "nonzeros": 648, + "globals": 0 + }, + "input_variables": 171, + "model_variables": 171, + "modelled_variables": 171, + "size_unit": "sites" + }, + "json_sha256": "05f7bcfa7613bffd669d5a7f96940f90cd41684099a00eadd2131825328dbac6", + "txt_sha256": "b26947191b79bcc264afbba5d5b55bc042c4a0d53b7b9306e3ac4dc38be09b03" + }, + { + "id": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "model": { + "id": "bin_packing_single_18", + "category": "bin_packing", + "family": "bin_packing", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 18, + "natural_size": 18, + "seed": 20260910, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 114, + "c": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 6, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 7, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 9, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 10, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 11, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ], + [ + 16, + 1 + ], + [ + 17, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ], + [ + 16, + -1 + ], + [ + 17, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 12, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 13, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 14, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 15, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 17, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 18, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 19, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 20, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 21, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 22, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 23, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 25, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 26, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 27, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 28, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 29, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 30, + 1 + ], + [ + 31, + 1 + ], + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 31, + -1 + ], + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 30, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 31, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 33, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 34, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 35, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ], + [ + 40, + -1 + ], + [ + 41, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 36, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 37, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 38, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 39, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 41, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 42, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 43, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 44, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 45, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 46, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 47, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 49, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 50, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 51, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 52, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 53, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 54, + 1 + ], + [ + 55, + 1 + ], + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 55, + -1 + ], + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 54, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 55, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 57, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 58, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 59, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ], + [ + 64, + 1 + ], + [ + 65, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ], + [ + 64, + -1 + ], + [ + 65, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 60, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 61, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 62, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 63, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 65, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 66, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 67, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 68, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 69, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 70, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 71, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 73, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 74, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 75, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 76, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 77, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 78, + 1 + ], + [ + 79, + 1 + ], + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 79, + -1 + ], + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 78, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 79, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 81, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 82, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 83, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ], + [ + 88, + 1 + ], + [ + 89, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ], + [ + 88, + -1 + ], + [ + 89, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 84, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 85, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 86, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 87, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 89, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 90, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 91, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 92, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 93, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 94, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 95, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 96, + 1 + ], + [ + 97, + 1 + ], + [ + 98, + 1 + ], + [ + 99, + 1 + ], + [ + 100, + 1 + ], + [ + 101, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 97, + -1 + ], + [ + 98, + -1 + ], + [ + 99, + -1 + ], + [ + 100, + -1 + ], + [ + 101, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 96, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 97, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 98, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 99, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 100, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 101, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 102, + 1 + ], + [ + 103, + 1 + ], + [ + 104, + 1 + ], + [ + 105, + 1 + ], + [ + 106, + 1 + ], + [ + 107, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 103, + -1 + ], + [ + 104, + -1 + ], + [ + 105, + -1 + ], + [ + 106, + -1 + ], + [ + 107, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 102, + -1 + ], + [ + 108, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 103, + -1 + ], + [ + 109, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 104, + -1 + ], + [ + 110, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 105, + -1 + ], + [ + 111, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 106, + -1 + ], + [ + 112, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 107, + -1 + ], + [ + 113, + 1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 0, + -3 + ], + [ + 6, + -6 + ], + [ + 12, + -3 + ], + [ + 18, + -4 + ], + [ + 24, + -7 + ], + [ + 30, + -7 + ], + [ + 36, + -6 + ], + [ + 42, + -2 + ], + [ + 48, + -3 + ], + [ + 54, + -4 + ], + [ + 60, + -4 + ], + [ + 66, + -4 + ], + [ + 72, + -8 + ], + [ + 78, + -10 + ], + [ + 84, + -7 + ], + [ + 90, + -10 + ], + [ + 96, + -3 + ], + [ + 102, + -9 + ], + [ + 108, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 1, + -3 + ], + [ + 7, + -6 + ], + [ + 13, + -3 + ], + [ + 19, + -4 + ], + [ + 25, + -7 + ], + [ + 31, + -7 + ], + [ + 37, + -6 + ], + [ + 43, + -2 + ], + [ + 49, + -3 + ], + [ + 55, + -4 + ], + [ + 61, + -4 + ], + [ + 67, + -4 + ], + [ + 73, + -8 + ], + [ + 79, + -10 + ], + [ + 85, + -7 + ], + [ + 91, + -10 + ], + [ + 97, + -3 + ], + [ + 103, + -9 + ], + [ + 109, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 2, + -3 + ], + [ + 8, + -6 + ], + [ + 14, + -3 + ], + [ + 20, + -4 + ], + [ + 26, + -7 + ], + [ + 32, + -7 + ], + [ + 38, + -6 + ], + [ + 44, + -2 + ], + [ + 50, + -3 + ], + [ + 56, + -4 + ], + [ + 62, + -4 + ], + [ + 68, + -4 + ], + [ + 74, + -8 + ], + [ + 80, + -10 + ], + [ + 86, + -7 + ], + [ + 92, + -10 + ], + [ + 98, + -3 + ], + [ + 104, + -9 + ], + [ + 110, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 3, + -3 + ], + [ + 9, + -6 + ], + [ + 15, + -3 + ], + [ + 21, + -4 + ], + [ + 27, + -7 + ], + [ + 33, + -7 + ], + [ + 39, + -6 + ], + [ + 45, + -2 + ], + [ + 51, + -3 + ], + [ + 57, + -4 + ], + [ + 63, + -4 + ], + [ + 69, + -4 + ], + [ + 75, + -8 + ], + [ + 81, + -10 + ], + [ + 87, + -7 + ], + [ + 93, + -10 + ], + [ + 99, + -3 + ], + [ + 105, + -9 + ], + [ + 111, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 4, + -3 + ], + [ + 10, + -6 + ], + [ + 16, + -3 + ], + [ + 22, + -4 + ], + [ + 28, + -7 + ], + [ + 34, + -7 + ], + [ + 40, + -6 + ], + [ + 46, + -2 + ], + [ + 52, + -3 + ], + [ + 58, + -4 + ], + [ + 64, + -4 + ], + [ + 70, + -4 + ], + [ + 76, + -8 + ], + [ + 82, + -10 + ], + [ + 88, + -7 + ], + [ + 94, + -10 + ], + [ + 100, + -3 + ], + [ + 106, + -9 + ], + [ + 112, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 5, + -3 + ], + [ + 11, + -6 + ], + [ + 17, + -3 + ], + [ + 23, + -4 + ], + [ + 29, + -7 + ], + [ + 35, + -7 + ], + [ + 41, + -6 + ], + [ + 47, + -2 + ], + [ + 53, + -3 + ], + [ + 59, + -4 + ], + [ + 65, + -4 + ], + [ + 71, + -4 + ], + [ + 77, + -8 + ], + [ + 83, + -10 + ], + [ + 89, + -7 + ], + [ + 95, + -10 + ], + [ + 101, + -3 + ], + [ + 107, + -9 + ], + [ + 113, + 20 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 108, + 1 + ], + [ + 109, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 109, + 1 + ], + [ + 110, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 110, + 1 + ], + [ + 111, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 111, + 1 + ], + [ + 112, + -1 + ] + ], + "b": 0 + }, + { + "a": [ + [ + 112, + 1 + ], + [ + 113, + -1 + ] + ], + "b": 0 + } + ], + "parameters": { + "items": 18, + "bins": 6, + "weights": [ + 3, + 6, + 3, + 4, + 7, + 7, + 6, + 2, + 3, + 4, + 4, + 4, + 8, + 10, + 7, + 10, + 3, + 9 + ], + "capacity": 20, + "symmetry": "enabled bins form a prefix", + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 114, + "variables": 114, + "rows": 155, + "nonzeros": 556, + "globals": 0 + }, + "input_variables": 114, + "model_variables": 114, + "modelled_variables": 114, + "size_unit": "items" + }, + "json_sha256": "be46d22bc3c55ef31810dbe72abf6ae58cfbec40d59051e862a7cd96d5fc5d21", + "txt_sha256": "28c54c1da14a556c1c8a807af4ab9fc0101d60cda4f326a87cdc956a3a97996b" + }, + { + "id": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "model": { + "id": "production_single_12", + "category": "production", + "family": "production", + "variant": "single", + "kind": "binary", + "tier": "adaptive", + "tier_size": 12, + "natural_size": 12, + "seed": 20260911, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 96, + "c": [ + 0, + 57, + 95, + 133, + 171, + 214, + 257, + 300, + 0, + 63, + 108, + 153, + 198, + 248, + 298, + 348, + 0, + 48, + 86, + 124, + 162, + 205, + 248, + 291, + 0, + 47, + 85, + 123, + 161, + 204, + 247, + 290, + 0, + 43, + 69, + 95, + 121, + 152, + 183, + 214, + 0, + 46, + 79, + 112, + 145, + 183, + 221, + 259, + 0, + 34, + 62, + 90, + 118, + 151, + 184, + 217, + 0, + 38, + 64, + 90, + 116, + 147, + 178, + 209, + 0, + 26, + 42, + 58, + 74, + 95, + 116, + 137, + 0, + 25, + 45, + 65, + 85, + 110, + 135, + 160, + 0, + 25, + 34, + 43, + 52, + 66, + 80, + 94, + 0, + 26, + 41, + 56, + 71, + 91, + 111, + 131 + ], + "rows": [ + { + "a": [ + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ] + ], + "b": 7 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ] + ], + "b": -17 + }, + { + "a": [ + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + 10, + 1 + ], + [ + 11, + 1 + ], + [ + 12, + 1 + ], + [ + 13, + 1 + ], + [ + 14, + 1 + ], + [ + 15, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + 10, + -1 + ], + [ + 11, + -1 + ], + [ + 12, + -1 + ], + [ + 13, + -1 + ], + [ + 14, + -1 + ], + [ + 15, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ] + ], + "b": 12 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ] + ], + "b": -22 + }, + { + "a": [ + [ + 16, + 1 + ], + [ + 17, + 1 + ], + [ + 18, + 1 + ], + [ + 19, + 1 + ], + [ + 20, + 1 + ], + [ + 21, + 1 + ], + [ + 22, + 1 + ], + [ + 23, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 16, + -1 + ], + [ + 17, + -1 + ], + [ + 18, + -1 + ], + [ + 19, + -1 + ], + [ + 20, + -1 + ], + [ + 21, + -1 + ], + [ + 22, + -1 + ], + [ + 23, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ] + ], + "b": 15 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ] + ], + "b": -25 + }, + { + "a": [ + [ + 24, + 1 + ], + [ + 25, + 1 + ], + [ + 26, + 1 + ], + [ + 27, + 1 + ], + [ + 28, + 1 + ], + [ + 29, + 1 + ], + [ + 30, + 1 + ], + [ + 31, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 24, + -1 + ], + [ + 25, + -1 + ], + [ + 26, + -1 + ], + [ + 27, + -1 + ], + [ + 28, + -1 + ], + [ + 29, + -1 + ], + [ + 30, + -1 + ], + [ + 31, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ] + ], + "b": 16 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ] + ], + "b": -26 + }, + { + "a": [ + [ + 32, + 1 + ], + [ + 33, + 1 + ], + [ + 34, + 1 + ], + [ + 35, + 1 + ], + [ + 36, + 1 + ], + [ + 37, + 1 + ], + [ + 38, + 1 + ], + [ + 39, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 32, + -1 + ], + [ + 33, + -1 + ], + [ + 34, + -1 + ], + [ + 35, + -1 + ], + [ + 36, + -1 + ], + [ + 37, + -1 + ], + [ + 38, + -1 + ], + [ + 39, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ] + ], + "b": 20 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ] + ], + "b": -30 + }, + { + "a": [ + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 42, + 1 + ], + [ + 43, + 1 + ], + [ + 44, + 1 + ], + [ + 45, + 1 + ], + [ + 46, + 1 + ], + [ + 47, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 40, + -1 + ], + [ + 41, + -1 + ], + [ + 42, + -1 + ], + [ + 43, + -1 + ], + [ + 44, + -1 + ], + [ + 45, + -1 + ], + [ + 46, + -1 + ], + [ + 47, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ] + ], + "b": 21 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ] + ], + "b": -31 + }, + { + "a": [ + [ + 48, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 1 + ], + [ + 51, + 1 + ], + [ + 52, + 1 + ], + [ + 53, + 1 + ], + [ + 54, + 1 + ], + [ + 55, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 48, + -1 + ], + [ + 49, + -1 + ], + [ + 50, + -1 + ], + [ + 51, + -1 + ], + [ + 52, + -1 + ], + [ + 53, + -1 + ], + [ + 54, + -1 + ], + [ + 55, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ] + ], + "b": 27 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ] + ], + "b": -37 + }, + { + "a": [ + [ + 56, + 1 + ], + [ + 57, + 1 + ], + [ + 58, + 1 + ], + [ + 59, + 1 + ], + [ + 60, + 1 + ], + [ + 61, + 1 + ], + [ + 62, + 1 + ], + [ + 63, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 56, + -1 + ], + [ + 57, + -1 + ], + [ + 58, + -1 + ], + [ + 59, + -1 + ], + [ + 60, + -1 + ], + [ + 61, + -1 + ], + [ + 62, + -1 + ], + [ + 63, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ] + ], + "b": 29 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ] + ], + "b": -39 + }, + { + "a": [ + [ + 64, + 1 + ], + [ + 65, + 1 + ], + [ + 66, + 1 + ], + [ + 67, + 1 + ], + [ + 68, + 1 + ], + [ + 69, + 1 + ], + [ + 70, + 1 + ], + [ + 71, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 64, + -1 + ], + [ + 65, + -1 + ], + [ + 66, + -1 + ], + [ + 67, + -1 + ], + [ + 68, + -1 + ], + [ + 69, + -1 + ], + [ + 70, + -1 + ], + [ + 71, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ] + ], + "b": 34 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ] + ], + "b": -44 + }, + { + "a": [ + [ + 72, + 1 + ], + [ + 73, + 1 + ], + [ + 74, + 1 + ], + [ + 75, + 1 + ], + [ + 76, + 1 + ], + [ + 77, + 1 + ], + [ + 78, + 1 + ], + [ + 79, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 72, + -1 + ], + [ + 73, + -1 + ], + [ + 74, + -1 + ], + [ + 75, + -1 + ], + [ + 76, + -1 + ], + [ + 77, + -1 + ], + [ + 78, + -1 + ], + [ + 79, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ] + ], + "b": 41 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ] + ], + "b": -51 + }, + { + "a": [ + [ + 80, + 1 + ], + [ + 81, + 1 + ], + [ + 82, + 1 + ], + [ + 83, + 1 + ], + [ + 84, + 1 + ], + [ + 85, + 1 + ], + [ + 86, + 1 + ], + [ + 87, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 80, + -1 + ], + [ + 81, + -1 + ], + [ + 82, + -1 + ], + [ + 83, + -1 + ], + [ + 84, + -1 + ], + [ + 85, + -1 + ], + [ + 86, + -1 + ], + [ + 87, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ] + ], + "b": 45 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ] + ], + "b": -55 + }, + { + "a": [ + [ + 88, + 1 + ], + [ + 89, + 1 + ], + [ + 90, + 1 + ], + [ + 91, + 1 + ], + [ + 92, + 1 + ], + [ + 93, + 1 + ], + [ + 94, + 1 + ], + [ + 95, + 1 + ] + ], + "b": 1 + }, + { + "a": [ + [ + 88, + -1 + ], + [ + 89, + -1 + ], + [ + 90, + -1 + ], + [ + 91, + -1 + ], + [ + 92, + -1 + ], + [ + 93, + -1 + ], + [ + 94, + -1 + ], + [ + 95, + -1 + ] + ], + "b": -1 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -58 + }, + { + "a": [ + [ + 1, + 1 + ], + [ + 2, + 2 + ], + [ + 3, + 3 + ], + [ + 4, + 4 + ], + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 7, + 7 + ], + [ + 9, + 1 + ], + [ + 10, + 2 + ], + [ + 11, + 3 + ], + [ + 12, + 4 + ], + [ + 13, + 5 + ], + [ + 14, + 6 + ], + [ + 15, + 7 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 23, + 7 + ], + [ + 25, + 1 + ], + [ + 26, + 2 + ], + [ + 27, + 3 + ], + [ + 28, + 4 + ], + [ + 29, + 5 + ], + [ + 30, + 6 + ], + [ + 31, + 7 + ], + [ + 33, + 1 + ], + [ + 34, + 2 + ], + [ + 35, + 3 + ], + [ + 36, + 4 + ], + [ + 37, + 5 + ], + [ + 38, + 6 + ], + [ + 39, + 7 + ], + [ + 41, + 1 + ], + [ + 42, + 2 + ], + [ + 43, + 3 + ], + [ + 44, + 4 + ], + [ + 45, + 5 + ], + [ + 46, + 6 + ], + [ + 47, + 7 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ], + [ + 51, + 3 + ], + [ + 52, + 4 + ], + [ + 53, + 5 + ], + [ + 54, + 6 + ], + [ + 55, + 7 + ], + [ + 57, + 1 + ], + [ + 58, + 2 + ], + [ + 59, + 3 + ], + [ + 60, + 4 + ], + [ + 61, + 5 + ], + [ + 62, + 6 + ], + [ + 63, + 7 + ], + [ + 65, + 1 + ], + [ + 66, + 2 + ], + [ + 67, + 3 + ], + [ + 68, + 4 + ], + [ + 69, + 5 + ], + [ + 70, + 6 + ], + [ + 71, + 7 + ], + [ + 73, + 1 + ], + [ + 74, + 2 + ], + [ + 75, + 3 + ], + [ + 76, + 4 + ], + [ + 77, + 5 + ], + [ + 78, + 6 + ], + [ + 79, + 7 + ], + [ + 81, + 1 + ], + [ + 82, + 2 + ], + [ + 83, + 3 + ], + [ + 84, + 4 + ], + [ + 85, + 5 + ], + [ + 86, + 6 + ], + [ + 87, + 7 + ], + [ + 89, + 1 + ], + [ + 90, + 2 + ], + [ + 91, + 3 + ], + [ + 92, + 4 + ], + [ + 93, + 5 + ], + [ + 94, + 6 + ], + [ + 95, + 7 + ] + ], + "b": 48 + }, + { + "a": [ + [ + 1, + -1 + ], + [ + 2, + -2 + ], + [ + 3, + -3 + ], + [ + 4, + -4 + ], + [ + 5, + -5 + ], + [ + 6, + -6 + ], + [ + 7, + -7 + ], + [ + 9, + -1 + ], + [ + 10, + -2 + ], + [ + 11, + -3 + ], + [ + 12, + -4 + ], + [ + 13, + -5 + ], + [ + 14, + -6 + ], + [ + 15, + -7 + ], + [ + 17, + -1 + ], + [ + 18, + -2 + ], + [ + 19, + -3 + ], + [ + 20, + -4 + ], + [ + 21, + -5 + ], + [ + 22, + -6 + ], + [ + 23, + -7 + ], + [ + 25, + -1 + ], + [ + 26, + -2 + ], + [ + 27, + -3 + ], + [ + 28, + -4 + ], + [ + 29, + -5 + ], + [ + 30, + -6 + ], + [ + 31, + -7 + ], + [ + 33, + -1 + ], + [ + 34, + -2 + ], + [ + 35, + -3 + ], + [ + 36, + -4 + ], + [ + 37, + -5 + ], + [ + 38, + -6 + ], + [ + 39, + -7 + ], + [ + 41, + -1 + ], + [ + 42, + -2 + ], + [ + 43, + -3 + ], + [ + 44, + -4 + ], + [ + 45, + -5 + ], + [ + 46, + -6 + ], + [ + 47, + -7 + ], + [ + 49, + -1 + ], + [ + 50, + -2 + ], + [ + 51, + -3 + ], + [ + 52, + -4 + ], + [ + 53, + -5 + ], + [ + 54, + -6 + ], + [ + 55, + -7 + ], + [ + 57, + -1 + ], + [ + 58, + -2 + ], + [ + 59, + -3 + ], + [ + 60, + -4 + ], + [ + 61, + -5 + ], + [ + 62, + -6 + ], + [ + 63, + -7 + ], + [ + 65, + -1 + ], + [ + 66, + -2 + ], + [ + 67, + -3 + ], + [ + 68, + -4 + ], + [ + 69, + -5 + ], + [ + 70, + -6 + ], + [ + 71, + -7 + ], + [ + 73, + -1 + ], + [ + 74, + -2 + ], + [ + 75, + -3 + ], + [ + 76, + -4 + ], + [ + 77, + -5 + ], + [ + 78, + -6 + ], + [ + 79, + -7 + ], + [ + 81, + -1 + ], + [ + 82, + -2 + ], + [ + 83, + -3 + ], + [ + 84, + -4 + ], + [ + 85, + -5 + ], + [ + 86, + -6 + ], + [ + 87, + -7 + ], + [ + 89, + -1 + ], + [ + 90, + -2 + ], + [ + 91, + -3 + ], + [ + 92, + -4 + ], + [ + 93, + -5 + ], + [ + 94, + -6 + ], + [ + 95, + -7 + ] + ], + "b": -48 + } + ], + "parameters": { + "periods": 12, + "options": 8, + "demands": [ + 7, + 5, + 3, + 1, + 4, + 1, + 6, + 2, + 5, + 7, + 4, + 3 + ], + "storage": 10, + "holding_cost": 3, + "production_costs": [ + [ + 0, + 21, + 23, + 25, + 27, + 34, + 41, + 48 + ], + [ + 0, + 30, + 42, + 54, + 66, + 83, + 100, + 117 + ], + [ + 0, + 18, + 26, + 34, + 42, + 55, + 68, + 81 + ], + [ + 0, + 20, + 31, + 42, + 53, + 69, + 85, + 101 + ], + [ + 0, + 19, + 21, + 23, + 25, + 32, + 39, + 46 + ], + [ + 0, + 25, + 37, + 49, + 61, + 78, + 95, + 112 + ], + [ + 0, + 16, + 26, + 36, + 46, + 61, + 76, + 91 + ], + [ + 0, + 23, + 34, + 45, + 56, + 72, + 88, + 104 + ], + [ + 0, + 14, + 18, + 22, + 26, + 35, + 44, + 53 + ], + [ + 0, + 16, + 27, + 38, + 49, + 65, + 81, + 97 + ], + [ + 0, + 19, + 22, + 25, + 28, + 36, + 44, + 52 + ], + [ + 0, + 23, + 35, + 47, + 59, + 76, + 93, + 110 + ] + ], + "objective_constant": -945, + "table_cells": null, + "dp_eligible": false, + "dp_eligibility_reason": "multiple_original_rows" + }, + "dimensions": { + "input_variables": 96, + "variables": 96, + "rows": 50, + "nonzeros": 1452, + "globals": 0 + }, + "input_variables": 96, + "model_variables": 96, + "modelled_variables": 96, + "size_unit": "periods" + }, + "json_sha256": "d281e652807ad9c43e43e86c393a53ae7a5eeb0fcff04480f6dc20f02cd03df9", + "txt_sha256": "766f8af6b209308f8c82f23a8473f99e66ba425dfb8621a08d0cb04418045b0a" + }, + { + "id": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "model": { + "id": "knapsack_uncorrelated_408", + "category": "knapsack", + "family": "capacity_uncorrelated", + "variant": "uncorrelated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260906, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -48, + -59, + -13, + -76, + -33, + -76, + -100, + -26, + -92, + -20, + -15, + -7, + -31, + -49, + -11, + -46, + -57, + -63, + -93, + -8, + -63, + -24, + -31, + -24, + -72, + -27, + -6, + -93, + -1, + -70, + -100, + -61, + -5, + -53, + -40, + -25, + -28, + -90, + -68, + -81, + -38, + -55, + -75, + -93, + -88, + -90, + -59, + -80, + -91, + -65, + -15, + -33, + -4, + -11, + -60, + -49, + -89, + -99, + -20, + -96, + -100, + -8, + -45, + -3, + -85, + -62, + -81, + -64, + -19, + -81, + -46, + -64, + -79, + -15, + -9, + -30, + -81, + -94, + -22, + -6, + -70, + -8, + -73, + -64, + -1, + -14, + -87, + -47, + -45, + -96, + -100, + -7, + -28, + -25, + -8, + -20, + -31, + -36, + -54, + -36, + -83, + -79, + -58, + -5, + -72, + -99, + -40, + -5, + -60, + -43, + -47, + -2, + -72, + -67, + -44, + -74, + -57, + -63, + -18, + -26, + -59, + -77, + -22, + -18, + -45, + -41, + -97, + -24, + -7, + -62, + -76, + -63, + -35, + -91, + -22, + -23, + -9, + -76, + -99, + -18, + -45, + -4, + -92, + -58, + -89, + -59, + -63, + -93, + -53, + -78, + -72, + -56, + -35, + -48, + -85, + -10, + -59, + -43, + -25, + -8, + -50, + -53, + -83, + -62, + -39, + -64, + -63, + -69, + -87, + -95, + -76, + -28, + -66, + -83, + -87, + -47, + -20, + -39, + -25, + -16, + -35, + -51, + -58, + -27, + -32, + -33, + -25, + -95, + -41, + -76, + -14, + -43, + -13, + -49, + -74, + -86, + -84, + -27, + -44, + -34, + -31, + -61, + -66, + -7, + -72, + -97, + -7, + -95, + -7, + -99, + -87, + -69, + -62, + -61, + -70, + -52, + -51, + -41, + -61, + -34, + -69, + -24, + -74, + -1, + -66, + -96, + -85, + -63, + -25, + -82, + -67, + -100, + -52, + -73, + -48, + -32, + -48, + -59, + -54, + -3, + -61, + -62, + -67, + -17, + -11, + -41, + -91, + -18, + -54, + -42, + -22, + -52, + -78, + -87, + -36, + -40, + -1, + -91, + -80, + -30, + -17, + -73, + -97, + -38, + -13, + -69, + -58, + -83, + -64, + -55, + -20, + -88, + -18, + -20, + -24, + -10, + -3, + -70, + -87, + -82, + -78, + -16, + -53, + -15, + -47, + -19, + -66, + -71, + -67, + -8, + -65, + -86, + -29, + -94, + -22, + -79, + -11, + -16, + -98, + -71, + -95, + -34, + -71, + -80, + -2, + -71, + -93, + -54, + -24, + -56, + -65, + -54, + -66, + -18, + -49, + -13, + -95, + -17, + -47, + -59, + -99, + -87, + -14, + -10, + -3, + -98, + -28, + -86, + -44, + -30, + -11, + -61, + -72, + -74, + -56, + -28, + -36, + -56, + -98, + -14, + -55, + -42, + -9, + -72, + -61, + -83, + -49, + -80, + -70, + -63, + -81, + -64, + -10, + -62, + -36, + -14, + -2, + -74, + -92, + -83, + -38, + -89, + -75, + -54, + -56, + -5, + -18, + -16, + -20, + -18, + -46, + -92, + -1, + -50, + -44, + -39, + -67, + -37, + -97, + -60, + -11, + -86, + -22, + -46, + -43, + -33, + -67, + -97, + -9, + -86, + -78, + -89, + -74, + -94, + -60, + -58, + -40, + -68, + -96, + -57, + -9, + -51, + -57, + -19, + -6, + -25, + -24, + -67 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -29 + ], + [ + 1, + -10 + ], + [ + 2, + -19 + ], + [ + 3, + -2 + ], + [ + 4, + -17 + ], + [ + 5, + -20 + ], + [ + 6, + -1 + ], + [ + 7, + -2 + ], + [ + 8, + -9 + ], + [ + 9, + -10 + ], + [ + 10, + -4 + ], + [ + 11, + -22 + ], + [ + 12, + -8 + ], + [ + 13, + -14 + ], + [ + 14, + -6 + ], + [ + 15, + -29 + ], + [ + 16, + -23 + ], + [ + 17, + -3 + ], + [ + 18, + -9 + ], + [ + 19, + -21 + ], + [ + 20, + -17 + ], + [ + 21, + -14 + ], + [ + 22, + -12 + ], + [ + 23, + -25 + ], + [ + 24, + -23 + ], + [ + 25, + -31 + ], + [ + 26, + -2 + ], + [ + 27, + -24 + ], + [ + 28, + -29 + ], + [ + 29, + -18 + ], + [ + 30, + -27 + ], + [ + 31, + -13 + ], + [ + 32, + -17 + ], + [ + 33, + -16 + ], + [ + 34, + -31 + ], + [ + 35, + -6 + ], + [ + 36, + -2 + ], + [ + 37, + -26 + ], + [ + 38, + -13 + ], + [ + 39, + -29 + ], + [ + 40, + -19 + ], + [ + 41, + -24 + ], + [ + 42, + -21 + ], + [ + 43, + -5 + ], + [ + 44, + -3 + ], + [ + 45, + -4 + ], + [ + 46, + -5 + ], + [ + 47, + -17 + ], + [ + 48, + -4 + ], + [ + 49, + -17 + ], + [ + 50, + -9 + ], + [ + 51, + -7 + ], + [ + 52, + -6 + ], + [ + 53, + -25 + ], + [ + 54, + -21 + ], + [ + 55, + -8 + ], + [ + 56, + -12 + ], + [ + 57, + -29 + ], + [ + 58, + -7 + ], + [ + 59, + -14 + ], + [ + 60, + -20 + ], + [ + 61, + -15 + ], + [ + 62, + -11 + ], + [ + 63, + -6 + ], + [ + 64, + -22 + ], + [ + 65, + -2 + ], + [ + 66, + -1 + ], + [ + 67, + -8 + ], + [ + 68, + -14 + ], + [ + 69, + -6 + ], + [ + 70, + -16 + ], + [ + 71, + -16 + ], + [ + 72, + -3 + ], + [ + 73, + -29 + ], + [ + 74, + -15 + ], + [ + 75, + -15 + ], + [ + 76, + -9 + ], + [ + 77, + -28 + ], + [ + 78, + -30 + ], + [ + 79, + -2 + ], + [ + 80, + -30 + ], + [ + 81, + -24 + ], + [ + 82, + -21 + ], + [ + 83, + -14 + ], + [ + 84, + -3 + ], + [ + 85, + -28 + ], + [ + 86, + -13 + ], + [ + 87, + -9 + ], + [ + 88, + -18 + ], + [ + 89, + -27 + ], + [ + 90, + -17 + ], + [ + 91, + -9 + ], + [ + 92, + -4 + ], + [ + 93, + -27 + ], + [ + 94, + -10 + ], + [ + 95, + -6 + ], + [ + 96, + -11 + ], + [ + 97, + -17 + ], + [ + 98, + -10 + ], + [ + 99, + -13 + ], + [ + 100, + -26 + ], + [ + 101, + -31 + ], + [ + 102, + -24 + ], + [ + 103, + -3 + ], + [ + 104, + -19 + ], + [ + 105, + -30 + ], + [ + 106, + -11 + ], + [ + 107, + -2 + ], + [ + 108, + -17 + ], + [ + 109, + -27 + ], + [ + 110, + -26 + ], + [ + 111, + -13 + ], + [ + 112, + -8 + ], + [ + 113, + -28 + ], + [ + 114, + -26 + ], + [ + 115, + -19 + ], + [ + 116, + -16 + ], + [ + 117, + -27 + ], + [ + 118, + -30 + ], + [ + 119, + -23 + ], + [ + 120, + -25 + ], + [ + 121, + -6 + ], + [ + 122, + -15 + ], + [ + 123, + -15 + ], + [ + 124, + -25 + ], + [ + 125, + -28 + ], + [ + 126, + -26 + ], + [ + 127, + -27 + ], + [ + 128, + -15 + ], + [ + 129, + -19 + ], + [ + 130, + -3 + ], + [ + 131, + -28 + ], + [ + 132, + -19 + ], + [ + 133, + -9 + ], + [ + 134, + -31 + ], + [ + 135, + -3 + ], + [ + 136, + -21 + ], + [ + 137, + -9 + ], + [ + 138, + -20 + ], + [ + 139, + -13 + ], + [ + 140, + -13 + ], + [ + 141, + -7 + ], + [ + 142, + -4 + ], + [ + 143, + -25 + ], + [ + 144, + -2 + ], + [ + 145, + -17 + ], + [ + 146, + -16 + ], + [ + 147, + -6 + ], + [ + 148, + -24 + ], + [ + 149, + -27 + ], + [ + 150, + -26 + ], + [ + 151, + -20 + ], + [ + 152, + -18 + ], + [ + 153, + -1 + ], + [ + 154, + -10 + ], + [ + 155, + -8 + ], + [ + 156, + -1 + ], + [ + 157, + -4 + ], + [ + 158, + -24 + ], + [ + 159, + -24 + ], + [ + 160, + -2 + ], + [ + 161, + -27 + ], + [ + 162, + -21 + ], + [ + 163, + -29 + ], + [ + 164, + -26 + ], + [ + 165, + -26 + ], + [ + 166, + -7 + ], + [ + 167, + -6 + ], + [ + 168, + -21 + ], + [ + 169, + -8 + ], + [ + 170, + -16 + ], + [ + 171, + -3 + ], + [ + 172, + -17 + ], + [ + 173, + -15 + ], + [ + 174, + -5 + ], + [ + 175, + -2 + ], + [ + 176, + -27 + ], + [ + 177, + -10 + ], + [ + 178, + -16 + ], + [ + 179, + -26 + ], + [ + 180, + -11 + ], + [ + 181, + -27 + ], + [ + 182, + -19 + ], + [ + 183, + -16 + ], + [ + 184, + -23 + ], + [ + 185, + -26 + ], + [ + 186, + -17 + ], + [ + 187, + -27 + ], + [ + 188, + -31 + ], + [ + 189, + -20 + ], + [ + 190, + -8 + ], + [ + 191, + -2 + ], + [ + 192, + -19 + ], + [ + 193, + -5 + ], + [ + 194, + -10 + ], + [ + 195, + -24 + ], + [ + 196, + -31 + ], + [ + 197, + -1 + ], + [ + 198, + -15 + ], + [ + 199, + -3 + ], + [ + 200, + -8 + ], + [ + 201, + -17 + ], + [ + 202, + -18 + ], + [ + 203, + -15 + ], + [ + 204, + -14 + ], + [ + 205, + -24 + ], + [ + 206, + -12 + ], + [ + 207, + -26 + ], + [ + 208, + -11 + ], + [ + 209, + -8 + ], + [ + 210, + -14 + ], + [ + 211, + -28 + ], + [ + 212, + -6 + ], + [ + 213, + -9 + ], + [ + 214, + -29 + ], + [ + 215, + -29 + ], + [ + 216, + -17 + ], + [ + 217, + -2 + ], + [ + 218, + -14 + ], + [ + 219, + -15 + ], + [ + 220, + -2 + ], + [ + 221, + -6 + ], + [ + 222, + -3 + ], + [ + 223, + -30 + ], + [ + 224, + -30 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -1 + ], + [ + 228, + -5 + ], + [ + 229, + -3 + ], + [ + 230, + -22 + ], + [ + 231, + -7 + ], + [ + 232, + -23 + ], + [ + 233, + -4 + ], + [ + 234, + -10 + ], + [ + 235, + -26 + ], + [ + 236, + -31 + ], + [ + 237, + -6 + ], + [ + 238, + -9 + ], + [ + 239, + -13 + ], + [ + 240, + -2 + ], + [ + 241, + -18 + ], + [ + 242, + -27 + ], + [ + 243, + -21 + ], + [ + 244, + -18 + ], + [ + 245, + -12 + ], + [ + 246, + -12 + ], + [ + 247, + -19 + ], + [ + 248, + -11 + ], + [ + 249, + -16 + ], + [ + 250, + -28 + ], + [ + 251, + -14 + ], + [ + 252, + -23 + ], + [ + 253, + -26 + ], + [ + 254, + -13 + ], + [ + 255, + -27 + ], + [ + 256, + -29 + ], + [ + 257, + -29 + ], + [ + 258, + -13 + ], + [ + 259, + -25 + ], + [ + 260, + -11 + ], + [ + 261, + -6 + ], + [ + 262, + -18 + ], + [ + 263, + -13 + ], + [ + 264, + -10 + ], + [ + 265, + -24 + ], + [ + 266, + -17 + ], + [ + 267, + -22 + ], + [ + 268, + -15 + ], + [ + 269, + -12 + ], + [ + 270, + -28 + ], + [ + 271, + -24 + ], + [ + 272, + -6 + ], + [ + 273, + -5 + ], + [ + 274, + -11 + ], + [ + 275, + -15 + ], + [ + 276, + -30 + ], + [ + 277, + -15 + ], + [ + 278, + -17 + ], + [ + 279, + -28 + ], + [ + 280, + -16 + ], + [ + 281, + -27 + ], + [ + 282, + -3 + ], + [ + 283, + -1 + ], + [ + 284, + -19 + ], + [ + 285, + -13 + ], + [ + 286, + -19 + ], + [ + 287, + -17 + ], + [ + 288, + -31 + ], + [ + 289, + -12 + ], + [ + 290, + -19 + ], + [ + 291, + -5 + ], + [ + 292, + -13 + ], + [ + 293, + -25 + ], + [ + 294, + -24 + ], + [ + 295, + -27 + ], + [ + 296, + -7 + ], + [ + 297, + -7 + ], + [ + 298, + -1 + ], + [ + 299, + -15 + ], + [ + 300, + -19 + ], + [ + 301, + -13 + ], + [ + 302, + -23 + ], + [ + 303, + -21 + ], + [ + 304, + -30 + ], + [ + 305, + -11 + ], + [ + 306, + -29 + ], + [ + 307, + -5 + ], + [ + 308, + -24 + ], + [ + 309, + -20 + ], + [ + 310, + -10 + ], + [ + 311, + -15 + ], + [ + 312, + -22 + ], + [ + 313, + -11 + ], + [ + 314, + -16 + ], + [ + 315, + -1 + ], + [ + 316, + -3 + ], + [ + 317, + -17 + ], + [ + 318, + -2 + ], + [ + 319, + -5 + ], + [ + 320, + -1 + ], + [ + 321, + -1 + ], + [ + 322, + -22 + ], + [ + 323, + -11 + ], + [ + 324, + -22 + ], + [ + 325, + -28 + ], + [ + 326, + -27 + ], + [ + 327, + -9 + ], + [ + 328, + -18 + ], + [ + 329, + -28 + ], + [ + 330, + -18 + ], + [ + 331, + -4 + ], + [ + 332, + -29 + ], + [ + 333, + -11 + ], + [ + 334, + -25 + ], + [ + 335, + -18 + ], + [ + 336, + -30 + ], + [ + 337, + -10 + ], + [ + 338, + -3 + ], + [ + 339, + -29 + ], + [ + 340, + -6 + ], + [ + 341, + -4 + ], + [ + 342, + -19 + ], + [ + 343, + -5 + ], + [ + 344, + -25 + ], + [ + 345, + -24 + ], + [ + 346, + -7 + ], + [ + 347, + -6 + ], + [ + 348, + -2 + ], + [ + 349, + -14 + ], + [ + 350, + -15 + ], + [ + 351, + -28 + ], + [ + 352, + -6 + ], + [ + 353, + -12 + ], + [ + 354, + -15 + ], + [ + 355, + -23 + ], + [ + 356, + -31 + ], + [ + 357, + -25 + ], + [ + 358, + -1 + ], + [ + 359, + -30 + ], + [ + 360, + -14 + ], + [ + 361, + -6 + ], + [ + 362, + -10 + ], + [ + 363, + -19 + ], + [ + 364, + -14 + ], + [ + 365, + -23 + ], + [ + 366, + -19 + ], + [ + 367, + -21 + ], + [ + 368, + -18 + ], + [ + 369, + -20 + ], + [ + 370, + -12 + ], + [ + 371, + -13 + ], + [ + 372, + -12 + ], + [ + 373, + -3 + ], + [ + 374, + -15 + ], + [ + 375, + -19 + ], + [ + 376, + -6 + ], + [ + 377, + -29 + ], + [ + 378, + -5 + ], + [ + 379, + -21 + ], + [ + 380, + -2 + ], + [ + 381, + -1 + ], + [ + 382, + -22 + ], + [ + 383, + -13 + ], + [ + 384, + -6 + ], + [ + 385, + -10 + ], + [ + 386, + -29 + ], + [ + 387, + -21 + ], + [ + 388, + -21 + ], + [ + 389, + -31 + ], + [ + 390, + -22 + ], + [ + 391, + -9 + ], + [ + 392, + -28 + ], + [ + 393, + -5 + ], + [ + 394, + -14 + ], + [ + 395, + -12 + ], + [ + 396, + -7 + ], + [ + 397, + -23 + ], + [ + 398, + -31 + ], + [ + 399, + -16 + ], + [ + 400, + -22 + ], + [ + 401, + -29 + ], + [ + 402, + -23 + ], + [ + 403, + -10 + ], + [ + 404, + -31 + ], + [ + 405, + -10 + ], + [ + 406, + -8 + ], + [ + 407, + -16 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 29, + 10, + 19, + 2, + 17, + 20, + 1, + 2, + 9, + 10, + 4, + 22, + 8, + 14, + 6, + 29, + 23, + 3, + 9, + 21, + 17, + 14, + 12, + 25, + 23, + 31, + 2, + 24, + 29, + 18, + 27, + 13, + 17, + 16, + 31, + 6, + 2, + 26, + 13, + 29, + 19, + 24, + 21, + 5, + 3, + 4, + 5, + 17, + 4, + 17, + 9, + 7, + 6, + 25, + 21, + 8, + 12, + 29, + 7, + 14, + 20, + 15, + 11, + 6, + 22, + 2, + 1, + 8, + 14, + 6, + 16, + 16, + 3, + 29, + 15, + 15, + 9, + 28, + 30, + 2, + 30, + 24, + 21, + 14, + 3, + 28, + 13, + 9, + 18, + 27, + 17, + 9, + 4, + 27, + 10, + 6, + 11, + 17, + 10, + 13, + 26, + 31, + 24, + 3, + 19, + 30, + 11, + 2, + 17, + 27, + 26, + 13, + 8, + 28, + 26, + 19, + 16, + 27, + 30, + 23, + 25, + 6, + 15, + 15, + 25, + 28, + 26, + 27, + 15, + 19, + 3, + 28, + 19, + 9, + 31, + 3, + 21, + 9, + 20, + 13, + 13, + 7, + 4, + 25, + 2, + 17, + 16, + 6, + 24, + 27, + 26, + 20, + 18, + 1, + 10, + 8, + 1, + 4, + 24, + 24, + 2, + 27, + 21, + 29, + 26, + 26, + 7, + 6, + 21, + 8, + 16, + 3, + 17, + 15, + 5, + 2, + 27, + 10, + 16, + 26, + 11, + 27, + 19, + 16, + 23, + 26, + 17, + 27, + 31, + 20, + 8, + 2, + 19, + 5, + 10, + 24, + 31, + 1, + 15, + 3, + 8, + 17, + 18, + 15, + 14, + 24, + 12, + 26, + 11, + 8, + 14, + 28, + 6, + 9, + 29, + 29, + 17, + 2, + 14, + 15, + 2, + 6, + 3, + 30, + 30, + 7, + 14, + 1, + 5, + 3, + 22, + 7, + 23, + 4, + 10, + 26, + 31, + 6, + 9, + 13, + 2, + 18, + 27, + 21, + 18, + 12, + 12, + 19, + 11, + 16, + 28, + 14, + 23, + 26, + 13, + 27, + 29, + 29, + 13, + 25, + 11, + 6, + 18, + 13, + 10, + 24, + 17, + 22, + 15, + 12, + 28, + 24, + 6, + 5, + 11, + 15, + 30, + 15, + 17, + 28, + 16, + 27, + 3, + 1, + 19, + 13, + 19, + 17, + 31, + 12, + 19, + 5, + 13, + 25, + 24, + 27, + 7, + 7, + 1, + 15, + 19, + 13, + 23, + 21, + 30, + 11, + 29, + 5, + 24, + 20, + 10, + 15, + 22, + 11, + 16, + 1, + 3, + 17, + 2, + 5, + 1, + 1, + 22, + 11, + 22, + 28, + 27, + 9, + 18, + 28, + 18, + 4, + 29, + 11, + 25, + 18, + 30, + 10, + 3, + 29, + 6, + 4, + 19, + 5, + 25, + 24, + 7, + 6, + 2, + 14, + 15, + 28, + 6, + 12, + 15, + 23, + 31, + 25, + 1, + 30, + 14, + 6, + 10, + 19, + 14, + 23, + 19, + 21, + 18, + 20, + 12, + 13, + 12, + 3, + 15, + 19, + 6, + 29, + 5, + 21, + 2, + 1, + 22, + 13, + 6, + 10, + 29, + 21, + 21, + 31, + 22, + 9, + 28, + 5, + 14, + 12, + 7, + 23, + 31, + 16, + 22, + 29, + 23, + 10, + 31, + 10, + 8, + 16 + ] + ], + "profits": [ + 48, + 59, + 13, + 76, + 33, + 76, + 100, + 26, + 92, + 20, + 15, + 7, + 31, + 49, + 11, + 46, + 57, + 63, + 93, + 8, + 63, + 24, + 31, + 24, + 72, + 27, + 6, + 93, + 1, + 70, + 100, + 61, + 5, + 53, + 40, + 25, + 28, + 90, + 68, + 81, + 38, + 55, + 75, + 93, + 88, + 90, + 59, + 80, + 91, + 65, + 15, + 33, + 4, + 11, + 60, + 49, + 89, + 99, + 20, + 96, + 100, + 8, + 45, + 3, + 85, + 62, + 81, + 64, + 19, + 81, + 46, + 64, + 79, + 15, + 9, + 30, + 81, + 94, + 22, + 6, + 70, + 8, + 73, + 64, + 1, + 14, + 87, + 47, + 45, + 96, + 100, + 7, + 28, + 25, + 8, + 20, + 31, + 36, + 54, + 36, + 83, + 79, + 58, + 5, + 72, + 99, + 40, + 5, + 60, + 43, + 47, + 2, + 72, + 67, + 44, + 74, + 57, + 63, + 18, + 26, + 59, + 77, + 22, + 18, + 45, + 41, + 97, + 24, + 7, + 62, + 76, + 63, + 35, + 91, + 22, + 23, + 9, + 76, + 99, + 18, + 45, + 4, + 92, + 58, + 89, + 59, + 63, + 93, + 53, + 78, + 72, + 56, + 35, + 48, + 85, + 10, + 59, + 43, + 25, + 8, + 50, + 53, + 83, + 62, + 39, + 64, + 63, + 69, + 87, + 95, + 76, + 28, + 66, + 83, + 87, + 47, + 20, + 39, + 25, + 16, + 35, + 51, + 58, + 27, + 32, + 33, + 25, + 95, + 41, + 76, + 14, + 43, + 13, + 49, + 74, + 86, + 84, + 27, + 44, + 34, + 31, + 61, + 66, + 7, + 72, + 97, + 7, + 95, + 7, + 99, + 87, + 69, + 62, + 61, + 70, + 52, + 51, + 41, + 61, + 34, + 69, + 24, + 74, + 1, + 66, + 96, + 85, + 63, + 25, + 82, + 67, + 100, + 52, + 73, + 48, + 32, + 48, + 59, + 54, + 3, + 61, + 62, + 67, + 17, + 11, + 41, + 91, + 18, + 54, + 42, + 22, + 52, + 78, + 87, + 36, + 40, + 1, + 91, + 80, + 30, + 17, + 73, + 97, + 38, + 13, + 69, + 58, + 83, + 64, + 55, + 20, + 88, + 18, + 20, + 24, + 10, + 3, + 70, + 87, + 82, + 78, + 16, + 53, + 15, + 47, + 19, + 66, + 71, + 67, + 8, + 65, + 86, + 29, + 94, + 22, + 79, + 11, + 16, + 98, + 71, + 95, + 34, + 71, + 80, + 2, + 71, + 93, + 54, + 24, + 56, + 65, + 54, + 66, + 18, + 49, + 13, + 95, + 17, + 47, + 59, + 99, + 87, + 14, + 10, + 3, + 98, + 28, + 86, + 44, + 30, + 11, + 61, + 72, + 74, + 56, + 28, + 36, + 56, + 98, + 14, + 55, + 42, + 9, + 72, + 61, + 83, + 49, + 80, + 70, + 63, + 81, + 64, + 10, + 62, + 36, + 14, + 2, + 74, + 92, + 83, + 38, + 89, + 75, + 54, + 56, + 5, + 18, + 16, + 20, + 18, + 46, + 92, + 1, + 50, + 44, + 39, + 67, + 37, + 97, + 60, + 11, + 86, + 22, + 46, + 43, + 33, + 67, + 97, + 9, + 86, + 78, + 89, + 74, + 94, + 60, + 58, + 40, + 68, + 96, + 57, + 9, + 51, + 57, + 19, + 6, + 25, + 24, + 67 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "fe7cbd8a86cab4ecbf283f0cd1d56180bf473b46e6794bfbb57f54ab39fa2b18", + "txt_sha256": "4268232dd470345470f6ee1eb620b04653772b822da383900de75e325c7603e3" + }, + { + "id": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "model": { + "id": "knapsack_correlated_408", + "category": "knapsack", + "family": "capacity_correlated", + "variant": "correlated", + "kind": "binary", + "tier": "adaptive", + "tier_size": 408, + "natural_size": 408, + "seed": 20260907, + "generator_version": "boundary-prefix-v1", + "prefix_policy": "preserve old master blocks, then extend the same seeded stream", + "n": 408, + "c": [ + -33, + -33, + -17, + -35, + -33, + -19, + -36, + -7, + -33, + -20, + -30, + -24, + -4, + -12, + -4, + -11, + -3, + -10, + -14, + -10, + -18, + -11, + -7, + -13, + -13, + -10, + -20, + -8, + -21, + -33, + -27, + -12, + -9, + -17, + -22, + -18, + -17, + -13, + -3, + -16, + -38, + -20, + -21, + -26, + -6, + -36, + -19, + -2, + -21, + -17, + -24, + -32, + -35, + -13, + -31, + -19, + -21, + -26, + -7, + -25, + -37, + -23, + -21, + -39, + -5, + -17, + -18, + -7, + -27, + -27, + -23, + -22, + -34, + -37, + -3, + -35, + -3, + -12, + -25, + -29, + -20, + -33, + -26, + -28, + -23, + -6, + -8, + -27, + -24, + -14, + -22, + -28, + -30, + -22, + -38, + -32, + -16, + -29, + -7, + -24, + -20, + -29, + -25, + -28, + -16, + -28, + -25, + -26, + -4, + -30, + -23, + -29, + -21, + -23, + -10, + -23, + -17, + -32, + -18, + -29, + -36, + -8, + -16, + -30, + -24, + -12, + -30, + -16, + -6, + -24, + -30, + -36, + -17, + -34, + -16, + -18, + -10, + -31, + -7, + -34, + -30, + -29, + -24, + -27, + -13, + -31, + -19, + -31, + -24, + -10, + -35, + -17, + -20, + -21, + -15, + -17, + -28, + -33, + -24, + -17, + -29, + -18, + -14, + -6, + -13, + -3, + -36, + -19, + -12, + -39, + -23, + -20, + -11, + -19, + -31, + -5, + -35, + -27, + -12, + -6, + -32, + -30, + -29, + -29, + -33, + -40, + -29, + -9, + -37, + -25, + -29, + -13, + -29, + -32, + -26, + -24, + -30, + -32, + -6, + -18, + -33, + -38, + -6, + -18, + -12, + -5, + -17, + -17, + -14, + -23, + -38, + -28, + -16, + -15, + -23, + -9, + -34, + -31, + -21, + -28, + -26, + -23, + -28, + -28, + -15, + -14, + -15, + -29, + -35, + -10, + -6, + -29, + -19, + -22, + -27, + -33, + -35, + -26, + -32, + -17, + -22, + -29, + -22, + -18, + -29, + -16, + -31, + -7, + -29, + -11, + -18, + -10, + -37, + -29, + -26, + -30, + -33, + -13, + -32, + -16, + -7, + -31, + -34, + -7, + -11, + -18, + -31, + -20, + -10, + -24, + -9, + -27, + -15, + -31, + -12, + -31, + -25, + -11, + -23, + -14, + -2, + -33, + -36, + -28, + -16, + -12, + -14, + -14, + -32, + -5, + -26, + -4, + -22, + -30, + -25, + -14, + -34, + -10, + -19, + -10, + -12, + -7, + -33, + -9, + -14, + -31, + -32, + -5, + -3, + -11, + -14, + -36, + -33, + -7, + -21, + -3, + -34, + -35, + -11, + -14, + -27, + -3, + -15, + -27, + -25, + -20, + -15, + -17, + -21, + -8, + -31, + -7, + -19, + -38, + -19, + -16, + -4, + -14, + -27, + -16, + -10, + -34, + -41, + -37, + -12, + -28, + -25, + -30, + -17, + -26, + -13, + -24, + -9, + -4, + -12, + -9, + -22, + -29, + -13, + -24, + -18, + -21, + -17, + -19, + -20, + -26, + -8, + -22, + -12, + -34, + -19, + -18, + -27, + -16, + -35, + -9, + -14, + -40, + -38, + -35, + -15, + -27, + -22, + -10, + -22, + -35, + -15, + -8, + -23, + -19, + -9, + -26, + -38, + -24, + -27, + -16, + -12, + -29, + -16, + -26, + -25, + -23, + -27, + -28, + -14, + -30, + -22, + -19 + ], + "rows": [ + { + "b": -2448, + "a": [ + [ + 0, + -30 + ], + [ + 1, + -30 + ], + [ + 2, + -14 + ], + [ + 3, + -26 + ], + [ + 4, + -30 + ], + [ + 5, + -15 + ], + [ + 6, + -28 + ], + [ + 7, + -4 + ], + [ + 8, + -31 + ], + [ + 9, + -12 + ], + [ + 10, + -26 + ], + [ + 11, + -19 + ], + [ + 12, + -1 + ], + [ + 13, + -12 + ], + [ + 14, + -4 + ], + [ + 15, + -2 + ], + [ + 16, + -1 + ], + [ + 17, + -4 + ], + [ + 18, + -13 + ], + [ + 19, + -1 + ], + [ + 20, + -9 + ], + [ + 21, + -3 + ], + [ + 22, + -4 + ], + [ + 23, + -11 + ], + [ + 24, + -8 + ], + [ + 25, + -2 + ], + [ + 26, + -16 + ], + [ + 27, + -4 + ], + [ + 28, + -15 + ], + [ + 29, + -31 + ], + [ + 30, + -24 + ], + [ + 31, + -7 + ], + [ + 32, + -1 + ], + [ + 33, + -9 + ], + [ + 34, + -12 + ], + [ + 35, + -17 + ], + [ + 36, + -12 + ], + [ + 37, + -3 + ], + [ + 38, + -3 + ], + [ + 39, + -15 + ], + [ + 40, + -31 + ], + [ + 41, + -10 + ], + [ + 42, + -19 + ], + [ + 43, + -24 + ], + [ + 44, + -4 + ], + [ + 45, + -28 + ], + [ + 46, + -11 + ], + [ + 47, + -2 + ], + [ + 48, + -20 + ], + [ + 49, + -15 + ], + [ + 50, + -21 + ], + [ + 51, + -27 + ], + [ + 52, + -27 + ], + [ + 53, + -11 + ], + [ + 54, + -30 + ], + [ + 55, + -15 + ], + [ + 56, + -12 + ], + [ + 57, + -22 + ], + [ + 58, + -2 + ], + [ + 59, + -21 + ], + [ + 60, + -31 + ], + [ + 61, + -23 + ], + [ + 62, + -16 + ], + [ + 63, + -30 + ], + [ + 64, + -3 + ], + [ + 65, + -12 + ], + [ + 66, + -9 + ], + [ + 67, + -3 + ], + [ + 68, + -21 + ], + [ + 69, + -20 + ], + [ + 70, + -23 + ], + [ + 71, + -19 + ], + [ + 72, + -30 + ], + [ + 73, + -29 + ], + [ + 74, + -3 + ], + [ + 75, + -29 + ], + [ + 76, + -1 + ], + [ + 77, + -11 + ], + [ + 78, + -21 + ], + [ + 79, + -21 + ], + [ + 80, + -20 + ], + [ + 81, + -23 + ], + [ + 82, + -18 + ], + [ + 83, + -27 + ], + [ + 84, + -23 + ], + [ + 85, + -1 + ], + [ + 86, + -2 + ], + [ + 87, + -24 + ], + [ + 88, + -16 + ], + [ + 89, + -10 + ], + [ + 90, + -19 + ], + [ + 91, + -18 + ], + [ + 92, + -23 + ], + [ + 93, + -13 + ], + [ + 94, + -29 + ], + [ + 95, + -25 + ], + [ + 96, + -14 + ], + [ + 97, + -24 + ], + [ + 98, + -5 + ], + [ + 99, + -18 + ], + [ + 100, + -16 + ], + [ + 101, + -24 + ], + [ + 102, + -23 + ], + [ + 103, + -26 + ], + [ + 104, + -14 + ], + [ + 105, + -19 + ], + [ + 106, + -24 + ], + [ + 107, + -16 + ], + [ + 108, + -3 + ], + [ + 109, + -22 + ], + [ + 110, + -17 + ], + [ + 111, + -25 + ], + [ + 112, + -11 + ], + [ + 113, + -14 + ], + [ + 114, + -10 + ], + [ + 115, + -16 + ], + [ + 116, + -10 + ], + [ + 117, + -25 + ], + [ + 118, + -11 + ], + [ + 119, + -21 + ], + [ + 120, + -26 + ], + [ + 121, + -6 + ], + [ + 122, + -11 + ], + [ + 123, + -23 + ], + [ + 124, + -19 + ], + [ + 125, + -11 + ], + [ + 126, + -22 + ], + [ + 127, + -6 + ], + [ + 128, + -3 + ], + [ + 129, + -14 + ], + [ + 130, + -26 + ], + [ + 131, + -30 + ], + [ + 132, + -7 + ], + [ + 133, + -27 + ], + [ + 134, + -13 + ], + [ + 135, + -8 + ], + [ + 136, + -10 + ], + [ + 137, + -25 + ], + [ + 138, + -6 + ], + [ + 139, + -27 + ], + [ + 140, + -22 + ], + [ + 141, + -20 + ], + [ + 142, + -23 + ], + [ + 143, + -20 + ], + [ + 144, + -3 + ], + [ + 145, + -27 + ], + [ + 146, + -14 + ], + [ + 147, + -27 + ], + [ + 148, + -22 + ], + [ + 149, + -3 + ], + [ + 150, + -27 + ], + [ + 151, + -10 + ], + [ + 152, + -19 + ], + [ + 153, + -18 + ], + [ + 154, + -12 + ], + [ + 155, + -12 + ], + [ + 156, + -23 + ], + [ + 157, + -25 + ], + [ + 158, + -22 + ], + [ + 159, + -13 + ], + [ + 160, + -28 + ], + [ + 161, + -9 + ], + [ + 162, + -7 + ], + [ + 163, + -2 + ], + [ + 164, + -11 + ], + [ + 165, + -2 + ], + [ + 166, + -26 + ], + [ + 167, + -9 + ], + [ + 168, + -8 + ], + [ + 169, + -31 + ], + [ + 170, + -18 + ], + [ + 171, + -17 + ], + [ + 172, + -6 + ], + [ + 173, + -19 + ], + [ + 174, + -29 + ], + [ + 175, + -5 + ], + [ + 176, + -27 + ], + [ + 177, + -17 + ], + [ + 178, + -11 + ], + [ + 179, + -1 + ], + [ + 180, + -22 + ], + [ + 181, + -26 + ], + [ + 182, + -25 + ], + [ + 183, + -28 + ], + [ + 184, + -26 + ], + [ + 185, + -31 + ], + [ + 186, + -22 + ], + [ + 187, + -1 + ], + [ + 188, + -29 + ], + [ + 189, + -19 + ], + [ + 190, + -28 + ], + [ + 191, + -6 + ], + [ + 192, + -20 + ], + [ + 193, + -25 + ], + [ + 194, + -19 + ], + [ + 195, + -14 + ], + [ + 196, + -27 + ], + [ + 197, + -25 + ], + [ + 198, + -3 + ], + [ + 199, + -16 + ], + [ + 200, + -24 + ], + [ + 201, + -31 + ], + [ + 202, + -2 + ], + [ + 203, + -14 + ], + [ + 204, + -9 + ], + [ + 205, + -5 + ], + [ + 206, + -13 + ], + [ + 207, + -10 + ], + [ + 208, + -9 + ], + [ + 209, + -22 + ], + [ + 210, + -30 + ], + [ + 211, + -24 + ], + [ + 212, + -7 + ], + [ + 213, + -14 + ], + [ + 214, + -20 + ], + [ + 215, + -8 + ], + [ + 216, + -27 + ], + [ + 217, + -21 + ], + [ + 218, + -21 + ], + [ + 219, + -22 + ], + [ + 220, + -17 + ], + [ + 221, + -19 + ], + [ + 222, + -18 + ], + [ + 223, + -22 + ], + [ + 224, + -13 + ], + [ + 225, + -7 + ], + [ + 226, + -14 + ], + [ + 227, + -26 + ], + [ + 228, + -28 + ], + [ + 229, + -6 + ], + [ + 230, + -3 + ], + [ + 231, + -29 + ], + [ + 232, + -11 + ], + [ + 233, + -16 + ], + [ + 234, + -22 + ], + [ + 235, + -28 + ], + [ + 236, + -26 + ], + [ + 237, + -21 + ], + [ + 238, + -29 + ], + [ + 239, + -10 + ], + [ + 240, + -22 + ], + [ + 241, + -20 + ], + [ + 242, + -17 + ], + [ + 243, + -18 + ], + [ + 244, + -27 + ], + [ + 245, + -9 + ], + [ + 246, + -26 + ], + [ + 247, + -1 + ], + [ + 248, + -25 + ], + [ + 249, + -11 + ], + [ + 250, + -12 + ], + [ + 251, + -6 + ], + [ + 252, + -30 + ], + [ + 253, + -24 + ], + [ + 254, + -23 + ], + [ + 255, + -23 + ], + [ + 256, + -29 + ], + [ + 257, + -3 + ], + [ + 258, + -27 + ], + [ + 259, + -6 + ], + [ + 260, + -5 + ], + [ + 261, + -22 + ], + [ + 262, + -26 + ], + [ + 263, + -5 + ], + [ + 264, + -10 + ], + [ + 265, + -9 + ], + [ + 266, + -27 + ], + [ + 267, + -17 + ], + [ + 268, + -7 + ], + [ + 269, + -23 + ], + [ + 270, + -1 + ], + [ + 271, + -17 + ], + [ + 272, + -8 + ], + [ + 273, + -23 + ], + [ + 274, + -6 + ], + [ + 275, + -31 + ], + [ + 276, + -18 + ], + [ + 277, + -11 + ], + [ + 278, + -14 + ], + [ + 279, + -13 + ], + [ + 280, + -2 + ], + [ + 281, + -29 + ], + [ + 282, + -29 + ], + [ + 283, + -21 + ], + [ + 284, + -7 + ], + [ + 285, + -6 + ], + [ + 286, + -6 + ], + [ + 287, + -12 + ], + [ + 288, + -31 + ], + [ + 289, + -4 + ], + [ + 290, + -26 + ], + [ + 291, + -1 + ], + [ + 292, + -21 + ], + [ + 293, + -26 + ], + [ + 294, + -15 + ], + [ + 295, + -6 + ], + [ + 296, + -28 + ], + [ + 297, + -2 + ], + [ + 298, + -19 + ], + [ + 299, + -9 + ], + [ + 300, + -3 + ], + [ + 301, + -7 + ], + [ + 302, + -25 + ], + [ + 303, + -9 + ], + [ + 304, + -7 + ], + [ + 305, + -27 + ], + [ + 306, + -25 + ], + [ + 307, + -2 + ], + [ + 308, + -1 + ], + [ + 309, + -7 + ], + [ + 310, + -12 + ], + [ + 311, + -26 + ], + [ + 312, + -29 + ], + [ + 313, + -5 + ], + [ + 314, + -17 + ], + [ + 315, + -1 + ], + [ + 316, + -27 + ], + [ + 317, + -29 + ], + [ + 318, + -10 + ], + [ + 319, + -13 + ], + [ + 320, + -19 + ], + [ + 321, + -1 + ], + [ + 322, + -14 + ], + [ + 323, + -19 + ], + [ + 324, + -23 + ], + [ + 325, + -15 + ], + [ + 326, + -13 + ], + [ + 327, + -12 + ], + [ + 328, + -16 + ], + [ + 329, + -6 + ], + [ + 330, + -25 + ], + [ + 331, + -7 + ], + [ + 332, + -13 + ], + [ + 333, + -31 + ], + [ + 334, + -14 + ], + [ + 335, + -15 + ], + [ + 336, + -4 + ], + [ + 337, + -6 + ], + [ + 338, + -19 + ], + [ + 339, + -10 + ], + [ + 340, + -1 + ], + [ + 341, + -26 + ], + [ + 342, + -31 + ], + [ + 343, + -29 + ], + [ + 344, + -6 + ], + [ + 345, + -21 + ], + [ + 346, + -15 + ], + [ + 347, + -20 + ], + [ + 348, + -11 + ], + [ + 349, + -21 + ], + [ + 350, + -8 + ], + [ + 351, + -16 + ], + [ + 352, + -2 + ], + [ + 353, + -2 + ], + [ + 354, + -3 + ], + [ + 355, + -1 + ], + [ + 356, + -15 + ], + [ + 357, + -26 + ], + [ + 358, + -8 + ], + [ + 359, + -19 + ], + [ + 360, + -14 + ], + [ + 361, + -13 + ], + [ + 362, + -12 + ], + [ + 363, + -19 + ], + [ + 364, + -16 + ], + [ + 365, + -26 + ], + [ + 366, + -8 + ], + [ + 367, + -21 + ], + [ + 368, + -2 + ], + [ + 369, + -26 + ], + [ + 370, + -10 + ], + [ + 371, + -13 + ], + [ + 372, + -18 + ], + [ + 373, + -16 + ], + [ + 374, + -31 + ], + [ + 375, + -8 + ], + [ + 376, + -4 + ], + [ + 377, + -31 + ], + [ + 378, + -28 + ], + [ + 379, + -26 + ], + [ + 380, + -8 + ], + [ + 381, + -23 + ], + [ + 382, + -13 + ], + [ + 383, + -9 + ], + [ + 384, + -17 + ], + [ + 385, + -28 + ], + [ + 386, + -9 + ], + [ + 387, + -5 + ], + [ + 388, + -21 + ], + [ + 389, + -9 + ], + [ + 390, + -5 + ], + [ + 391, + -16 + ], + [ + 392, + -30 + ], + [ + 393, + -17 + ], + [ + 394, + -27 + ], + [ + 395, + -13 + ], + [ + 396, + -10 + ], + [ + 397, + -20 + ], + [ + 398, + -14 + ], + [ + 399, + -24 + ], + [ + 400, + -23 + ], + [ + 401, + -23 + ], + [ + 402, + -22 + ], + [ + 403, + -26 + ], + [ + 404, + -12 + ], + [ + 405, + -30 + ], + [ + 406, + -12 + ], + [ + 407, + -9 + ] + ] + } + ], + "parameters": { + "weights": [ + [ + 30, + 30, + 14, + 26, + 30, + 15, + 28, + 4, + 31, + 12, + 26, + 19, + 1, + 12, + 4, + 2, + 1, + 4, + 13, + 1, + 9, + 3, + 4, + 11, + 8, + 2, + 16, + 4, + 15, + 31, + 24, + 7, + 1, + 9, + 12, + 17, + 12, + 3, + 3, + 15, + 31, + 10, + 19, + 24, + 4, + 28, + 11, + 2, + 20, + 15, + 21, + 27, + 27, + 11, + 30, + 15, + 12, + 22, + 2, + 21, + 31, + 23, + 16, + 30, + 3, + 12, + 9, + 3, + 21, + 20, + 23, + 19, + 30, + 29, + 3, + 29, + 1, + 11, + 21, + 21, + 20, + 23, + 18, + 27, + 23, + 1, + 2, + 24, + 16, + 10, + 19, + 18, + 23, + 13, + 29, + 25, + 14, + 24, + 5, + 18, + 16, + 24, + 23, + 26, + 14, + 19, + 24, + 16, + 3, + 22, + 17, + 25, + 11, + 14, + 10, + 16, + 10, + 25, + 11, + 21, + 26, + 6, + 11, + 23, + 19, + 11, + 22, + 6, + 3, + 14, + 26, + 30, + 7, + 27, + 13, + 8, + 10, + 25, + 6, + 27, + 22, + 20, + 23, + 20, + 3, + 27, + 14, + 27, + 22, + 3, + 27, + 10, + 19, + 18, + 12, + 12, + 23, + 25, + 22, + 13, + 28, + 9, + 7, + 2, + 11, + 2, + 26, + 9, + 8, + 31, + 18, + 17, + 6, + 19, + 29, + 5, + 27, + 17, + 11, + 1, + 22, + 26, + 25, + 28, + 26, + 31, + 22, + 1, + 29, + 19, + 28, + 6, + 20, + 25, + 19, + 14, + 27, + 25, + 3, + 16, + 24, + 31, + 2, + 14, + 9, + 5, + 13, + 10, + 9, + 22, + 30, + 24, + 7, + 14, + 20, + 8, + 27, + 21, + 21, + 22, + 17, + 19, + 18, + 22, + 13, + 7, + 14, + 26, + 28, + 6, + 3, + 29, + 11, + 16, + 22, + 28, + 26, + 21, + 29, + 10, + 22, + 20, + 17, + 18, + 27, + 9, + 26, + 1, + 25, + 11, + 12, + 6, + 30, + 24, + 23, + 23, + 29, + 3, + 27, + 6, + 5, + 22, + 26, + 5, + 10, + 9, + 27, + 17, + 7, + 23, + 1, + 17, + 8, + 23, + 6, + 31, + 18, + 11, + 14, + 13, + 2, + 29, + 29, + 21, + 7, + 6, + 6, + 12, + 31, + 4, + 26, + 1, + 21, + 26, + 15, + 6, + 28, + 2, + 19, + 9, + 3, + 7, + 25, + 9, + 7, + 27, + 25, + 2, + 1, + 7, + 12, + 26, + 29, + 5, + 17, + 1, + 27, + 29, + 10, + 13, + 19, + 1, + 14, + 19, + 23, + 15, + 13, + 12, + 16, + 6, + 25, + 7, + 13, + 31, + 14, + 15, + 4, + 6, + 19, + 10, + 1, + 26, + 31, + 29, + 6, + 21, + 15, + 20, + 11, + 21, + 8, + 16, + 2, + 2, + 3, + 1, + 15, + 26, + 8, + 19, + 14, + 13, + 12, + 19, + 16, + 26, + 8, + 21, + 2, + 26, + 10, + 13, + 18, + 16, + 31, + 8, + 4, + 31, + 28, + 26, + 8, + 23, + 13, + 9, + 17, + 28, + 9, + 5, + 21, + 9, + 5, + 16, + 30, + 17, + 27, + 13, + 10, + 20, + 14, + 24, + 23, + 23, + 22, + 26, + 12, + 30, + 12, + 9 + ] + ], + "profits": [ + 33, + 33, + 17, + 35, + 33, + 19, + 36, + 7, + 33, + 20, + 30, + 24, + 4, + 12, + 4, + 11, + 3, + 10, + 14, + 10, + 18, + 11, + 7, + 13, + 13, + 10, + 20, + 8, + 21, + 33, + 27, + 12, + 9, + 17, + 22, + 18, + 17, + 13, + 3, + 16, + 38, + 20, + 21, + 26, + 6, + 36, + 19, + 2, + 21, + 17, + 24, + 32, + 35, + 13, + 31, + 19, + 21, + 26, + 7, + 25, + 37, + 23, + 21, + 39, + 5, + 17, + 18, + 7, + 27, + 27, + 23, + 22, + 34, + 37, + 3, + 35, + 3, + 12, + 25, + 29, + 20, + 33, + 26, + 28, + 23, + 6, + 8, + 27, + 24, + 14, + 22, + 28, + 30, + 22, + 38, + 32, + 16, + 29, + 7, + 24, + 20, + 29, + 25, + 28, + 16, + 28, + 25, + 26, + 4, + 30, + 23, + 29, + 21, + 23, + 10, + 23, + 17, + 32, + 18, + 29, + 36, + 8, + 16, + 30, + 24, + 12, + 30, + 16, + 6, + 24, + 30, + 36, + 17, + 34, + 16, + 18, + 10, + 31, + 7, + 34, + 30, + 29, + 24, + 27, + 13, + 31, + 19, + 31, + 24, + 10, + 35, + 17, + 20, + 21, + 15, + 17, + 28, + 33, + 24, + 17, + 29, + 18, + 14, + 6, + 13, + 3, + 36, + 19, + 12, + 39, + 23, + 20, + 11, + 19, + 31, + 5, + 35, + 27, + 12, + 6, + 32, + 30, + 29, + 29, + 33, + 40, + 29, + 9, + 37, + 25, + 29, + 13, + 29, + 32, + 26, + 24, + 30, + 32, + 6, + 18, + 33, + 38, + 6, + 18, + 12, + 5, + 17, + 17, + 14, + 23, + 38, + 28, + 16, + 15, + 23, + 9, + 34, + 31, + 21, + 28, + 26, + 23, + 28, + 28, + 15, + 14, + 15, + 29, + 35, + 10, + 6, + 29, + 19, + 22, + 27, + 33, + 35, + 26, + 32, + 17, + 22, + 29, + 22, + 18, + 29, + 16, + 31, + 7, + 29, + 11, + 18, + 10, + 37, + 29, + 26, + 30, + 33, + 13, + 32, + 16, + 7, + 31, + 34, + 7, + 11, + 18, + 31, + 20, + 10, + 24, + 9, + 27, + 15, + 31, + 12, + 31, + 25, + 11, + 23, + 14, + 2, + 33, + 36, + 28, + 16, + 12, + 14, + 14, + 32, + 5, + 26, + 4, + 22, + 30, + 25, + 14, + 34, + 10, + 19, + 10, + 12, + 7, + 33, + 9, + 14, + 31, + 32, + 5, + 3, + 11, + 14, + 36, + 33, + 7, + 21, + 3, + 34, + 35, + 11, + 14, + 27, + 3, + 15, + 27, + 25, + 20, + 15, + 17, + 21, + 8, + 31, + 7, + 19, + 38, + 19, + 16, + 4, + 14, + 27, + 16, + 10, + 34, + 41, + 37, + 12, + 28, + 25, + 30, + 17, + 26, + 13, + 24, + 9, + 4, + 12, + 9, + 22, + 29, + 13, + 24, + 18, + 21, + 17, + 19, + 20, + 26, + 8, + 22, + 12, + 34, + 19, + 18, + 27, + 16, + 35, + 9, + 14, + 40, + 38, + 35, + 15, + 27, + 22, + 10, + 22, + 35, + 15, + 8, + 23, + 19, + 9, + 26, + 38, + 24, + 27, + 16, + 12, + 29, + 16, + 26, + 25, + 23, + 27, + 28, + 14, + 30, + 22, + 19 + ], + "capacities": [ + 2448 + ], + "capacity": 2448, + "table_cells": 1001641, + "dp_eligible": false, + "dp_eligibility_reason": "full_table_cell_cap_exceeded" + }, + "dimensions": { + "input_variables": 408, + "variables": 408, + "rows": 1, + "nonzeros": 408, + "globals": 0 + }, + "input_variables": 408, + "model_variables": 408, + "modelled_variables": 408, + "size_unit": "items" + }, + "json_sha256": "19e138a83cd2b42ee8c86a6bb443e238de55822be31dc03c918c7d964b156990", + "txt_sha256": "3add2fcfea9b3d807e0fe6cabef9a71b057f77d811778ee20571b815532354e0" + } + ], + "records": [ + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "before", + "repetition": 0, + "route": "native", + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.05689887500011537, + "offset_end": 0.07648025000071357, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2508, + "stderr_bytes_observed": 98173, + "external_seconds": 0.01938479099953838, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000456583, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.8583e-05, + "solve_seconds": 0.000456583, + "backend_solve_seconds": 0.000454083, + "driver_seconds": 0.0005405, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-8-uncorrelated", + "category": "knapsack", + "size": 8, + "variant": "uncorrelated", + "cohort": "after", + "repetition": 0, + "route": "native", + "probe": true, + "status": "optimal", + "passed": true, + "offset_start": 0.08818970900028944, + "offset_end": 0.10595779200048128, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2486, + "stderr_bytes_observed": 98173, + "external_seconds": 0.01749999999992724, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.000107208, + "objective": -337, + "best_bound": -337, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 8, + "model_rows": 1, + "model_globals": 0, + "objective": -337, + "best_bound": -337, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 4.0958e-05, + "solve_seconds": 0.000107208, + "backend_solve_seconds": 0.000104708, + "driver_seconds": 0.000163208, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 0.1227136249999603, + "offset_end": 10.13397279200035, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3719, + "stderr_bytes_observed": 0, + "external_seconds": 10.011032874999728, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000142625, + "objective": 219, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 219, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000192958, + "solve_seconds": 10.000142625, + "backend_solve_seconds": 10.000139167, + "driver_seconds": 10.000358708, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 10.140262124999936, + "offset_end": 10.184802458999911, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3813, + "stderr_bytes_observed": 0, + "external_seconds": 0.044419249999918975, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.032597833, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000252833, + "solve_seconds": 0.032597833, + "backend_solve_seconds": 0.03255075, + "driver_seconds": 0.03287275, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000547417, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 4004, + "conditional_checks": 179852, + "variable_fixings": 22014, + "variable_bound_tightenings": 22014, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 10.191230667000127, + "offset_end": 10.232837500000642, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4066, + "stderr_bytes_observed": 0, + "external_seconds": 0.04150245800065022, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.031924083, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000193708, + "solve_seconds": 0.031924083, + "backend_solve_seconds": 0.031878666, + "driver_seconds": 0.032137, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 2, + "lp_seconds": 0.000347209, + "valid_bounds": 2, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 4004, + "conditional_checks": 179852, + "variable_fixings": 22014, + "variable_bound_tightenings": 22014, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 111451, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000279125 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 10.239834209000037, + "offset_end": 10.312378042000091, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4069, + "stderr_bytes_observed": 0, + "external_seconds": 0.07210558299993863, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.061109167, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000231833, + "solve_seconds": 0.061109167, + "backend_solve_seconds": 0.061062375, + "driver_seconds": 0.061355917, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 595, + "lp_seconds": 0.04475849799999998, + "valid_bounds": 595, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1150, + "conditional_checks": 75547, + "variable_fixings": 4611, + "variable_bound_tightenings": 4611, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 111451, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000324209 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 10.319484000000557, + "offset_end": 20.331145084000127, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4040, + "stderr_bytes_observed": 0, + "external_seconds": 10.011455957999715, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000100208, + "objective": 177, + "best_bound": 0, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 177, + "best_bound": 0, + "absolute_gap": 177, + "relative_gap": 1, + "build_seconds": 0.000196208, + "solve_seconds": 10.000100208, + "backend_solve_seconds": 10.00009725, + "driver_seconds": 10.000319792, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 2138613, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 1069306, + "budget_nodes": 2138741, + "peak_open_nodes": 18, + "unresolved_regions": 10, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 1069306, + "manual_splits": 27, + "fallback_decisions": 1069279, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 62, + "failed_directions": 0, + "reliable_candidates": 10, + "probe_propagations": 2996, + "budget_nodes": 2138741, + "work": 100000, + "history_entries": 63, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 20.338987375000215, + "offset_end": 20.42409945899999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4352, + "stderr_bytes_observed": 0, + "external_seconds": 0.08488154099995882, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0734365, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000230292, + "solve_seconds": 0.0734365, + "backend_solve_seconds": 0.073393541, + "driver_seconds": 0.073681333, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 845, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 422, + "budget_nodes": 973, + "peak_open_nodes": 18, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 623, + "lp_seconds": 0.049660295, + "valid_bounds": 623, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 976, + "conditional_checks": 57355, + "variable_fixings": 5818, + "variable_bound_tightenings": 5818, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 111451, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000323208 + } + }, + "branching": { + "requested": true, + "decisions": 422, + "manual_splits": 19, + "fallback_decisions": 403, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 69, + "failed_directions": 0, + "reliable_candidates": 2, + "probe_propagations": 6388, + "budget_nodes": 973, + "work": 100000, + "history_entries": 63, + "probe_lp_calls": 62, + "probe_lp_seconds": 0.005882287999999998 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "assignment-18-single", + "category": "assignment", + "size": 18, + "variant": "single", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 20.432659250000142, + "offset_end": 20.517103791999943, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4639, + "stderr_bytes_observed": 0, + "external_seconds": 0.08419591700021556, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.072675167, + "objective": 150, + "best_bound": 150, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 324, + "model_rows": 72, + "model_globals": 0, + "objective": 150, + "best_bound": 150, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000219583, + "solve_seconds": 0.072675167, + "backend_solve_seconds": 0.072629708, + "driver_seconds": 0.072910875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 845, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 422, + "budget_nodes": 1050, + "peak_open_nodes": 18, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 623, + "lp_seconds": 0.04842638800000006, + "valid_bounds": 623, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 976, + "conditional_checks": 57355, + "variable_fixings": 5818, + "variable_bound_tightenings": 5818, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 111451, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000301958 + } + }, + "branching": { + "requested": true, + "decisions": 422, + "manual_splits": 19, + "fallback_decisions": 403, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 69, + "failed_directions": 0, + "reliable_candidates": 2, + "probe_propagations": 6388, + "budget_nodes": 1050, + "work": 100000, + "history_entries": 63, + "probe_lp_calls": 62, + "probe_lp_seconds": 0.005688379000000003 + }, + "neighborhood": { + "requested": true, + "completion": "LocalStorageLimit", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 324, + "source_entries": 2163, + "coordinator_work": 3425, + "status_attempts": 77, + "completed_status_calls": 77, + "failed_nodes": 13, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 64, + "peak_total_spaces": 80, + "budget_nodes": 1050, + "elapsed_seconds": 0.0012743330000000008 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 20.532107584000187, + "offset_end": 30.541877874999955, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3114, + "stderr_bytes_observed": 0, + "external_seconds": 10.009409999999662, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000096209, + "objective": 302, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000167542, + "solve_seconds": 10.000096209, + "backend_solve_seconds": 10.000093583, + "driver_seconds": 10.000289542, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 30.55136416700043, + "offset_end": 30.63575533400035, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3221, + "stderr_bytes_observed": 0, + "external_seconds": 0.08424766600001021, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.073729834, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000208792, + "solve_seconds": 0.073729834, + "backend_solve_seconds": 0.073661375, + "driver_seconds": 0.073957875, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000356958, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 18232, + "conditional_checks": 359984, + "variable_fixings": 5112, + "variable_bound_tightenings": 5112, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 30.64590445900012, + "offset_end": 30.730631000000358, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3462, + "stderr_bytes_observed": 0, + "external_seconds": 0.08459008399950108, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.072752458, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00016925, + "solve_seconds": 0.072752458, + "backend_solve_seconds": 0.072710417, + "driver_seconds": 0.0729405, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 2, + "lp_seconds": 0.000407626, + "valid_bounds": 2, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 18232, + "conditional_checks": 359984, + "variable_fixings": 5112, + "variable_bound_tightenings": 5112, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 43231, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000342417 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 30.740752875, + "offset_end": 30.75778958400042, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3455, + "stderr_bytes_observed": 0, + "external_seconds": 0.01691562499945576, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.0074845, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000173083, + "solve_seconds": 0.0074845, + "backend_solve_seconds": 0.007444667, + "driver_seconds": 0.007675042, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 65, + "lp_seconds": 0.005244293999999999, + "valid_bounds": 65, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 101, + "conditional_checks": 3599, + "variable_fixings": 189, + "variable_bound_tightenings": 189, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 43231, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0003435 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 30.767923166999935, + "offset_end": 40.78317420900021, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3415, + "stderr_bytes_observed": 0, + "external_seconds": 10.013115624999955, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000111, + "objective": 490, + "best_bound": 0, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 490, + "best_bound": 0, + "absolute_gap": 490, + "relative_gap": 1, + "build_seconds": 0.000156833, + "solve_seconds": 10.000111, + "backend_solve_seconds": 10.000108292, + "driver_seconds": 10.000292583, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 4273536, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 2136768, + "budget_nodes": 4273664, + "peak_open_nodes": 26, + "unresolved_regions": 16, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 2136768, + "manual_splits": 19, + "fallback_decisions": 2136749, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 64, + "failed_directions": 0, + "reliable_candidates": 21, + "probe_propagations": 1575, + "budget_nodes": 4273664, + "work": 100000, + "history_entries": 53, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 40.7943081250005, + "offset_end": 40.89150033400074, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3767, + "stderr_bytes_observed": 0, + "external_seconds": 0.09700908299964794, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.085926667, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00018675, + "solve_seconds": 0.085926667, + "backend_solve_seconds": 0.085881375, + "driver_seconds": 0.086128958, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 1799, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 899, + "budget_nodes": 1927, + "peak_open_nodes": 27, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1075, + "lp_seconds": 0.060595829000000066, + "valid_bounds": 1075, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 2101, + "conditional_checks": 78314, + "variable_fixings": 7308, + "variable_bound_tightenings": 7308, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 43231, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000386333 + } + }, + "branching": { + "requested": true, + "decisions": 899, + "manual_splits": 20, + "fallback_decisions": 879, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 22, + "probe_propagations": 3490, + "budget_nodes": 1927, + "work": 100000, + "history_entries": 54, + "probe_lp_calls": 71, + "probe_lp_seconds": 0.005941582000000002 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "facility_location-9-single", + "category": "facility_location", + "size": 9, + "variant": "single", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 40.90222741700018, + "offset_end": 40.9968806249999, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4033, + "stderr_bytes_observed": 0, + "external_seconds": 0.0944880409997495, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.084587542, + "objective": 302, + "best_bound": 302, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 171, + "model_rows": 198, + "model_globals": 0, + "objective": 302, + "best_bound": 302, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000158833, + "solve_seconds": 0.084587542, + "backend_solve_seconds": 0.084549792, + "driver_seconds": 0.084761667, + "assignment": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 1763, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 881, + "budget_nodes": 1914, + "peak_open_nodes": 27, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 1063, + "lp_seconds": 0.059415084999999965, + "valid_bounds": 1063, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 2084, + "conditional_checks": 78487, + "variable_fixings": 7334, + "variable_bound_tightenings": 7334, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 1, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 43231, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000351959 + } + }, + "branching": { + "requested": true, + "decisions": 881, + "manual_splits": 20, + "fallback_decisions": 861, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 59, + "failed_directions": 0, + "reliable_candidates": 22, + "probe_propagations": 3490, + "budget_nodes": 1914, + "work": 100000, + "history_entries": 54, + "probe_lp_calls": 71, + "probe_lp_seconds": 0.006051839 + }, + "neighborhood": { + "requested": true, + "completion": "Improved", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 171, + "source_entries": 1587, + "coordinator_work": 2871, + "status_attempts": 23, + "completed_status_calls": 23, + "failed_nodes": 7, + "feasible_candidates": 1, + "accepted_improvements": 1, + "peak_local_spaces": 16, + "peak_total_spaces": 41, + "budget_nodes": 1914, + "elapsed_seconds": 0.0005284590000000002 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 41.01678466700014, + "offset_end": 51.02775595900039, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2884, + "stderr_bytes_observed": 0, + "external_seconds": 10.010816750000231, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.00009525, + "objective": 5, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000170833, + "solve_seconds": 10.00009525, + "backend_solve_seconds": 10.000089125, + "driver_seconds": 10.000301667, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 51.04029083400019, + "offset_end": 51.057647084000564, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2984, + "stderr_bytes_observed": 0, + "external_seconds": 0.017237957999896025, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.005213292, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000170959, + "solve_seconds": 0.005213292, + "backend_solve_seconds": 0.005176459, + "driver_seconds": 0.005398125, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.0005127500000000001, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1163, + "conditional_checks": 20537, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 51.070722166999985, + "offset_end": 51.09057233400017, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3219, + "stderr_bytes_observed": 0, + "external_seconds": 0.019647916000394616, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.008239042, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000170417, + "solve_seconds": 0.008239042, + "backend_solve_seconds": 0.008196458, + "driver_seconds": 0.008429625, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 5, + "lp_seconds": 0.001875707, + "valid_bounds": 5, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1163, + "conditional_checks": 20537, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": true, + "completion": "RoundLimit", + "rounds": 4, + "augmentations": 4, + "cuts": 11, + "nonzeros": 41, + "work": 156700, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 11, + "duplicate_cuts": 11, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001530874 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 51.103456709000056, + "offset_end": 51.12298741700033, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3247, + "stderr_bytes_observed": 0, + "external_seconds": 0.019381000000066706, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.009627042, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000133916, + "solve_seconds": 0.009627042, + "backend_solve_seconds": 0.00958725, + "driver_seconds": 0.009776666, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 44, + "lp_seconds": 0.006360083, + "valid_bounds": 44, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 2, + "certificate_evaluations": 103, + "conditional_checks": 5702, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": true, + "completion": "RoundLimit", + "rounds": 4, + "augmentations": 4, + "cuts": 11, + "nonzeros": 41, + "work": 156700, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 11, + "duplicate_cuts": 11, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001546166 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 51.13544300000012, + "offset_end": 61.14660725000067, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3194, + "stderr_bytes_observed": 0, + "external_seconds": 10.010808166999595, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000111083, + "objective": 5, + "best_bound": 0, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 0, + "absolute_gap": 5, + "relative_gap": 1, + "build_seconds": 0.0001385, + "solve_seconds": 10.000111083, + "backend_solve_seconds": 10.000108708, + "driver_seconds": 10.00027225, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 6404110, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 3202055, + "budget_nodes": 6404238, + "peak_open_nodes": 18, + "unresolved_regions": 13, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 3202055, + "manual_splits": 110, + "fallback_decisions": 3201945, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 55, + "finite_samples": 110, + "zero_gain_samples": 94, + "failed_directions": 13, + "reliable_candidates": 893, + "probe_propagations": 1286, + "budget_nodes": 6404238, + "work": 100000, + "history_entries": 44, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 61.16008745900035, + "offset_end": 61.18732291700053, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3518, + "stderr_bytes_observed": 0, + "external_seconds": 0.02711070799978188, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.015773041, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000174875, + "solve_seconds": 0.015773041, + "backend_solve_seconds": 0.015735167, + "driver_seconds": 0.015961833, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 61, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 30, + "budget_nodes": 189, + "peak_open_nodes": 19, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 90, + "lp_seconds": 0.011007122000000005, + "valid_bounds": 90, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 175, + "conditional_checks": 7363, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": true, + "completion": "RoundLimit", + "rounds": 4, + "augmentations": 4, + "cuts": 11, + "nonzeros": 41, + "work": 156700, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 11, + "duplicate_cuts": 11, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.0015663740000000002 + } + }, + "branching": { + "requested": true, + "decisions": 30, + "manual_splits": 6, + "fallback_decisions": 24, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 55, + "finite_samples": 110, + "zero_gain_samples": 109, + "failed_directions": 9, + "reliable_candidates": 8, + "probe_propagations": 3120, + "budget_nodes": 189, + "work": 8685, + "history_entries": 39, + "probe_lp_calls": 58, + "probe_lp_seconds": 0.006366082000000005 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "bin_packing-18-single", + "category": "bin_packing", + "size": 18, + "variant": "single", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 61.20124295900041, + "offset_end": 61.22588120900036, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3790, + "stderr_bytes_observed": 0, + "external_seconds": 0.024481749999722524, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.01530225, + "objective": 5, + "best_bound": 5, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 114, + "model_rows": 155, + "model_globals": 0, + "objective": 5, + "best_bound": 5, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000130291, + "solve_seconds": 0.01530225, + "backend_solve_seconds": 0.015260459, + "driver_seconds": 0.015449416, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 61, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 30, + "budget_nodes": 317, + "peak_open_nodes": 19, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 90, + "lp_seconds": 0.010338000000000002, + "valid_bounds": 90, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 175, + "conditional_checks": 7363, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": true, + "completion": "RoundLimit", + "rounds": 4, + "augmentations": 4, + "cuts": 11, + "nonzeros": 41, + "work": 156700, + "projected_coordinates": 1, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 11, + "duplicate_cuts": 11, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001396751 + } + }, + "branching": { + "requested": true, + "decisions": 30, + "manual_splits": 6, + "fallback_decisions": 24, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 55, + "finite_samples": 110, + "zero_gain_samples": 109, + "failed_directions": 9, + "reliable_candidates": 8, + "probe_propagations": 3120, + "budget_nodes": 317, + "work": 8685, + "history_entries": 39, + "probe_lp_calls": 58, + "probe_lp_seconds": 0.005897206000000003 + }, + "neighborhood": { + "requested": true, + "completion": "StatusLimit", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 114, + "source_entries": 1144, + "coordinator_work": 2024, + "status_attempts": 128, + "completed_status_calls": 128, + "failed_nodes": 61, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 25, + "peak_total_spaces": 33, + "budget_nodes": 317, + "elapsed_seconds": 0.0007995410000000008 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 61.250275334000435, + "offset_end": 71.26082912499987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2806, + "stderr_bytes_observed": 0, + "external_seconds": 10.01039183299963, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000074166, + "objective": 1459, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1459, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000191584, + "solve_seconds": 10.000074166, + "backend_solve_seconds": 10.00007125, + "driver_seconds": 10.000289917, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 71.27855408400046, + "offset_end": 76.80242887500026, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 2923, + "stderr_bytes_observed": 0, + "external_seconds": 5.523726000000352, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 5.51259475, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000204583, + "solve_seconds": 5.51259475, + "backend_solve_seconds": 5.512540375, + "driver_seconds": 5.512822875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000343625, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1351589, + "conditional_checks": 26951861, + "variable_fixings": 804625, + "variable_bound_tightenings": 804625, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 76.81966491700041, + "offset_end": 82.38335770899994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3155, + "stderr_bytes_observed": 0, + "external_seconds": 5.563389291000021, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 5.553096083, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000219708, + "solve_seconds": 5.553096083, + "backend_solve_seconds": 5.553033791, + "driver_seconds": 5.553349208, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 2, + "lp_seconds": 0.0005794999999999999, + "valid_bounds": 2, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1351589, + "conditional_checks": 26951861, + "variable_fixings": 804625, + "variable_bound_tightenings": 804625, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 127219, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000321792 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 82.4009112090007, + "offset_end": 82.47465012500015, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3181, + "stderr_bytes_observed": 0, + "external_seconds": 0.07356929199977458, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.062807292, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00022025, + "solve_seconds": 0.062807292, + "backend_solve_seconds": 0.062769209, + "driver_seconds": 0.06304275, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 697, + "lp_seconds": 0.05097850200000003, + "valid_bounds": 697, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 7, + "certificate_evaluations": 1379, + "conditional_checks": 32279, + "variable_fixings": 2775, + "variable_bound_tightenings": 2775, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 127219, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000321042 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 82.49281158400026, + "offset_end": 92.50294387500071, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3147, + "stderr_bytes_observed": 0, + "external_seconds": 10.009952166999938, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000080625, + "objective": 1447, + "best_bound": 598, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 598, + "absolute_gap": 849, + "relative_gap": 0.5867311679336559, + "build_seconds": 0.000192459, + "solve_seconds": 10.000080625, + "backend_solve_seconds": 10.000077792, + "driver_seconds": 10.000299084, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 5328858, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 2664429, + "budget_nodes": 5328986, + "peak_open_nodes": 12, + "unresolved_regions": 7, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 2664429, + "manual_splits": 19, + "fallback_decisions": 2664410, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 33, + "finite_samples": 66, + "zero_gain_samples": 39, + "failed_directions": 31, + "reliable_candidates": 2, + "probe_propagations": 3923, + "budget_nodes": 5328986, + "work": 100000, + "history_entries": 29, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 92.52289825000025, + "offset_end": 92.57586195900058, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3453, + "stderr_bytes_observed": 0, + "external_seconds": 0.05281195800034766, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.043008458, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000186542, + "solve_seconds": 0.043008458, + "backend_solve_seconds": 0.042969, + "driver_seconds": 0.043209875, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 963, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 481, + "budget_nodes": 1091, + "peak_open_nodes": 11, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 412, + "lp_seconds": 0.030286874999999987, + "valid_bounds": 412, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 6, + "certificate_evaluations": 869, + "conditional_checks": 25716, + "variable_fixings": 1158, + "variable_bound_tightenings": 1158, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 127219, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00037583299999999995 + } + }, + "branching": { + "requested": true, + "decisions": 481, + "manual_splits": 32, + "fallback_decisions": 449, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 30, + "failed_directions": 37, + "reliable_candidates": 38, + "probe_propagations": 6444, + "budget_nodes": 1091, + "work": 100000, + "history_entries": 21, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.0034543760000000016 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "production-12-single", + "category": "production", + "size": 12, + "variant": "single", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 92.59462062500006, + "offset_end": 92.64950637499987, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 3735, + "stderr_bytes_observed": 0, + "external_seconds": 0.054380915999900026, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.044001, + "objective": 1447, + "best_bound": 1447, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 96, + "model_rows": 50, + "model_globals": 0, + "objective": 1447, + "best_bound": 1447, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000174833, + "solve_seconds": 0.044001, + "backend_solve_seconds": 0.043964208, + "driver_seconds": 0.044193083, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 963, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 481, + "budget_nodes": 1219, + "peak_open_nodes": 11, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 412, + "lp_seconds": 0.030314916000000015, + "valid_bounds": 412, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 6, + "certificate_evaluations": 869, + "conditional_checks": 25716, + "variable_fixings": 1158, + "variable_bound_tightenings": 1158, + "root_cover": { + "requested": true, + "completion": "WorkLimit", + "rounds": 1, + "augmentations": 1, + "cuts": 2, + "nonzeros": 67, + "work": 127219, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 1, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000367583 + } + }, + "branching": { + "requested": true, + "decisions": 481, + "manual_splits": 32, + "fallback_decisions": 449, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 28, + "finite_samples": 56, + "zero_gain_samples": 30, + "failed_directions": 37, + "reliable_candidates": 38, + "probe_propagations": 6444, + "budget_nodes": 1219, + "work": 100000, + "history_entries": 21, + "probe_lp_calls": 42, + "probe_lp_seconds": 0.003234290999999998 + }, + "neighborhood": { + "requested": true, + "completion": "StatusLimit", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 96, + "source_entries": 1785, + "coordinator_work": 2502, + "status_attempts": 128, + "completed_status_calls": 128, + "failed_nodes": 46, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 45, + "peak_total_spaces": 53, + "budget_nodes": 1219, + "elapsed_seconds": 0.0010780829999999988 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 92.67826920900006, + "offset_end": 102.68918754200058, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4056, + "stderr_bytes_observed": 0, + "external_seconds": 10.01039262500035, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000196083, + "objective": -8628, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8628, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000116583, + "solve_seconds": 10.000196083, + "backend_solve_seconds": 10.000190792, + "driver_seconds": 10.000334041, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "native", + "repetition": 1, + "route": "native", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 102.71837041700019, + "offset_end": 112.73052570900018, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4049, + "stderr_bytes_observed": 0, + "external_seconds": 10.012018790999718, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000220083, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000146375, + "solve_seconds": 10.000220083, + "backend_solve_seconds": 10.000215167, + "driver_seconds": 10.00038475, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native", + "search_order": "native_bab", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 112.75085800000033, + "offset_end": 122.76453920899985, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4119, + "stderr_bytes_observed": 0, + "external_seconds": 10.013388166999903, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000304791, + "objective": -8626, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8626, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000171333, + "solve_seconds": 10.000304791, + "backend_solve_seconds": 10.000246625, + "driver_seconds": 10.00050025, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.000300625, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1633494, + "conditional_checks": 29920906, + "variable_fixings": 1816728, + "variable_bound_tightenings": 1816728, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "lp-root", + "repetition": 1, + "route": "lp-root", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 122.78727570899991, + "offset_end": 132.79920137499994, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4137, + "stderr_bytes_observed": 0, + "external_seconds": 10.011392041999898, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000338167, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-root", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000220083, + "solve_seconds": 10.000338167, + "backend_solve_seconds": 10.000279375, + "driver_seconds": 10.000580833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": false, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": null, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 1, + "lp_seconds": 0.00034237499999999996, + "valid_bounds": 1, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1648270, + "conditional_checks": 50789431, + "variable_fixings": 1572882, + "variable_bound_tightenings": 1572882, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 132.82044304200008, + "offset_end": 142.83461100000022, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4369, + "stderr_bytes_observed": 0, + "external_seconds": 10.013967666999633, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000299334, + "objective": -8597, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8597, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000240792, + "solve_seconds": 10.000299334, + "backend_solve_seconds": 10.000232125, + "driver_seconds": 10.000561292, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 5, + "lp_seconds": 0.001205625, + "valid_bounds": 5, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1454863, + "conditional_checks": 24975800, + "variable_fixings": 46807, + "variable_bound_tightenings": 46807, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 607, + "work": 271985, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.00112125 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "lp-cuts", + "repetition": 1, + "route": "lp-cuts", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 142.85682295900006, + "offset_end": 152.8682200000003, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4370, + "stderr_bytes_observed": 0, + "external_seconds": 10.011086000000432, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000348834, + "objective": -3249, + "best_bound": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-cuts", + "status": "time_limit", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3249, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 0.000127166, + "solve_seconds": 10.000348834, + "backend_solve_seconds": 10.000278833, + "driver_seconds": 10.000499916, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "root", + "bound_tightening": true, + "bound_change_interval": 1, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4, + "lp_seconds": 0.001048375, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 1587494, + "conditional_checks": 37692143, + "variable_fixings": 1910091, + "variable_bound_tightenings": 1910091, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 2, + "nonzeros": 394, + "work": 194425, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000969459 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 152.89070983400052, + "offset_end": 156.26294874999985, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4419, + "stderr_bytes_observed": 0, + "external_seconds": 3.3720720419996724, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 3.361639958, + "objective": -14567, + "best_bound": -14567, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -14567, + "best_bound": -14567, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000218333, + "solve_seconds": 3.361639958, + "backend_solve_seconds": 3.361586125, + "driver_seconds": 3.361872917, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 33121, + "lp_seconds": 2.558282158000008, + "valid_bounds": 33121, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 81776, + "conditional_checks": 1925274, + "variable_fixings": 388094, + "variable_bound_tightenings": 388094, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 607, + "work": 271985, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001146416 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "lp-updated", + "repetition": 1, + "route": "lp-updated", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 156.28559466700062, + "offset_end": 156.79609125000025, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4428, + "stderr_bytes_observed": 0, + "external_seconds": 0.5103207500005738, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.499250334, + "objective": -3873, + "best_bound": -3873, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-updated", + "status": "optimal", + "backend": "Gecode native + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3873, + "best_bound": -3873, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000122458, + "solve_seconds": 0.499250334, + "backend_solve_seconds": 0.499210667, + "driver_seconds": 0.499388667, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null, + "algorithm_configuration": { + "entry_point": "solve_native_lp", + "search_order": "native_bab", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": false, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": null, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": null, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 4695, + "lp_seconds": 0.3673846429999999, + "valid_bounds": 4695, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 10651, + "conditional_checks": 652259, + "variable_fixings": 106619, + "variable_bound_tightenings": 106619, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 2, + "nonzeros": 394, + "work": 194425, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000861167 + } + }, + "branching": { + "requested": false, + "decisions": 0, + "manual_splits": 0, + "fallback_decisions": 0, + "probe_status_calls": 0, + "completed_pairs": 0, + "published_pairs": 0, + "finite_samples": 0, + "zero_gain_samples": 0, + "failed_directions": 0, + "reliable_candidates": 0, + "probe_propagations": 0, + "budget_nodes": 0, + "work": 0, + "history_entries": 0, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 156.82002187500075, + "offset_end": 166.83233520900012, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4405, + "stderr_bytes_observed": 0, + "external_seconds": 10.012111041000026, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000504959, + "objective": -8755, + "best_bound": -20880, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -8755, + "best_bound": -20880, + "absolute_gap": 12125, + "relative_gap": 0.5806992337164751, + "build_seconds": 0.00013625, + "solve_seconds": 10.000504959, + "backend_solve_seconds": 10.000501167, + "driver_seconds": 10.000662125, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 3290591, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 1645296, + "budget_nodes": 3290719, + "peak_open_nodes": 168, + "unresolved_regions": 161, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 1645296, + "manual_splits": 47, + "fallback_decisions": 1645249, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 64, + "failed_directions": 0, + "reliable_candidates": 270, + "probe_propagations": 256, + "budget_nodes": 3290719, + "work": 100000, + "history_entries": 47, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "dfs-reliability", + "repetition": 1, + "route": "dfs-reliability", + "probe": false, + "status": "time_limit", + "passed": false, + "offset_start": 166.85509249999996, + "offset_end": 176.8660740840005, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4389, + "stderr_bytes_observed": 0, + "external_seconds": 10.010667208000086, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": false, + "solve_seconds": 10.000505, + "objective": -3297, + "best_bound": -8638, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs-reliability", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3297, + "best_bound": -8638, + "absolute_gap": 5341, + "relative_gap": 0.6183144246353323, + "build_seconds": 0.000122125, + "solve_seconds": 10.000505, + "backend_solve_seconds": 10.000501417, + "driver_seconds": 10.000657542, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": 3338923, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 1669461, + "budget_nodes": 3339051, + "peak_open_nodes": 167, + "unresolved_regions": 161, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": false, + "lp_frequency": null, + "bound_tightening": false, + "bound_change_interval": null, + "root_cover_cuts": false, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": true, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": null, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 0, + "lp_seconds": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 0, + "conditional_checks": 0, + "variable_fixings": 0, + "variable_bound_tightenings": 0, + "root_cover": { + "requested": false, + "completion": "NotRequested", + "rounds": 0, + "augmentations": 0, + "cuts": 0, + "nonzeros": 0, + "work": 0, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 0, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 0, + "valid_bounds": 0, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0 + } + }, + "branching": { + "requested": true, + "decisions": 1669461, + "manual_splits": 42, + "fallback_decisions": 1669419, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 64, + "failed_directions": 0, + "reliable_candidates": 218, + "probe_propagations": 256, + "budget_nodes": 3339051, + "work": 100000, + "history_entries": 42, + "probe_lp_calls": 0, + "probe_lp_seconds": 0 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 176.88933270899997, + "offset_end": 178.67131120900012, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4719, + "stderr_bytes_observed": 0, + "external_seconds": 1.78180195799996, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.770252417, + "objective": -14567, + "best_bound": -14567, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -14567, + "best_bound": -14567, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000133417, + "solve_seconds": 1.770252417, + "backend_solve_seconds": 1.770207709, + "driver_seconds": 1.770400709, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 40267, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 20133, + "budget_nodes": 40395, + "peak_open_nodes": 175, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 14864, + "lp_seconds": 1.262866845999996, + "valid_bounds": 14864, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 44532, + "conditional_checks": 1291082, + "variable_fixings": 260966, + "variable_bound_tightenings": 260966, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 607, + "work": 271985, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001090708 + } + }, + "branching": { + "requested": true, + "decisions": 20133, + "manual_splits": 43, + "fallback_decisions": 20090, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 57, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1004, + "budget_nodes": 40395, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.0037093719999999994 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "lp-reliability", + "repetition": 1, + "route": "lp-reliability", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 178.6946602500002, + "offset_end": 179.0706620840001, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 4714, + "stderr_bytes_observed": 0, + "external_seconds": 0.3756559590001416, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.365317708, + "objective": -3873, + "best_bound": -3873, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability", + "status": "optimal", + "backend": "Gecode native frontier + checked LP", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3873, + "best_bound": -3873, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000122958, + "solve_seconds": 0.365317708, + "backend_solve_seconds": 0.365276917, + "driver_seconds": 0.365460708, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": 6599, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 3299, + "budget_nodes": 6727, + "peak_open_nodes": 163, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_search", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": false, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": null + }, + "relaxation": { + "lp_calls": 2933, + "lp_seconds": 0.2546039879999994, + "valid_bounds": 2933, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 8301, + "conditional_checks": 579921, + "variable_fixings": 104290, + "variable_bound_tightenings": 104290, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 2, + "nonzeros": 394, + "work": 194425, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000822751 + } + }, + "branching": { + "requested": true, + "decisions": 3299, + "manual_splits": 44, + "fallback_decisions": 3255, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 67, + "failed_directions": 0, + "reliable_candidates": 248, + "probe_propagations": 866, + "budget_nodes": 6727, + "work": 100000, + "history_entries": 45, + "probe_lp_calls": 24, + "probe_lp_seconds": 0.0021375020000000003 + }, + "neighborhood": { + "requested": false, + "completion": "NotStarted", + "stop_reason": null, + "attempts": 0, + "eligible_variables": 0, + "source_entries": 0, + "coordinator_work": 0, + "status_attempts": 0, + "completed_status_calls": 0, + "failed_nodes": 0, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 0, + "peak_total_spaces": 0, + "budget_nodes": 0, + "elapsed_seconds": 0 + } + } + }, + { + "case": "knapsack-408-uncorrelated", + "category": "knapsack", + "size": 408, + "variant": "uncorrelated", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 179.0947655, + "offset_end": 180.88760879200072, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5009, + "stderr_bytes_observed": 0, + "external_seconds": 1.7924712079993697, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 1.782179417, + "objective": -14567, + "best_bound": -14567, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -14567, + "best_bound": -14567, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00012625, + "solve_seconds": 1.782179417, + "backend_solve_seconds": 1.782139166, + "driver_seconds": 1.782321958, + "assignment": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": 40267, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 20133, + "budget_nodes": 40519, + "peak_open_nodes": 175, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 14864, + "lp_seconds": 1.2713243400000032, + "valid_bounds": 14864, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 44532, + "conditional_checks": 1291082, + "variable_fixings": 260966, + "variable_bound_tightenings": 260966, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 4, + "augmentations": 3, + "cuts": 3, + "nonzeros": 607, + "work": 271985, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 3, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 4, + "valid_bounds": 4, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.001060083 + } + }, + "branching": { + "requested": true, + "decisions": 20133, + "manual_splits": 43, + "fallback_decisions": 20090, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 57, + "failed_directions": 0, + "reliable_candidates": 226, + "probe_propagations": 1004, + "budget_nodes": 40519, + "work": 100000, + "history_entries": 43, + "probe_lp_calls": 36, + "probe_lp_seconds": 0.0034272940000000013 + }, + "neighborhood": { + "requested": true, + "completion": "LocalStorageLimit", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 408, + "source_entries": 1230, + "coordinator_work": 2767, + "status_attempts": 124, + "completed_status_calls": 124, + "failed_nodes": 60, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 64, + "peak_total_spaces": 219, + "budget_nodes": 40519, + "elapsed_seconds": 0.0018163329999999998 + } + } + }, + { + "case": "knapsack-408-correlated", + "category": "knapsack", + "size": 408, + "variant": "correlated", + "cohort": "lp-reliability-neighborhood", + "repetition": 1, + "route": "lp-reliability-neighborhood", + "probe": false, + "status": "optimal", + "passed": true, + "offset_start": 180.91280912500042, + "offset_end": 181.29019991699988, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 5014, + "stderr_bytes_observed": 0, + "external_seconds": 0.3770213749994582, + "primal_checked": true, + "independent_optimality_verified": false, + "backend_reported_optimal": true, + "solve_seconds": 0.36609325, + "objective": -3873, + "best_bound": -3873, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "lp-reliability-neighborhood", + "status": "optimal", + "backend": "Gecode native frontier + checked LP + BinaryHamming", + "backend_version": "6.4.0; HiGHS 1.15.1", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 408, + "model_rows": 1, + "model_globals": 0, + "objective": -3873, + "best_bound": -3873, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000126292, + "solve_seconds": 0.36609325, + "backend_solve_seconds": 0.366018167, + "driver_seconds": 0.366235125, + "assignment": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "full_values": [ + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1 + ], + "nodes": 6599, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 3299, + "budget_nodes": 6851, + "peak_open_nodes": 163, + "unresolved_regions": 0, + "algorithm_configuration": { + "entry_point": "solve_native_neighborhoods", + "search_order": "depth_first", + "checked_lp": true, + "lp_frequency": "after_bound_changes", + "bound_tightening": true, + "bound_change_interval": 4, + "root_cover_cuts": true, + "binary_reliability": true, + "neighborhoods": true, + "knapsack_dp_eligible_route": false, + "presolve": false, + "max_open_nodes": 1024, + "cover_settings": { + "max_rounds": 4, + "max_work": 4000000, + "max_cuts": 64, + "max_cut_nonzeros": 4096, + "max_model_columns": 200000, + "max_model_rows": 200000, + "max_model_nonzeros": 2000000, + "max_separation_rows": 256, + "max_terms_per_row": 512, + "denominator": 1048576 + }, + "branching_settings": { + "policy": "binary_reliability", + "max_candidates_per_decision": 8, + "max_probe_status_calls": 128, + "max_probe_status_calls_per_decision": 8, + "max_branching_work": 100000, + "reliability_samples": 2, + "max_nonimproving_pairs": 2, + "max_history_entries": 4096 + }, + "neighborhood_settings": { + "policy": "binary_hamming", + "radius": 4, + "max_status_calls": 128, + "max_distance_variables": 4096, + "max_source_entries": 100000, + "max_coordinator_work": 100000, + "max_local_spaces": 64, + "time_limit_seconds": 0.05 + } + }, + "relaxation": { + "lp_calls": 2933, + "lp_seconds": 0.2534736529999999, + "valid_bounds": 2933, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "certificate_evaluations": 8301, + "conditional_checks": 579921, + "variable_fixings": 104290, + "variable_bound_tightenings": 104290, + "root_cover": { + "requested": true, + "completion": "NoNewCuts", + "rounds": 3, + "augmentations": 2, + "cuts": 2, + "nonzeros": 394, + "work": 194425, + "projected_coordinates": 0, + "unsupported_rows": 0, + "oversized_rows": 0, + "separated_cuts": 2, + "duplicate_cuts": 0, + "arithmetic_rejections": 0, + "lp_calls": 3, + "valid_bounds": 3, + "rejected_bounds": 0, + "numerical_infeasibility_reports": 0, + "lp_seconds": 0.000822915 + } + }, + "branching": { + "requested": true, + "decisions": 3299, + "manual_splits": 44, + "fallback_decisions": 3255, + "probe_status_calls": 128, + "completed_pairs": 64, + "published_pairs": 64, + "finite_samples": 128, + "zero_gain_samples": 67, + "failed_directions": 0, + "reliable_candidates": 248, + "probe_propagations": 866, + "budget_nodes": 6851, + "work": 100000, + "history_entries": 45, + "probe_lp_calls": 24, + "probe_lp_seconds": 0.0022382100000000005 + }, + "neighborhood": { + "requested": true, + "completion": "LocalStorageLimit", + "stop_reason": null, + "attempts": 1, + "eligible_variables": 408, + "source_entries": 1230, + "coordinator_work": 2767, + "status_attempts": 124, + "completed_status_calls": 124, + "failed_nodes": 60, + "feasible_candidates": 0, + "accepted_improvements": 0, + "peak_local_spaces": 64, + "peak_total_spaces": 218, + "budget_nodes": 6851, + "elapsed_seconds": 0.0017340419999999981 + } + } + } + ], + "decisions": [] + } +} diff --git a/docs/solver-parity/checkpoints/native-algorithms.json b/docs/solver-parity/checkpoints/native-algorithms.json new file mode 100644 index 0000000000..a254a217b6 --- /dev/null +++ b/docs/solver-parity/checkpoints/native-algorithms.json @@ -0,0 +1,30541 @@ +{ + "schema_version": 1, + "source_commit": "5d533bcd4f66e9f065e24bac5ed7a7c976d715db", + "compiled_solver_commit": "b57bf49ad", + "accepted": { + "report": { + "schema_version": 1, + "started_utc": "2026-09-06T02:02:17.486449+00:00", + "purpose": "native_algorithm_changes_from_current_pre_algorithm_baseline", + "expected_runs": 60, + "inputs": [ + { + "id": "test_knapsack_large_1312000", + "kind": "binary", + "stem": "instances/test_knapsack_large_1312000", + "json_sha256": "7058d2ad2e22d58f800c860f451b73f916ddb326974fd0c21432b9af5e8e63cd", + "txt_sha256": "78b2364ca6925017ca930517489c7fc56cf6e908c7c8e033e2a2e1c254a9e28e", + "objective": -2464, + "semantic_sha256": "0e974e09f297a80d3615b5468c02b9b2e504de97e79deba0b7e46bb0efd31741", + "reference_method": "one-dimensional zero-one knapsack DP", + "input_variables": 80, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_facility_location_large_1812000", + "kind": "binary", + "stem": "instances/test_facility_location_large_1812000", + "json_sha256": "b93e5c15d83bff49cd4aee1dde60df72638a37d4674299e3629fa01406659d65", + "txt_sha256": "e627b916143364e246990b9451164c9f3b1c1ec98730680b91ad1a0d06bb46a1", + "objective": 240, + "semantic_sha256": "e1860a148b48ab19be2fb3d23d4e3323b958ee0f969c32b843e02074f4853af2", + "reference_method": "enumerate facility subsets and independently assign each customer", + "input_variables": 128, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_assignment_large_2012000", + "kind": "binary", + "stem": "instances/test_assignment_large_2012000", + "json_sha256": "86186c3a82b3012c48da2d5362e354bbc32ff8d7c163df6e31f79b7e6d68da78", + "txt_sha256": "785ac7cb5bcea26a813715f5cfe593eb80ca512aa6928d1444d32ee61b60bdf1", + "objective": 164, + "semantic_sha256": "125ff7049cca1b7fa457c9c147a513a04875d81d2179bf8272d91242e2afee05", + "reference_method": "subset dynamic program for bipartite assignment", + "input_variables": 144, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_tsp_large_2412000", + "kind": "binary", + "stem": "instances/test_tsp_large_2412000", + "json_sha256": "984de574f27830e6cb7b5ce94383b335ed90624c9963d8da31c9e243dfa8eb45", + "txt_sha256": "1659002ab70dd6ba37bef182d0577654542ad810d227a450998a3b59cae8afdd", + "objective": 168, + "semantic_sha256": "ee5430e34e118638173bf3373858eb42d0c6fa4cf710420fac97d4dd74d481a8", + "reference_method": "Held-Karp subset dynamic program", + "input_variables": 120, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_production_large_2712000", + "kind": "binary", + "stem": "instances/test_production_large_2712000", + "json_sha256": "d6e359a10be09c35a9ee2c8b53b15c16ce6bd7defcb90f572d70ca261104e87a", + "txt_sha256": "5991ecd6e9795e3084780551212c3e93722b63bb6c6bb3e0bb59c628aeed25a8", + "objective": 512, + "semantic_sha256": "aec49df05779029d8b78b322837a807a6c2401081abbc004692db664c80f7030", + "reference_method": "inventory-state production dynamic program", + "input_variables": 120, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_bin_packing_small_2202000", + "kind": "binary", + "stem": "instances/test_bin_packing_small_2202000", + "json_sha256": "cb6b44423fd1f72565301576a6da35360d66e39a2a23a964ca641bf2a4ba09ba", + "txt_sha256": "dc779b85821f0b752eb2bb5313f3cffdce03474dc39620545e0baaf368780943", + "objective": 3, + "semantic_sha256": "f2b1b623a08201a1d16b003201fa02bedd2d64ae93c581ac06c75145f752827c", + "reference_method": "feasible witness meets total-weight capacity lower bound", + "input_variables": 44, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "stem": "native-instances/test_native_tsp_large_9112000", + "json_sha256": "7946df28b5f4f2a85db52932c3a61431c8dcf950709fed69d2969e8a9d238dec", + "txt_sha256": "b8c212e821fe3d5f2a90035898b8bcf295fdd8fb41e71f134c55db587bb289b8", + "objective": 390, + "semantic_sha256": "97070e1d2126f3dea60fe61a7ec586b8ce8c86b38e3d739b9ef360bda14961e3", + "reference_method": "Held-Karp dynamic programming", + "input_variables": 12, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "stem": "native-instances/test_weighted_queens_large_9312000", + "json_sha256": "47d48e4ad3ed2cd384ffab6111570081801af12c4b1e4f7ab811b05c08c45bca", + "txt_sha256": "d6c023e6f6b2ae1e61bde3228337c4b84a596440e9a46edfe446b1bd6c79ba1a", + "objective": 129, + "semantic_sha256": "7ee39f26c494d0d5bfd66cb8f4113acdf9d7d959abdf3f9c08c08721a15dba0f", + "reference_method": "independent exhaustive queen enumeration", + "input_variables": 12, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + } + ], + "provenance": { + "driver_sha256": "c70157d0196b1b8e351d5bd7c61683b5717c2bcf1eaa5b1cb5196bf3c8cf4536", + "driver_name": "optimize-native-benchmark", + "source_head": "5d533bcd4f66e9f065e24bac5ed7a7c976d715db", + "candidate_source_sha256": { + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505", + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b" + }, + "driver_source_sha256": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "runner_sha256": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "capture_sha256": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "validators": { + "validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1024, + "stderr_bytes_observed": 98254, + "external_seconds": 2.246682584285736, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:17.486795+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr" + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1059, + "stderr_bytes_observed": 98187, + "external_seconds": 0.036447624675929546, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:19.746990+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr" + } + } + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/native_benchmark.cpp": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + } + }, + "records": [ + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 0, + "external_seconds": 2.01171329151839, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:19.797934+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r1-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r1-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.000068542, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 7.175e-05, + "solve_seconds": 2.000068542, + "driver_seconds": 2.000165833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1082, + "stderr_bytes_observed": 0, + "external_seconds": 0.013358999975025654, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:21.811161+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r1-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r1-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000942709, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.1541e-05, + "solve_seconds": 0.000942709, + "driver_seconds": 0.001034708, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1257, + "stderr_bytes_observed": 0, + "external_seconds": 0.45226533245295286, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:21.826053+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r1-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r1-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.442543, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000154959, + "solve_seconds": 0.442543, + "driver_seconds": 0.442725417, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1257, + "stderr_bytes_observed": 0, + "external_seconds": 0.4539887495338917, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:22.281319+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r1-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r1-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.444154458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000138792, + "solve_seconds": 0.444154458, + "driver_seconds": 0.444324667, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.10655704233795404, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:22.737162+00:00", + "stdout_file": "test_assignment_large_2012000-native-r1-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r1-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.094006083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000133959, + "solve_seconds": 0.094006083, + "driver_seconds": 0.094169417, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.10649841744452715, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:22.846076+00:00", + "stdout_file": "test_assignment_large_2012000-native-r1-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r1-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.094770417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000122959, + "solve_seconds": 0.094770417, + "driver_seconds": 0.094924167, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1226, + "stderr_bytes_observed": 0, + "external_seconds": 0.0354672921821475, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:22.955204+00:00", + "stdout_file": "test_tsp_large_2412000-native-r1-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r1-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023101, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000361167, + "solve_seconds": 0.023101, + "driver_seconds": 0.023494917, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1238, + "stderr_bytes_observed": 0, + "external_seconds": 0.03438812494277954, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:22.993518+00:00", + "stdout_file": "test_tsp_large_2412000-native-r1-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r1-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.02340425, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000330333, + "solve_seconds": 0.02340425, + "driver_seconds": 0.023763667, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1228, + "stderr_bytes_observed": 0, + "external_seconds": 0.02008245885372162, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.030671+00:00", + "stdout_file": "test_production_large_2712000-native-r1-before.stdout", + "stderr_file": "test_production_large_2712000-native-r1-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010012042, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000205917, + "solve_seconds": 0.010012042, + "driver_seconds": 0.010243542, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1239, + "stderr_bytes_observed": 0, + "external_seconds": 0.019451250322163105, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.053168+00:00", + "stdout_file": "test_production_large_2712000-native-r1-after.stdout", + "stderr_file": "test_production_large_2712000-native-r1-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0096805, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000181458, + "solve_seconds": 0.0096805, + "driver_seconds": 0.009877208, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 910, + "stderr_bytes_observed": 0, + "external_seconds": 0.010739082470536232, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.075444+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r1-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r1-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000225667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000101958, + "solve_seconds": 0.000225667, + "driver_seconds": 0.000348375, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 921, + "stderr_bytes_observed": 0, + "external_seconds": 0.009933915920555592, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.088373+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r1-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r1-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000229583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.3291e-05, + "solve_seconds": 0.000229583, + "driver_seconds": 0.000334375, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 838, + "stderr_bytes_observed": 0, + "external_seconds": 0.0199796250090003, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.100735+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r1-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r1-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010733084, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.5875e-05, + "solve_seconds": 0.010733084, + "driver_seconds": 0.010833, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 838, + "stderr_bytes_observed": 0, + "external_seconds": 0.02263270877301693, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.122918+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r1-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r1-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010909625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.3417e-05, + "solve_seconds": 0.010909625, + "driver_seconds": 0.011021542, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 914, + "stderr_bytes_observed": 0, + "external_seconds": 0.01937283296138048, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.147874+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r1-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r1-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00976725, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.6625e-05, + "solve_seconds": 0.00976725, + "driver_seconds": 0.009879, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 903, + "stderr_bytes_observed": 0, + "external_seconds": 0.0223385002464056, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.169505+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r1-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r1-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.01002125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.6291e-05, + "solve_seconds": 0.01002125, + "driver_seconds": 0.010123125, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1080, + "stderr_bytes_observed": 0, + "external_seconds": 2.0115811666473746, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:23.194063+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r1-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r1-before.stderr", + "status": "time_limit", + "objective": -1792, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 672, + "solve_seconds": 2.000086667, + "nodes": 1884487, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1792, + "best_bound": -4277, + "absolute_gap": 2485, + "relative_gap": 0.5810147299509002, + "build_seconds": 5.0166e-05, + "solve_seconds": 2.000086667, + "driver_seconds": 2.000165541, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1884487, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 942244, + "budget_nodes": 1884487, + "peak_open_nodes": 33, + "unresolved_regions": 27 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 1, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1063, + "stderr_bytes_observed": 0, + "external_seconds": 0.011061125434935093, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:25.208743+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r1-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r1-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00121975, + "nodes": 159, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.5667e-05, + "solve_seconds": 0.00121975, + "driver_seconds": 0.001299583, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 159, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 79, + "budget_nodes": 159, + "peak_open_nodes": 80, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 911, + "stderr_bytes_observed": 0, + "external_seconds": 0.011231082491576672, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:25.222244+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r1-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r1-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000260208, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.225e-05, + "solve_seconds": 0.000260208, + "driver_seconds": 0.000359583, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 922, + "stderr_bytes_observed": 0, + "external_seconds": 0.01090487465262413, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:25.236027+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r1-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r1-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000235167, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.0208e-05, + "solve_seconds": 0.000235167, + "driver_seconds": 0.000318417, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1071, + "stderr_bytes_observed": 0, + "external_seconds": 0.011290207505226135, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:25.249667+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r2-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r2-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001024709, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 6.9416e-05, + "solve_seconds": 0.001024709, + "driver_seconds": 0.001128708, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1036, + "stderr_bytes_observed": 0, + "external_seconds": 2.0117574585601687, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:25.263798+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r2-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r2-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.000078958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.6583e-05, + "solve_seconds": 2.000078958, + "driver_seconds": 2.00017575, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1268, + "stderr_bytes_observed": 0, + "external_seconds": 0.45818787440657616, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:27.278417+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r2-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r2-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.445240584, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000169417, + "solve_seconds": 0.445240584, + "driver_seconds": 0.445434625, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1268, + "stderr_bytes_observed": 0, + "external_seconds": 0.4543928746134043, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:27.740137+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r2-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r2-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.443654291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000161792, + "solve_seconds": 0.443654291, + "driver_seconds": 0.443841375, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.1062516663223505, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.198149+00:00", + "stdout_file": "test_assignment_large_2012000-native-r2-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r2-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.094977125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000139625, + "solve_seconds": 0.094977125, + "driver_seconds": 0.095142375, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.10406399983912706, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.308154+00:00", + "stdout_file": "test_assignment_large_2012000-native-r2-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r2-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.095273208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00013575, + "solve_seconds": 0.095273208, + "driver_seconds": 0.09543325, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1238, + "stderr_bytes_observed": 0, + "external_seconds": 0.03540045861154795, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.415525+00:00", + "stdout_file": "test_tsp_large_2412000-native-r2-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r2-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023415541, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000371958, + "solve_seconds": 0.023415541, + "driver_seconds": 0.023814542, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1227, + "stderr_bytes_observed": 0, + "external_seconds": 0.034164207987487316, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.455078+00:00", + "stdout_file": "test_tsp_large_2412000-native-r2-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r2-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023079292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000337416, + "solve_seconds": 0.023079292, + "driver_seconds": 0.023435458, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.020601334050297737, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.493576+00:00", + "stdout_file": "test_production_large_2712000-native-r2-after.stdout", + "stderr_file": "test_production_large_2712000-native-r2-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009747708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000194084, + "solve_seconds": 0.009747708, + "driver_seconds": 0.009962584, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1228, + "stderr_bytes_observed": 0, + "external_seconds": 0.01991220936179161, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.518400+00:00", + "stdout_file": "test_production_large_2712000-native-r2-before.stdout", + "stderr_file": "test_production_large_2712000-native-r2-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009727333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000164334, + "solve_seconds": 0.009727333, + "driver_seconds": 0.009912084, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 921, + "stderr_bytes_observed": 0, + "external_seconds": 0.01090866606682539, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.542283+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r2-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r2-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000220542, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.5417e-05, + "solve_seconds": 0.000220542, + "driver_seconds": 0.000321583, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.010002374649047852, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.556841+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r2-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r2-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000235833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.1417e-05, + "solve_seconds": 0.000235833, + "driver_seconds": 0.000334417, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 838, + "stderr_bytes_observed": 0, + "external_seconds": 0.01884749997407198, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.570221+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r2-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r2-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010365084, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.3916e-05, + "solve_seconds": 0.010365084, + "driver_seconds": 0.010462458, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 829, + "stderr_bytes_observed": 0, + "external_seconds": 0.021067707799375057, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.593890+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r2-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r2-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010541917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.8458e-05, + "solve_seconds": 0.010541917, + "driver_seconds": 0.010648167, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 903, + "stderr_bytes_observed": 0, + "external_seconds": 0.021021916531026363, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.618216+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r2-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r2-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010015833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.1917e-05, + "solve_seconds": 0.010015833, + "driver_seconds": 0.010118417, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 914, + "stderr_bytes_observed": 0, + "external_seconds": 0.019399458542466164, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.642932+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r2-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r2-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009852417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.7792e-05, + "solve_seconds": 0.009852417, + "driver_seconds": 0.009956292, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 2, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1063, + "stderr_bytes_observed": 0, + "external_seconds": 0.010455458424985409, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.665821+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r2-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r2-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001282125, + "nodes": 159, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.925e-05, + "solve_seconds": 0.001282125, + "driver_seconds": 0.001386083, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 159, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 79, + "budget_nodes": 159, + "peak_open_nodes": 80, + "unresolved_regions": 0 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1081, + "stderr_bytes_observed": 0, + "external_seconds": 2.011117124930024, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:28.680007+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r2-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r2-before.stderr", + "status": "time_limit", + "objective": -1780, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 684, + "solve_seconds": 2.000077542, + "nodes": 1869922, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1780, + "best_bound": -4277, + "absolute_gap": 2497, + "relative_gap": 0.5838204348842647, + "build_seconds": 5.5583e-05, + "solve_seconds": 2.000077542, + "driver_seconds": 2.000163083, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1869922, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 934961, + "budget_nodes": 1869922, + "peak_open_nodes": 33, + "unresolved_regions": 24 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 922, + "stderr_bytes_observed": 0, + "external_seconds": 0.01056750025600195, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:30.695381+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r2-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r2-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000243125, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.6792e-05, + "solve_seconds": 0.000243125, + "driver_seconds": 0.000349958, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 911, + "stderr_bytes_observed": 0, + "external_seconds": 0.01011616736650467, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:30.709931+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r2-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r2-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000275167, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000108916, + "solve_seconds": 0.000275167, + "driver_seconds": 0.000400541, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1035, + "stderr_bytes_observed": 0, + "external_seconds": 2.011737208813429, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:30.723946+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r3-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r3-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.000071958, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 8.7792e-05, + "solve_seconds": 2.000071958, + "driver_seconds": 2.00018575, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1071, + "stderr_bytes_observed": 0, + "external_seconds": 0.012553374283015728, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:32.739740+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r3-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r3-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.001205167, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.2625e-05, + "solve_seconds": 0.001205167, + "driver_seconds": 0.001307458, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1260, + "stderr_bytes_observed": 0, + "external_seconds": 0.453428165987134, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:32.756141+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r3-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r3-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.442990875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000136292, + "solve_seconds": 0.442990875, + "driver_seconds": 0.443155625, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1256, + "stderr_bytes_observed": 0, + "external_seconds": 0.4536459157243371, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.214187+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r3-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r3-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.442809125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00014625, + "solve_seconds": 0.442809125, + "driver_seconds": 0.442985791, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1312, + "stderr_bytes_observed": 0, + "external_seconds": 0.1053372910246253, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.672488+00:00", + "stdout_file": "test_assignment_large_2012000-native-r3-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r3-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.09521425, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000171125, + "solve_seconds": 0.09521425, + "driver_seconds": 0.095408459, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1323, + "stderr_bytes_observed": 0, + "external_seconds": 0.10659216716885567, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.782467+00:00", + "stdout_file": "test_assignment_large_2012000-native-r3-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r3-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.094442833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000122792, + "solve_seconds": 0.094442833, + "driver_seconds": 0.09458975, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1218, + "stderr_bytes_observed": 0, + "external_seconds": 0.03484945930540562, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.894526+00:00", + "stdout_file": "test_tsp_large_2412000-native-r3-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r3-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023196083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000347542, + "solve_seconds": 0.023196083, + "driver_seconds": 0.023571042, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1238, + "stderr_bytes_observed": 0, + "external_seconds": 0.034061708487570286, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.934927+00:00", + "stdout_file": "test_tsp_large_2412000-native-r3-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r3-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023232291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000337584, + "solve_seconds": 0.023232291, + "driver_seconds": 0.02361, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1218, + "stderr_bytes_observed": 0, + "external_seconds": 0.019122040830552578, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.974469+00:00", + "stdout_file": "test_production_large_2712000-native-r3-before.stdout", + "stderr_file": "test_production_large_2712000-native-r3-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.01010425, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000193667, + "solve_seconds": 0.01010425, + "driver_seconds": 0.010321917, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1208, + "stderr_bytes_observed": 0, + "external_seconds": 0.020855040289461613, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:33.998702+00:00", + "stdout_file": "test_production_large_2712000-native-r3-after.stdout", + "stderr_file": "test_production_large_2712000-native-r3-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010058459, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000181375, + "solve_seconds": 0.010058459, + "driver_seconds": 0.010257334, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 910, + "stderr_bytes_observed": 0, + "external_seconds": 0.011041291989386082, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.024655+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r3-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r3-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000237209, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000104416, + "solve_seconds": 0.000237209, + "driver_seconds": 0.000359125, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.010994208045303822, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.040649+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r3-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r3-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00021, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.0292e-05, + "solve_seconds": 0.00021, + "driver_seconds": 0.000304125, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 826, + "stderr_bytes_observed": 0, + "external_seconds": 0.020058459602296352, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.056350+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r3-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r3-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010825541, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.9917e-05, + "solve_seconds": 0.010825541, + "driver_seconds": 0.010945583, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 835, + "stderr_bytes_observed": 0, + "external_seconds": 0.02193458378314972, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.080927+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r3-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r3-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010589541, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.2292e-05, + "solve_seconds": 0.010589541, + "driver_seconds": 0.010701, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 892, + "stderr_bytes_observed": 0, + "external_seconds": 0.020102624781429768, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.107630+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r3-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r3-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010203333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000128916, + "solve_seconds": 0.010203333, + "driver_seconds": 0.010351458, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 901, + "stderr_bytes_observed": 0, + "external_seconds": 0.0200659167021513, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.132803+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r3-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r3-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.01026975, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000102666, + "solve_seconds": 0.01026975, + "driver_seconds": 0.010392375, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1085, + "stderr_bytes_observed": 0, + "external_seconds": 2.0096640000119805, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:34.157861+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r3-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r3-before.stderr", + "status": "time_limit", + "objective": -1792, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 672, + "solve_seconds": 2.000074584, + "nodes": 1885395, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1792, + "best_bound": -4277, + "absolute_gap": 2485, + "relative_gap": 0.5810147299509002, + "build_seconds": 6.9666e-05, + "solve_seconds": 2.000074584, + "driver_seconds": 2.00017675, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1885395, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 942698, + "budget_nodes": 1885395, + "peak_open_nodes": 33, + "unresolved_regions": 26 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 3, + "expected_objective": -2464, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1073, + "stderr_bytes_observed": 0, + "external_seconds": 0.010309416800737381, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:36.172874+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r3-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r3-after.stderr", + "status": "optimal", + "objective": -2464, + "best_bound": -2464, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00120125, + "nodes": 159, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -2464, + "best_bound": -2464, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.6792e-05, + "solve_seconds": 0.00120125, + "driver_seconds": 0.001295709, + "assignment": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": 159, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 79, + "budget_nodes": 159, + "peak_open_nodes": 80, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 910, + "stderr_bytes_observed": 0, + "external_seconds": 0.010828499682247639, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:36.188242+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r3-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r3-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00024325, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.0625e-05, + "solve_seconds": 0.00024325, + "driver_seconds": 0.0003505, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 922, + "stderr_bytes_observed": 0, + "external_seconds": 0.010257834568619728, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:36.204203+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r3-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r3-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000254834, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.3166e-05, + "solve_seconds": 0.000254834, + "driver_seconds": 0.000355, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + } + ], + "runtime_hashes_unchanged": true, + "finished_utc": "2026-09-06T02:02:36.257225+00:00", + "input_hashes_unchanged": true, + "candidate_source_hashes_unchanged": true, + "measurement_source_hashes_unchanged": true, + "preserved_manifest_unchanged": true, + "elapsed_seconds": 18.8506913324818, + "comparison_valid": true + }, + "summary": { + "schema_version": 1, + "cohorts": { + "before": "Pre-algorithm 530a3b783 / compiled c2fabb78f", + "after": "Candidate, identical driver and verified runtime libraries" + }, + "repetitions": 3, + "required_units": 10, + "required_runs": 60, + "actual_runs": 60, + "units": [ + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "route": "native", + "known_optimum": -2464, + "before": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.01171329151839, + 2.0117574585601687, + 2.011737208813429 + ], + "median_external_seconds": 2.011737208813429, + "median_solve_seconds": 2.000071958, + "objectives": [ + -1947, + -1947, + -1947 + ], + "bounds": [ + null, + null, + null + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.013358999975025654, + 0.011290207505226135, + 0.012553374283015728 + ], + "median_external_seconds": 0.012553374283015728, + "median_solve_seconds": 0.001024709, + "objectives": [ + -2464, + -2464, + -2464 + ], + "bounds": [ + -2464, + -2464, + -2464 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": null + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "route": "native", + "known_optimum": 240, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.45226533245295286, + 0.4543928746134043, + 0.453428165987134 + ], + "median_external_seconds": 0.453428165987134, + "median_solve_seconds": 0.442990875, + "objectives": [ + 240, + 240, + 240 + ], + "bounds": [ + 240, + 240, + 240 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.4539887495338917, + 0.45818787440657616, + 0.4536459157243371 + ], + "median_external_seconds": 0.4539887495338917, + "median_solve_seconds": 0.444154458, + "objectives": [ + 240, + 240, + 240 + ], + "bounds": [ + 240, + 240, + 240 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0038106327354155 + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "route": "native", + "known_optimum": 164, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.10655704233795404, + 0.10406399983912706, + 0.1053372910246253 + ], + "median_external_seconds": 0.1053372910246253, + "median_solve_seconds": 0.09521425, + "objectives": [ + 164, + 164, + 164 + ], + "bounds": [ + 164, + 164, + 164 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.10649841744452715, + 0.1062516663223505, + 0.10659216716885567 + ], + "median_external_seconds": 0.10649841744452715, + "median_solve_seconds": 0.094770417, + "objectives": [ + 164, + 164, + 164 + ], + "bounds": [ + 164, + 164, + 164 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0119129335112387 + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "route": "native", + "known_optimum": 168, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.0354672921821475, + 0.034164207987487316, + 0.03484945930540562 + ], + "median_external_seconds": 0.03484945930540562, + "median_solve_seconds": 0.023101, + "objectives": [ + 168, + 168, + 168 + ], + "bounds": [ + 168, + 168, + 168 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.03438812494277954, + 0.03540045861154795, + 0.034061708487570286 + ], + "median_external_seconds": 0.03438812494277954, + "median_solve_seconds": 0.02340425, + "objectives": [ + 168, + 168, + 168 + ], + "bounds": [ + 168, + 168, + 168 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9773956086109737 + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "route": "native", + "known_optimum": 512, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.02008245885372162, + 0.01991220936179161, + 0.019122040830552578 + ], + "median_external_seconds": 0.01991220936179161, + "median_solve_seconds": 0.010012042, + "objectives": [ + 512, + 512, + 512 + ], + "bounds": [ + 512, + 512, + 512 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.019451250322163105, + 0.020601334050297737, + 0.020855040289461613 + ], + "median_external_seconds": 0.020601334050297737, + "median_solve_seconds": 0.009747708, + "objectives": [ + 512, + 512, + 512 + ], + "bounds": [ + 512, + 512, + 512 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0346081479952922 + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "route": "native", + "known_optimum": 3, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.010739082470536232, + 0.010002374649047852, + 0.011041291989386082 + ], + "median_external_seconds": 0.010739082470536232, + "median_solve_seconds": 0.000235833, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.009933915920555592, + 0.01090866606682539, + 0.010994208045303822 + ], + "median_external_seconds": 0.01090866606682539, + "median_solve_seconds": 0.000220542, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9957356490411157 + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "route": "native", + "known_optimum": 390, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.0199796250090003, + 0.021067707799375057, + 0.020058459602296352 + ], + "median_external_seconds": 0.020058459602296352, + "median_solve_seconds": 0.010733084, + "objectives": [ + 390, + 390, + 390 + ], + "bounds": [ + 390, + 390, + 390 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.02263270877301693, + 0.01884749997407198, + 0.02193458378314972 + ], + "median_external_seconds": 0.02193458378314972, + "median_solve_seconds": 0.010589541, + "objectives": [ + 390, + 390, + 390 + ], + "bounds": [ + 390, + 390, + 390 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0935328144858434 + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "route": "native", + "known_optimum": 129, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.01937283296138048, + 0.019399458542466164, + 0.020102624781429768 + ], + "median_external_seconds": 0.019399458542466164, + "median_solve_seconds": 0.009852417, + "objectives": [ + 129, + 129, + 129 + ], + "bounds": [ + 129, + 129, + 129 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.0223385002464056, + 0.021021916531026363, + 0.0200659167021513 + ], + "median_external_seconds": 0.021021916531026363, + "median_solve_seconds": 0.01002125, + "objectives": [ + 129, + 129, + 129 + ], + "bounds": [ + 129, + 129, + 129 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0836341893258812 + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "route": "dfs", + "known_optimum": -2464, + "before": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.0115811666473746, + 2.011117124930024, + 2.0096640000119805 + ], + "median_external_seconds": 2.011117124930024, + "median_solve_seconds": 2.000077542, + "objectives": [ + -1792, + -1780, + -1792 + ], + "bounds": [ + -4277, + -4277, + -4277 + ], + "nodes": [ + 1884487, + 1869922, + 1885395 + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.011061125434935093, + 0.010455458424985409, + 0.010309416800737381 + ], + "median_external_seconds": 0.010455458424985409, + "median_solve_seconds": 0.00121975, + "objectives": [ + -2464, + -2464, + -2464 + ], + "bounds": [ + -2464, + -2464, + -2464 + ], + "nodes": [ + 159, + 159, + 159 + ] + }, + "median_paired_ratio_after_before": null + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "route": "dfs", + "known_optimum": 3, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.011231082491576672, + 0.01011616736650467, + 0.010828499682247639 + ], + "median_external_seconds": 0.010828499682247639, + "median_solve_seconds": 0.000260208, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + 57, + 57, + 57 + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.01090487465262413, + 0.01056750025600195, + 0.010257834568619728 + ], + "median_external_seconds": 0.01056750025600195, + "median_solve_seconds": 0.000243125, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + 57, + 57, + 57 + ] + }, + "median_paired_ratio_after_before": 0.9709549066888968 + } + ], + "elapsed_seconds": 18.8506913324818, + "provenance": { + "driver_sha256": "c70157d0196b1b8e351d5bd7c61683b5717c2bcf1eaa5b1cb5196bf3c8cf4536", + "driver_name": "optimize-native-benchmark", + "source_head": "5d533bcd4f66e9f065e24bac5ed7a7c976d715db", + "candidate_source_sha256": { + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505", + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "0a95ea0267162ec8b00b3c0b96d64306ee449e6eb3723d375cd39b0f94d48695", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b" + }, + "driver_source_sha256": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "runner_sha256": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "capture_sha256": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "validators": { + "validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1024, + "stderr_bytes_observed": 98254, + "external_seconds": 2.246682584285736, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:17.486795+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr" + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "1e936e4a5889713079b1b6d7b5fc502b806ebff7f65c7d89808284b7e7db9862" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1059, + "stderr_bytes_observed": 98187, + "external_seconds": 0.036447624675929546, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T02:02:19.746990+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr" + } + } + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/native_benchmark.cpp": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "experiments/optimize/benchmark_progress.py": "79a83d7169376c2a2864c278064aa74ec940fa4af6ec3365e921998e5cba5b58", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + } + }, + "caveats": [ + "Fixed saved instances; no post-result selection, starts or reference feed.", + "Ordinary Native and explicit DFS frontier are separate routes; no HiGHS solve is requested.", + "No timing ratio unless every repetition completed and independently matched the optimum.", + "Capped incumbents/bounds and failures remain in all denominators.", + "Ordinary native node counts are unavailable through the frozen public API.", + "External times include process and model construction; internal solve time is also retained.", + "Three paired repetitions are a small diagnostic, not a statistical speed guarantee." + ], + "comparison_valid": true + } + }, + "rejected_pilot": { + "disposition": "Generic objective-endpoint and DFS ordering was rejected after unchanged completion, a worse limited knapsack incumbent and more bin-packing nodes. The accepted study retains the same driver, runner, inputs, references, baseline and protocol. A separately tested macOS process-group cleanup fix changes the capture-helper hash between studies; both cohorts within the accepted study use that same final helper.", + "report": { + "schema_version": 1, + "started_utc": "2026-09-06T01:10:20.766294+00:00", + "purpose": "native_algorithm_changes_from_current_pre_algorithm_baseline", + "expected_runs": 60, + "inputs": [ + { + "id": "test_knapsack_large_1312000", + "kind": "binary", + "stem": "instances/test_knapsack_large_1312000", + "json_sha256": "7058d2ad2e22d58f800c860f451b73f916ddb326974fd0c21432b9af5e8e63cd", + "txt_sha256": "78b2364ca6925017ca930517489c7fc56cf6e908c7c8e033e2a2e1c254a9e28e", + "objective": -2464, + "semantic_sha256": "0e974e09f297a80d3615b5468c02b9b2e504de97e79deba0b7e46bb0efd31741", + "reference_method": "one-dimensional zero-one knapsack DP", + "input_variables": 80, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_facility_location_large_1812000", + "kind": "binary", + "stem": "instances/test_facility_location_large_1812000", + "json_sha256": "b93e5c15d83bff49cd4aee1dde60df72638a37d4674299e3629fa01406659d65", + "txt_sha256": "e627b916143364e246990b9451164c9f3b1c1ec98730680b91ad1a0d06bb46a1", + "objective": 240, + "semantic_sha256": "e1860a148b48ab19be2fb3d23d4e3323b958ee0f969c32b843e02074f4853af2", + "reference_method": "enumerate facility subsets and independently assign each customer", + "input_variables": 128, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_assignment_large_2012000", + "kind": "binary", + "stem": "instances/test_assignment_large_2012000", + "json_sha256": "86186c3a82b3012c48da2d5362e354bbc32ff8d7c163df6e31f79b7e6d68da78", + "txt_sha256": "785ac7cb5bcea26a813715f5cfe593eb80ca512aa6928d1444d32ee61b60bdf1", + "objective": 164, + "semantic_sha256": "125ff7049cca1b7fa457c9c147a513a04875d81d2179bf8272d91242e2afee05", + "reference_method": "subset dynamic program for bipartite assignment", + "input_variables": 144, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_tsp_large_2412000", + "kind": "binary", + "stem": "instances/test_tsp_large_2412000", + "json_sha256": "984de574f27830e6cb7b5ce94383b335ed90624c9963d8da31c9e243dfa8eb45", + "txt_sha256": "1659002ab70dd6ba37bef182d0577654542ad810d227a450998a3b59cae8afdd", + "objective": 168, + "semantic_sha256": "ee5430e34e118638173bf3373858eb42d0c6fa4cf710420fac97d4dd74d481a8", + "reference_method": "Held-Karp subset dynamic program", + "input_variables": 120, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_production_large_2712000", + "kind": "binary", + "stem": "instances/test_production_large_2712000", + "json_sha256": "d6e359a10be09c35a9ee2c8b53b15c16ce6bd7defcb90f572d70ca261104e87a", + "txt_sha256": "5991ecd6e9795e3084780551212c3e93722b63bb6c6bb3e0bb59c628aeed25a8", + "objective": 512, + "semantic_sha256": "aec49df05779029d8b78b322837a807a6c2401081abbc004692db664c80f7030", + "reference_method": "inventory-state production dynamic program", + "input_variables": 120, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_bin_packing_small_2202000", + "kind": "binary", + "stem": "instances/test_bin_packing_small_2202000", + "json_sha256": "cb6b44423fd1f72565301576a6da35360d66e39a2a23a964ca641bf2a4ba09ba", + "txt_sha256": "dc779b85821f0b752eb2bb5313f3cffdce03474dc39620545e0baaf368780943", + "objective": 3, + "semantic_sha256": "f2b1b623a08201a1d16b003201fa02bedd2d64ae93c581ac06c75145f752827c", + "reference_method": "feasible witness meets total-weight capacity lower bound", + "input_variables": 44, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "stem": "native-instances/test_native_tsp_large_9112000", + "json_sha256": "7946df28b5f4f2a85db52932c3a61431c8dcf950709fed69d2969e8a9d238dec", + "txt_sha256": "b8c212e821fe3d5f2a90035898b8bcf295fdd8fb41e71f134c55db587bb289b8", + "objective": 390, + "semantic_sha256": "97070e1d2126f3dea60fe61a7ec586b8ce8c86b38e3d739b9ef360bda14961e3", + "reference_method": "Held-Karp dynamic programming", + "input_variables": 12, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + }, + { + "id": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "stem": "native-instances/test_weighted_queens_large_9312000", + "json_sha256": "47d48e4ad3ed2cd384ffab6111570081801af12c4b1e4f7ab811b05c08c45bca", + "txt_sha256": "d6c023e6f6b2ae1e61bde3228337c4b84a596440e9a46edfe446b1bd6c79ba1a", + "objective": 129, + "semantic_sha256": "7ee39f26c494d0d5bfd66cb8f4113acdf9d7d959abdf3f9c08c08721a15dba0f", + "reference_method": "independent exhaustive queen enumeration", + "input_variables": 12, + "reference_record_verified": true, + "reference_witness_checked": true, + "reference_recomputed": false + } + ], + "provenance": { + "driver_sha256": "c70157d0196b1b8e351d5bd7c61683b5717c2bcf1eaa5b1cb5196bf3c8cf4536", + "driver_name": "optimize-native-benchmark", + "source_head": "33e1015c99a2e0b314257b0e345ae80be1d69b0f", + "candidate_source_sha256": { + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505", + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "390023d8827153be8659f333c0ed13e77610d8ced9fc116ca72ccaab8156ea94", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b" + }, + "driver_source_sha256": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "runner_sha256": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "capture_sha256": "b365a3435bdcfb60ec80ecc6c20076b159ba59a3fd797866cb33b0b684b0b47f", + "validators": { + "validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1036, + "stderr_bytes_observed": 97143, + "external_seconds": 2.875202499330044, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:20.766608+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr" + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "13aa8190b07ed94e663cbe2a3df45284e02b21ace957eb1e516f928e0bca8793" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 97076, + "external_seconds": 2.0297612911090255, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:23.652884+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr" + } + } + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/native_benchmark.cpp": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "experiments/optimize/benchmark_progress.py": "b365a3435bdcfb60ec80ecc6c20076b159ba59a3fd797866cb33b0b684b0b47f", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + } + }, + "records": [ + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 0, + "external_seconds": 2.0574995828792453, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:25.698009+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r1-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r1-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.00007825, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 5.6792e-05, + "solve_seconds": 2.00007825, + "driver_seconds": 2.000161625, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1026, + "stderr_bytes_observed": 0, + "external_seconds": 2.0109385000541806, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:27.757730+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r1-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r1-after.stderr", + "status": "time_limit", + "objective": -1831, + "best_bound": null, + "absolute_primal_gap_to_oracle": 633, + "solve_seconds": 2.000073, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1831, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.5708e-05, + "solve_seconds": 2.000073, + "driver_seconds": 2.000161291, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1268, + "stderr_bytes_observed": 0, + "external_seconds": 0.441108082421124, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:29.770747+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r1-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r1-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.431307583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00014125, + "solve_seconds": 0.431307583, + "driver_seconds": 0.431476958, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1240, + "stderr_bytes_observed": 0, + "external_seconds": 0.44067991618067026, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.214257+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r1-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r1-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.43062075, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000130667, + "solve_seconds": 0.43062075, + "driver_seconds": 0.430776875, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.10210783407092094, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.657813+00:00", + "stdout_file": "test_assignment_large_2012000-native-r1-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r1-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.092360833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000124333, + "solve_seconds": 0.092360833, + "driver_seconds": 0.092510375, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1331, + "stderr_bytes_observed": 0, + "external_seconds": 0.13445758260786533, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.762183+00:00", + "stdout_file": "test_assignment_large_2012000-native-r1-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r1-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.120076833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000121083, + "solve_seconds": 0.120076833, + "driver_seconds": 0.120223375, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.03746237512677908, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.900329+00:00", + "stdout_file": "test_tsp_large_2412000-native-r1-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r1-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023433875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000610875, + "solve_seconds": 0.023433875, + "driver_seconds": 0.024087375, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1218, + "stderr_bytes_observed": 0, + "external_seconds": 0.03216974996030331, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.941096+00:00", + "stdout_file": "test_tsp_large_2412000-native-r1-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r1-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023026583, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000318167, + "solve_seconds": 0.023026583, + "driver_seconds": 0.023364667, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1239, + "stderr_bytes_observed": 0, + "external_seconds": 0.019601916894316673, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.976561+00:00", + "stdout_file": "test_production_large_2712000-native-r1-before.stdout", + "stderr_file": "test_production_large_2712000-native-r1-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009416625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000400458, + "solve_seconds": 0.009416625, + "driver_seconds": 0.009834708, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.019460124894976616, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:30.998882+00:00", + "stdout_file": "test_production_large_2712000-native-r1-after.stdout", + "stderr_file": "test_production_large_2712000-native-r1-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009731291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000175875, + "solve_seconds": 0.009731291, + "driver_seconds": 0.009929083, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 921, + "stderr_bytes_observed": 0, + "external_seconds": 0.009223458357155323, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.020733+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r1-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r1-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000244959, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000257958, + "solve_seconds": 0.000244959, + "driver_seconds": 0.000518583, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.009130999445915222, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.031978+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r1-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r1-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000207792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.7458e-05, + "solve_seconds": 0.000207792, + "driver_seconds": 0.000300583, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 847, + "stderr_bytes_observed": 0, + "external_seconds": 0.01943808328360319, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.043799+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r1-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r1-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010837458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000277291, + "solve_seconds": 0.010837458, + "driver_seconds": 0.011137541, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 836, + "stderr_bytes_observed": 0, + "external_seconds": 0.019261958077549934, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.065740+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r1-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r1-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0105145, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.2958e-05, + "solve_seconds": 0.0105145, + "driver_seconds": 0.010610208, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 1, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 893, + "stderr_bytes_observed": 0, + "external_seconds": 0.02196074929088354, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.087146+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r1-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r1-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.01037475, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000270084, + "solve_seconds": 0.01037475, + "driver_seconds": 0.010668917, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 1, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 904, + "stderr_bytes_observed": 0, + "external_seconds": 0.01955575030297041, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.112119+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r1-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r1-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009842875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.5708e-05, + "solve_seconds": 0.009842875, + "driver_seconds": 0.009960333, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1085, + "stderr_bytes_observed": 0, + "external_seconds": 2.010469874367118, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:31.134333+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r1-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r1-before.stderr", + "status": "time_limit", + "objective": -1815, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 649, + "solve_seconds": 2.000100916, + "nodes": 1924071, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1815, + "best_bound": -4277, + "absolute_gap": 2462, + "relative_gap": 0.5756371288286182, + "build_seconds": 8.6417e-05, + "solve_seconds": 2.000100916, + "driver_seconds": 2.00021425, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1924071, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 962035, + "budget_nodes": 1924071, + "peak_open_nodes": 33, + "unresolved_regions": 27 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 1, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1093, + "stderr_bytes_observed": 0, + "external_seconds": 2.011075667105615, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:33.147716+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r1-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r1-after.stderr", + "status": "time_limit", + "objective": -1826, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 638, + "solve_seconds": 2.00011075, + "nodes": 1956349, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1826, + "best_bound": -4277, + "absolute_gap": 2451, + "relative_gap": 0.5730652326397008, + "build_seconds": 6.875e-05, + "solve_seconds": 2.00011075, + "driver_seconds": 2.000213042, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1956349, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 978175, + "budget_nodes": 1956349, + "peak_open_nodes": 33, + "unresolved_regions": 26 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 911, + "stderr_bytes_observed": 0, + "external_seconds": 0.009289749898016453, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:35.161948+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r1-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r1-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.00026475, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000110125, + "solve_seconds": 0.00026475, + "driver_seconds": 0.000394125, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 1, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 911, + "stderr_bytes_observed": 0, + "external_seconds": 0.011771749705076218, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:35.174202+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r1-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r1-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000495958, + "nodes": 75, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000105042, + "solve_seconds": 0.000495958, + "driver_seconds": 0.000626125, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 75, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 37, + "budget_nodes": 75, + "peak_open_nodes": 20, + "unresolved_regions": 0 + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 0, + "external_seconds": 2.010632749646902, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:35.188646+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r2-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r2-after.stderr", + "status": "time_limit", + "objective": -1831, + "best_bound": null, + "absolute_primal_gap_to_oracle": 633, + "solve_seconds": 2.000071875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1831, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 6.3542e-05, + "solve_seconds": 2.000071875, + "driver_seconds": 2.000165125, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1036, + "stderr_bytes_observed": 0, + "external_seconds": 2.0101226661354303, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:37.202857+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r2-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r2-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.000082833, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 9.9375e-05, + "solve_seconds": 2.000082833, + "driver_seconds": 2.000215833, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1257, + "stderr_bytes_observed": 0, + "external_seconds": 0.4467247910797596, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:39.216035+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r2-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r2-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.437484, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000131667, + "solve_seconds": 0.437484, + "driver_seconds": 0.437648167, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1260, + "stderr_bytes_observed": 0, + "external_seconds": 0.45965804159641266, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:39.666618+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r2-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r2-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.449584, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000153916, + "solve_seconds": 0.449584, + "driver_seconds": 0.449786291, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.1044969167560339, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.130472+00:00", + "stdout_file": "test_assignment_large_2012000-native-r2-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r2-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.095281083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000135834, + "solve_seconds": 0.095281083, + "driver_seconds": 0.095443417, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1333, + "stderr_bytes_observed": 0, + "external_seconds": 0.10525850020349026, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.239269+00:00", + "stdout_file": "test_assignment_large_2012000-native-r2-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r2-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.096414875, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000135541, + "solve_seconds": 0.096414875, + "driver_seconds": 0.096578125, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.03439779207110405, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.348578+00:00", + "stdout_file": "test_tsp_large_2412000-native-r2-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r2-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.023785416, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000364917, + "solve_seconds": 0.023785416, + "driver_seconds": 0.024186292, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1227, + "stderr_bytes_observed": 0, + "external_seconds": 0.03588866628706455, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.387380+00:00", + "stdout_file": "test_tsp_large_2412000-native-r2-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r2-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.024036041, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000341792, + "solve_seconds": 0.024036041, + "driver_seconds": 0.024407084, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.019208207726478577, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.427597+00:00", + "stdout_file": "test_production_large_2712000-native-r2-after.stdout", + "stderr_file": "test_production_large_2712000-native-r2-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009853292, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000185958, + "solve_seconds": 0.009853292, + "driver_seconds": 0.010066458, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1226, + "stderr_bytes_observed": 0, + "external_seconds": 0.021410957910120487, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.451274+00:00", + "stdout_file": "test_production_large_2712000-native-r2-before.stdout", + "stderr_file": "test_production_large_2712000-native-r2-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010039208, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000187, + "solve_seconds": 0.010039208, + "driver_seconds": 0.0102535, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 921, + "stderr_bytes_observed": 0, + "external_seconds": 0.009297041222453117, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.476970+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r2-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r2-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000228375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000102334, + "solve_seconds": 0.000228375, + "driver_seconds": 0.000349667, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.008699707686901093, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.490130+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r2-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r2-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000221417, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.9333e-05, + "solve_seconds": 0.000221417, + "driver_seconds": 0.000338708, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 818, + "stderr_bytes_observed": 0, + "external_seconds": 0.02161391731351614, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.502597+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r2-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r2-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.011020792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000100667, + "solve_seconds": 0.011020792, + "driver_seconds": 0.011148042, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 825, + "stderr_bytes_observed": 0, + "external_seconds": 0.01915374957025051, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.529452+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r2-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r2-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010557, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.1334e-05, + "solve_seconds": 0.010557, + "driver_seconds": 0.01067275, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 2, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 913, + "stderr_bytes_observed": 0, + "external_seconds": 0.020576790906488895, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.552356+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r2-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r2-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009926709, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.00011675, + "solve_seconds": 0.009926709, + "driver_seconds": 0.0100645, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 2, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 893, + "stderr_bytes_observed": 0, + "external_seconds": 0.019228458404541016, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.576681+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r2-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r2-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009928916, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000105208, + "solve_seconds": 0.009928916, + "driver_seconds": 0.010060041, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1093, + "stderr_bytes_observed": 0, + "external_seconds": 2.0088525423780084, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:40.599880+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r2-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r2-after.stderr", + "status": "time_limit", + "objective": -1826, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 638, + "solve_seconds": 2.000076458, + "nodes": 1994307, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1826, + "best_bound": -4277, + "absolute_gap": 2451, + "relative_gap": 0.5730652326397008, + "build_seconds": 7.7916e-05, + "solve_seconds": 2.000076458, + "driver_seconds": 2.000183375, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1994307, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 997154, + "budget_nodes": 1994307, + "peak_open_nodes": 33, + "unresolved_regions": 25 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 2, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1084, + "stderr_bytes_observed": 0, + "external_seconds": 2.0091660004109144, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:42.613358+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r2-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r2-before.stderr", + "status": "time_limit", + "objective": -1813, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 651, + "solve_seconds": 2.00007125, + "nodes": 1911963, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1813, + "best_bound": -4277, + "absolute_gap": 2464, + "relative_gap": 0.5761047463175123, + "build_seconds": 6.1459e-05, + "solve_seconds": 2.00007125, + "driver_seconds": 2.000158542, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1911963, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 955982, + "budget_nodes": 1911963, + "peak_open_nodes": 33, + "unresolved_regions": 27 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 910, + "stderr_bytes_observed": 0, + "external_seconds": 0.011683042161166668, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:44.626598+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r2-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r2-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000950792, + "nodes": 75, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.3209e-05, + "solve_seconds": 0.000950792, + "driver_seconds": 0.001065375, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 75, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 37, + "budget_nodes": 75, + "peak_open_nodes": 20, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 2, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 900, + "stderr_bytes_observed": 0, + "external_seconds": 0.009000749327242374, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:44.642738+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r2-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r2-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000269125, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.8417e-05, + "solve_seconds": 0.000269125, + "driver_seconds": 0.000376583, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 0, + "external_seconds": 2.0082721253857017, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:44.656036+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r3-before.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r3-before.stderr", + "status": "time_limit", + "objective": -1947, + "best_bound": null, + "absolute_primal_gap_to_oracle": 517, + "solve_seconds": 2.000063625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1947, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 8.1417e-05, + "solve_seconds": 2.000063625, + "driver_seconds": 2.000166542, + "assignment": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 0, + "external_seconds": 2.0103791253641248, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:46.668811+00:00", + "stdout_file": "test_knapsack_large_1312000-native-r3-after.stdout", + "stderr_file": "test_knapsack_large_1312000-native-r3-after.stderr", + "status": "time_limit", + "objective": -1831, + "best_bound": null, + "absolute_primal_gap_to_oracle": 633, + "solve_seconds": 2.000068083, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "time_limit", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native shared solve budget exhausted", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1831, + "best_bound": null, + "absolute_gap": null, + "relative_gap": null, + "build_seconds": 7.125e-05, + "solve_seconds": 2.000068083, + "driver_seconds": 2.000161875, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1260, + "stderr_bytes_observed": 0, + "external_seconds": 0.4656751248985529, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:48.683467+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r3-before.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r3-before.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.455230792, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000143708, + "solve_seconds": 0.455230792, + "driver_seconds": 0.455410042, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 240, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1268, + "stderr_bytes_observed": 0, + "external_seconds": 0.4440462915226817, + "command": [ + "BINARY", + "--input", + "instances/test_facility_location_large_1812000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.153852+00:00", + "stdout_file": "test_facility_location_large_1812000-native-r3-after.stdout", + "stderr_file": "test_facility_location_large_1812000-native-r3-after.stderr", + "status": "optimal", + "objective": 240, + "best_bound": 240, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.434055708, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 128, + "model_rows": 150, + "model_globals": 0, + "objective": 240, + "best_bound": 240, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.0001385, + "solve_seconds": 0.434055708, + "driver_seconds": 0.434218917, + "assignment": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1322, + "stderr_bytes_observed": 0, + "external_seconds": 0.1037210002541542, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.602493+00:00", + "stdout_file": "test_assignment_large_2012000-native-r3-before.stdout", + "stderr_file": "test_assignment_large_2012000-native-r3-before.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.092873667, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000141667, + "solve_seconds": 0.092873667, + "driver_seconds": 0.093038333, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 164, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1322, + "stderr_bytes_observed": 0, + "external_seconds": 0.10392316710203886, + "command": [ + "BINARY", + "--input", + "instances/test_assignment_large_2012000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.711303+00:00", + "stdout_file": "test_assignment_large_2012000-native-r3-after.stdout", + "stderr_file": "test_assignment_large_2012000-native-r3-after.stderr", + "status": "optimal", + "objective": 164, + "best_bound": 164, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.093596917, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 144, + "model_rows": 48, + "model_globals": 0, + "objective": 164, + "best_bound": 164, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000136167, + "solve_seconds": 0.093596917, + "driver_seconds": 0.093765667, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1238, + "stderr_bytes_observed": 0, + "external_seconds": 0.031584917567670345, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.820238+00:00", + "stdout_file": "test_tsp_large_2412000-native-r3-before.stdout", + "stderr_file": "test_tsp_large_2412000-native-r3-before.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.02260225, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000330708, + "solve_seconds": 0.02260225, + "driver_seconds": 0.022952708, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 168, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1229, + "stderr_bytes_observed": 0, + "external_seconds": 0.03130329214036465, + "command": [ + "BINARY", + "--input", + "instances/test_tsp_large_2412000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.857213+00:00", + "stdout_file": "test_tsp_large_2412000-native-r3-after.stdout", + "stderr_file": "test_tsp_large_2412000-native-r3-after.stderr", + "status": "optimal", + "objective": 168, + "best_bound": 168, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.022424625, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 513, + "model_globals": 0, + "objective": 168, + "best_bound": 168, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000348625, + "solve_seconds": 0.022424625, + "driver_seconds": 0.02279475, + "assignment": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1219, + "stderr_bytes_observed": 0, + "external_seconds": 0.01884474977850914, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.893884+00:00", + "stdout_file": "test_production_large_2712000-native-r3-before.stdout", + "stderr_file": "test_production_large_2712000-native-r3-before.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009431666, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000186, + "solve_seconds": 0.009431666, + "driver_seconds": 0.009635958, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 512, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1228, + "stderr_bytes_observed": 0, + "external_seconds": 0.019093625247478485, + "command": [ + "BINARY", + "--input", + "instances/test_production_large_2712000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.917850+00:00", + "stdout_file": "test_production_large_2712000-native-r3-after.stdout", + "stderr_file": "test_production_large_2712000-native-r3-after.stderr", + "status": "optimal", + "objective": 512, + "best_bound": 512, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009522333, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 120, + "model_rows": 26, + "model_globals": 0, + "objective": 512, + "best_bound": 512, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 0.000168541, + "solve_seconds": 0.009522333, + "driver_seconds": 0.009709, + "assignment": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "full_values": [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.009012209251523018, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.941782+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r3-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r3-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000209291, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.575e-05, + "solve_seconds": 0.000209291, + "driver_seconds": 0.000321291, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 932, + "stderr_bytes_observed": 0, + "external_seconds": 0.00899325031787157, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.955259+00:00", + "stdout_file": "test_bin_packing_small_2202000-native-r3-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-native-r3-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000217375, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.5959e-05, + "solve_seconds": 0.000217375, + "driver_seconds": 0.000319042, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 835, + "stderr_bytes_observed": 0, + "external_seconds": 0.01915424969047308, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.968858+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r3-before.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r3-before.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010793458, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.8375e-05, + "solve_seconds": 0.010793458, + "driver_seconds": 0.010905, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 390, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 836, + "stderr_bytes_observed": 0, + "external_seconds": 0.019223584793508053, + "command": [ + "BINARY", + "--input", + "native-instances/test_native_tsp_large_9112000.txt", + "--kind", + "native_tsp", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:49.992645+00:00", + "stdout_file": "test_native_tsp_large_9112000-native-r3-after.stdout", + "stderr_file": "test_native_tsp_large_9112000-native-r3-after.stderr", + "status": "optimal", + "objective": 390, + "best_bound": 390, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.0105965, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "native_tsp", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 38, + "model_columns": 24, + "model_rows": 0, + "model_globals": 13, + "objective": 390, + "best_bound": 390, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 7.8209e-05, + "solve_seconds": 0.0105965, + "driver_seconds": 0.010693459, + "assignment": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2 + ], + "full_values": [ + 5, + 11, + 10, + 0, + 3, + 7, + 8, + 9, + 1, + 6, + 4, + 2, + 9, + 62, + 29, + 13, + 11, + 5, + 26, + 49, + 80, + 57, + 12, + 37 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "before", + "repetition": 3, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 894, + "stderr_bytes_observed": 0, + "external_seconds": 0.019237250089645386, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:50.016352+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r3-before.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r3-before.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.010283584, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.3708e-05, + "solve_seconds": 0.010283584, + "driver_seconds": 0.010403416, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "route": "native", + "cohort": "after", + "repetition": 3, + "expected_objective": 129, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 914, + "stderr_bytes_observed": 0, + "external_seconds": 0.01913137547671795, + "command": [ + "BINARY", + "--input", + "native-instances/test_weighted_queens_large_9312000.txt", + "--kind", + "weighted_queens", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:50.040933+00:00", + "stdout_file": "test_weighted_queens_large_9312000-native-r3-after.stdout", + "stderr_file": "test_weighted_queens_large_9312000-native-r3-after.stderr", + "status": "optimal", + "objective": 129, + "best_bound": 129, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.009858125, + "nodes": null, + "backend_result": { + "schema_version": 1, + "kind": "weighted_queens", + "route": "native", + "status": "optimal", + "backend": "Gecode native", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native finite integer search exhausted; original integer semantics preserved", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 88, + "model_columns": 48, + "model_rows": 24, + "model_globals": 15, + "objective": 129, + "best_bound": 129, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 8.0875e-05, + "solve_seconds": 0.009858125, + "driver_seconds": 0.0099585, + "assignment": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0 + ], + "full_values": [ + 10, + 4, + 7, + 5, + 2, + 9, + 1, + 6, + 8, + 3, + 11, + 0, + 10, + 10, + 5, + 3, + 9, + 5, + 8, + 2, + 6, + -2, + 14, + 4, + 7, + -5, + 13, + -1, + 16, + 0, + 12, + -6, + 21, + 1, + 11, + -11, + 5, + 8, + 15, + 24, + 12, + 10, + 19, + 6, + 10, + 1, + 9, + 10 + ], + "nodes": null, + "node_count_scope": "unavailable in ordinary SolveResult", + "expanded_nodes": null, + "budget_nodes": null, + "peak_open_nodes": null, + "unresolved_regions": null + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1093, + "stderr_bytes_observed": 0, + "external_seconds": 2.009140250273049, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:50.065053+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r3-before.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r3-before.stderr", + "status": "time_limit", + "objective": -1815, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 649, + "solve_seconds": 2.000097541, + "nodes": 1925383, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1815, + "best_bound": -4277, + "absolute_gap": 2462, + "relative_gap": 0.5756371288286182, + "build_seconds": 7.0458e-05, + "solve_seconds": 2.000097541, + "driver_seconds": 2.000193083, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1925383, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 962692, + "budget_nodes": 1925383, + "peak_open_nodes": 33, + "unresolved_regions": 25 + } + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 3, + "expected_objective": -2464, + "completed": false, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1081, + "stderr_bytes_observed": 0, + "external_seconds": 2.0122441658750176, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:52.079774+00:00", + "stdout_file": "test_knapsack_large_1312000-dfs-r3-after.stdout", + "stderr_file": "test_knapsack_large_1312000-dfs-r3-after.stderr", + "status": "time_limit", + "objective": -1826, + "best_bound": -4277, + "absolute_primal_gap_to_oracle": 638, + "solve_seconds": 2.000094167, + "nodes": 1990221, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "time_limit", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "Native frontier time/cancellation budget stopped before return", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 80, + "model_rows": 1, + "model_globals": 0, + "objective": -1826, + "best_bound": -4277, + "absolute_gap": 2451, + "relative_gap": 0.5730652326397008, + "build_seconds": 7.0417e-05, + "solve_seconds": 2.000094167, + "driver_seconds": 2.000192125, + "assignment": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0 + ], + "nodes": 1990221, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 995110, + "budget_nodes": 1990221, + "peak_open_nodes": 33, + "unresolved_regions": 25 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "before", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 899, + "stderr_bytes_observed": 0, + "external_seconds": 0.008892958052456379, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:54.097941+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r3-before.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r3-before.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000242208, + "nodes": 57, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.8459e-05, + "solve_seconds": 0.000242208, + "driver_seconds": 0.000357625, + "assignment": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 57, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 28, + "budget_nodes": 57, + "peak_open_nodes": 11, + "unresolved_regions": 0 + } + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "kind": "binary", + "route": "dfs", + "cohort": "after", + "repetition": 3, + "expected_objective": 3, + "completed": true, + "witness_checked": true, + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 922, + "stderr_bytes_observed": 0, + "external_seconds": 0.008965667337179184, + "command": [ + "BINARY", + "--input", + "instances/test_bin_packing_small_2202000.txt", + "--kind", + "binary", + "--route", + "dfs", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:54.111723+00:00", + "stdout_file": "test_bin_packing_small_2202000-dfs-r3-after.stdout", + "stderr_file": "test_bin_packing_small_2202000-dfs-r3-after.stderr", + "status": "optimal", + "objective": 3, + "best_bound": 3, + "absolute_primal_gap_to_oracle": 0, + "solve_seconds": 0.000281667, + "nodes": 75, + "backend_result": { + "schema_version": 1, + "kind": "binary", + "route": "dfs", + "status": "optimal", + "backend": "Gecode native frontier", + "backend_version": "6.4.0", + "guarantee": "exact", + "message": "All native frontier regions exhausted or pruned by exact incumbent bounds", + "solution_validated": true, + "has_solution": true, + "start_submitted": false, + "model_id": 1, + "revision": 3, + "model_columns": 44, + "model_rows": 67, + "model_globals": 0, + "objective": 3, + "best_bound": 3, + "absolute_gap": 0, + "relative_gap": 0, + "build_seconds": 9.0292e-05, + "solve_seconds": 0.000281667, + "driver_seconds": 0.000389834, + "assignment": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "full_values": [ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ], + "nodes": 75, + "node_count_scope": "frontier admitted status attempts", + "expanded_nodes": 37, + "budget_nodes": 75, + "peak_open_nodes": 20, + "unresolved_regions": 0 + } + } + ], + "runtime_hashes_unchanged": true, + "finished_utc": "2026-09-06T01:10:54.169479+00:00", + "input_hashes_unchanged": true, + "candidate_source_hashes_unchanged": true, + "measurement_source_hashes_unchanged": true, + "preserved_manifest_unchanged": true, + "elapsed_seconds": 33.47403575014323, + "comparison_valid": true + }, + "summary": { + "schema_version": 1, + "cohorts": { + "before": "Pre-algorithm 530a3b783 / compiled c2fabb78f", + "after": "Candidate, identical driver and verified runtime libraries" + }, + "repetitions": 3, + "required_units": 10, + "required_runs": 60, + "actual_runs": 60, + "units": [ + { + "unit": "test_knapsack_large_1312000-native", + "case": "test_knapsack_large_1312000", + "route": "native", + "known_optimum": -2464, + "before": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.0574995828792453, + 2.0101226661354303, + 2.0082721253857017 + ], + "median_external_seconds": 2.0101226661354303, + "median_solve_seconds": 2.00007825, + "objectives": [ + -1947, + -1947, + -1947 + ], + "bounds": [ + null, + null, + null + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.0109385000541806, + 2.010632749646902, + 2.0103791253641248 + ], + "median_external_seconds": 2.010632749646902, + "median_solve_seconds": 2.000071875, + "objectives": [ + -1831, + -1831, + -1831 + ], + "bounds": [ + null, + null, + null + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": null + }, + { + "unit": "test_facility_location_large_1812000-native", + "case": "test_facility_location_large_1812000", + "route": "native", + "known_optimum": 240, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.441108082421124, + 0.45965804159641266, + 0.4656751248985529 + ], + "median_external_seconds": 0.45965804159641266, + "median_solve_seconds": 0.449584, + "objectives": [ + 240, + 240, + 240 + ], + "bounds": [ + 240, + 240, + 240 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.44067991618067026, + 0.4467247910797596, + 0.4440462915226817 + ], + "median_external_seconds": 0.4440462915226817, + "median_solve_seconds": 0.434055708, + "objectives": [ + 240, + 240, + 240 + ], + "bounds": [ + 240, + 240, + 240 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.971863321542825 + }, + { + "unit": "test_assignment_large_2012000-native", + "case": "test_assignment_large_2012000", + "route": "native", + "known_optimum": 164, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.10210783407092094, + 0.10525850020349026, + 0.1037210002541542 + ], + "median_external_seconds": 0.1037210002541542, + "median_solve_seconds": 0.092873667, + "objectives": [ + 164, + 164, + 164 + ], + "bounds": [ + 164, + 164, + 164 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.13445758260786533, + 0.1044969167560339, + 0.10392316710203886 + ], + "median_external_seconds": 0.1044969167560339, + "median_solve_seconds": 0.095281083, + "objectives": [ + 164, + 164, + 164 + ], + "bounds": [ + 164, + 164, + 164 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0019491409395327 + }, + { + "unit": "test_tsp_large_2412000-native", + "case": "test_tsp_large_2412000", + "route": "native", + "known_optimum": 168, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.03746237512677908, + 0.03588866628706455, + 0.031584917567670345 + ], + "median_external_seconds": 0.03588866628706455, + "median_solve_seconds": 0.023433875, + "objectives": [ + 168, + 168, + 168 + ], + "bounds": [ + 168, + 168, + 168 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.03216974996030331, + 0.03439779207110405, + 0.03130329214036465 + ], + "median_external_seconds": 0.03216974996030331, + "median_solve_seconds": 0.023026583, + "objectives": [ + 168, + 168, + 168 + ], + "bounds": [ + 168, + 168, + 168 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9584583555143741 + }, + { + "unit": "test_production_large_2712000-native", + "case": "test_production_large_2712000", + "route": "native", + "known_optimum": 512, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.019601916894316673, + 0.021410957910120487, + 0.01884474977850914 + ], + "median_external_seconds": 0.019601916894316673, + "median_solve_seconds": 0.009431666, + "objectives": [ + 512, + 512, + 512 + ], + "bounds": [ + 512, + 512, + 512 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.019460124894976616, + 0.019208207726478577, + 0.019093625247478485 + ], + "median_external_seconds": 0.019208207726478577, + "median_solve_seconds": 0.009731291, + "objectives": [ + 512, + 512, + 512 + ], + "bounds": [ + 512, + 512, + 512 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9927664217686196 + }, + { + "unit": "test_bin_packing_small_2202000-native", + "case": "test_bin_packing_small_2202000", + "route": "native", + "known_optimum": 3, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.009223458357155323, + 0.008699707686901093, + 0.009012209251523018 + ], + "median_external_seconds": 0.009012209251523018, + "median_solve_seconds": 0.000221417, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.009130999445915222, + 0.009297041222453117, + 0.00899325031787157 + ], + "median_external_seconds": 0.009130999445915222, + "median_solve_seconds": 0.000217375, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9978963056535507 + }, + { + "unit": "test_native_tsp_large_9112000-native", + "case": "test_native_tsp_large_9112000", + "route": "native", + "known_optimum": 390, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.01943808328360319, + 0.01915374957025051, + 0.01915424969047308 + ], + "median_external_seconds": 0.01915424969047308, + "median_solve_seconds": 0.010793458, + "objectives": [ + 390, + 390, + 390 + ], + "bounds": [ + 390, + 390, + 390 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.019261958077549934, + 0.02161391731351614, + 0.019223584793508053 + ], + "median_external_seconds": 0.019261958077549934, + "median_solve_seconds": 0.0105965, + "objectives": [ + 390, + 390, + 390 + ], + "bounds": [ + 390, + 390, + 390 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 1.0036198287145364 + }, + { + "unit": "test_weighted_queens_large_9312000-native", + "case": "test_weighted_queens_large_9312000", + "route": "native", + "known_optimum": 129, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.02196074929088354, + 0.019228458404541016, + 0.019237250089645386 + ], + "median_external_seconds": 0.019237250089645386, + "median_solve_seconds": 0.010283584, + "objectives": [ + 129, + 129, + 129 + ], + "bounds": [ + 129, + 129, + 129 + ], + "nodes": [ + null, + null, + null + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.01955575030297041, + 0.020576790906488895, + 0.01913137547671795 + ], + "median_external_seconds": 0.01955575030297041, + "median_solve_seconds": 0.009858125, + "objectives": [ + 129, + 129, + 129 + ], + "bounds": [ + 129, + 129, + 129 + ], + "nodes": [ + null, + null, + null + ] + }, + "median_paired_ratio_after_before": 0.9944963748750959 + }, + { + "unit": "test_knapsack_large_1312000-dfs", + "case": "test_knapsack_large_1312000", + "route": "dfs", + "known_optimum": -2464, + "before": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.010469874367118, + 2.0091660004109144, + 2.009140250273049 + ], + "median_external_seconds": 2.0091660004109144, + "median_solve_seconds": 2.000097541, + "objectives": [ + -1815, + -1813, + -1815 + ], + "bounds": [ + -4277, + -4277, + -4277 + ], + "nodes": [ + 1924071, + 1911963, + 1925383 + ] + }, + "after": { + "attempts": 3, + "completed": 0, + "statuses": [ + "time_limit", + "time_limit", + "time_limit" + ], + "external_seconds": [ + 2.011075667105615, + 2.0088525423780084, + 2.0122441658750176 + ], + "median_external_seconds": 2.011075667105615, + "median_solve_seconds": 2.000094167, + "objectives": [ + -1826, + -1826, + -1826 + ], + "bounds": [ + -4277, + -4277, + -4277 + ], + "nodes": [ + 1956349, + 1994307, + 1990221 + ] + }, + "median_paired_ratio_after_before": null + }, + { + "unit": "test_bin_packing_small_2202000-dfs", + "case": "test_bin_packing_small_2202000", + "route": "dfs", + "known_optimum": 3, + "before": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.009289749898016453, + 0.009000749327242374, + 0.008892958052456379 + ], + "median_external_seconds": 0.009000749327242374, + "median_solve_seconds": 0.00026475, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + 57, + 57, + 57 + ] + }, + "after": { + "attempts": 3, + "completed": 3, + "statuses": [ + "optimal", + "optimal", + "optimal" + ], + "external_seconds": [ + 0.011771749705076218, + 0.011683042161166668, + 0.008965667337179184 + ], + "median_external_seconds": 0.011683042161166668, + "median_solve_seconds": 0.000495958, + "objectives": [ + 3, + 3, + 3 + ], + "bounds": [ + 3, + 3, + 3 + ], + "nodes": [ + 75, + 75, + 75 + ] + }, + "median_paired_ratio_after_before": 1.2671761709741747 + } + ], + "elapsed_seconds": 33.47403575014323, + "provenance": { + "driver_sha256": "c70157d0196b1b8e351d5bd7c61683b5717c2bcf1eaa5b1cb5196bf3c8cf4536", + "driver_name": "optimize-native-benchmark", + "source_head": "33e1015c99a2e0b314257b0e345ae80be1d69b0f", + "candidate_source_sha256": { + "gecode/int/linear/bool-int.hpp": "beee3075e41fdb98bc6fbf32e9d53894be9a64df8868ade74d9aedea505d5331", + "gecode/int/linear/bool-post.cpp": "370b07f9bec22a81a0a998783da44707e2d25df003222ab0fea8df642529e804", + "gecode/int/linear/bool-scale.hpp": "8bcf0bfda368876adaf2ff4207c85e1b0a5a71c97b9487cab92dbc8ab43f3243", + "gecode/int/linear/bool-view.hpp": "edd478b3d893c93da33abac1bb2734094931585a8b13dfe27e806091a43333f4", + "gecode/int/linear/int-bin.hpp": "8fb918086ee44d3d535a25d3d40db2512ef3dba5bae66f6279ad5c2d233d5851", + "gecode/int/linear/int-dom.hpp": "f1bc43f39fd7e4aa8f7e68cc54498b6809974039e58cb971cc1d64e00e4f64fa", + "gecode/int/linear/int-nary.hpp": "8811a2f2c4eb6119b0d18f883349bae31d86ad15f541676c071203587b7dee82", + "gecode/int/linear/int-noview.hpp": "49c00064ba4412aebbdf41a82060334e2d868b8b334d91560d753b9b29a6a522", + "gecode/int/linear/int-post.cpp": "6185f8c338b42a0be65327d55e563714020529833036b494531cc69282574dc0", + "gecode/int/linear/int-ter.hpp": "1c6dbc812284eeaf669aa76ee350c9e3400623eb1d656b87f6a6b61e6d50e674", + "gecode/int/linear/post.hpp": "8d919cfe6bd5edf7d6506757582f851b61f96fa087454f3cc8cd274de05b9505", + "gecode/optimize/c_api.cpp": "290f6b9a0e680cd2bdc7992ceabf5eb1f0e60bfc876d65063eb5b4fee3bf3ea8", + "gecode/optimize/constraints.cpp": "c4c8f8f53392934ee8314435d65ecec7f869016d3563a14adbb83a5d084a861a", + "gecode/optimize/constraints.hpp": "8b18355c7f1faeefe97f2014ba00de06f7e1aea11b7ae1fd7fc5ea29ed4510cf", + "gecode/optimize/diagnostics.cpp": "64b14f0fed8cf492cb096869a76616d5abf9c84d51d42ad573d8c87758fae35a", + "gecode/optimize/diagnostics.hpp": "affd758884868f86bb32cc4e86567a7a133bcf3da514d9d24cb4811183d8d48e", + "gecode/optimize/flatzinc.cpp": "2e6eab7c2d50942cc0a05a03dad7968efa20d48a65e61c72f881ff5d807c642c", + "gecode/optimize/flatzinc.hpp": "101d324e25a6e28f6beddd6d718673a9537093a6592806d6a09242e706caf1ac", + "gecode/optimize/globals.cpp": "e59d9856418b335833b88023f4b047469252cdaae94ccc4ee3a3de9a53c29c4e", + "gecode/optimize/globals.hpp": "85cf43b35d28fa715a862dac9c73eaa34cb8fb0a9d6caa77498217ebe6b728d1", + "gecode/optimize/io.cpp": "3e439abb2249f8e164f1d0b8833cb52b8a401f3cf10dbecfc43aa7ba77c08f67", + "gecode/optimize/learning_reasons_detail.hpp": "1c9faeb47e22424df8f1bb15dad3268969bb78bbfa40dc15d3b14bdb72089ad4", + "gecode/optimize/lp_basis.cpp": "a19951bf6e643068c292d5047228505af15efc808c082ea834cd193c46d04554", + "gecode/optimize/lp_basis.hpp": "4c9af85bbf3df7e298675b9e8abc8b9303b52fa04e7ac9a2c43d7dc58c949e70", + "gecode/optimize/lp_basis_detail.hpp": "afc43bd89ac21acd4c1cf9b245b99bec636bf4ac7f8385e8ff42bf9335c25c2a", + "gecode/optimize/lp_evidence.cpp": "b29b9cb514d230342cad918701390daa06b1a69562751e54c6b987a4f7dd06db", + "gecode/optimize/lp_evidence.hpp": "e4c898f06abb15e2200ff173515875ff4819ec0fb748c9e9890de646f20452fc", + "gecode/optimize/lp_observations.cpp": "64a83a05f0ac1146dc0b39f059f8f434bfef5f8117761ed620f35d80fdb63cf9", + "gecode/optimize/lp_observations.hpp": "bfd1509fd7602e8fec493c1e050d90b979d0b82dd2521a80c58fb9925df7eb75", + "gecode/optimize/lp_observations_detail.hpp": "410481ed1cd30c28dcf6a3c1b7c1ca7fb005d499f0775118c14c6d3fa5b157b8", + "gecode/optimize/lp_sensitivity.cpp": "9d8e70826ace826e16dee40f2952b81c7e90877a44c096b6c43cf39597ed6e11", + "gecode/optimize/lp_sensitivity.hpp": "d0b27863d35e1f460fc75dfc98f9bf4bc9213d8cecc4579dd1e6d8592e12a428", + "gecode/optimize/lp_sensitivity_backend.cpp": "e8ee115037676347fc708e4d8505a22e3fd3c9270018b7d771c3d03814ea6908", + "gecode/optimize/lp_sensitivity_backend.hpp": "a6e5bcb083acae8d5ea1b25c090474b0fbde8711f24ac2bcc0f6b70f4612a221", + "gecode/optimize/lp_sensitivity_highs_detail.hpp": "807e5dc623a1b4b883835fe28cbd351f6591d23eb9a0aac7f0e89524e3bd458b", + "gecode/optimize/model.cpp": "a1acc3ab4910aa564c0b5b1d2293b5fd917767e1f0bc15fab897163634c2d95e", + "gecode/optimize/model.hpp": "b64268ad48f33c75155b7bf024ddb246f93e287023087ca32fa0b9fdfa817c59", + "gecode/optimize/native.cpp": "390023d8827153be8659f333c0ed13e77610d8ced9fc116ca72ccaab8156ea94", + "gecode/optimize/native.hpp": "808de7b075a95c15d40ba6f5c16263f394fb0af246fc149a9392e59032a20841", + "gecode/optimize/native_lp.hpp": "115f555838318fcd610d99f8a7f49f7e7cdb277a9c7521689375513c1c325413", + "gecode/optimize/native_neighborhoods.hpp": "2cbf2f09a257201b23ef8907603425e9e74cca9fcc880950b896028ff760e36b", + "gecode/optimize/native_regular_limits.hpp": "74ee42d0b8afd3b85f37f961f447b80a1f074b2393186addbdef558512dbca30", + "gecode/optimize/native_search.hpp": "0076d67341b288946eb9d302872b34e986e1958f66af193d0bc6ee4f98c5cecd", + "gecode/optimize/pool.cpp": "c730bced8be0d6f71af80dc277bb513b2e170daa24ba480f9a9a318b0be40c4d", + "gecode/optimize/pool.hpp": "b710a00c2e20e39836d306efa32403c4a5c5c45a807a54c907fb696c34b29d0d", + "gecode/optimize/presolve.cpp": "eddcd9c10a01bfffcfcfc882150e0020fe1c73276fccf41a4079dc7b8ce33bdb", + "gecode/optimize/presolve.hpp": "b1286762a811fe52005c1ccd91a206ba9db329461a49acfb8fda9a13ebd96c3f", + "gecode/optimize/quadratic.cpp": "db58824892f4bc19f20734f049f921417eff0f7be581f8f6d698bbc1207da360", + "gecode/optimize/quadratic.hpp": "0b8898b671991771354aec8fdeeaaa7d00f55e3c0c713dea4a69ab93827cbba7", + "gecode/optimize/quadratic_bound.cpp": "e014d796daa7693e46c00ed85f2dd2514a982459a7bce248d71ef2d6ffd224f7", + "gecode/optimize/quadratic_bound.hpp": "5ba5755b6e8224491cd78b5aefa46dfea6008db6b7d052598b89094c0cb0ca1d", + "gecode/optimize/quadratic_solve.cpp": "e8a70f52a7457fbf66b834edb10963556ba6f52372bcf45ff19c808df55c2fa3", + "gecode/optimize/relaxation.cpp": "8218cb7caab6e2bcf59325516b141a16ab16185614d5580e9e86022b6c0733ec", + "gecode/optimize/relaxation.hpp": "ee5fc242a537c5ec3baa670caa14015b8000dac57ac32c227cb34880d50f2025", + "gecode/optimize/result.cpp": "ea74150b90c6af4b0607140efd1ca9a67566daba26478337b98ec7b0eb88274f", + "gecode/optimize/result.hpp": "2f292b13680cc921e87e4e130e576ad179f00431d22f430b6432f74448958f25", + "gecode/optimize/scenarios.cpp": "0321a2ee63c987ff1286de744f68eca21a1f5c57c18f6f4cb15395efb50f9dcc", + "gecode/optimize/scenarios.hpp": "bdafccdd8d7fa86202a02504abe7af370948ad4e07603e1fff8aa35b967cda1f", + "gecode/optimize/session.hpp": "eaf954eeabfc8aeb8942c7265adf1ce4d91bd0abf75edadfd33541adab6c21f1", + "gecode/optimize/solve.cpp": "c542286bc6fac8b1264bc476d447ea55327e5cfe675654a9f0244984b51fd1f2", + "gecode/optimize/solve.hpp": "b717d2d92908781cf3deba4ea6bbd96285cb0fcea73ce4fc32849f8dc46e892b", + "gecode/optimize/types.hpp": "89e10dfb70b19d9292e5294392e14446323c73468116747e81e6ca43162da0f4", + "gecode/optimize/validate.cpp": "51780fb064dcfb76729e88947e6b47947d5ba148d662e82b6f6f83af672e121f", + "gecode/optimize/validate.hpp": "ad103d63066072cb9fcc861342bd938effaaa06a682f28f84b2b5f6ceefe3fa9", + "gecode/optimize/workflow.cpp": "1fe0a82d23664e6c0b3bade4d712dbcf0ed7bf91fdbb264f78c81e410ee5be60", + "gecode/optimize/workflow.hpp": "facc8885448d8aef4782e15f175d2a780cc99da2794f38c0dc61cbcd3eb1ee4b" + }, + "driver_source_sha256": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "runner_sha256": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "capture_sha256": "b365a3435bdcfb60ec80ecc6c20076b159ba59a3fd797866cb33b0b684b0b47f", + "validators": { + "validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + }, + "preserved_baseline": { + "manifest_sha256": "3e5f2eecffbed41a1c788f6e48ad61b698aa8d87753f60e464defd586440617a", + "source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60" + }, + "cohorts": { + "before": { + "libraries": [ + { + "name": "libgecodeint.51.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.51.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodeoptimize.dylib", + "sha256": "3fd895b5599cc2f5fd392469e9da3abc3923399c0850c29fb8e4d7f8e646fe8e" + }, + { + "name": "libgecodesearch.51.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.51.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1036, + "stderr_bytes_observed": 97143, + "external_seconds": 2.875202499330044, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:20.766608+00:00", + "stdout_file": "provenance-before.stdout", + "stderr_file": "provenance-before.stderr" + } + }, + "after": { + "libraries": [ + { + "name": "libgecodeoptimize.dylib", + "sha256": "13aa8190b07ed94e663cbe2a3df45284e02b21ace957eb1e516f928e0bca8793" + }, + { + "name": "libgecodeint.6.4.0.dylib", + "sha256": "a3d780f5fa831a98692d9ca8664ee9681bdbb421851680f59f25ae2a69d4e752" + }, + { + "name": "libgecodekernel.6.4.0.dylib", + "sha256": "6eac6266c1730ef314c1c55c93bf5804bc0d6bf48a4d5f49cc162084635ffe82" + }, + { + "name": "libgecodesearch.6.4.0.dylib", + "sha256": "7a5ef2813bcd1d387de9aeaca5c500efe9b9b23b0262deef0c7d0eab7e357e8f" + }, + { + "name": "libgecodesupport.6.4.0.dylib", + "sha256": "f646526c2376fea5faf52823d7f16ef129cc862db1c043d693d62d395c6448d7" + } + ], + "loader_probe": { + "returncode": 0, + "hard_timeout": false, + "output_limit": false, + "stdout_bytes_observed": 1043, + "stderr_bytes_observed": 97076, + "external_seconds": 2.0297612911090255, + "command": [ + "BINARY", + "--input", + "instances/test_knapsack_large_1312000.txt", + "--kind", + "binary", + "--route", + "native", + "--seconds", + "2" + ], + "started_utc": "2026-09-06T01:10:23.652884+00:00", + "stdout_file": "provenance-after.stdout", + "stderr_file": "provenance-after.stderr" + } + } + }, + "measurement_source_sha256": { + "experiments/optimize/benchmark_native_algorithms.py": "7e7eb09690c134c49cdb0120e7bb4cfd943e8c5c7b4b137dcc26eda94c87a11a", + "experiments/optimize/native_benchmark.cpp": "6e26d88f0404422d7d32c0fd366003439f6dfd89096f348de46162991a37bb2b", + "experiments/optimize/benchmark_progress.py": "b365a3435bdcfb60ec80ecc6c20076b159ba59a3fd797866cb33b0b684b0b47f", + "experiments/solver-bench/validate.py": "a37e86e268699e498c210581f4c21657023b82355d07e79dc051e5c2b98b1f0f", + "experiments/solver-bench/native.py": "16482824a07b1344b29b2a4749626647dd6037f87e7f972bbf459476f3a69676" + } + }, + "caveats": [ + "Fixed saved instances; no post-result selection, starts or reference feed.", + "Ordinary Native and explicit DFS frontier are separate routes; no HiGHS solve is requested.", + "No timing ratio unless every repetition completed and independently matched the optimum.", + "Capped incumbents/bounds and failures remain in all denominators.", + "Ordinary native node counts are unavailable through the frozen public API.", + "External times include process and model construction; internal solve time is also retained.", + "Three paired repetitions are a small diagnostic, not a statistical speed guarantee." + ], + "comparison_valid": true + } + }, + "validation": { + "release_ctest": { + "passed": 70, + "total": 70 + }, + "python": { + "passed": 84, + "total": 84 + }, + "affected_native_asan_ubsan": { + "passed": 12, + "total": 12, + "leak_detection": false + }, + "backend_disabled_new_boundary": { + "passed": 1, + "total": 1 + }, + "finite_oracle_budget_configurations": 1494, + "capture_tests": { + "passed": 13, + "total": 13 + }, + "benchmark_validation_tests": { + "passed": 7, + "total": 7 + }, + "fast": { + "passed": 35, + "total": 35, + "external_seconds": 5.843861166387796 + }, + "original_preserved_hashes": 2963 + }, + "evidence": { + "source_commit": "5d533bcd4f66e9f065e24bac5ed7a7c976d715db", + "headline": "Knapsack: a two-second timeout becomes a proved optimum in 10\u201313 ms.", + "conclusion": "Every current run completed: 8/8 ordinary native models and 2/2 depth-first models, each repeated three times. Other families show small gains and slowdowns; this is a targeted improvement.", + "rejected_pilot_note": "Generic objective-endpoint and DFS ordering was rejected after unchanged completion, a worse limited knapsack incumbent and more bin-packing nodes. The accepted study retains the same driver, runner, inputs, references, baseline and protocol. A separately tested macOS process-group cleanup fix changes the capture-helper hash between studies; both cohorts within the accepted study use that same final helper.", + "files": { + "report": { + "path": "build/comparison-algorithms/final-results/report.json", + "sha256": "7f794332f1e526041957543bc0881d13625f472424ff5a669dbd1aeec769cd0f" + }, + "summary": { + "path": "build/comparison-algorithms/final-results/summary.json", + "sha256": "373775ad7717bc0dcccd16716c7d1229e45921d56d32689f613b448e52c2e516" + }, + "fast": { + "path": "build/comparison-algorithms/fast-accepted.json", + "sha256": "c9c2dbd8a29af0fe7a7b8c8e20adf572a5272e0ce04200d147d3b188369643bf" + }, + "fast_wall": { + "path": "build/comparison-algorithms/fast-accepted-wall.json", + "sha256": "04f7229e71e49a15a3e38d3c99d84302a6cd9c95b7a8d4ced75f91b2dfcb7bc7" + }, + "pilot_report": { + "path": "build/comparison-algorithms/results/report.json", + "sha256": "ca17582731be2677420a5b8ac92e9ce621ba865f4df4dcab5c36d1b5bc54b0de" + }, + "pilot_summary": { + "path": "build/comparison-algorithms/results/summary.json", + "sha256": "4965e0206b8fdc988c43788508c774ab885f9cecd8484047ebc5cb7352e3558f" + } + } + }, + "scope": "Adaptive fixed regression panel; no new problem-class support and no claim of a general speedup. Final runtime and source hashes are in the accepted report. Historical studies remain separate." +} diff --git a/docs/solver-parity/checkpoints/ninth.json b/docs/solver-parity/checkpoints/ninth.json new file mode 100644 index 0000000000..4a153d6907 --- /dev/null +++ b/docs/solver-parity/checkpoints/ninth.json @@ -0,0 +1,680 @@ +{ + "schema": 1, + "checkpoint": "ninth", + "date": "2026-09-05", + "branch": "codex/solver-parity", + "compiled_product_commit": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60", + "measured_runner_commit": "db7eb0b85b2970e20e8a3d965559fd31a94c73b4", + "completion_scope": "Integrate existing sensitivity/neighborhood work; bounded correctness and prior-checkpoint performance validation. Further roadmap implementation on hold.", + "platform": "macOS-15.7.4-arm64-arm-64bit-Mach-O", + "highs_version": "1.15.1", + "minizinc_version": "2.10.1", + "correctness_gate_counts": { + "combined_ctest": 67, + "numerical_release_ctest": 54, + "backend_disabled_debug_ctest": 52, + "full_native_highs_facade_sanitizer_ctest": 66, + "python_sanitizer": 83, + "installed_c_cpp_consumers_each_of_three_configurations": 8, + "installed_python_each_of_three_configurations": 83, + "native_only_consumer": 1, + "cli_normal_and_sanitizer_each": 106, + "minizinc_normal_and_sanitizer_each": 72, + "minizinc_installed": 72, + "legacy_fixture_instances": 140, + "legacy_distinct_display_names": 139, + "legacy_repetitions": 5, + "harness_passed": 24, + "harness_windows_skipped": 9, + "expanded_fast_passed": 35 + }, + "expanded_fast_external_seconds": 5.785179916769266, + "expanded_fast_budget_seconds": 28, + "original_isolation": { + "checked_utc": "2026-09-05T19:27:04.024369+00:00", + "source": "preserved pre-project checkout (local path omitted)", + "files_checked": 2963, + "mismatches": [], + "head": "3e0e8ee76fb4ba01c53616dce02c0bb1a53f159e", + "expected_head": "3e0e8ee76fb4ba01c53616dce02c0bb1a53f159e", + "branch": "experiment/llm-search", + "expected_branch": "experiment/llm-search", + "passed": true + }, + "comparison": { + "baseline_compiled_commit": "bda86186dc187b7707b73de2b52fdd3b54bf74eb", + "baseline_source_commit": "158dc0b66f02929c9be957cdcad651581dd7be3f", + "method": "Same preserved executables and frozen common workloads; alternating cohort order; only explicitly verified runtime libraries change.", + "common_fast_pairs_completed": 5, + "common_fast_pairs_planned": 6, + "common_fast_case_executions_completed": 330, + "mip_pairs_completed": 3, + "mip_solve_executions_completed": 30, + "all_completed_pairs_correct": true, + "all_attempted_fast_panels_passed": false, + "extra_attempt_failure": { + "cohort": "new", + "pair": 6, + "path": "build/comparison-eighth/results-final/pair-06-new.json", + "case": "cp_distinct", + "reason": "4-second per-case wall deadline", + "retry": false + }, + "regression_rule": "Median slowdown >20% and >1ms, with both conditions together in at least half of paired observations; diagnostic, not significance test.", + "fast_summary": { + "all_correct": true, + "paired_whole_command_ratio_median": 1.0195048481083444, + "whole_command": { + "old": { + "median": 5.630275375209749, + "min": 5.573532083071768, + "max": 5.7275683749467134 + }, + "new": { + "median": 5.740093041211367, + "min": 5.5079776253551245, + "max": 6.000177041627467 + } + }, + "common_case_geometric_mean_of_paired_median_ratios": 1.0024424726795773, + "cases": [ + { + "case": "cp_distinct", + "checks": [ + 1 + ], + "old_external_median": 3.3467737920582294, + "new_external_median": 3.3790649585425854, + "paired_ratio_median": 1.0066976642859764, + "external_delta_ms": 32.29116648435593, + "old_internal_median": null, + "new_internal_median": null, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "cp_element", + "checks": [ + 1 + ], + "old_external_median": 0.5560029158368707, + "new_external_median": 0.5525399995967746, + "paired_ratio_median": 0.99453847500765, + "external_delta_ms": -3.4629162400960922, + "old_internal_median": null, + "new_internal_median": null, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "cp_cumulative", + "checks": [ + 1 + ], + "old_external_median": 0.5568039584904909, + "new_external_median": 0.5542022073641419, + "paired_ratio_median": 0.997668520683074, + "external_delta_ms": -2.6017511263489723, + "old_internal_median": null, + "new_internal_median": null, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "cp_search", + "checks": [ + 1 + ], + "old_external_median": 0.5453102085739374, + "new_external_median": 0.5418287497013807, + "paired_ratio_median": 0.9873815634232954, + "external_delta_ms": -3.4814588725566864, + "old_internal_median": null, + "new_internal_median": null, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "lp_evidence", + "checks": [ + 66 + ], + "old_external_median": 0.014368083328008652, + "new_external_median": 0.014591749757528305, + "paired_ratio_median": 1.0253079182436293, + "external_delta_ms": 0.22366642951965332, + "old_internal_median": 0.001785791, + "new_internal_median": 0.0016165, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "scenario_batches", + "checks": [ + 38 + ], + "old_external_median": 0.014513583853840828, + "new_external_median": 0.014496209099888802, + "paired_ratio_median": 1.0044354274125726, + "external_delta_ms": -0.017374753952026367, + "old_internal_median": 0.001461084, + "new_internal_median": 0.001566167, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "native_regular", + "checks": [ + 13 + ], + "old_external_median": 0.014125333167612553, + "new_external_median": 0.014236541464924812, + "paired_ratio_median": 1.0200412309086904, + "external_delta_ms": 0.11120829731225967, + "old_internal_median": 0.000332459, + "new_internal_median": 0.00033825, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "lp_observations", + "checks": [ + 44 + ], + "old_external_median": 0.014237083494663239, + "new_external_median": 0.01419420912861824, + "paired_ratio_median": 0.988829838588361, + "external_delta_ms": -0.04287436604499817, + "old_internal_median": 0.001064708, + "new_internal_median": 0.001044625, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "lp_min_offset", + "checks": [ + 8 + ], + "old_external_median": 0.014415125362575054, + "new_external_median": 0.014358875341713428, + "paired_ratio_median": 0.996138291445287, + "external_delta_ms": -0.05625002086162567, + "old_internal_median": 0.000419167, + "new_internal_median": 0.000460667, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "lp_max_offset", + "checks": [ + 8 + ], + "old_external_median": 0.014251667074859142, + "new_external_median": 0.014267542399466038, + "paired_ratio_median": 1.008098760117859, + "external_delta_ms": 0.015875324606895447, + "old_internal_median": 0.000448708, + "new_internal_median": 0.000470958, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "bounded_integer", + "checks": [ + 8 + ], + "old_external_median": 0.03800741583108902, + "new_external_median": 0.03568887524306774, + "paired_ratio_median": 0.9389976788128601, + "external_delta_ms": -2.3185405880212784, + "old_internal_median": 0.0190295, + "new_internal_median": 0.015944542, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "mixed_recourse", + "checks": [ + 27 + ], + "old_external_median": 0.049585165455937386, + "new_external_median": 0.03936695959419012, + "paired_ratio_median": 0.8518543724343072, + "external_delta_ms": -10.218205861747265, + "old_internal_median": 0.031041084, + "new_internal_median": 0.026588792, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "indicators_boolean", + "checks": [ + 9 + ], + "old_external_median": 0.014366417191922665, + "new_external_median": 0.0141565827652812, + "paired_ratio_median": 0.9979801487561196, + "external_delta_ms": -0.20983442664146423, + "old_internal_median": 0.000634291, + "new_internal_median": 0.000670084, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "semis", + "checks": [ + 13 + ], + "old_external_median": 0.014156999997794628, + "new_external_median": 0.014180625788867474, + "paired_ratio_median": 1.010053902506045, + "external_delta_ms": 0.02362579107284546, + "old_internal_median": 0.0008965, + "new_internal_median": 0.00087575, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "multiobjective", + "checks": [ + 9 + ], + "old_external_median": 0.01443904172629118, + "new_external_median": 0.014098582789301872, + "paired_ratio_median": 1.0125412546552053, + "external_delta_ms": -0.3404589369893074, + "old_internal_median": 0.001025208, + "new_internal_median": 0.001175375, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "infeasible", + "checks": [ + 4 + ], + "old_external_median": 0.0141740832477808, + "new_external_median": 0.014059416949748993, + "paired_ratio_median": 0.9822093070472464, + "external_delta_ms": -0.11466629803180695, + "old_internal_median": 0.000474584, + "new_internal_median": 0.000490875, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "unbounded", + "checks": [ + 4 + ], + "old_external_median": 0.013639833778142929, + "new_external_median": 0.014187000691890717, + "paired_ratio_median": 1.044332868017677, + "external_delta_ms": 0.5471669137477875, + "old_internal_median": 0.000296333, + "new_internal_median": 0.000298542, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "edits_io", + "checks": [ + 25 + ], + "old_external_median": 0.014292499981820583, + "new_external_median": 0.014269249513745308, + "paired_ratio_median": 1.0272550240430118, + "external_delta_ms": -0.02325046807527542, + "old_internal_median": 0.002394458, + "new_internal_median": 0.002395625, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "limit_contracts", + "checks": [ + 6 + ], + "old_external_median": 0.013191957958042622, + "new_external_median": 0.01441350020468235, + "paired_ratio_median": 1.0962045448432332, + "external_delta_ms": 1.2215422466397285, + "old_internal_median": 0.00021675, + "new_internal_median": 0.000278, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "session_reoptimization", + "checks": [ + 34 + ], + "old_external_median": 0.0143772903829813, + "new_external_median": 0.01425037533044815, + "paired_ratio_median": 1.0112910136085524, + "external_delta_ms": -0.12691505253314972, + "old_internal_median": 0.00164175, + "new_internal_median": 0.001403958, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "diagnostics_groups", + "checks": [ + 38 + ], + "old_external_median": 0.01404624991118908, + "new_external_median": 0.013607708737254143, + "paired_ratio_median": 0.9687787717926334, + "external_delta_ms": -0.4385411739349365, + "old_internal_median": 0.001538209, + "new_internal_median": 0.00139475, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "native_exact_reified", + "checks": [ + 18 + ], + "old_external_median": 0.013215874321758747, + "new_external_median": 0.013827166520059109, + "paired_ratio_median": 1.0033235452090166, + "external_delta_ms": 0.6112921983003616, + "old_internal_median": 0.000368, + "new_internal_median": 0.00036225, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "native_globals", + "checks": [ + 11 + ], + "old_external_median": 0.013915790244936943, + "new_external_median": 0.014151915907859802, + "paired_ratio_median": 0.9889569004617828, + "external_delta_ms": 0.2361256629228592, + "old_internal_median": 0.000415, + "new_internal_median": 0.0003975, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "c_api_ownership", + "checks": [ + 36 + ], + "old_external_median": 0.026981625705957413, + "new_external_median": 0.027037457562983036, + "paired_ratio_median": 1.0005643312266552, + "external_delta_ms": 0.05583185702562332, + "old_internal_median": 0.016988791, + "new_internal_median": 0.016578666, + "regression_pairs_over_20_percent_and_1ms": 2, + "investigate": false + }, + { + "case": "feasibility_repair", + "checks": [ + 16 + ], + "old_external_median": 0.014160332269966602, + "new_external_median": 0.014214374125003815, + "paired_ratio_median": 1.003816425632316, + "external_delta_ms": 0.05404185503721237, + "old_internal_median": 0.001166458, + "new_internal_median": 0.0012125, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "native_checked_lp", + "checks": [ + 11 + ], + "old_external_median": 0.014293166808784008, + "new_external_median": 0.01434966642409563, + "paired_ratio_median": 0.9538385660673293, + "external_delta_ms": 0.05649961531162262, + "old_internal_median": 0.000939917, + "new_internal_median": 0.00096275, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "solution_pool", + "checks": [ + 24 + ], + "old_external_median": 0.014253792352974415, + "new_external_median": 0.014393165707588196, + "paired_ratio_median": 1.0138676565723133, + "external_delta_ms": 0.13937335461378098, + "old_internal_median": 0.001941, + "new_internal_median": 0.001963708, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "integer_presolve", + "checks": [ + 19 + ], + "old_external_median": 0.014161832630634308, + "new_external_median": 0.014329332858324051, + "paired_ratio_median": 1.0376748817073023, + "external_delta_ms": 0.16750022768974304, + "old_internal_median": 0.000143458, + "new_internal_median": 0.000149959, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "native_frontier_bounds", + "checks": [ + 11 + ], + "old_external_median": 0.014421375468373299, + "new_external_median": 0.01423591747879982, + "paired_ratio_median": 0.9724790533723724, + "external_delta_ms": -0.1854579895734787, + "old_internal_median": 0.000188209, + "new_internal_median": 0.000164, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "convex_quadratic", + "checks": [ + 15 + ], + "old_external_median": 0.0132752088829875, + "new_external_median": 0.01460262481123209, + "paired_ratio_median": 1.085224004420922, + "external_delta_ms": 1.3274159282445908, + "old_internal_median": 0.001184792, + "new_internal_median": 0.001253416, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "native_root_covers", + "checks": [ + 11 + ], + "old_external_median": 0.01407262496650219, + "new_external_median": 0.014360874891281128, + "paired_ratio_median": 1.0525677487709284, + "external_delta_ms": 0.2882499247789383, + "old_internal_median": 0.00117875, + "new_internal_median": 0.001197791, + "regression_pairs_over_20_percent_and_1ms": 1, + "investigate": false + }, + { + "case": "native_binary_branching", + "checks": [ + 11 + ], + "old_external_median": 0.014256124384701252, + "new_external_median": 0.014416416175663471, + "paired_ratio_median": 1.033544109426312, + "external_delta_ms": 0.16029179096221924, + "old_internal_median": 0.000142375, + "new_internal_median": 0.000138167, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "native_complete_start", + "checks": [ + 11 + ], + "old_external_median": 0.014582540839910507, + "new_external_median": 0.014481999911367893, + "paired_ratio_median": 0.9931053902302508, + "external_delta_ms": -0.10054092854261398, + "old_internal_median": 0.00021375, + "new_internal_median": 0.000203833, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + } + ], + "flagged_cases": [] + }, + "mip_summary": { + "all_correct": true, + "paired_whole_command_ratio_median": 0.9420820488501805, + "whole_command": { + "old": { + "median": 1.7816142085939646, + "min": 1.6914898343384266, + "max": 1.9421028345823288 + }, + "new": { + "median": 1.5935222087427974, + "min": 1.563661458902061, + "max": 1.7037921249866486 + } + }, + "common_case_geometric_mean_of_paired_median_ratios": 0.9608144504126682, + "cases": [ + { + "case": "p0033", + "checks": [ + 1 + ], + "old_external_median": 0.03935341723263264, + "new_external_median": 0.040212417021393776, + "paired_ratio_median": 1.0218278322231402, + "external_delta_ms": 0.8589997887611389, + "old_internal_median": 0.023658583, + "new_internal_median": 0.023815958, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "p0201", + "checks": [ + 1 + ], + "old_external_median": 0.7035185415297747, + "new_external_median": 0.6553949574008584, + "paired_ratio_median": 0.9210891441888984, + "external_delta_ms": -48.123584128916264, + "old_internal_median": 0.69102875, + "new_internal_median": 0.643015583, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "p0282", + "checks": [ + 1 + ], + "old_external_median": 0.17122866678982973, + "new_external_median": 0.16235008276998997, + "paired_ratio_median": 1.0051363459130735, + "external_delta_ms": -8.878584019839764, + "old_internal_median": 0.159292375, + "new_internal_median": 0.150684917, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "p0548", + "checks": [ + 1 + ], + "old_external_median": 0.0782424584031105, + "new_external_median": 0.0789580000564456, + "paired_ratio_median": 0.8954994988823052, + "external_delta_ms": 0.7155416533350945, + "old_internal_median": 0.064464334, + "new_internal_median": 0.062927209, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + }, + { + "case": "lseu", + "checks": [ + 1 + ], + "old_external_median": 0.2006832081824541, + "new_external_median": 0.20028016529977322, + "paired_ratio_median": 0.9665579884244042, + "external_delta_ms": -0.40304288268089294, + "old_internal_median": 0.191671, + "new_internal_median": 0.18943225, + "regression_pairs_over_20_percent_and_1ms": 0, + "investigate": false + } + ], + "flagged_cases": [] + }, + "identical_native_instruction_sections": 9 + }, + "limitations": [ + "Extra sixth FAST current panel timed out under the existing four-second cp_distinct cap; retained and excluded from complete paired medians.", + "Short same-machine smoke against preceding integrated checkpoint; no CPLEX/Gurobi comparison, broad benchmark or new-feature speedup claim.", + "Original full native test corpus not rerun; bounded CP cases plus legacy FlatZinc fixture panel executed.", + "Actual Windows/Linux runtime and oldest macOS not tested; Windows containment gate remains disabled.", + "ASan/UBSan error checks enabled; leak detection disabled.", + "Ninth installed prefixes tested; existing eighth Python wheel not rebuilt.", + "Learning contract remains private/uncompiled; no product learning runtime." + ], + "evidence_sha256": { + "build/native-compat/ninth-ctest.log": "dc89bb685a6537d8fe92e9dd52da4361ec789f8f1e4577c7336d272cf60cdc34", + "build/optimize/ninth-ctest.log": "e44cfe37ae796065ec30c024256c2772d8c61f55de3a965bcef3640a20cb2edf", + "build/optimize-core/ninth-final-ctest.log": "780e0fca3d29b86bb09066adafa33e0883d0c3d59649d775dd49ce2c854c7183", + "build/native-sanitize/ninth-ctest.log": "6223fe02d274e613c882ba8654b0c5131f27854496918b29901a895863f0172f", + "build/native-sanitize/ninth-python-preloaded-sanitizer.log": "a2015445c530d90957d137b190941fb6d0f92d4fa24e99b4411bd663f26c704e", + "build/optimize/ninth-installed-consumers.json": "c18b146732098b6d1010a314a8aa0caf4e8c758630ea3cd4a424a6b38849be97", + "build/native-compat/ninth-native-only-test.log": "c60625a953ab1763534ae6b5b6f7ea9abb507ff8be7dec19c1d01da5f6100a7d", + "build/native-compat/ninth-cli.json": "bc2fd9292adb6392c9b4cc33be0b70e062fcea70fa4709602d4ae388b54d314e", + "build/native-sanitize/ninth-cli.json": "2f3b52b6b5bd7416f71e8a174883dcdf5a07dab2f5b5698f3e4f453ba844c34e", + "build/native-compat/ninth-minizinc.json": "648b6666738d1f5267ba2440bb33be43cfb1be197e24bbc51cfc3af671a511bd", + "build/native-sanitize/ninth-minizinc.json": "b3b9731ce7c6e57231f16c1fe9dad62b6e6aa381dba0718328f755c623240e29", + "build/native-compat/ninth-installed-minizinc.log": "99625b2f4cb5dbc4840413f829c6648998f3bcda45a5130582036391892df019", + "build/native-compat/ninth-legacy-summary.json": "7a37a3bfb59634f60cec6baea00761dcd5f676d4159883dd31f8702937a2d54b", + "build/native-compat/ninth-legacy-count-audit.json": "da1d1b1b4d042f4bdcde60cbdb273c590356c2c4f566b49d5fe8e4c6ca383286", + "build/native-compat/ninth-legacy-flatzinc.log": "e0ef487c3643d801bcd88de3ec526b988da923a26b7e52f1dd63a5ce681591ef", + "build/native-compat/ninth-legacy-blackbox-tests.log": "d7ea7e4029b955f7798a390dd66ed62ad36221f7224a412f40a91672fc312cea", + "build/native-compat/ninth-harness-tests.log": "61365b36c9f994f9fc0d4271aaff003dbe064f79f22d8603d9abbbd01c719799", + "build/optimize/ninth-fast.json": "40bc92cb0e41d0bde0820065de1aaf16298067bd1e7354e9b444073a8d41a891", + "build/optimize/ninth-fast-wall.json": "0f2a2c15986f46927c3159960c195a8ac1d4356d5a696a0645d741fb9576b5fd", + "build/optimize/ninth-original-isolation.json": "c2b7ee8a2f92fb8b7f69393710255d4ca76065b53b02f78c576b1453626ae552", + "build/optimize/ninth-process-inventory.txt": "15e0c7449e808a4ff2809ce4142705766323dc3ec08e674f8300fc190998f44f", + "build/comparison-eighth/baseline-preparation.json": "84a4d56096c813411b674a4423aec9ba6d8e92d4d69b48abcf79deae84cfb845", + "build/comparison-eighth/compare.py": "2b521976a3e8c842d0cfb37badd072b594e12254c9315655fc929ba1a7b3b209", + "build/comparison-eighth/results-final/comparison.json": "d47bb4e1cb6d442faef87e56069b85df7edeaef50157181f78b7afbd7ea2c87e", + "build/comparison-eighth/results-final/interpretation.md": "6acc166ccab7ef5a320b8a0da51b1c9387da657004d6acb788de48c5475e2844", + "build/comparison-eighth/results-final/pair-06-new.json": "7263e86bc7350fb38965773c8c7f73640eada98f91841a7a2a4ed84b1b22c2fd", + "build/comparison-eighth/results-final/native-text-comparison.json": "61c087855de170ca38c4a320431dc54441bca6045e2cb3f9bf0aac812cc479bf", + "build/optimize/ninth-installed-standalone.log": "b1d997dc76a642c25d567aff551917e0babba72fac0821f3a8303d6281addd41", + "build/optimize-core/ninth-installed-core.log": "3fb629a2562109c181a0ddd2568b08e3ffce7efdaec3b3e78301d67daa6c8f03", + "build/native-compat/ninth-consumer-test.log": "d9521b1017d59f4790d5ea994ecb2e554d5c3e5f49faf418f83a95f6beb7cd9f", + "build/native-compat/ninth-installed-python.log": "f6d3edde1ba4fe8cb6fe18136b57174197688f0fdd9c9eba78d6c6119b1b0c1f" + } +} diff --git a/docs/solver-parity/dependencies.json b/docs/solver-parity/dependencies.json new file mode 100644 index 0000000000..8747c3133f --- /dev/null +++ b/docs/solver-parity/dependencies.json @@ -0,0 +1,11 @@ +{ + "schema_version": 1, + "backend": "HiGHS", + "version": "1.15.1", + "repository": "https://github.com/ERGO-Code/HiGHS.git", + "commit": "04024d701f79feb8e2f18bc3df0dffc04ef05088", + "minimum_cmake_package_version": "1.15", + "tested_source_location_relative_to_checkout": "../deps/HiGHS", + "automatic_download": false, + "note": "Pinned source is a separate independent copy; no dependency files in the original benchmark workspace are edited. Newer compatible installed versions are allowed but are not covered by these recorded tests." +} diff --git a/docs/solver-parity/final-benchmark-checkpoint.json b/docs/solver-parity/final-benchmark-checkpoint.json new file mode 100644 index 0000000000..f9ccf179d7 --- /dev/null +++ b/docs/solver-parity/final-benchmark-checkpoint.json @@ -0,0 +1,394 @@ +{ + "schema_version": 1, + "complete": true, + "source_head": "95b54f2f5553fb078502bff483fb9067c4b37887", + "runtime_source_commit": "7d29278a12dbe3c69e8e1147177021be79f178e6", + "original_source_head": "530a3b7837205d8255c6640425018831d3f8ee0e", + "original_compiled_product": "c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60", + "report": "build/final-benchmark/final-results/report.json", + "report_sha256": "f0635189a62c78e69d36f11d562751153924ee8afec22d0dc530b8d9da25bb9b", + "projection_sha256": "effaa514f4effd94fd4cd7c2b78548a6e6177d5a8cce6c7d4f7b014378f87c23", + "public_sha256": "17daa755934cd63d1910ff772968d2901057ada5b89db1c8900ed29c27de2e2f", + "measured_attempts": 356, + "loader_probes": 3, + "harness_attempts": 1, + "active_elapsed_seconds": 2044.40996275, + "seconds_per_solve": 10, + "integrity": { + "sources_unchanged": true, + "runtime_sources_unchanged": true, + "driver_unchanged": true, + "original_driver_unchanged": true, + "all_current_libraries_unchanged": true, + "models_unchanged": true, + "libraries_unchanged": true + }, + "brackets": { + "knapsack": { + "before": { + "lower": 33, + "upper": 34, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 2304, + "upper": 2336, + "width": 32, + "target_width": 47, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 2304, + "upper": 2336, + "width": 32, + "target_width": 47, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "assignment": { + "before": { + "lower": 17, + "upper": 18, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 64, + "upper": 66, + "width": 2, + "target_width": 2, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 31, + "upper": 32, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "facility_location": { + "before": { + "lower": 8, + "upper": 9, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 44, + "upper": 45, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 54, + "upper": 56, + "width": 2, + "target_width": 2, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "bin_packing": { + "before": { + "lower": 17, + "upper": 18, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 47, + "upper": 48, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 30, + "upper": 31, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "production": { + "before": { + "lower": 11, + "upper": 12, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 27, + "upper": 29, + "width": 2, + "target_width": 1, + "target_width_met": false, + "unresolved_reason": "Interior sizes have mixed confirmations; bracket could not be narrowed without repeating observations.", + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 28, + "upper": 29, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "native_tsp": { + "before": { + "lower": 21, + "upper": 22, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 21, + "upper": 22, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 21, + "upper": 22, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + }, + "weighted_queens": { + "before": { + "lower": 23, + "upper": 24, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "auto": { + "lower": 23, + "upper": 24, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + }, + "configured": { + "lower": 23, + "upper": 24, + "width": 1, + "target_width": 1, + "target_width_met": true, + "unresolved_reason": null, + "nonmonotonicity_caveat": true + } + } + }, + "race_activity": { + "skipped": 18, + "one_probe": 66, + "two_probes": 68, + "selected_automatic": 114, + "selected_ordinary": 20, + "other": 0 + }, + "validator_amendment": "Optional empty backend-version metadata on automatic time limit; all semantic checks retained and runtime identity verified by hashes.", + "transport_amendment": "A pre-solve parser rejection is archived separately, never treated as solver capacity. Larger parser guards do not alter solving or timing boundaries.", + "phases": [ + { + "name": "bounded discovery", + "source_head": "7d29278a12dbe3c69e8e1147177021be79f178e6", + "report_sha256": "cacd2398b836b9d54d498d0301cd804c07f7828839ee5016298bf05fd4c999ac", + "records": 235, + "protocol": { + "seconds": 10, + "capture_seconds": 11, + "whole_seconds": 3600, + "max_attempts": 720, + "max_sizes_per_category": 32, + "limits": { + "knapsack": [ + 8, + 32, + 512 + ], + "assignment": [ + 3, + 16, + 32 + ], + "facility_location": [ + 2, + 8, + 16 + ], + "bin_packing": [ + 4, + 16, + 32 + ], + "production": [ + 3, + 6, + 48 + ], + "native_tsp": [ + 4, + 16, + 96 + ], + "weighted_queens": [ + 4, + 12, + 32 + ] + }, + "policy": { + "schema_version": 1, + "purpose": "Frozen intuition-selected presets for the final three-cohort study", + "selected_from_pilot": { + "report": "build/configured-bench/pilot/report.json", + "sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8", + "runs": 42 + }, + "selection_rule": "Reuse the earlier frozen family presets, updating knapsack to the expanded exact DP admission. No new pilot or per-instance fastest-route selection.", + "families": { + "knapsack": { + "route": "native", + "label": "Compact exact capacity DP", + "rationale": "All frozen-domain knapsack sizes fit the expanded DP work/memory admission; native falls back to BAB if its local time cap is reached." + }, + "assignment": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "facility_location": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "bin_packing": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "production": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "native_tsp": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "weighted_queens": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + } + }, + "excluded": { + "neighborhoods": "The bounded radius-four candidate was measured, but did not improve total pilot solve time; every attempt and result remains in the pilot.", + "presolve": "Automatic cohort alone composes exact presolve, independent components and identical-column symmetry. Explicit configured routes preserve their declared settings.", + "learning": "No production learning runtime has been implemented.", + "numerical_backend": "This comparison remains native Gecode; it does not substitute the numerical HiGHS MILP route." + } + }, + "cohort_labels": { + "before": "Original Gecode", + "auto": "Auto + race", + "configured": "Configured" + }, + "selection": "Independent anchor/doubling/bisection; adjacent two-repeat confirmation. Frozen family presets, no per-instance route selection. All discovery observations retained.", + "capacity": "Largest sampled size passing both repetitions and every variant. Bisection assumes local monotonicity only as a sampling heuristic; reversals are reported. A ceiling is a lower bound on capacity, not a measured solver maximum.", + "timing": "One thread, serial processes, steady-clock wall time around the entire owning solve; ten seconds includes all race probes, restart and selected search. No supplied starts.", + "automatic_racing": { + "exploration_seconds": 2, + "probe_node_limit": 4096, + "candidates": [ + "structural_auto", + "ordinary_native" + ], + "warning": "Exploration and restarting can increase total CPU use or solve time; an effective strategy can pay back that cost on longer solves." + }, + "optimality": "Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.", + "generalization": "Same deterministic seeded families as earlier policy selection, not an independent holdout." + } + }, + { + "name": "user-requested extension without study ceilings", + "source_head": "aa5a712d74b37c4483e25cdd719721161615d13e", + "started_utc": "2026-09-06T09:27:41.243479+00:00", + "initial_records": 235, + "reason": "User requested observed failed upper sizes instead of censored study ceilings." + }, + { + "name": "diagnostic validator correction; captured observation retained", + "source_head": "363e66a5d2a37e803fe72954ab6e5e00056669be", + "started_utc": "2026-09-06T09:33:18.257515+00:00", + "previous_report_sha256": "0904648dfe45ebdd1220479dfbe3c99f9ee8e30313d7c80e550fe29652297177", + "previous_records": 244, + "validator_source_sha256": "7ba21e7c253ad0fcf8035e15c79f127406f6b7c7434e40e46e83455db60925fe", + "revalidated_stdout_sha256": "0d84053ceed966a172c325ff5c9448a448c6139ffc5406abba75c9fe9956ed76", + "reason": "Empty version string accepted only for interrupted automatic results; all incumbent/bound validation retained and loaded runtime independently pinned." + }, + { + "name": "expanded transport parser; solver unchanged", + "source_head": "95b54f2f5553fb078502bff483fb9067c4b37887", + "started_utc": "2026-09-06T09:46:53.594723+00:00", + "previous_report_sha256": "fe07c194d738cf9f01e39b3d0c4d7265998097224891687217dfbd95fe32155d", + "previous_driver_sha256": "4a91d848b1eba29a798e7e5bf26488e7ba0fa8a6e4ecfe8455a70a1aa07fe54c", + "driver_sha256": "a21d80e10c406391277015186af55265bd58418c35b735bccd8ef577fdd84879", + "first_new_solve_record": 309, + "parser_build_manifest_sha256": "b8563ffbd0c951e59903df0148c0d788011d746ae492d133bc29cdbe9eea81ab", + "reason": "Assignment128 exceeded the old 10000-variable TXT guard before solve. Guard-only driver rebuild; identical input encoding and solver libraries. Earlier clocks surround solve and exclude model parsing." + } + ], + "export_command": "python3 experiments/optimize/resume_large_final_benchmark.py --report build/final-benchmark/final-results/report.json --export-only" +} diff --git a/doxygen/doxygen.conf.in b/doxygen/doxygen.conf.in index cdd72876d0..771af3fd30 100755 --- a/doxygen/doxygen.conf.in +++ b/doxygen/doxygen.conf.in @@ -463,6 +463,8 @@ WARN_LOGFILE = doxygen.log # with spaces. INPUT = doxygen.hh \ + "@top_srcdir@/doxygen/optimize.hh" \ + "@top_srcdir@/docs/solver-parity" \ license.hh \ stat.hh \ changelog.hh \ @@ -481,7 +483,8 @@ INPUT = doxygen.hh \ FILE_PATTERNS = *.h \ *.hh \ *.hpp \ - *.cpp + *.cpp \ + *.md # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. @@ -520,6 +523,13 @@ EXCLUDE_PATTERNS = \ *moc_* \ *gecode/gist/standalone-example/* \ *gecode/third-party/* \ + *gecode/optimize/quadratic_bound.hpp \ + *gecode/optimize/lp_observations_detail.hpp \ + *gecode/optimize/lp_basis_detail.hpp \ + *gecode/optimize/learning_reasons_detail.hpp \ + *gecode/optimize/lp_sensitivity_backend.hpp \ + *gecode/optimize/lp_sensitivity_highs_detail.hpp \ + *gecode/optimize/native_regular_limits.hpp \ *gecode/flatzinc/exampleplugin/* \ *gecode/flatzinc/parser.tab.* *gecode/flatzinc/lexer.* diff --git a/doxygen/doxygen.hh.in b/doxygen/doxygen.hh.in index 69ae6ec5fa..307d397e77 100755 --- a/doxygen/doxygen.hh.in +++ b/doxygen/doxygen.hh.in @@ -343,7 +343,7 @@ * * \section SecStart Getting started * - * For your fist steps with %Gecode, including detailed instructions on + * For your first steps with %Gecode, including detailed instructions on * installing the library and compiling against it, please refer to the * document Modeling and * Programming with Gecode. @@ -351,10 +351,16 @@ * You may also want to have a look at our \ref PageNotation as well as * our \ref Example. * + * This development branch also provides the optional C++17 + * \ref PageOptimize "Optimize model and solver API". Its numerical backends + * and bounded native bridge have explicit support and guarantee contracts; + * existing Space-based CP interfaces remain available independently. + * * \section SecByTask Programming tasks * * Documentation is available for the following tasks: * - \ref TaskModel + * - \ref TaskOptimize * - \ref TaskSearch * - \ref TaskActor "Programming propagators and branchers" * - \ref TaskVar diff --git a/doxygen/optimize.hh b/doxygen/optimize.hh new file mode 100644 index 0000000000..44cb97be20 --- /dev/null +++ b/doxygen/optimize.hh @@ -0,0 +1,484 @@ +/* Documentation only: the additive Optimize API in this development branch. */ + +/** + * \defgroup TaskOptimize Modeling and solving with Optimize + * \ingroup TaskModel + * + * The optional C++17 namespace Gecode::Optimize offers an owning sparse model, + * numerical LP/MILP solving and an explicit bounded integer bridge to native + * %Gecode. Start with \ref PageOptimize. Existing Space-based models, propagators, + * search engines and the original FlatZinc driver retain their own interfaces. + */ + +/** + * \namespace Gecode::Optimize + * \brief Optional sparse optimization models, backends and owning results. + * \ingroup TaskOptimize + * + * See \ref PageOptimize for backend scope and \ref PageOptimizeModel for + * model ownership, result guarantees and validation. + */ + +/** + * \page PageOptimize Optimize: sparse optimization and native integer search + * + * This development branch provides an additive API, included with + * \code{.cpp} + * #include + * \endcode + * It is enabled separately from the existing %Gecode libraries. A model owns + * variables, sparse rows, objective data and supported logical/global metadata; + * a solve returns a historical result rather than a mutable search Space. + * + * - \subpage PageOptimizeModel + * - \subpage PageOptimizeNative + * - \subpage PageOptimizeLP + * - \subpage PageOptimizeWorkflows + * - \subpage PageOptimizeBuild + * - \subpage PageOptimizeBenchmarks + * + * \section OptimizeRoutes Choose the interface and backend + * + * | Interface | Delivered scope | Important boundary | + * | --- | --- | --- | + * | Existing Space, IntVar, BoolVar, SetVar, FloatVar and native search APIs | The original CP modeling, global constraints, propagators, search customization and configured parallel search | Optimize restrictions below do not remove these existing capabilities. See \ref TaskModel and \ref TaskModelSearch. | + * | Optimize with Backend::Highs | Numerical continuous LP and mixed-integer linear models, including supported binary and semi domains | One worker per solve; numerical tolerances and adapter scaling limits apply. Exact and Certified requests are rejected. | + * | Optimize with Backend::Native | Finite Integer, Binary and SemiInteger models with exact integral linear data, retained indicators and six typed global families | Conservative native coefficient/activity limits; one deterministic worker; no arbitrary continuous or fractional model conversion. | + * | Explicit native LP/frontier/neighborhood APIs | Checked integer LP deductions, optional original-row root covers, frontier bounds, binary reliability probes and one bounded incumbent neighborhood | Explicit entry points allow direct control; the common Native policy can select LP, covers and reliability structurally. No automatic portfolio is implemented. | + * | QuadraticModel and solve_quadratic | Bounded continuous convex minimization or concave maximization expressed as weighted squares plus linear terms | Numerical checking; separate model type. No integer QP, quadratic constraints or general nonconvex optimization. | + * + * Gecode::Optimize::solve selects native %Gecode for active typed globals under + * Backend::Auto, and HiGHS otherwise. Auto does not select a backend from the + * requested guarantee: an ordinary linear model requesting Exact must select + * Native explicitly. Missing or unsupported backends return Unsupported; + * explicit requests are not silently substituted. Within Native, the common + * dispatcher uses solve_native_auto to preserve eligible knapsack DP and select + * optional checked LP/branching from bounded model structure. Direct + * solve_native retains ordinary BAB. The automatic route additionally applies + * bounded exact presolve, independent-component solving and ordering of exactly + * interchangeable columns when compatible. The opt-in solve_native_race API + * compares automatic and ordinary routes with sequential probes, then restarts + * the selected route under the same time/node budget. Exploration can increase + * CPU work and solve time, but can reveal a better strategy for a longer solve. + * Exploration time is configurable; MiniZinc exposure is future work. + * No conflict learning is added. Inspect + * Gecode::Optimize::capabilities, Gecode::Optimize::native_capabilities, + * Gecode::Optimize::native_lp_capabilities and + * Gecode::Optimize::quadratic_capabilities for the current build. + * + * \section OptimizeExample A small exact integer model + * + * \code{.cpp} + * #include + * #include + * namespace O = Gecode::Optimize; + * + * O::Model model; + * const auto x = model.add_integer(0, 4, "x"); + * const auto y = model.add_integer(0, 4, "y"); + * model.add_row({{x, 1}, {y, 1}}, 3, + * std::numeric_limits::infinity(), "demand"); + * model.minimize({{x, 2}, {y, 1}}, 7); + * O::SolveOptions options; + * options.backend = O::Backend::Native; + * options.guarantee = O::Guarantee::Exact; + * options.time_limit_seconds = 10; + * const auto result = O::solve(model, options); + * if (result.has_solution()) { + * const double chosen_y = result.value(y); + * (void)chosen_y; + * } + * // A completed optimum is x=0, y=3, objective=10. + * // Check result.termination before claiming optimality. + * \endcode + * + * For a numerical LP, use Continuous variables and Backend::Highs with + * Guarantee::Numerical. Consult \ref PageOptimizeBuild for the required build. + */ + +/** + * \page PageOptimizeModel Model ownership, logical constraints and results + * + * \section OptimizeOwnership Models and edits + * + * Gecode::Optimize::Model stores sparse ranged rows and min/max objectives with + * an offset. VariableType distinguishes Continuous, Integer, Binary, + * SemiContinuous and SemiInteger domains. Duplicate terms are coalesced + * deterministically; invalid/nonfinite coefficients are rejected. The + * VariableSpec, RowSpec and SparseRowBatch overloads provide atomic bulk + * additions, including compressed sparse row input. + * + * Variable and constraint handles carry an owner identity and never-reused + * slot. Removal leaves tombstones; foreign and deleted handles are rejected. + * Successful edits advance the revision. A Model is movable, not copyable; + * ModelSnapshot owns a historical copy. Public snapshot fields remain + * untrusted: structural and original-semantic checks run at API boundaries. + * Historical SolveResult, observations and analysis artifacts survive edits + * and destruction of their originating model/session. + * + * \section OptimizeLogic Logical and global constraints + * + * Gecode::Optimize::add_indicator retains the original implication and derives + * finite conservative M values from declared domains for numerical solving. + * It rejects insufficient bounds or overflow instead of guessing M. Generated + * rows/gates and their domain guards remain associated with the original + * metadata. Mutations that invalidate the lowering are rejected; use + * Gecode::Optimize::remove_indicator for its supported removal lifecycle. + * Native search uses the original reified implication and preserves exposed + * gate semantics. The independent checker tests the original implication too. + * + * Gecode::Optimize::add_boolean_and and Gecode::Optimize::add_boolean_or + * require Binary inputs/results. Empty AND is true; empty OR is false. + * + * | Typed helper | Original meaning | + * | --- | --- | + * | Gecode::Optimize::add_all_different | Pairwise different integer values. | + * | Gecode::Optimize::add_element | Variable index/result with explicit index base and retained array aliases. | + * | Gecode::Optimize::add_table | Membership in a positive table of integer tuples. | + * | Gecode::Optimize::add_cumulative | Mandatory fixed-duration, fixed-height tasks with half-open intervals; zero duration/height consumes no resource. | + * | Gecode::Optimize::add_circuit | One cycle through a nonempty successor array with explicit index base. | + * | Gecode::Optimize::add_regular | Deterministic finite automaton, sparse state IDs, unique state/symbol transitions, no epsilon transitions. A missing transition rejects; the empty word accepts exactly when the initial state is final. | + * + * These six families are the Optimize registry, not the full original %Gecode + * global catalog. Active globals require native compilation, which performs + * additional domain, indexing, storage and arithmetic admission. HiGHS and + * model exporters reject unsupported original metadata instead of discarding it. + * + * \section OptimizeResult Result and guarantee contracts + * + * Gecode::Optimize::SolveResult separates termination from availability of a + * validated incumbent. Test has_solution() before value(handle), and inspect + * termination before claiming completion. Values use original slots, including + * a separate active mask for tombstones. Missing bounds/gaps are absent, not + * zero. The common relative gap is + * abs(primal-dual)/max(1,abs(primal),abs(dual)); native_backend_gap, when present, + * retains a vendor's different convention. + * + * Numerical results are tolerance-qualified. Native Exact uses admitted integer + * arithmetic, original-domain/constraint checking and finite search; it does + * not export a complete independently checkable proof. Certified is unsupported + * by these solve routes. Checked LP deductions do not upgrade a complete solve + * into a certified proof artifact. Infeasibility, local exhaustion and + * unavailable numerical data are distinct outcomes. + * + * A SolveBudget shares a monotonic deadline, cancellation and node accounting. + * Copying, conversion and checking are included in the documented whole-call + * allowance. Calls into propagation, factorization or a backend are cooperative + * and can overrun a wall limit. Publication rules differ by operation: inspect + * the result status and availability flags even when historical diagnostics or + * a previously accepted incumbent remain present. + */ + +/** + * \page PageOptimizeNative Native search, starts and optional enhancements + * + * \section OptimizeNativeAdmission Exact subset and complete starts + * + * The native bridge admits finite Integer/Binary/SemiInteger domains and integral + * coefficients/finite row sides within native integer limits. SemiInteger keeps + * its zero alternative. Conservative sums of absolute products bound row, + * indicator and objective activities; cancellation is not used to evade those + * guards. Objective offsets and all attainable objective values must remain + * exactly representable in result doubles. Unsupported fractions, ranges or + * native-global storage limits fail before search; they never imply infeasibility. + * + * Complete primal_start entries use original handles and exact integral values. + * Every active ordinary slot must be supplied. Only live indicator inactivity + * gates may be completed from their exact activators; explicitly supplied gates + * must agree. Removed indicators do not imply a retained gate's value. Other + * private/fixed slots are not inferred. Unresolved partial starts are Unsupported, + * and invalid/infeasible complete assignments are InvalidModel. No near-integral + * rounding or permanent fixing is performed. A timely checked start seeds the + * incumbent and an unfixed original root with a strict improvement cutoff. + * + * Native routes require threads=1 and random_seed=0. Gap tolerances do not + * enable early gap stopping. Existing native CP search options remain available + * through their original APIs independently of these facade limitations. + * + * Ordinary native search recognizes a bounded exact binary capacity case: all + * active variables are Binary with domains [0,1], and one same-sign integral + * row covers them all, with one capacity side and no indicators or globals. + * Positive upper rows and their negative lower-row equivalents are supported. + * A capacity-indexed dynamic program uses two rolling value rows and packed + * decisions, with capacity 65536, 32 million transitions, 8 MiB accounted payload + * and a cooperative 250 ms local preprocessing cap. Its completed witness supplies a branch + * preference and its exact optimum supplies a one-sided objective bound. + * Existing search still checks and publishes the solution and termination. + * Other model shapes or size-cap misses use the existing brancher. Time and + * cancellation checks remain active during preprocessing. Explicit checked-LP + * and local-neighborhood construction do not enable this optimization. + * The DP preference follows the engine's actual descent order. BestBound favors + * the region containing that witness only when objective bounds tie. Generic + * smallest-domain/minimum-first branching and non-DP frontier order are unchanged. + * + * \section OptimizeNativeRoutes Explicit native entry points + * + * | API | Behavior and evidence | + * | --- | --- | + * | Gecode::Optimize::solve_native | Native propagation and BAB. An interrupted incumbent may be returned, but no unfinished-frontier global bound is exposed. | + * | Gecode::Optimize::solve_native_lp | Native constraints plus a sparse ordinary-row relaxation. LP bounds/domain deductions require checked integer certificates; numerical LP infeasibility alone never prunes. Native, HiGHS and checked-wide-integer support are required. | + * | Gecode::Optimize::solve_native_search | DepthFirst or BestBound frontier with explicit storage cap. Every queued/active region remains represented during partial expansion; interrupted bounds aggregate all unresolved regions and the incumbent when initial compilation established a bound. | + * | Gecode::Optimize::solve_native_neighborhoods | The same frontier plus at most one bounded BinaryHamming incumbent improvement attempt. See below. | + * + * NativeLpSettings can schedule root or after-bound-change relaxations and + * explicitly enable root_cover_cuts. Covers are independently verified against + * immutable original ordinary rows and global domains. An augmentation and its + * exact evidence retain their owning source. LP suggestions select candidates; + * they are not original feasible witnesses or proof. Local-scope cuts are not + * promoted into the global root pool. + * + * NativeSearchOptions::branching enables BinaryReliability. Only completed + * finite paired propagation probes update solve-local history. These gains are + * not LP pseudocosts. Probes choose a split; they publish neither incumbents nor + * pruning evidence. General-integer reliability and LP-informed branching are + * not implemented in this slice. + * + * \section OptimizeNeighborhood One bounded incumbent neighborhood + * + * NativeNeighborhoodOptions wraps the ordinary search options without enabling + * any existing default route. BinaryHamming waits for a checked incumbent and + * a surviving stable parent. It posts a fresh original native model, a strict + * original objective cutoff and a Hamming radius. Distance counts all eligible + * original nonfixed Binary slots without indicator_origin. It counts slots, + * not independent mathematical decisions; equality-linked slots count separately. + * Other original variables and constraints remain, including globals and semis. + * + * The neighborhood may find an improvement outside the active parent. Only a + * timely exact original-model-validated assignment is published after local + * cleanup. Local bounds, infeasibility and exhaustion never become global proof. + * The main frontier remains represented throughout the attempt. This operation + * cannot create the first incumbent of a cold solve and is not RINS, RENS, + * partial-start repair or an automatic heuristic portfolio. + * + * Settings cap status attempts, source entries, coordinator work, retained + * Spaces, distance-variable count and local elapsed time. These are not byte + * or CPU-instruction guarantees. Local caps stop optional work; outer limits + * stop the whole solve. With reliability and neighborhoods enabled, the shared + * node count equals frontier admissions + probe status attempts + neighborhood + * status attempts. The statistics' budget_nodes fields repeat that total; do + * not add them again. Optional local admissions reserve two ordinary child slots. + */ + +/** + * \page PageOptimizeLP Numerical LP observations, basis, evidence and sensitivity + * + * These explicit workflows use ordinary Continuous linear models and numerical + * HiGHS semantics. They do not automatically relax a MIP or replace unsupported + * indicators/globals. Historical artifacts own their source model and original + * slot mapping. Available zero values, unavailable data and unrequested data + * have different states; read those states before optional payloads. + * + * | Operation | Delivered data | Boundary | + * | --- | --- | --- | + * | Gecode::Optimize::solve_lp_observed | Original row activity/slack, checked duals/reduced costs and basis statuses | Accepted duals require timely optimal primal/dual data and independent KKT checks. Basis data is not a proof. | + * | Gecode::Optimize::make_lp_basis and Gecode::Optimize::solve_lp_with_basis | Immutable original basis input and explicit accepted/repaired/rejected submission | Exact owner/revision/content checks; no simultaneous primal start, silent cold fallback or faster-solve guarantee. | + * | Gecode::Optimize::analyze_lp_evidence | Independently checked numerical primal rays or Farkas multipliers using explicit private auxiliary solves | Original and auxiliary coordinates/statuses remain distinct; no exact infeasibility certificate claim. | + * | Gecode::Optimize::analyze_lp_sensitivity | One-parameter objective-coefficient or common equality-RHS interval for a selected optimal basis | Additional private factorization/system solves, zero optimization runs; numerical intervals only. | + * + * \section OptimizeSensitivity Selected-basis sensitivity + * + * LpSensitivityOptions requests unique LpObjectiveParameter or + * LpEqualityRhsParameter entries from an owning LpObservedResult. The analyzer + * checks original feasibility, dual/KKT evidence, complete basis statuses and + * reconstructed reference point before interval publication. It neither repairs + * nor chooses another basis. A degenerate optimum can have different intervals + * for different selected bases/statuses. + * + * \code{.cpp} + * namespace O = Gecode::Optimize; + * O::Model model; + * const auto x = model.add_continuous(); + * const auto y = model.add_continuous(); + * const auto balance = model.add_row({{x, 1}, {y, 1}}, 3, 3); + * model.minimize({{x, 2}, {y, 1}}, 7); + * const auto observed = O::solve_lp_observed(model); + * O::LpSensitivityOptions options; + * options.parameters = {O::LpObjectiveParameter{x}, + * O::LpEqualityRhsParameter{balance}}; + * const auto analysis = O::analyze_lp_sensitivity(observed, options); + * if (analysis.sensitivity) { + * const auto* entry = analysis.sensitivity->objective(x); + * if (entry && entry->group.state == O::LpSensitivityState::Available) { + * // Read entry->interval: tagged endpoints, slope and checks. + * } + * } + * \endcode + * + * Each interval varies one original parameter alone with the selected basis + * and nonbasic statuses fixed. Equality RHS varies both equal sides together. + * Endpoints are absolute parameter values; infinity is tagged, not a finite + * double. A singleton is an available interval. The optional objective_slope + * describes slope*(parameter-anchor), without adding the original offset again. + * Variable-bound, inequality-side, matrix-entry and simultaneous perturbation + * ranges are not supported. There is no CPLEX/Gurobi ranging equivalence claim. + * + * Complete means every requested interval passed; Partial allows per-request + * rejection. Whole-call stop, resource, allocation or cleanup failure clears + * every interval's availability, including earlier results. Source history and + * completed diagnostics can remain. Lookups perform no solver work and survive + * model/session destruction. Size/work/factor-solve caps and one cooperative + * deadline cover admission through backend cleanup. + */ + +/** + * \page PageOptimizeWorkflows Repeated solves, diagnostics and model exchange + * + * | API | Meaning and current scope | + * | --- | --- | + * | Gecode::Optimize::SolveSession | Persistent numerical backend state, compatible LP basis reuse and revalidated previous MIP hints; supports observed/basis solves. Reuse is reported, not assumed to improve runtime. | + * | Gecode::Optimize::solve_lexicographic | Highest-priority-first linear objectives, checked retention rows and explicit degradation. Unfinished stages are not a lexicographic optimum. | + * | Gecode::Optimize::analyze_conflict | Numerical deletion-filter conflict groups over original rows/bounds/domains; irreducibility is relative to the documented groups, not a minimum-cardinality conflict or exact proof. | + * | Gecode::Optimize::relax_feasibility | Selected row/bound sides with positive L1 penalties in a private model; repair residuals do not make the unchanged original model feasible. | + * | Gecode::Optimize::solve_pool | One representative per finite discrete projection; established ranked prefix is separate from a final unranked candidate and from projection exhaustion. | + * | Gecode::Optimize::presolve_integer | Explicit checked bounded-integer reductions with owning reconstruction. A presolve fixpoint is not original optimality; postsolve returns a checked original witness without transferring a reduced-model global bound. | + * | Gecode::Optimize::solve_scenarios | Serial sparse objective/bound overrides on ordinary Continuous/Integer/Binary linear models under one batch allowance; no shared search tree. Explicit Native uses its one-shot route. | + * | Gecode::Optimize::solve_quadratic | Separate weighted-square continuous convex/concave model and original-coordinate checks; see QuadraticModel and QuadraticOptions. | + * + * Workflow support is narrower than the base Model vocabulary. Consult each + * entry point before combining semis, globals, indicators, guarantees, starts or + * multistage node limits. Unsupported combinations fail explicitly; a sequence + * of solves does not imply a global consumed-node or proof contract it does not + * implement. Private model results retain explicit mappings to original slots. + * + * \section OptimizeExchange Files and FlatZinc + * + * Gecode::Optimize::read_model and Gecode::Optimize::write_model support a strict + * numerical LP/free-MPS subset. Unsupported dialect/metadata is rejected. + * Export performs a checked semantic round trip before atomic replacement; + * it does not silently omit indicators or globals. This is not full support for + * every vendor extension. + * + * The opt-in fzn-gecode-optimize driver uses immutable raw FlatZinc capture, + * Gecode::Optimize::compile_flatzinc and an independent original-source checker + * before publishing output. Its admitted integer linear, Boolean, reified and + * typed-global subset includes all-different, element, table/holey domains, + * explicit-offset circuit, fixed four-argument cumulative and literal-parameter + * six-argument Regular. Predicate signatures, annotation forms, alias/domain + * semantics and finite resource admission are checked explicitly. Other + * predicates or parameter forms may be rejected even when the original + * fzn-gecode driver supports them. + * + * The separate experimental MiniZinc registration invokes this driver in + * --minizinc mode. Its compiler library lowers supported forms and preserves + * explicit rejections elsewhere; it does not change the default registration. + * The standard -t milliseconds convention belongs to that mode: -t 0 means no + * limit, whereas the direct --time-limit 0 option requests an immediate limit. + * Ordinary incomplete MiniZinc output uses protocol status and exit zero; + * malformed/unsupported inputs remain errors. + * + * \section OptimizeBindings C and Python + * + * The installed gecode/optimize/c_api.h and shared Gecode::optimize_c target + * provide a versioned C surface. The Python 3.9+ ctypes package is in python/; + * it loads a built library and does not download a solver at runtime. Delivered + * bindings cover model/bulk edits, logic/globals including Regular, sessions, + * complete native starts, solution pools, feasibility repair, scenarios and + * LP observations/basis/evidence/sensitivity. C++ API availability alone does + * not imply a matching binding: standalone lexicographic objectives, conflict + * analysis, integer presolve and the explicit native neighborhood API remain + * C++ only in this checkpoint. C handles and owning result objects + * have explicit close/destroy lifetimes; follow the header's counted-buffer and + * version fields. + */ + +/** + * \page PageOptimizeBuild Building and linking the optional component + * + * Optimize requires C++17 and CMake 3.21+. In a full %Gecode source build, + * GECODE_ENABLE_OPTIMIZE defaults to OFF. Enable it explicitly; the native + * bridge also requires integer and search components. GECODE_OPTIMIZE_WITH_NATIVE + * defaults to ON when those native targets exist. For a native-only component: + * + * \code{.sh} + * cmake -S . -B build/native-optimize \ + * -DGECODE_ENABLE_OPTIMIZE=ON -DGECODE_OPTIMIZE_WITH_HIGHS=OFF \ + * -DGECODE_ENABLE_INT_VARS=ON -DGECODE_ENABLE_SEARCH=ON + * cmake --build build/native-optimize --parallel 2 + * \endcode + * + * A standalone numerical build uses -S gecode/optimize and an installed HiGHS + * package, or GECODE_OPTIMIZE_HIGHS_SOURCE pointing to a separately obtained + * source checkout. The tested dependency is HiGHS 1.15.1 at commit + * 04024d701f79feb8e2f18bc3df0dffc04ef05088. CMake does not fetch it. A standalone + * build cannot enable the native bridge. With both backends disabled, model, + * checking, exchange and coordinator APIs remain available; solving returns + * Unsupported rather than a substitute implementation. + * + * After installation, use one matching package discovery route: + * \code{.cmake} + * find_package(Gecode CONFIG REQUIRED COMPONENTS optimize) # combined package + * # Or: find_package(GecodeOptimize CONFIG REQUIRED) # standalone + * target_link_libraries(my_target PRIVATE Gecode::optimize) + * \endcode + * Both expose Gecode::optimize and Gecode::gecodeoptimize aliases. For the C + * library use Gecode::optimize_c. A native-only component request does not + * require HiGHS. Compiled native libraries and generated configuration headers + * must match; do not mix different ABI/configuration or sanitizer cohorts. + * + * The existing native documentation target uses Doxygen 1.17.0 or newer and uv + * for generated helper pages. These Optimize pages are part of that target even + * when the optional solver component is disabled. Documentation does not enable + * a backend. The repository's docs/solver-parity/README.md contains detailed + * commands and links to per-feature contracts. + */ + +/** + * \page PageOptimizeBenchmarks Validation and benchmark interpretation + * + * The [configured settings study](../docs/solver-parity/CONFIGURED-BENCHMARK.md) + * compares ordinary Native/BAB with selected explicit routes in the same solver + * build. Eligible capacity models retain DP; linear families can enable checked + * LP, cover cuts and bounded reliability probes. Native global routes remain + * active for routing and queens. Every optional mechanism reports actual work. + * An exploratory pilot selects a frozen family policy before adaptive timing; + * these reused seeded families do not constitute an independent holdout. + * + * The [adaptive boundary study](../docs/solver-parity/ADAPTIVE-BOUNDARIES.md) + * searches each native version independently under ten-second limits. Expansion + * stops after a failed size, followed by bracket search and confirmation. These + * are sampled boundaries, not absolute solver limits. Original witnesses are + * checked independently; exact optimality is reported by the backend without + * a separate reference oracle. Earlier fixed studies remain separate records. + * + * The [seven-category study](../docs/solver-parity/CATEGORY-SCALING.md) + * records 132 runs from 33 frozen cases under ten-second limits. Knapsack is + * grouped across both distributions and both repetitions; its largest tested + * proved size rises from 32 to 384 model variables. Six other category maxima + * are unchanged. Routing and queens report actual integer model variables + * separately from city/queen counts. The single-variant 512-item stress case + * remains visible. No general maximum, speed or commercial-parity claim follows. + * + * The [capacity scaling study](../docs/solver-parity/CAPACITY-SCALING.md) + * measures 13 frozen cases with two paired repetitions and ten-second limits. + * The largest tested knapsack size proved in both repetitions rises from 32 + * to 384 Binary variables in two fixed distributions; assignment remains at + * 256. The 512-variable table-overflow point remains in the census and times + * out for both versions. These are sampled sizes, not general solver limits + * or speed ratios. All 52 original-model witnesses pass independent checks. + * + * The [algorithm checkpoint](../docs/solver-parity/ALGORITHMIC-CHECKPOINT.md) + * compares the bounded binary capacity optimization with the immediate prior + * implementation using the same driver and checked runtime-library cohorts. + * The separate before-project and eighth-to-ninth studies are historical. + * None is a CPLEX/Gurobi comparison or a rerun of the entire original corpus. + * Existing CP tests exercise original native functionality; + * Optimize tests separately exercise the additive facade and its backends. + * + * The expanded FAST gate passes 35 required cases, including selected-basis + * sensitivity and an actual bounded neighborhood improvement. Correctness + * configurations overlap and their counts must not be added as unique coverage. + * The before-project panel compares preserved original experimental binaries + * with the ninth checkpoint, including its HiGHS binary-model route; build + * and loading costs are part of that measurement. The separate eighth-to-ninth + * comparison uses preserved executables and common workloads; one attempted + * extra panel exceeded the unchanged cp_distinct + * deadline and remains disclosed. No limit was relaxed to obtain a pass. + * + * See the [benchmark report](../docs/solver-parity/BENCHMARKS.md) for measured + * values, charts, cohort identities, retained failures and limitations. That + * report is included as a native documentation page. Its portable source is + * docs/solver-parity/BENCHMARKS.md; the checkpoint record and raw artifact paths + * are retained with the source tree. Performance evidence applies only to the + * stated workloads, builds, machine and budgets. The broader solver-parity + * roadmap remains incomplete and further feature implementation is on hold. + */ diff --git a/examples/optimize-file.cpp b/examples/optimize-file.cpp new file mode 100644 index 0000000000..42061bc9ef --- /dev/null +++ b/examples/optimize-file.cpp @@ -0,0 +1,107 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; + +static std::string json(const std::string& value) { + std::ostringstream out; + out << '"'; + for (unsigned char c : value) { + switch (c) { + case '"': out << "\\\""; break; + case '\\': out << "\\\\"; break; + case '\n': out << "\\n"; break; + case '\r': out << "\\r"; break; + case '\t': out << "\\t"; break; + default: + if (c<32) out << "\\u" << std::hex << std::setw(4) << std::setfill('0') << unsigned(c) << std::dec; + else out << c; + } + } + out << '"'; + return out.str(); +} + +static double number(const std::string& text) { + std::size_t used=0; + const double value=std::stod(text,&used); + if (used!=text.size() || !std::isfinite(value) || value<0) + throw std::invalid_argument("Option requires a nonnegative finite number"); + return value; +} + +static void optional(const std::optional& value) { + if (value && std::isfinite(*value)) std::cout << *value; + else std::cout << "null"; +} + +int main(int argc, char** argv) { + const auto begin=std::chrono::steady_clock::now(); + const auto elapsed=[&] { return std::chrono::duration(std::chrono::steady_clock::now()-begin).count(); }; + std::cout << std::setprecision(std::numeric_limits::max_digits10); + try { + if (argc<2) throw std::invalid_argument("Usage: optimize-file MODEL.lp|MODEL.mps [--time-limit SECONDS] [--relative-gap GAP] [--absolute-gap GAP] [--seed N]"); + O::SolveOptions options; + for (int arg=2; arg=argc) throw std::invalid_argument("Missing option value"); + const std::string key=argv[arg]; + const double value=number(argv[arg+1]); + if (key=="--time-limit") options.time_limit_seconds=value; + else if (key=="--relative-gap") options.relative_gap=value; + else if (key=="--absolute-gap") options.absolute_gap=value; + else if (key=="--seed" && std::floor(value)==value && value<=std::numeric_limits::max()) + options.random_seed=static_cast(value); + else throw std::invalid_argument("Unknown or invalid option: "+key); + } + options.validate(); + auto model=O::read_model(argv[1]); + const double import_seconds=elapsed(); + if (std::isfinite(options.time_limit_seconds)) + options.time_limit_seconds=std::max(0.0,options.time_limit_seconds-import_seconds); + const auto result=O::solve(model,options); + std::cout << "{\"schema_version\":1,\"model\":" << json(argv[1]) + << ",\"backend\":" << json(result.backend) + << ",\"backend_version\":" << json(result.backend_version) + << ",\"guarantee\":\"numerical\",\"termination\":" << json(O::to_string(result.termination)) + << ",\"message\":" << json(result.message) + << ",\"solution_validated\":" << (result.has_solution()?"true":"false") + << ",\"objective\":"; + optional(result.objective); + std::cout << ",\"best_bound\":"; optional(result.best_bound); + std::cout << ",\"absolute_gap\":"; optional(result.absolute_gap); + std::cout << ",\"relative_gap\":"; optional(result.relative_gap); + std::cout << ",\"native_backend_gap\":"; optional(result.native_backend_gap); + std::cout << ",\"import_seconds\":" << import_seconds + << ",\"solve_seconds\":" << result.elapsed_seconds + << ",\"elapsed_seconds\":" << elapsed() << ",\"values\":["; + for (std::size_t i=0; i +#include +#include + +int main() { + namespace O = Gecode::Optimize; + O::Model model; + const auto open = model.add_binary("open"); + const auto quantity = model.add_continuous(0.0, 100.0, "quantity"); + model.add_row({{quantity, 1.0}, {open, -100.0}}, + -std::numeric_limits::infinity(), 0.0, "capacity"); + model.add_row({{quantity, 1.0}}, 40.0, + std::numeric_limits::infinity(), "demand"); + model.minimize({{open, 12.0}, {quantity, 0.5}}); + O::SolveOptions options; + options.time_limit_seconds = 30; + auto result = O::solve(model, options); + std::cout << result.backend << ' ' << result.backend_version << ": " + << O::to_string(result.termination) << '\n'; + if (!result.has_solution()) { + std::cout << result.message << '\n'; + return 1; + } + std::cout << "open=" << result.value(open) << " quantity=" << result.value(quantity) + << " objective=" << *result.objective << '\n'; + return result.termination == O::Termination::Optimal ? 0 : 1; +} diff --git a/experiments/lp-relaxation/driver.cpp b/experiments/lp-relaxation/driver.cpp index 8566671b15..5c94231832 100644 --- a/experiments/lp-relaxation/driver.cpp +++ b/experiments/lp-relaxation/driver.cpp @@ -22,45 +22,82 @@ using Clock=std::chrono::steady_clock; struct Instance { LP::LinearModel model; + LP::SparseLinearModel sparse; + LP::BoundedIntegerModel integer; + bool use_sparse,use_integer; + LP::SparseLinearModel& sparse_data() {return use_integer?integer.linear:sparse;} + const LP::SparseLinearModel& sparse_data() const {return use_integer?integer.linear:sparse;} + const std::vector& costs() const { return use_sparse ? sparse_data().c : model.c; } std::vector incumbent; int incumbent_cost=0; int lo=0,hi=0; - explicit Instance(const char* path) { + explicit Instance(const char* path,bool csr=false,bool bounded_integer=false) + : use_sparse(csr || bounded_integer),use_integer(bounded_integer) { std::ifstream f(path); int n,m; - if (!(f>>n>>m) || n<=0 || n>10000 || m<0 || m>10000 || 1LL*n*m>10000000) + if (!(f>>n>>m) || n<=0 || n>10000 || m<0 || m>10000 || (!use_sparse && 1LL*n*m>10000000)) throw std::runtime_error("Invalid dimensions"); - model.c.resize(n); model.b.resize(m); model.a.assign(n*m,0); - for (auto& c:model.c) if (!(f>>c)) throw std::runtime_error("Invalid objective"); + auto& csr_model=sparse_data(); + auto& c=use_sparse ? csr_model.c : model.c; + auto& b=use_sparse ? csr_model.b : model.b; + c.resize(n); b.resize(m); + if (use_sparse) csr_model.row_start.reserve(static_cast(m)+1); + else model.a.assign(n*m,0); + for (auto& cost:c) if (!(f>>cost)) throw std::runtime_error("Invalid objective"); + if (use_integer) { + std::string bounds; + if (!(f>>bounds) || bounds!="bounds") throw std::runtime_error("Integer input requires bounds followed by n lower/upper pairs"); + integer.lower.resize(n);integer.upper.resize(n); + for (int j=0;j>integer.lower[j]>>integer.upper[j])) throw std::runtime_error("Invalid integral domain endpoints"); + } for (int i=0;i>model.b[i]>>count) || count<0 || count>n) + if (!(f>>b[i]>>count) || count<0 || count>n) throw std::runtime_error("Invalid row"); int previous=-1; for (int k=0;k>j>>a) || j<=previous || j>=n || !a) throw std::runtime_error("Invalid coefficient"); - previous=j; model.a[i*n+j]=a; + previous=j; + if (use_sparse) { csr_model.column.push_back(static_cast(j)); csr_model.a.push_back(a); } + else model.a[i*n+j]=a; + } + if (use_sparse) csr_model.row_start.push_back(csr_model.a.size()); + } + if (use_integer) { + LP::validate_integer_model(integer); + for (int j=0;j(std::min(a,b));hi+=static_cast(std::max(a,b)); } + } else { + if (use_sparse) LP::validate_model(csr_model); else LP::validate_model(model); + for (auto c:costs()) { if (c<0) lo+=static_cast(c); else hi+=static_cast(c); } } - LP::validate_model(model); - for (auto c:model.c) { if (c<0) lo+=static_cast(c); else hi+=static_cast(c); } std::string label; int present; if (!(f>>label>>present) || label!="incumbent" || (present!=0 && present!=1)) throw std::runtime_error("Invalid incumbent trailer"); if (present) { incumbent.resize(n); - for (int& value:incumbent) - if (!(f>>value) || (value!=0 && value!=1)) throw std::runtime_error("Invalid incumbent bit"); + for (int j=0;j>incumbent[j]) || (use_integer ? + (incumbent[j]integer.upper[j]) : + (incumbent[j]!=0 && incumbent[j]!=1))) throw std::runtime_error("Incumbent violates variable domain"); for (int i=0;i(model.c[j])*incumbent[j]; + for (int j=0;j(costs()[j])*incumbent[j]; } + if (use_integer && (f>>std::ws).peek()!=std::char_traits::eof()) + throw std::runtime_error("Unexpected trailing integer model content"); } }; @@ -68,7 +105,8 @@ struct Configuration { std::string mode,branching; bool warm; #ifdef WITH_LP - std::shared_ptr backend; + std::shared_ptr backend; + std::shared_ptr integer_backend; #endif }; @@ -77,18 +115,30 @@ class Model : public IntMinimizeSpace { IntVarArray x; IntVar objective; Model(const Instance& p,const Configuration& cfg) - : x(*this,static_cast(p.model.c.size()),0,1),objective(*this,p.lo,p.hi) { + : x(*this,static_cast(p.costs().size())),objective(*this,p.lo,p.hi) { + for (int j=0;j(p.integer.lower[j]):0, + p.use_integer?static_cast(p.integer.upper[j]):1); #ifdef WITH_LP - if (cfg.backend) + if (cfg.integer_backend) { + LP::IntegerOptions policy; + policy.frequency=cfg.mode=="root" || cfg.mode=="root-tight" ? LP::Frequency::Root : LP::Frequency::EveryNode; + policy.bound_tightening=cfg.mode=="root-tight" || cfg.mode=="node-tight"; + LP::integer_linear_minimize(*this,x,objective,cfg.integer_backend,policy); + } else if (cfg.backend) LP::binary_linear_minimize(*this,x,objective,cfg.backend, cfg.mode=="root" ? LP::Frequency::Root : LP::Frequency::EveryNode); else #endif - LP::post_native(*this,x,objective,p.model); + { + if (p.use_integer) LP::post_native_integer(*this,x,objective,p.integer); + else if (p.use_sparse) LP::post_native(*this,x,objective,p.sparse_data()); + else LP::post_native(*this,x,objective,p.model); + } if (cfg.warm && !p.incumbent.empty()) rel(*this,objective,IRT_LE,p.incumbent_cost); // The same objective-aware value order and variable rule in both solvers. - const bool negative=std::all_of(p.model.c.begin(),p.model.c.end(),[](auto c){return c<=0;}); + const bool negative=std::all_of(p.costs().begin(),p.costs().end(),[](auto c){return c<=0;}); IntValBranch values=negative ? INT_VAL_MAX() : INT_VAL_MIN(); if (cfg.branching=="afc") branch(*this,x,INT_VAR_AFC_SIZE_MAX(0.99),values); else if (cfg.branching=="size") branch(*this,x,INT_VAR_SIZE_MIN(),values); @@ -101,13 +151,17 @@ class Model : public IntMinimizeSpace { int main(int argc,char** argv) { try { - if (argc!=7) throw std::runtime_error("Usage: driver INPUT none|root|node afc|size LIMIT_MS WARM_START REPEATS"); - Instance input(argv[1]); + if (argc!=7 && argc!=8) throw std::runtime_error("Usage: driver INPUT none|root|node|root-tight|node-tight afc|size LIMIT_MS WARM_START REPEATS [--sparse|--integer]"); + const std::string representation=argc==8?argv[7]:""; + if (!representation.empty() && representation!="--sparse" && representation!="--integer") + throw std::runtime_error("Unknown model option; expected --sparse or --integer"); + Instance input(argv[1],representation=="--sparse",representation=="--integer"); std::string mode=argv[2],branching=argv[3]; double limit=std::stod(argv[4]); bool warm=std::stoi(argv[5])!=0; int repeats=std::stoi(argv[6]); - if ((mode!="none" && mode!="root" && mode!="node") || limit<=0 || repeats<=0) + if ((mode!="none" && mode!="root" && mode!="node" && + !(input.use_integer && (mode=="root-tight" || mode=="node-tight"))) || limit<=0 || repeats<=0) throw std::runtime_error("Invalid mode or budget"); #ifndef WITH_LP if (mode!="none") throw std::runtime_error("Stock executable has no LP feature"); @@ -117,7 +171,11 @@ int main(int argc,char** argv) { Search::TimeStop stop(limit); Configuration cfg; cfg.mode=mode;cfg.branching=branching;cfg.warm=warm; #ifdef WITH_LP - if (mode!="none") cfg.backend=std::make_shared(input.model); + if (mode!="none") { + if (input.use_integer) cfg.integer_backend=std::make_shared(input.integer); + else if (input.use_sparse) cfg.backend=std::make_shared(input.sparse_data()); + else cfg.backend=std::make_shared(input.model); + } #endif std::vector best; int best_cost=0; @@ -147,6 +205,11 @@ int main(int argc,char** argv) { valid_bounds=s.valid_bounds;rejected=s.rejected;lp_infeasible=s.infeasible_status; cfg.backend.reset(); } + if (cfg.integer_backend) { + auto s=cfg.integer_backend->statistics();lp_calls=s.lp_calls;lp_ms=s.lp_ms; + valid_bounds=s.valid_bounds;rejected=s.rejected;lp_infeasible=s.infeasible_status; + cfg.integer_backend.reset(); + } #endif const auto finished=Clock::now(); struct rusage usage;getrusage(RUSAGE_SELF,&usage); @@ -156,6 +219,8 @@ int main(int argc,char** argv) { #endif const char* status=best.empty() ? (stopped?"unknown":"infeasible") : (stopped?"feasible":"optimal"); std::cout << "{\"status\":\"" << status << "\",\"mode\":\"" << mode << "\",\"branching\":\"" << branching + << "\",\"matrix_storage\":\"" << (input.use_sparse?"csr":"dense") + << "\",\"variable_domain\":\"" << (input.use_integer?"bounded-integer":"binary") << "\",\"stopped\":" << (stopped?"true":"false") << ",\"elapsed_ms\":" << std::chrono::duration(finished-begin).count() << ",\"build_ms\":" << std::chrono::duration(constructed-begin).count() diff --git a/experiments/lp-relaxation/tests/backend.cpp b/experiments/lp-relaxation/tests/backend.cpp index 6e894e9383..e681d46648 100644 --- a/experiments/lp-relaxation/tests/backend.cpp +++ b/experiments/lp-relaxation/tests/backend.cpp @@ -3,6 +3,7 @@ #include #include #include +#include using namespace Gecode::Experimental::LpRelaxation; @@ -10,7 +11,71 @@ static void check(bool ok, const char* message) { if (!ok) throw std::runtime_error(message); } +static void sparse_checks() { + const LinearModel input{{1,1,0, 0,1,1, 1,0,1},{1,1,1},{1,1,1}}; + Backend dense(input); + SparseBackend sparse(sparse_model(input)); + check(sparse.model.nonzeros()==6 && sparse.model.row_start.size()==4,"CSR storage"); + for (unsigned box=0;box<27;++box) { + std::vector lo(3),hi(3); auto remaining=box; + for (unsigned j=0;j<3;++j) { + const auto domain=remaining%3; remaining/=3; + lo[j]=domain==1; hi[j]=domain!=2; + } + const auto d=dense.bound(lo,hi,true),s=sparse.bound(lo,hi,true); + check(d.valid==s.valid,"sparse/dense bound validity"); + if (d.valid) { + check(d.lower_bound==s.lower_bound && s.certificate,"sparse/dense bound value"); + std::int64_t restored=0,original=0; + check(s.certificate->lower_bound({0,0,0},{1,1,1},restored) && + d.certificate->lower_bound({0,0,0},{1,1,1},original) && restored==original, + "sparse certificate sibling reuse"); + } + } + // Input containers remain mutable. Each constructor takes a fresh snapshot; + // changing one never changes already published dense/sparse backend models. + auto changed=input; + Backend before(changed); changed.a[0]=0; + Backend after(changed); + check(before.model.a[0]==1 && after.model.a[0]==0 && + before.SparseBackend::model.nonzeros()==6 && after.SparseBackend::model.nonzeros()==5, + "legacy mutable model reused stale CSR"); + auto csr=sparse_model(input); + SparseBackend immutable(csr); csr.a[0]=7; + check(immutable.model.a[0]==1,"sparse input mutation changed published model"); + for (unsigned bad=0;bad<5;++bad) { + auto invalid=sparse_model(input); + if (bad==0) invalid.row_start.clear(); + if (bad==1) invalid.column[1]=invalid.column[0]; + if (bad==2) invalid.a[0]=0; + if (bad==3) invalid.column[0]=3; + if (bad==4) invalid.a[0]=1000000001LL; + bool rejected=false; + try { SparseBackend unused(std::move(invalid)); } + catch (const std::invalid_argument&) { rejected=true; } + check(rejected,"invalid sparse backend input accepted"); + } + SparseLinearModel zero; + zero.row_start={0,0}; zero.b={1}; zero.c={-3,4}; + SparseBackend constant(zero); + const auto box=constant.bound({0,0},{1,1},true); + check(box.valid && box.lower_bound==-3 && constant.statistics().lp_calls==0, + "zero matrix numerical assertion or unsupported infeasibility inference"); + SparseBackend sibling(sparse_model({{1,1},{1},{2,9}})); + bool first_ok=true,second_ok=true; + std::thread first([&] { for (int i=0;i<20;++i) { + auto r=sibling.bound({0,1},{0,1}); first_ok &= r.valid && r.lower_bound==9; + } }); + std::thread second([&] { for (int i=0;i<20;++i) { + auto r=sibling.bound({1,0},{1,0}); second_ok &= r.valid && r.lower_bound==2; + } }); + first.join(); second.join(); + check(first_ok && second_ok,"sparse serialized sibling restoration"); + static_assert(std::is_base_of::value,"legacy sparse backend conversion"); +} + int main() { + sparse_checks(); // Fractional triangle-cover optimum is 1.5, hence integer lower bound 2. Backend triangle({{1,1,0, 0,1,1, 1,0,1}, {1,1,1}, {1,1,1}}); auto t = triangle.bound({0,0,0},{1,1,1}); @@ -52,7 +117,7 @@ int main() { << "\"cases\":[\"triangle_dual_sign_and_exact_bound\"," << "\"sibling_bound_restoration\",\"recovery_after_infeasible_lp\"," << "\"binary_and_dimension_checks\",\"empty_models\"," - << "\"serialized_callers\"],\"lp_calls\":" << stats.lp_calls + << "\"serialized_callers\",\"sparse_equivalence_and_corruption\"],\"lp_calls\":" << stats.lp_calls << ",\"valid_bounds\":" << stats.valid_bounds << ",\"rejected\":" << stats.rejected << "}\n"; } diff --git a/experiments/lp-relaxation/tests/cut-loop.cpp b/experiments/lp-relaxation/tests/cut-loop.cpp new file mode 100644 index 0000000000..c2b05a17bf --- /dev/null +++ b/experiments/lp-relaxation/tests/cut-loop.cpp @@ -0,0 +1,336 @@ +// Independent finite original-model oracle and actual numerical LP selection. +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#ifdef GECODE_LP_CUT_LOOP_TEST_NATIVE +#include +#endif + +namespace LP=Gecode::Experimental::LpRelaxation; +namespace Cuts=LP::Cuts; +using I=std::int64_t; +using Model=LP::BoundedIntegerModel; +static std::size_t runs=0,points=0; +#ifdef GECODE_LP_CUT_LOOP_TEST_HOOKS +static thread_local std::map events; +static thread_local std::string failed_event; +static thread_local unsigned failed_occurrence=0,event_occurrence=0; +static thread_local bool allocation_failure=false; +static thread_local bool cancel_on_event=false,cancelled_on_event=false; +namespace Gecode { namespace Experimental { namespace LpRelaxation { namespace Cuts { +void root_cut_loop_test_event(const char* name) { + ++events[name]; + if(failed_event!=name || ++event_occurrence!=failed_occurrence)return; + if(cancel_on_event){cancelled_on_event=true;return;} + if(allocation_failure)throw std::bad_alloc(); + throw std::runtime_error("injected backend/augmentation error"); +} +}}}} +#endif + +static Model model(LP::LinearModel dense,std::vector lower,std::vector upper) { + return {LP::sparse_model(dense),std::move(lower),std::move(upper)}; +} +static Model fixture() {return model({{-3,-3},{-5},{-2,-2}},{0,0},{1,1});} +static bool same(const Model& a,const Model& b) { + return a.lower==b.lower && a.upper==b.upper && a.linear.a==b.linear.a && + a.linear.b==b.linear.b && a.linear.c==b.linear.c && + a.linear.column==b.linear.column && a.linear.row_start==b.linear.row_start; +} +static bool feasible(const Model& m,const std::vector& x) { + for (std::size_t j=0;jm.upper[j]) return false; + for (std::size_t i=0;i& x) { + I sum=0;for(std::size_t j=0;j& cuts) { + const auto& original=source.model();const auto& m=augmented.model(); + assert(m.lower==original.lower && m.upper==original.upper && m.linear.c==original.linear.c); + const auto rows=original.linear.b.size(),nnz=original.linear.a.size(); + assert(m.linear.b.size()==rows+cuts.size()); + assert(std::equal(original.linear.row_start.begin(),original.linear.row_start.end(),m.linear.row_start.begin())); + assert(std::equal(original.linear.a.begin(),original.linear.a.end(),m.linear.a.begin())); + assert(std::equal(original.linear.column.begin(),original.linear.column.end(),m.linear.column.begin())); + assert(std::equal(original.linear.b.begin(),original.linear.b.end(),m.linear.b.begin())); + std::size_t start=nnz; + for (std::size_t i=0;imodel,result.model.model())); + if(result.best_bound) { + const auto& best=*result.best_bound; + assert(best.bound.valid && best.bound.certificate && !best.bound.primal_suggestion); + provenance(source,best.model,best.cuts); + I checked=0; + assert(best.bound.certificate->lower_bound_integer(source.model().lower,source.model().upper,checked)); + assert(checked==best.bound.lower_bound); + } + const auto& original=source.model();std::vector x(original.lower.size()); + std::optional optimum; + const auto visit=[&](const auto& self,std::size_t j)->void { + if(j==x.size()) { + ++points;const bool valid=feasible(original,x); + assert(valid==feasible(result.model.model(),x)); + if(result.best_bound) assert(valid==feasible(result.best_bound->model.model(),x)); + if(valid) {const auto value=objective(original,x);if(!optimum || value<*optimum) optimum=value;} + return; + } + for(I value=original.lower[j];value<=original.upper[j];++value){x[j]=value;self(self,j+1);} + }; + visit(visit,0); + if(optimum && result.best_bound) assert(result.best_bound->bound.lower_bound<=*optimum); +} +static void actual_lp_and_ownership() { + auto input=fixture();Cuts::SourceModel source(input); + auto old=std::make_shared(input); + const auto old_bound=old->bound(input.lower,input.upper,true,true); + assert(old_bound.valid && old_bound.lower_bound==-3 && old_bound.primal_suggestion && + std::abs(old_bound.lp_objective+10.0/3.0)<1e-8); + assert(!old->bound(input.lower,input.upper).primal_suggestion); + auto copied=old_bound;(*copied.primal_suggestion)[0]=999; + assert((*old_bound.primal_suggestion)[0]<=1); + input.linear.a[0]=11;input.upper[0]=0; + assert(source.model().linear.a[0]==-3 && old->model.upper[0]==1); + Cuts::RootLoopOptions options; + auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::NoNewCuts); + assert(result.stats.lp_calls>=2 && result.stats.augmentations==1 && result.cuts.size()==1); + assert(result.best_bound && result.best_bound->bound.lower_bound==-2); + assert(result.best_bound->model.model().linear.b.size()==2); + assert(old->model.linear.b.size()==1 && old->bound({0,0},{1,1},true).lower_bound==-3); + I checked=0;assert(old_bound.certificate->lower_bound_integer({0,0},{1,1},checked) && checked==-3); + auto historical=result;result.cuts.clear();result.backend.reset(); + assert(historical.cuts.size()==1 && historical.backend->model.linear.b.size()==2); + LP::SparseBackend binary(source.model().linear); + assert(binary.bound({0,0},{1,1},true,true).primal_suggestion); + assert(!binary.bound({0,0},{1,1},true).primal_suggestion); +} +static void rationalization() { + Cuts::SourceModel source(model({{},{},{0,0,0}},{-2,0,2},{2,1,2})); + const auto projected=Cuts::rational_selection_point(source,{-3,1.0001,99},8); + assert(projected.projected_coordinates==3 && projected.point.numerator==std::vector({-16,8,16})); + const auto rounded=Cuts::rational_selection_point(source,{-0.0625,0.0625,2},8); + assert(!rounded.projected_coordinates && rounded.point.numerator==std::vector({-1,1,16})); + for(I d:{I(0),I(-1),I(3),I(2097152)}) { + bool rejected=false;try{(void)Cuts::rational_selection_point(source,{0,0,2},d);} + catch(const std::invalid_argument&){rejected=true;}assert(rejected); + } + for(double bad:{std::numeric_limits::infinity(),std::numeric_limits::quiet_NaN()}) { + bool rejected=false;try{(void)Cuts::rational_selection_point(source,{bad,0,2});} + catch(const std::invalid_argument&){rejected=true;}assert(rejected); + } + bool rejected=false;try{(void)Cuts::rational_selection_point(source,{0});} + catch(const std::invalid_argument&){rejected=true;}assert(rejected); + const auto limit=Gecode::Int::Limits::max; + Cuts::SourceModel endpoints(model({{},{},{0,0}},{-limit,limit},{-limit,limit})); + const auto exact=Cuts::rational_selection_point(endpoints,{-double(limit),double(limit)}); + assert(exact.point.numerator==std::vector({-I(limit)*1048576,I(limit)*1048576})); +} +static void budgets() { + Cuts::SourceModel source(fixture());Cuts::RootLoopOptions options; + options.max_rounds=0;auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::RoundLimit && !result.backend && !result.best_bound); + options={};options.max_rounds=1;result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::RoundLimit && result.cuts.size()==1); + assert(result.best_bound->bound.lower_bound==-3 && result.best_bound->cuts.empty()); + assert(result.model.model().linear.b.size()==2 && result.best_bound->model.model().linear.b.size()==1); + for(std::size_t work=0;work<650;++work) { + options={};options.max_work=work; + const auto limited=Cuts::root_cover_loop(source,options);evidence(source,options,limited); + assert(limited.completion==Cuts::RootLoopCompletion::WorkLimit || + limited.completion==Cuts::RootLoopCompletion::NoNewCuts); + if(limited.completion==Cuts::RootLoopCompletion::WorkLimit && limited.best_bound) + assert(limited.best_bound->bound.lower_bound<=-2); + } + for(unsigned kind=0;kind<6;++kind) { + options={}; + if(kind==0)options.max_columns=1; + if(kind==1)options.max_rows=1; + if(kind==2)options.max_nonzeros=3; + if(kind==3)options.pool.max_cuts=0; + if(kind==4)options.pool.max_nonzeros=1; + if(kind==5)options.max_rows=0; + result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::StorageLimit && result.cuts.empty()); + } + options={};options.separation.max_rows=0;result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::SeparationLimit); + options={};options.separation.max_work=0;result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::WorkLimit); + options={};options.separation.max_cuts=0;result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::SeparationLimit); + options={};options.deadline=std::chrono::steady_clock::now();result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::TimeLimit && !result.backend); + options={};options.stop_requested=[](){return true;};result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(result.completion==Cuts::RootLoopCompletion::Cancelled && !result.backend); + std::size_t checkpoints=0; + options={};options.stop_requested=[&](){++checkpoints;return false;}; + result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + const auto total=checkpoints; + for(std::size_t stop=1;stop<=total;++stop) for(unsigned mode=0;mode<4;++mode) { + checkpoints=0;options={}; + options.stop_requested=[&]() { + if(++checkpoints!=stop)return false; + if(mode==1)throw std::runtime_error("callback failure"); + if(mode==2)throw std::bad_alloc(); + if(mode==3){options.deadline=std::chrono::steady_clock::now();return false;} + return true; + }; + const auto partial=Cuts::root_cover_loop(source,options);evidence(source,options,partial); + assert(checkpoints==stop); + assert(partial.completion==(mode==3?Cuts::RootLoopCompletion::TimeLimit: + mode?Cuts::RootLoopCompletion::CallbackError:Cuts::RootLoopCompletion::Cancelled)); + } +} +static void edge_models() { + for(const auto& value:{ + model({{1},{0},{1}},{0},{1}), // Integral LP; no violated cover. + model({{-1,-1},{-3},{-1,-1}},{0,0},{3,3}), // Unsupported free general terms. + model({{},{},{0}},{-1},{1}), // No matrix, no raw LP suggestion. + model({{},{1},{}},{},{}), // Exact contradiction, no floating inference. + model({{1,-1},{-1},{0,0}},{-2,0},{-2,1}), // Fixed negative integer substitution. + model({{1},{2},{0}},{0},{1}) // Floating infeasible status must not prune. + }) { + Cuts::SourceModel source(value);Cuts::RootLoopOptions options; + const auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + if(value.upper==std::vector({3,3})) assert(result.stats.unsupported_rows>0 && result.cuts.empty()); + if(value.linear.a.empty()) assert(result.completion==Cuts::RootLoopCompletion::NoPrimalSuggestion); + } + std::mt19937 random(419); + for(unsigned example=0;example<180;++example) { + const std::size_t n=2+random()%2,m=1+random()%3;LP::LinearModel dense; + for(std::size_t k=0;k lo(n,0),hi(n,1); + if(example%5==0)lo[0]=hi[0]=-2; + Cuts::SourceModel source(model(dense,lo,hi)); + std::optional prior; + for(std::size_t rounds=1;rounds<=3;++rounds) { + Cuts::RootLoopOptions options;options.max_rounds=rounds; + const auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + if(result.best_bound) { + if(prior)assert(result.best_bound->bound.lower_bound>=*prior); + prior=result.best_bound->bound.lower_bound; + } + } + } +} +static void concurrency() { + Cuts::SourceModel source(fixture());Cuts::RootLoopOptions options; + std::optional a,b; + std::thread one([&](){a=Cuts::root_cover_loop(source,options);}); + std::thread two([&](){b=Cuts::root_cover_loop(source,options);}); + one.join();two.join();evidence(source,options,*a);evidence(source,options,*b); + assert(a->best_bound->bound.lower_bound==-2 && b->best_bound->bound.lower_bound==-2); + assert(!a->model.same_identity(b->model) && a->cuts[0].source().same_identity(b->cuts[0].source())); + auto backend=a->backend;bool first=true,second=true; + std::thread low([&](){for(unsigned i=0;i<10;++i){const auto r=backend->bound({0,0},{0,1},true,true);first&=r.valid && r.lower_bound==-2;}}); + std::thread high([&](){for(unsigned i=0;i<10;++i){const auto r=backend->bound({1,0},{1,0},true,true);second&=r.valid && r.lower_bound==-2;}}); + low.join();high.join();assert(first && second); +} +#ifdef GECODE_LP_CUT_LOOP_TEST_HOOKS +static void faults() { + Cuts::SourceModel source(fixture());Cuts::RootLoopOptions options; + events.clear();(void)Cuts::root_cover_loop(source,options);const auto counts=events; + for(const auto& event:counts)for(unsigned occurrence=1;occurrence<=event.second;++occurrence) + for(unsigned mode=0;mode<3;++mode) { + failed_event=event.first;failed_occurrence=occurrence;event_occurrence=0;allocation_failure=mode==1; + cancel_on_event=mode==2;cancelled_on_event=false; + options.stop_requested=[](){return cancelled_on_event;}; + auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + assert(event_occurrence==occurrence); + assert(result.completion==(mode==2?Cuts::RootLoopCompletion::Cancelled: + mode==1?Cuts::RootLoopCompletion::AllocationFailure:Cuts::RootLoopCompletion::BackendError)); + if(event.first=="augmentation_publication")assert(result.cuts.empty() && result.best_bound->bound.lower_bound==-3); + if(event.first=="after_augmentation_publication")assert(result.cuts.size()==1 && result.best_bound->bound.lower_bound==-3); + if(event.first=="bound_publication" && occurrence==2)assert(result.cuts.size()==1 && result.best_bound->bound.lower_bound==-3); + } + // Explicit last-round interruption: retain its already-published augmentation. + failed_event="after_augmentation_publication";failed_occurrence=1;event_occurrence=0; + cancel_on_event=true;cancelled_on_event=false;options.max_rounds=1; + const auto last=Cuts::root_cover_loop(source,options);evidence(source,options,last); + assert(last.completion==Cuts::RootLoopCompletion::Cancelled && last.cuts.size()==1); + failed_event.clear();cancel_on_event=false;cancelled_on_event=false; +} +#endif +#ifdef GECODE_LP_CUT_LOOP_TEST_NATIVE +class NativeModel final:public Gecode::Space { +public: + Gecode::IntVarArray x; + Gecode::IntVar cost; + explicit NativeModel(const Model& input):x(*this,static_cast(input.lower.size())), + cost(*this,Gecode::Int::Limits::min,Gecode::Int::Limits::max) { + for(int j=0;j(input.lower[j]),static_cast(input.upper[j])); + LP::post_native_integer(*this,x,cost,input); + Gecode::branch(*this,x,Gecode::INT_VAR_SIZE_MIN(),Gecode::INT_VAL_MIN()); + } + NativeModel(NativeModel& other):Gecode::Space(other){x.update(*this,other.x);cost.update(*this,other.cost);} + Gecode::Space* copy() override{return new NativeModel(*this);} +}; +static void native_consumption() { + for(const auto& input:{fixture(),model({{2,-3,-3},{-7},{0,-2,-2}},{-1,0,0},{-1,1,1}), + model({{},{1},{}},{},{})}) { + Cuts::SourceModel source(input);Cuts::RootLoopOptions options; + auto result=Cuts::root_cover_loop(source,options);evidence(source,options,result); + auto root=std::make_unique(result.model.model()); + Gecode::DFS search(root.get());root.reset(); + std::size_t count=0; + while(auto* raw=search.next()) { + std::unique_ptr solution(raw);std::vector x; + for(int j=0;jx.size();++j)x.push_back(solution->x[j].val()); + assert(feasible(input,x) && solution->cost.val()==objective(input,x));++count; + } + std::size_t expected=0;std::vector x(input.lower.size()); + const auto visit=[&](const auto& self,std::size_t j)->void { + if(j==x.size()){expected+=feasible(input,x);return;} + for(I value=input.lower[j];value<=input.upper[j];++value){x[j]=value;self(self,j+1);} + }; + visit(visit,0);assert(count==expected); + } +} +#endif +int main() { + actual_lp_and_ownership();rationalization();budgets();edge_models(); +#ifdef GECODE_LP_CUT_LOOP_TEST_HOOKS + faults(); // Hook instrumentation is coordinator-only; concurrent runs follow. +#endif + concurrency(); +#ifdef GECODE_LP_CUT_LOOP_TEST_NATIVE + native_consumption(); +#endif + std::cout<<"PASS root cover loop: "< +#include +#include +#include +#include +#include + +namespace LP=Gecode::Experimental::LpRelaxation; +namespace C=LP::Cuts; +using I=std::int64_t; +using Point=std::vector; +static void check(bool okay,const char* message) {if(!okay)throw std::runtime_error(message);} +template static void rejected(Function function,const char* message) { + bool failed=false; + try {function();}catch(const std::invalid_argument&){failed=true;}catch(const std::overflow_error&){failed=true;} + check(failed,message); +} +static LP::BoundedIntegerModel model(LP::LinearModel dense,Point lower,Point upper) { + return {LP::sparse_model(dense),std::move(lower),std::move(upper)}; +} +static C::Box box(const LP::BoundedIntegerModel& source) {return {source.lower,source.upper};} +static bool in_box(const Point& point,const C::Box& bounds) { + for(std::size_t j=0;jbounds.upper[j])return false; + return true; +} +static I activity(const C::SparseCut& cut,const Point& point) { + I value=0;for(std::size_t k=0;k enumerate(const LP::BoundedIntegerModel& source) { + const auto& m=source.linear;Point point(m.c.size());std::vector found; + const auto visit=[&](auto&& self,std::size_t column)->void { + if(column& points) { + std::size_t excluded_siblings=0; + const auto& inequality=cut.inequality(); + check(inequality.column.size()==inequality.coefficient.size(),"cut term dimensions"); + for(std::size_t i=0;iinequality.column[i-1],"cut is not canonical"); + check(inequality.coefficient[i]==-1 || inequality.coefficient[i]==1,"cover coefficients are not literal signs"); + } + for(const auto& point:points) { + const bool inside=cut.proof().scope.kind==C::ScopeKind::Global || in_box(point,cut.proof().scope.box); + check(cut.applies_to(source,{point,point})==inside,"cut scope differs from independent box containment"); + if(inside)check(activity(inequality,point)<=inequality.upper,"cover removed a feasible original integer assignment"); + else if(activity(inequality,point)>inequality.upper)++excluded_siblings; + } + const auto rechecked=C::verify_cover(source,cut.proof()); + check(rechecked.inequality().column==inequality.column && rechecked.inequality().coefficient==inequality.coefficient && + rechecked.inequality().upper==inequality.upper && rechecked.capacity()==cut.capacity() && + rechecked.cover_weight()==cut.cover_weight(),"stored cover proof does not reconstruct its cut"); + return excluded_siblings; +} +static std::string fingerprint(const C::SeparationResult& result) { + std::ostringstream text; + for(const auto& cut:result.cuts) { + text<(cut.proof().scope.kind)<<':'<::value,"unverified default cut must not exist"); + auto input=model({{-3,-3,0},{-5},{0,0,0}},{0,0,0},{1,1,1}); + C::SourceModel source(input),identical(input);auto shared=source; + auto cut=C::verify_cover(source,{0,{1,0},C::Scope::global()}); + check(cut.capacity()==5 && cut.cover_weight()==6 && cut.inequality().upper==1 && + cut.inequality().column==std::vector({0,1}),"strict cover or canonical ordering"); + check(cut.applies_to(shared,box(input)) && !cut.applies_to(identical,box(input)),"source identity was structural or lost on copy"); + input.linear.a[0]=-1;input.upper[0]=3; + check(source.model().linear.a[0]==-3 && source.model().upper[0]==1,"source snapshot changed after input mutation"); + auto moved=std::move(source); + check(cut.applies_to(moved,box(moved.model())) && !cut.applies_to(source,box(moved.model())),"source move identity"); + rejected([&]{(void)source.model();},"moved source accepted"); + assert_valid(cut,moved,enumerate(moved.model())); + auto row_copy=cut.inequality();row_copy.upper=100; + check(cut.inequality().upper==1,"mutable inequality copy modified the verified record"); + const auto retained=[] { + C::SourceModel temporary(model({{-3,-3},{-5},{0,0}},{0,0},{1,1})); + return C::verify_cover(temporary,{0,{0,1},{}}); + }(); + assert_valid(retained,retained.source(),enumerate(retained.source().model())); + for(const auto& claim:std::vector{ + {0,{0},{}},{0,{0,0},{}},{0,{0,2},{}},{0,{99},{}},{99,{},{}}, + {0,{0,1},{C::ScopeKind::Global,{{0,0,0},{1,1,0}}}}, + {0,{0,1},C::Scope::local({{0,0},{1,1}})}, + {0,{0,1},C::Scope::local({{-1,0,0},{1,1,1}})}, + {0,{0,1},C::Scope::local({{1,0,0},{0,1,1}})}, + {0,{0,1},{static_cast(-1),{}}}}) + rejected([&]{(void)C::verify_cover(moved,claim);},"forged or insufficient cover proof accepted"); + check(!cut.applies_to(moved,{{0},{1}}) && !cut.applies_to(moved,{{0,0,0},{2,1,1}}),"invalid application box accepted"); + + C::SourceModel signed_row(model({{3,-3,3},{1},{0,0,0}},{0,0,0},{1,1,1})); + auto signed_cut=C::verify_cover(signed_row,{0,{0,1},{}}); + check(signed_cut.inequality().coefficient==Point({-1,1}) && signed_cut.inequality().upper==0, + "signed-literal translation lost a complement constant"); + assert_valid(signed_cut,signed_row,enumerate(signed_row.model())); + for(I coefficient:{I(2),I(-2)}) { + const I fixed=coefficient>0?2:-2; + C::SourceModel fixed_row(model({{-3,-3,coefficient},{-1},{0,0,0}},{0,0,fixed},{1,1,fixed})); + const auto fixed_cut=C::verify_cover(fixed_row,{0,{0,1},{}}); + check(fixed_cut.capacity()==5 && fixed_cut.inequality().upper==1,"fixed signed integer contribution"); + assert_valid(fixed_cut,fixed_row,enumerate(fixed_row.model())); + rejected([&]{(void)C::verify_cover(fixed_row,{0,{0,2},{}});},"fixed variable accepted as free cover literal"); + } + C::SourceModel fixed_zero(model({{3,-3},{-1},{0,0}},{0,0},{0,1})); + auto zero_cut=C::verify_cover(fixed_zero,{0,{1},{}}); + check(zero_cut.capacity()==1 && zero_cut.inequality().upper==0,"fixed positive coefficient included twice"); + assert_valid(zero_cut,fixed_zero,enumerate(fixed_zero.model())); + C::SourceModel contradiction(model({{},{1},{}},{},{})); + auto impossible=C::verify_cover(contradiction,{0,{},{}}); + check(impossible.inequality().column.empty() && impossible.inequality().upper==-1,"empty cover contradiction"); + for(I rhs:{I(0),I(-1)}) { + C::SourceModel constant(model({{},{rhs},{}},{},{})); + rejected([&]{(void)C::verify_cover(constant,{0,{},{}});},"nonnegative capacity accepted an empty cover"); + } + auto corrupt=model({{-3,-3},{-5},{0,0}},{0,0},{1,1});corrupt.linear.column[1]=0; + rejected([&]{C::SourceModel invalid(corrupt);},"malformed sparse source accepted"); + corrupt=model({{-3},{-1},{0}},{0},{1});corrupt.linear.a[0]=std::numeric_limits::min(); + rejected([&]{C::SourceModel invalid(corrupt);},"unsupported source arithmetic accepted"); +} + +static void scope_and_pool() { + // In z=1, x+y<=1 is valid. In z=0, x=y=1 is feasible and violates it. + C::SourceModel source(model({{-2,-2,-2,0},{-4},{0,0,0,0}},{0,0,0,0},{1,1,1,1})); + auto parent=box(source.model());parent.lower[2]=1; + auto left=parent,right=parent;left.upper[3]=0;right.lower[3]=1; + const auto a=C::verify_cover(source,{0,{0,1},C::Scope::local(left)}); + const auto b=C::verify_cover(source,{0,{1,0},C::Scope::local(right)}); + const auto broad=C::verify_cover(source,{0,{0,1},C::Scope::local(parent)}); + check(assert_valid(a,source,enumerate(source.model()))>0,"local fixture cannot expose a sibling leak"); + auto sibling=box(source.model());sibling.upper[2]=0; + check(!a.applies_to(source,right) && !a.applies_to(source,sibling) && broad.applies_to(source,left),"local cut leaked a sibling"); + rejected([&]{(void)C::verify_cover(source,{0,{0,1},{}});},"local proof silently became global"); + C::CutPool pool(source); + check(pool.insert(a)==C::InsertStatus::Inserted && pool.insert(b)==C::InsertStatus::Inserted && + pool.records().size()==2,"incomparable scopes were merged"); + check(pool.applicable(parent).empty() && pool.applicable(left).size()==1 && pool.applicable(sibling).empty(), + "pool applied a union of unproved scopes"); + auto historical=pool.applicable(left); + check(pool.insert(broad)==C::InsertStatus::Replaced && pool.records().size()==1 && + pool.scope_values()==8 && pool.nonzeros()==2,"independently proved broader local scope did not replace narrower cuts"); + check(pool.insert(a)==C::InsertStatus::Duplicate && !historical[0].applies_to(source,right), + "duplicate insertion widened a historical record"); + C::SourceModel foreign(source.model()); + auto foreign_cut=C::verify_cover(foreign,{0,{0,1},C::Scope::local(parent)}); + check(pool.insert(foreign_cut)==C::InsertStatus::ForeignSource && pool.records().size()==1,"pool accepted a foreign model"); + for(const auto limits:std::vector{{0,100,100},{2,1,100},{2,100,7}}) { + C::CutPool limited(source,limits); + check(limited.insert(broad)==C::InsertStatus::Capacity && limited.records().empty() && + limited.nonzeros()==0 && limited.scope_values()==0,"capacity rejection partially mutated pool"); + } + C::SourceModel global_source(model({{-3,-3,0},{-5},{0,0,0}},{0,0,0},{1,1,1})); + auto local=box(global_source.model());local.upper[2]=0; + auto global=C::verify_cover(global_source,{0,{0,1},{}}); + C::CutPool replacement(global_source,{1,2,6}); + check(replacement.insert(C::verify_cover(global_source,{0,{0,1},C::Scope::local(local)}))==C::InsertStatus::Inserted, + "local initial record insertion"); + check(replacement.insert(global)==C::InsertStatus::Replaced && replacement.scope_values()==0, + "global proof replacement failed at pool capacity"); + check(replacement.insert(global)==C::InsertStatus::Duplicate,"global canonical duplicate"); +} + +static void separation_edges() { + C::SourceModel source(model({{-3,-3,0,-3,0,-3},{-5,-5},{0,0,0}},{0,0,0},{1,1,1})); + const C::FractionalPoint point{{3,3,3},4}; + // Each original packing row has activity 4.5<=5, but its cover has 1.5>1. + const auto complete=C::separate_covers(source,point); + check(complete.cuts.size()==2 && !complete.stats.work_limit,"fractional cover point was not separated"); + for(const auto& cut:complete.cuts) { + check(activity(cut.inequality(),point.numerator)>cut.inequality().upper*point.denominator, + "separator returned an unviolated cut"); + assert_valid(cut,source,enumerate(source.model())); + } + // Verification accepts a valid cut independently of whether this point violates it. + const auto valid=C::verify_cover(source,{0,{0,1},{}}); + check(C::separate_covers(source,{{0,0,0},1}).cuts.empty() && valid.inequality().upper==1, + "validity was confused with candidate-point violation"); + for(std::size_t budget=0;budget<300;++budget) { + C::SeparationOptions options;options.max_work=budget; + const auto a=C::separate_covers(source,point,{},options),b=C::separate_covers(source,point,{},options); + check(a.stats.work<=budget && fingerprint(a)==fingerprint(b),"separation work budget or deterministic prefix"); + for(const auto& cut:a.cuts)assert_valid(cut,source,enumerate(source.model())); + } + C::SeparationOptions options;options.max_rows=0; + check(C::separate_covers(source,point,{},options).stats.row_limit,"row limit ignored"); + options={};options.max_cuts=0; + check(C::separate_covers(source,point,{},options).stats.cut_limit,"zero cut limit ignored"); + options={};options.max_cuts=1; + const auto one=C::separate_covers(source,point,{},options); + check(one.cuts.size()==1 && one.stats.cut_limit,"output cut limit ignored"); + options={};options.max_terms_per_row=1; + const auto skipped=C::separate_covers(source,point,{},options); + check(skipped.cuts.empty() && skipped.stats.oversized_rows==2,"row-term storage cap ignored"); + options={};options.max_cuts_per_row=0; + check(C::separate_covers(source,point,{},options).cuts.empty(),"per-row zero cut limit ignored"); + options={};options.max_starts_per_row=0; + check(C::separate_covers(source,point,{},options).cuts.empty(),"zero greedy starts ignored"); + C::SourceModel general(model({{-3,-3,2},{-1},{0,0,0}},{0,0,-2},{1,1,2})); + rejected([&]{(void)C::verify_cover(general,{0,{0,1},{}});},"free general integer row treated as binary"); + const auto unsupported=C::separate_covers(general,{{1,1,0},2}); + check(unsupported.cuts.empty() && unsupported.stats.unsupported_rows==1,"unsupported row not reported"); + auto local=box(general.model());local.lower[2]=local.upper[2]=2; + const auto localized=C::separate_covers(general,{{3,3,8},4},C::Scope::local(local)); + check(!localized.cuts.empty(),"fixed general integer substitution did not permit binary separation"); + for(const auto& cut:localized.cuts)assert_valid(cut,general,enumerate(general.model())); + for(const auto& bad:std::vector{{{0,0,0},0},{{0,0},1},{{-1,0,0},1},{{2,0,0},1}}) + rejected([&]{(void)C::separate_covers(source,bad);},"invalid selection point accepted"); + const I maximum=std::numeric_limits::max(); + const auto overflow=C::separate_covers(source,{{maximum,maximum,maximum},maximum}); + check(overflow.cuts.empty() && overflow.stats.arithmetic_rejections>0,"overflowing rational separation was not rejected"); + C::SourceModel impossible(model({{},{1},{}},{},{})); + const auto empty=C::separate_covers(impossible,{{},1}); + check(empty.cuts.size()==1 && empty.cuts[0].inequality().upper==-1,"constant contradiction not separated"); + + // The source and query remain sparse; even coordinate validation obeys work. + const std::size_t n=16384; + LP::BoundedIntegerModel large; + large.linear.row_start={0,2};large.linear.column={0,n-1};large.linear.a={-3,-3};large.linear.b={-5}; + large.linear.c.resize(n);large.lower.resize(n);large.upper.assign(n,1); + C::SourceModel big(large);options={};options.max_work=100; + const auto bounded=C::separate_covers(big,{Point(n,1),2},{},options); + check(bounded.stats.work==100 && bounded.stats.work_limit && bounded.stats.rows==0 && bounded.cuts.empty(), + "large source coordinate scan ignored separator budget"); + auto global=C::verify_cover(big,{0,{0,n-1},{}}); + C::CutPool sparse_pool(big); + check(sparse_pool.insert(global)==C::InsertStatus::Inserted && sparse_pool.nonzeros()==2, + "sparse cut pool retained dense coefficients"); +} + +static void exhaustive_oracles() { + std::mt19937 random(975522); + std::size_t verified=0,rejected_proofs=0,separated=0,sibling_witnesses=0; + for(unsigned trial=0;trial<750;++trial) { + const auto n=1+random()%4,m=1+random()%3; + LP::LinearModel dense;dense.c.resize(n);dense.a.resize(n*m);dense.b.resize(m); + Point lo(n),hi(n); + for(std::size_t j=0;j(random()%5)-2;} + else {lo[j]=-2;hi[j]=2;} + } + for(auto& a:dense.a)a=random()%3?static_cast(random()%11)-5:0; + for(auto& b:dense.b)b=static_cast(random()%15)-7; + C::SourceModel source(model(dense,lo,hi));const auto feasible=enumerate(source.model()); + auto local=box(source.model()); + for(std::size_t j=0;j{{},C::Scope::local(local)}) { + for(std::size_t row=0;row2*cut.inequality().upper,"random cut was not exactly violated"); + } + } + } + check(verified>100 && rejected_proofs>100 && separated>100 && sibling_witnesses>0,"cover oracle coverage missing"); + std::cout<<"PASS 750 scoped integer models; "< +#include +#include +#include +#include +#include + +namespace LP=Gecode::Experimental::LpRelaxation; +using I=std::int64_t; +static void check(bool okay,const char* message) {if(!okay)throw std::runtime_error(message);} +static LP::BoundedIntegerModel model(LP::LinearModel dense,std::vector lo,std::vector hi) { + return {LP::sparse_model(dense),std::move(lo),std::move(hi)}; +} +static void invalid_models() { + const auto original=model({{1,1},{-1},{2,9}},{-3,-3},{3,3}); + for(unsigned bad=0;bad<10;++bad) { + auto m=original; + if(bad==0)m.lower.pop_back(); + if(bad==1)m.upper[0]=m.lower[0]-1; + if(bad==2)m.lower[0]=static_cast(Gecode::Int::Limits::min)-1; + if(bad==3)m.upper[0]=static_cast(Gecode::Int::Limits::max)+1; + if(bad==4)m.linear.column[1]=m.linear.column[0]; + if(bad==5)m.linear.a[0]=0; + if(bad==6)m.linear.b[0]=1000000001LL; + if(bad==7)m.linear.a[0]=1000000000LL; // Native row activity overflow. + if(bad==8)m.linear.c[0]=1000000000LL; // Native objective equality overflow. + if(bad==9)m.linear.row_start.back()=1; + bool validator=false,backend=false; + try {LP::validate_integer_model(m);}catch(const std::invalid_argument&){validator=true;} + try {LP::BoundedIntegerBackend unused(m);}catch(const std::invalid_argument&){backend=true;} + check(validator && backend,"unsafe integer model accepted"); + } + const I maximum=Gecode::Int::Limits::max; + LP::validate_integer_model(model({{1},{0},{0}},{-maximum},{maximum})); + LP::validate_integer_model(model({{},{},{1}},{-maximum/2},{maximum/2})); + auto excess=model({{},{},{1}},{0},{maximum/2+1});bool rejected=false; + try {LP::validate_integer_model(excess);}catch(const std::invalid_argument&){rejected=true;} + check(rejected,"objective equality envelope boundary not enforced"); +} +int main() { + try { + static_assert(!std::is_base_of::value, + "integer workspace must not enter strict binary API"); + invalid_models(); + LP::BoundedIntegerBackend triangle(model({{1,1,0,0,1,1,1,0,1},{3,3,3},{1,1,1}}, + {0,0,0},{3,3,3})); + const auto t=triangle.bound({0,0,0},{3,3,3},true); + check(t.valid && t.lower_bound==5 && std::abs(t.lp_objective-4.5)<1e-8 && t.certificate, + "fractional integer LP certificate ceiling"); + I reevaluated=0; + check(t.certificate->lower_bound_integer({-3,-3,-3},{3,3,3},reevaluated) && reevaluated==5, + "integer certificate not independently reusable on a looser signed box"); + + auto source=model({{1,1},{-1},{2,9}},{-3,-3},{3,3}); + LP::BoundedIntegerBackend sibling(source); + source.linear.a[0]=7;source.lower[0]=0;source.upper[1]=0; + check(sibling.model.linear.a[0]==1 && sibling.model.lower[0]==-3 && sibling.model.upper[1]==3, + "input mutation changed immutable integer model"); + auto a=sibling.bound({-3,2},{-3,2},true),b=sibling.bound({2,-3},{2,-3},true); + auto restored=sibling.bound({-3,-3},{3,3},true); + check(a.valid && a.lower_bound==12 && b.valid && b.lower_bound==-23 && + restored.valid && restored.lower_bound==-23,"signed sibling bounds were not fully restored"); + (void)sibling.bound({-3,-3},{-3,-3}); + restored=sibling.bound({-3,-3},{3,3}); + check(restored.valid && restored.lower_bound==-23 && sibling.statistics().infeasible_status>0, + "integer workspace did not recover after numerical infeasibility"); + check(!sibling.bound({-4,-3},{3,3}).valid && !sibling.bound({-3,-3},{3,4}).valid && + !sibling.bound({-3},{3}).valid && !sibling.bound({3,-3},{2,3}).valid, + "integer workspace accepted invalid/outside-original boxes"); + bool first_ok=true,second_ok=true; + std::thread first([&]{for(int i=0;i<40;++i){const auto r=sibling.bound({-3,2},{-3,2});first_ok&=r.valid && r.lower_bound==12;}}); + std::thread second([&]{for(int i=0;i<40;++i){const auto r=sibling.bound({2,-3},{2,-3});second_ok&=r.valid && r.lower_bound==-23;}}); + first.join();second.join();check(first_ok && second_ok,"serialized integer sibling calls changed bounds"); + + LP::BoundedIntegerBackend empty(model({{},{},{}},{},{})); + const auto e=empty.bound({},{});check(e.valid && e.lower_bound==0,"empty integer box"); + LP::BoundedIntegerBackend zero(model({{0,0},{1},{-3,4}},{-2,-3},{2,3})); + const auto z=zero.bound({-2,-3},{2,3},true); + check(z.valid && z.lower_bound==-18 && zero.statistics().lp_calls==0, + "zero matrix skipped original feasibility or attempted invalid HiGHS import"); + LP::Backend binary({{},{},{1}}); + check(!binary.bound({-1},{1}).valid && !binary.bound({0},{2}).valid,"legacy binary contract widened silently"); + std::cout<<"PASS integer backend: signed restored siblings, 80 serialized calls, exact ceiling, " + "original-domain gates, zero matrices and native activity boundaries\n"; + }catch(const std::exception& error){std::cerr< +#include +#include +#include +#include +#include + +namespace C=Gecode::Experimental::LpCertificate; +using I=std::int64_t; +using V=std::vector; +static void check(bool okay,const char* message) {if(!okay)throw std::runtime_error(message);} +struct Matrix { + std::vector start{0},column; + V value;std::size_t n=0; + C::SparseMatrixView view() const {return {start,column,value,n};} +}; +static Matrix sparse(const V& a,std::size_t m,std::size_t n) { + Matrix matrix;matrix.n=n; + for(std::size_t i=0;i0?-5:-upper}) && result.upper==V({cost>0?upper:5}), + "floor/ceil sign or exact-divisibility error"); + check(result.lower_bound==-10,"signed integer box bound"); + I legacy=443; + check(!certificate.lower_bound({-5},{5},legacy) && legacy==443,"legacy binary method widened silently"); + } + C::Certificate constant; + check(C::prepare({2},{3},{1},{0.5},constant),"zero-residual multiplier preparation"); + C::IntegerFilterResult empty; + check(constant.filter_integer({-3},{5},1,empty) && empty.infeasible && empty.lower_bound==2, + "constant cutoff infeasibility or integer ceiling"); + check(constant.filter_integer({-3},{5},2,empty) && !empty.infeasible, + "constant cutoff equality rejected"); + C::Certificate none; + check(C::prepare({}, {}, {}, {},none),"empty model preparation"); + check(none.filter_integer({}, {},-1,empty) && empty.infeasible,"zero-dimensional box cutoff"); + check(none.filter_integer({}, {},0,empty) && !empty.infeasible && empty.lower.empty(),"empty feasible model"); + C::IntegerFilterResult saved{991,{992},{993},true}; + empty=saved; + check(!constant.filter_integer({2},{1},0,empty) && empty.lower_bound==991 && empty.lower==V({992}) && + empty.upper==V({993}) && empty.infeasible,"empty interval failure changed output"); + I bound=444; + check(!constant.lower_bound_integer({}, {},bound) && bound==444,"integer bound dimension failure"); + const auto maximum=std::numeric_limits::max(),minimum=std::numeric_limits::min(); + check(C::integer_lower_bound({}, {},{1},{minimum},{minimum},{},bound) && bound==minimum,"minimum integer endpoint"); + check(C::integer_lower_bound({}, {},{1},{maximum},{maximum},{},bound) && bound==maximum,"maximum integer endpoint"); + bound=444; + check(!C::integer_lower_bound({}, {},{-1},{minimum},{minimum},{},bound) && bound==444, + "unrepresentable objective accepted"); + check(C::integer_lower_bound({}, {},{minimum},{1},{1},{},bound) && bound==minimum,"minimum integer coefficient"); + check(C::integer_lower_bound({}, {},{maximum},{1},{1},{},bound) && bound==maximum,"maximum integer coefficient"); + + C::Certificate large; + check(C::prepare({maximum},{0},{0},{1e8},large),"large residual preparation"); + bound=444; + check(!large.lower_bound_integer({0},{maximum},bound) && bound==444,"residual*endpoint overflow accepted"); + empty=saved; + check(!large.filter_integer({0},{maximum},0,empty) && empty.lower_bound==991 && empty.lower==V({992}), + "overflowing interval filter changed output"); + // Preparation and the integer box numerator fit; the conditional cutoff + // subtraction does not. Reject the whole cut rather than wrap or saturate. + const V huge={minimum,minimum,minimum,minimum+1}; + check(C::prepare(huge,huge,{0},std::vector(4,std::ldexp(1.0,42)),large), + "near-int128-limit affine preparation"); + check(large.lower_bound_integer({1},{2},bound) && bound==0,"cancelled large integer numerator"); + empty=saved; + check(!large.filter_integer({1},{2},maximum,empty) && empty.lower_bound==991 && empty.upper==V({993}), + "conditional subtraction overflow accepted or output changed"); +} +static void oracles() { + std::mt19937 random(139572); + unsigned feasible_models=0,cut_solutions=0,tightened=0; + for(unsigned trial=0;trial<3000;++trial) { + const std::size_t n=1+random()%4,m=random()%5; + V a(n*m),b(m),c(n),lower(n),upper(n),witness(n); + std::vector duals(m); + for(std::size_t j=0;j(random()%7)-4;upper[j]=lower[j]+random()%4; + witness[j]=lower[j]+random()%(upper[j]-lower[j]+1); + c[j]=static_cast(random()%11)-5; + } + for(std::size_t i=0;i(random()%11)-5; + activity+=a[i*n+j]*witness[j]; + } + b[i]=trial%2?static_cast(random()%21)-10:activity-static_cast(random()%5); + duals[i]=(static_cast(random()%41)-10)/7.0; + } + const auto matrix=sparse(a,m,n); + C::Certificate dense,csr; + check(C::prepare(a,b,c,duals,dense) && C::prepare(matrix.view(),b,c,duals,csr),"small integer preparation"); + I db=0,sb=0,direct=0; + check(dense.lower_bound_integer(lower,upper,db) && csr.lower_bound_integer(lower,upper,sb) && db==sb && + C::integer_lower_bound(matrix.view(),b,c,lower,upper,duals,direct) && direct==db,"integer dense/CSR equivalence"); + const I cutoff=static_cast(random()%41)-20; + C::IntegerFilterResult dcut,scut; + check(dense.filter_integer(lower,upper,cutoff,dcut) && csr.filter_integer(lower,upper,cutoff,scut),"small integer filtering"); + check(dcut.lower_bound==scut.lower_bound && dcut.lower==scut.lower && dcut.upper==scut.upper && + dcut.infeasible==scut.infeasible,"dense/CSR integer cuts disagree"); + bool feasible=false,within_cutoff=false; + V assignment(n); + const auto enumerate=[&](auto&& self,std::size_t j)->void { + if(jcutoff)return; + within_cutoff=true;++cut_solutions; + check(!scut.infeasible,"integer cut falsely proved infeasibility"); + for(std::size_t k=0;k=lower[j] && scut.upper[j]<=upper[j] && scut.lower[j]<=scut.upper[j],"cuts loosened/inverted box"); + tightened+=scut.lower[j]!=lower[j] || scut.upper[j]!=upper[j]; + } + // The same certificate also evaluates a looser, signed sibling box. + for(std::size_t j=0;j=1500 && cut_solutions>0 && tightened>0,"integer oracle did not exercise valid cuts"); + std::cout<<"PASS 3000 integer box/cut dense-CSR oracles; "<= rhs for rhs, row in rows)] + + def serialize(costs, domains, rows, witness, integer): + text = [f"{len(costs)} {len(rows)}", " ".join(map(str, costs))] + if integer: + text.append("bounds " + " ".join(f"{lo} {hi}" for lo, hi in domains)) + for rhs, row in rows: + terms = [(j, a) for j, a in enumerate(row) if a] + text.append(f"{rhs} {len(terms)} " + " ".join(f"{j} {a}" for j, a in terms)) + text.append("incumbent 0" if witness is None else "incumbent 1 " + " ".join(map(str, witness))) + return "\n".join(text) + "\n" + + runs = 0 + with tempfile.TemporaryDirectory(prefix="gecode-integer-lp-") as directory: + path = Path(directory) / "model.txt" + for index, (costs, domains, rows) in enumerate(cases): + witnesses = feasible(costs, domains, rows) + optimum = min((cost for cost, _ in witnesses), default=None) + # Deliberately use a feasible but usually suboptimal warm start. + start = max(witnesses)[1] if witnesses else None + path.write_text(serialize(costs, domains, rows, start, True)) + for executable, modes in [(native, ["none"]), (lp, ["none", "root", "node", "root-tight", "node-tight"])]: + for mode, branch, warm in itertools.product(modes, ["size", "afc"], ["0", "1"]): + result = subprocess.run([str(executable), str(path), mode, branch, "10000", warm, "1", "--integer"], + capture_output=True, text=True, timeout=20, check=True) + record = json.loads(result.stdout) + assert record["status"] == ("infeasible" if optimum is None else "optimal"), (index, mode, record) + assert record["objective"] == optimum and not record["stopped"], (index, mode, record) + assert record["matrix_storage"] == "csr" and record["variable_domain"] == "bounded-integer" + if optimum is not None: + assert (record["objective"], tuple(record["assignment"])) in witnesses + runs += 1 + + # The existing binary default and opt-in CSR inputs still have identical semantics. + costs, domains, rows = [1, 1, 1], [(0, 1)] * 3, [(1, [1, 1, 0]), (1, [0, 1, 1]), (1, [1, 0, 1])] + path.write_text(serialize(costs, domains, rows, (1, 1, 1), False)) + for executable, modes in [(native, ["none"]), (lp, ["none", "root", "node"])]: + for mode, flag in itertools.product(modes, [[], ["--sparse"]]): + record = json.loads(subprocess.run([str(executable), str(path), mode, "size", "10000", "1", "1"] + flag, + capture_output=True, text=True, timeout=20, check=True).stdout) + assert record["status"] == "optimal" and record["objective"] == 2 + assert record["variable_domain"] == "binary" + runs += 1 + + # Never silently interpret unsupported fractional/infinite/malformed input. + good = serialize([1], [(-2, 2)], [], None, True) + invalid = [good.replace("bounds -2 2", "bounds -2 2.5"), + good.replace("bounds -2 2", "bounds -2 inf"), + good.replace("bounds -2 2", "bounds 3 2"), + good.replace("bounds -2 2", "bounds -2 2147483648"), + good.replace("\n1\nbounds", "\n1000000000\nbounds"), + good.replace("incumbent 0", "incumbent 1 3"), + good.replace("incumbent 0", "incumbent 1 1.5"), + good + "ignored mathematical content\n"] + for bad in invalid: + path.write_text(bad) + result = subprocess.run([str(lp), str(path), "node", "size", "10000", "0", "1", "--integer"], + capture_output=True, text=True, timeout=20) + assert result.returncode != 0 and not result.stdout, (bad, result.stdout, result.stderr) + print(f"PASS {runs} integer/native/LP and binary compatibility CLI oracle checks; {len(invalid)} invalid input rejections (timings ignored)") + + +if __name__ == "__main__": + main() diff --git a/experiments/lp-relaxation/tests/integer-propagator.cpp b/experiments/lp-relaxation/tests/integer-propagator.cpp new file mode 100644 index 0000000000..2c89a012d1 --- /dev/null +++ b/experiments/lp-relaxation/tests/integer-propagator.cpp @@ -0,0 +1,197 @@ +// Complete original integer solution sets and optima against independent enumeration. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace LP=Gecode::Experimental::LpRelaxation; +using I=std::int64_t; +using Assignment=std::vector; +static void check(bool okay,const char* message) {if(!okay)throw std::runtime_error(message);} +struct Instance { + LP::BoundedIntegerModel model; + std::vector domains; +}; +enum class Mode {Native,Root,Node,RootTight,NodeTight,Throttled}; +static I value(const LP::BoundedIntegerModel& model,const Assignment& x) { + I result=0;for(std::size_t j=0;j enumerate(const Instance& instance) { + const auto& m=instance.model.linear;Assignment current(m.c.size());std::set result; + const auto visit=[&](auto&& self,std::size_t j)->void { + if(jinstance.model.upper[k])return; + for(std::size_t i=0;i& backend, + unsigned interval=4) + : x(*this,static_cast(instance.model.linear.c.size())),z(*this,Gecode::Int::Limits::min,Gecode::Int::Limits::max) { + for(int j=0;j(domain.size()))); + } + if(mode==Mode::Native) LP::post_native_integer(*this,x,z,instance.model); + else { + LP::IntegerOptions options; + options.frequency=mode==Mode::Root || mode==Mode::RootTight ? LP::Frequency::Root : LP::Frequency::EveryNode; + options.bound_tightening=mode==Mode::RootTight || mode==Mode::NodeTight || mode==Mode::Throttled; + options.bound_change_interval=mode==Mode::Throttled?interval:1; + LP::integer_linear_minimize(*this,x,z,backend,options); + } + Gecode::branch(*this,x,Gecode::INT_VAR_SIZE_MIN(),Gecode::INT_VAL_MIN()); + } + Problem(Problem& other):Gecode::Space(other){x.update(*this,other.x);z.update(*this,other.z);} + Gecode::Space* copy() override{return new Problem(*this);} + void constrain(const Gecode::Space& best) override { + Gecode::rel(*this,z,Gecode::IRT_LE,static_cast(best).z.val()); + } + Assignment assignment() const { + Assignment result;for(int j=0;j& backend, + unsigned distance,const std::set& expected) { + Gecode::Search::Options options;options.threads=1;options.c_d=distance;options.a_d=3; + { + auto root=std::make_unique(instance,mode,backend); + Gecode::DFS search(root.get(),options);root.reset();std::set actual; + while(std::unique_ptr found{search.next()}) { + auto assignment=found->assignment(); + check(expected.count(assignment)==1 && actual.insert(assignment).second,"integer DFS infeasible/duplicate witness"); + check(found->z.assigned() && found->z.val()==value(instance.model,assignment),"integer DFS objective mismatch"); + } + check(!search.stopped() && actual==expected,"integer propagation changed complete solution set"); + } + check(backend.use_count()==1,"integer DFS backend leak"); + { + auto root=std::make_unique(instance,mode,backend); + Gecode::BAB search(root.get(),options);root.reset();I best=std::numeric_limits::max(); + while(std::unique_ptr found{search.next()}) { + const auto assignment=found->assignment();const I cost=value(instance.model,assignment); + check(expected.count(assignment)==1 && costz.val()==cost,"integer BAB witness/objective mismatch"); + best=cost; + } + I optimum=std::numeric_limits::max();for(const auto& assignment:expected)optimum=std::min(optimum,value(instance.model,assignment)); + check(!search.stopped() && best==optimum,"integer BAB optimum mismatch"); + } + check(backend.use_count()==1,"integer BAB backend leak"); +} +static Instance instance(LP::LinearModel dense,std::vector lower,std::vector upper) { + Instance result{{LP::sparse_model(dense),std::move(lower),std::move(upper)},{}}; + for(std::size_t j=0;j(v)); + result.domains.push_back(std::move(domain)); + } + return result; +} +static std::vector cases() { + std::vector result; + result.push_back(instance({{1,1,0,0,1,1,1,0,1},{3,3,3},{1,1,1}},{0,0,0},{3,3,3})); + result.push_back(instance({{-1,-1,0,0,-1,-1,-1,0,-1},{1,1,1},{-1,-1,-1}},{-3,-3,-3},{1,1,1})); + result.push_back(instance({{1,-1,2,-2},{0,1},{-2,3}},{-2,-2},{2,2})); + result.push_back(instance({{0,0},{1},{-1,2}},{-2,1},{2,3})); + result.push_back(instance({{},{},{-3,2}},{-2,-2},{2,3})); + result.push_back(instance({{},{},{}},{},{})); + result.push_back(instance({{1,-1},{0},{-1,2}},{-2,-3},{-2,-3})); + auto holes=instance({{1,-1},{0},{-3,2}},{-3,-3},{3,3});holes.domains={{-3,0,3},{-2,2}};result.push_back(holes); + result.push_back(instance({{1000000000,-1000000000},{1000000000},{0,0}},{-1,-1},{1,1})); + const I maximum=Gecode::Int::Limits::max; + result.push_back({{LP::sparse_model({{-1},{1000000000},{0}}),{-maximum},{maximum}}, + {{static_cast(-maximum),0,static_cast(maximum)}}}); + result.push_back({{LP::sparse_model({{},{},{1}}),{-maximum/2},{maximum/2}}, + {{static_cast(-maximum/2),0,static_cast(maximum/2)}}}); + auto intersected=instance({{1,1},{0},{-1,2}},{-2,-1},{2,3}); + intersected.domains={{-4,-1,0,1,4},{-2,0,2,5}};result.push_back(intersected); + auto empty_intersection=instance({{},{},{1}},{0},{1}); + empty_intersection.domains={{-2,-1}};result.push_back(empty_intersection); + std::mt19937 random(113955); + while(result.size()<80) { + const auto n=1+random()%4,m=random()%5; + LP::LinearModel dense;dense.a.resize(n*m);dense.b.resize(m);dense.c.resize(n); + std::vector lo(n),hi(n),witness(n); + for(std::size_t j=0;j(random()%5)-3;hi[j]=lo[j]+random()%4; + witness[j]=lo[j]+random()%(hi[j]-lo[j]+1);dense.c[j]=static_cast(random()%9)-4; + } + for(std::size_t i=0;i(random()%9)-4;activity+=dense.a[i*n+j]*witness[j];} + dense.b[i]=result.size()%2?static_cast(random()%15)-7:activity-static_cast(random()%4); + } + auto model=instance(dense,lo,hi); + for(auto& domain:model.domains) if(domain.size()>2 && random()%3==0)domain.erase(domain.begin()+1); + result.push_back(std::move(model)); + } + return result; +} +static std::uint64_t policies() { + // The three covering rows jointly imply a fractional cost of 4.5. + // Native row-by-row propagation cannot derive the fourth variable's cut. + const auto cutting=instance({{1,1,0,0,0,1,1,0,1,0,1,0},{3,3,3},{1,1,1,2}}, + {0,0,0,-1},{3,3,3,3}); + auto cut_backend=std::make_shared(cutting.model); + auto cut=std::make_unique(cutting,Mode::RootTight,cut_backend); + Gecode::rel(*cut,cut->z,Gecode::IRT_LQ,6); + check(cut->status()==Gecode::SS_BRANCH && cut->x[3].min()==-1 && cut->x[3].max()==0, + "integer certificate failed a strict nonbinary interval cut"); + check(cut_backend->statistics().variable_bound_tightenings>0,"integer interval tightening not recorded"); + { + auto expected=enumerate(cutting); + for(auto it=expected.begin();it!=expected.end();) + if(value(cutting.model,*it)>6)it=expected.erase(it);else ++it; + Gecode::DFS search(cut.get());cut.reset();std::set actual; + while(std::unique_ptr found{search.next()})actual.insert(found->assignment()); + check(!search.stopped() && actual==expected,"integer interval cut removed a cutoff-feasible assignment"); + } + check(cut_backend.use_count()==1,"integer cutting policy lifecycle"); + const auto plain=instance({{},{},{1,2,3}},{-4,-4,-4},{4,4,4}); + for(unsigned interval:{1U,2U}) { + auto backend=std::make_shared(plain.model); + auto root=std::make_unique(plain,Mode::Throttled,backend,interval); + check(root->status()==Gecode::SS_BRANCH && backend->statistics().valid_bounds==1,"integer root scheduling"); + Gecode::rel(*root,root->x[0],Gecode::IRT_GQ,-2); + check(root->status()==Gecode::SS_BRANCH && !root->x[0].assigned(),"nonassignment bound change"); + check(backend->statistics().valid_bounds==(interval==1?2U:1U),"integer scheduling counted assignments instead of bounds"); + Gecode::rel(*root,root->x[1],Gecode::IRT_GQ,-2); + check(root->status()==Gecode::SS_BRANCH && backend->statistics().valid_bounds==(interval==1?3U:2U),"integer bound interval throttling"); + const auto calls=backend->statistics().valid_bounds; + Gecode::rel(*root,root->z,Gecode::IRT_LQ,23); + check(root->status()==Gecode::SS_BRANCH && backend->statistics().valid_bounds==calls,"objective-only change reoptimized LP"); + auto clone=std::unique_ptr(static_cast(root->clone())); + check(clone->status()==Gecode::SS_BRANCH,"integer cloned bound policy"); + clone.reset();root.reset();check(backend.use_count()==1,"integer policy lifecycle"); + } + return cut_backend->statistics().variable_bound_tightenings; +} +int main() { + try { + static_assert(!std::is_base_of::value,"integer backend must not enter binary API by upcast"); + const auto models=cases();unsigned runs=0,feasible=0;std::uint64_t bounds=0,tightened=0; + for(const auto& model:models) { + const auto expected=enumerate(model);feasible+=!expected.empty(); + auto backend=std::make_shared(model.model); + std::weak_ptr weak=backend; + for(auto mode:{Mode::Native,Mode::Root,Mode::Node,Mode::RootTight,Mode::NodeTight,Mode::Throttled}) + for(unsigned distance:{1U,8U}){searches(model,mode,backend,distance,expected);runs+=2;} + bounds+=backend->statistics().valid_bounds;tightened+=backend->statistics().variable_bound_tightenings; + backend.reset();check(weak.expired(),"integer backend outlived searches"); + } + tightened+=policies();check(feasible>0 && feasible0 && tightened>0,"integer integration coverage missing"); + std::cout<<"PASS "<& backend) + const std::shared_ptr& backend) : x(*this,static_cast(instance.model.c.size()),0,1), z(*this,objective_endpoint(instance.model,false), objective_endpoint(instance.model,true)) { for (int j=0; j(instance.lower[j]), static_cast(instance.upper[j])); - if (mode==Mode::Native) - LP::post_native(*this,x,z,instance.model); - else - LP::binary_linear_minimize(*this,x,z,backend, - mode==Mode::Root ? LP::Frequency::Root : LP::Frequency::EveryNode); + if (mode==Mode::Native) { + if (instance.sparse) LP::post_native(*this,x,z,backend->model); + else LP::post_native(*this,x,z,instance.model); + } else { + LP::Options policy; + policy.frequency=(mode==Mode::Root || mode==Mode::RootFix) + ? LP::Frequency::Root : LP::Frequency::EveryNode; + policy.reduced_cost_fixing=mode==Mode::RootFix || mode==Mode::EveryFix || mode==Mode::ThrottledFix; + policy.assignment_interval=mode==Mode::ThrottledFix ? 4 : 1; + LP::binary_linear_minimize(*this,x,z,backend,policy); + } Gecode::branch(*this,x,Gecode::INT_VAR_NONE(),Gecode::INT_VAL_MIN()); } Problem(Problem& other) : Gecode::Space(other) { @@ -108,7 +115,7 @@ class Problem : public Gecode::Space { }; static void check_dfs(const Instance& instance, Mode mode, - const std::shared_ptr& backend, + const std::shared_ptr& backend, const Gecode::Search::Options& options, const std::set& expected) { { @@ -132,7 +139,7 @@ static void check_dfs(const Instance& instance, Mode mode, } static void check_bab(const Instance& instance, Mode mode, - const std::shared_ptr& backend, + const std::shared_ptr& backend, const Gecode::Search::Options& options, const std::set& expected) { I optimum=std::numeric_limits::max(); @@ -216,8 +223,8 @@ static std::vector instances(void) { static void check_lifecycle_and_root_bounds(const std::vector& cases) { for (std::size_t id : {std::size_t(0),std::size_t(1)}) { - auto backend=std::make_shared(cases[id].model); - std::weak_ptr weak=backend; + std::shared_ptr backend=std::make_shared(cases[id].model); + std::weak_ptr weak=backend; const int expected=id==0 ? 2 : -1; for (Mode mode : {Mode::Root,Mode::EveryNode}) { { @@ -259,15 +266,19 @@ int main(void) { check_lifecycle_and_root_bounds(cases); unsigned int runs=0, feasible=0, infeasible=0; std::uint64_t lp_calls=0, certified=0; - for (const Instance& instance : cases) { + for (const Instance& original : cases) for (bool sparse : {false,true}) { + Instance instance=original; instance.sparse=sparse; const auto expected=enumerate(instance); if (expected.empty()) ++infeasible; else ++feasible; - auto backend=std::make_shared(instance.model); - std::weak_ptr weak=backend; + std::shared_ptr backend; + if (sparse) backend=std::make_shared(LP::sparse_model(instance.model)); + else backend=std::make_shared(instance.model); + std::weak_ptr weak=backend; // Reuse one backend across independent searches, after traversing // siblings with opposite bound fixings and different recomputation. for (unsigned int distance : {1U,8U,32U}) - for (Mode mode : {Mode::Native,Mode::Root,Mode::EveryNode}) { + for (Mode mode : {Mode::Native,Mode::Root,Mode::EveryNode, + Mode::RootFix,Mode::EveryFix,Mode::ThrottledFix}) { Gecode::Search::Options options; options.threads=1; options.c_d=distance; @@ -283,9 +294,9 @@ int main(void) { } require(feasible>0 && infeasible>0,"both feasibility outcomes must be tested"); require(lp_calls>0 && certified>0,"LP integration was not exercised"); - std::cout << "PASS " << cases.size() << " models (" << feasible - << " feasible, " << infeasible << " infeasible), " << runs - << " exhaustive native/Root/EveryNode DFS/BAB configurations; " + std::cout << "PASS " << cases.size() << " models in two storage forms (" << feasible + << " feasible representations, " << infeasible << " infeasible representations), " << runs + << " exhaustive dense/sparse native/bounds/fixing/throttled DFS/BAB configurations; " << lp_calls << " LP calls, " << certified << " certified bounds; backend lifecycle and root tightening\n"; return EXIT_SUCCESS; diff --git a/experiments/lp-relaxation/tests/sparse-certificate.cpp b/experiments/lp-relaxation/tests/sparse-certificate.cpp new file mode 100644 index 0000000000..9ec7b4ceb3 --- /dev/null +++ b/experiments/lp-relaxation/tests/sparse-certificate.cpp @@ -0,0 +1,165 @@ +// Sparse certificate trust boundary, dense equivalence and deterministic work. +// Standalone C++17; no native solver or numerical backend dependency. +#include +#include +#include +#include +#include +#include +#include + +namespace C = Gecode::Experimental::LpCertificate; +using I = std::int64_t; +using V = std::vector; +static void check(bool condition,const char* message) { + if (!condition) throw std::runtime_error(message); +} +struct Matrix { + std::vector start{0},column; + V value; + std::size_t n=0; + C::SparseMatrixView view() const { return {start,column,value,n}; } +}; +static Matrix sparse(const V& a,std::size_t m,std::size_t n) { + Matrix result; result.n=n; + for (std::size_t i=0;i bad={ + {{},{0,1},{1,2},2}, // Missing row offsets. + {{1,2},{0,1},{1,2},2}, + {{0,1},{0,1},{1,2},2}, // Wrong terminal offset. + {{0,3},{0,1},{1,2},2}, + {{0,2},{0},{1,2},2}, + {{0,2},{0,2},{1,2},2}, // Out of range. + {{0,2},{0,0},{1,2},2}, // Duplicate column. + {{0,2},{1,0},{1,2},2}, // Unsorted column. + {{0,2},{0,1},{1,0},2}, // Explicit zero. + {{0,2},{0,1},{1,2},3}, // Mismatched width. + }; + for (const auto& matrix:bad) { + C::PreparationStats work{73,74,75}; + check(!C::prepare(matrix.view(),{1},{1,2},{1},kept,&work),"malformed CSR accepted"); + check(work.rows_visited==73 && work.nonzero_products==74 && work.residuals_initialized==75, + "failed preparation changed work output"); + I bound=0; + check(kept.lower_bound({0,0},{1,1},bound) && bound==1,"failed preparation replaced certificate"); + bound=991; + check(!C::lower_bound(matrix.view(),{1},{1,2},{0,0},{1,1},{1},bound) && bound==991, + "failed sparse bound changed output"); + } + Matrix decreasing{{0,2,1,2},{0,1},{1,1},2}; + check(!C::valid_sparse(decreasing.view(),3,2),"decreasing row offsets accepted"); + check(!C::valid_sparse(unit.view(),std::numeric_limits::max(),2), + "row count overflow accepted"); + for (double dual:{std::numeric_limits::infinity(), + std::numeric_limits::quiet_NaN(),std::ldexp(1.0,43)}) { + check(!C::prepare(unit.view(),{1},{1,2},{dual},kept),"corrupt dual accepted"); + } + Matrix overflow{{0,1,2,3,4,5},{0,0,0,0,0},V(5,std::numeric_limits::max()),1}; + check(!C::prepare(overflow.view(),V(5,0),{0},std::vector(5,std::ldexp(1.0,42)),kept), + "sparse residual overflow accepted"); + check(!C::prepare(overflow.view(),V(5,std::numeric_limits::max()),{0}, + std::vector(5,std::ldexp(1.0,42)),kept),"sparse constant overflow accepted"); +} +static void equivalence() { + std::mt19937 random(357187); + for (unsigned trial=0;trial<3000;++trial) { + const std::size_t n=random()%8,m=random()%9; + V a(m*n),b(m),c(n),lower(n),upper(n); + std::vector dual(m); + for (auto& coefficient:a) coefficient=random()%4 ? 0 : static_cast(random()%15)-7; + for (auto& rhs:b) rhs=static_cast(random()%15)-7; + for (auto& cost:c) cost=static_cast(random()%21)-10; + for (auto& q:dual) q=(static_cast(random()%83)-20)/11.0; + for (std::size_t j=0;j(random()%31)-15; + I db=0,sb=0; + std::vector df,sf; + check(dense.filter(lower,upper,upper_objective,db,df) && + csr.filter(lower,upper,upper_objective,sb,sf) && db==sb && df==sf, + "dense/sparse bound or filtering disagreement"); + I direct=992; + check(C::lower_bound(matrix.view(),b,c,lower,upper,dual,direct) && direct==db, + "sparse direct/prepared bound disagreement"); + // Independent enumeration: every feasible assignment obeys the bound, + // and every feasible assignment within the cutoff survives filtering. + for (unsigned mask=0;mask<(1U<>j)&1U; + if (xupper[j]) feasible=false; + cost+=c[j]*x; + } + for (std::size_t i=0;i>j)&1U); + if (activity>j)&1U))),"sparse filtering removed feasible assignment"); + } + // The same immutable affine certificate may be applied to a looser sibling. + lower.assign(n,0); upper.assign(n,1); + check(dense.lower_bound(lower,upper,db) && csr.lower_bound(lower,upper,sb) && db==sb, + "sparse sibling box disagreement"); + } +} +static void scaling() { + std::size_t previous_bytes=0; + for (std::size_t n:{std::size_t(32768),std::size_t(65536)}) { + Matrix matrix; matrix.n=n; + matrix.start.reserve(n+1); matrix.column.reserve(n); matrix.value.reserve(n); + for (std::size_t i=0;i(n,1),certificate,&work), + "large sparse certificate failed"); + check(work.rows_visited==n && work.nonzero_products==n && work.residuals_initialized==n, + "large sparse preparation performed more than linear arithmetic"); + I bound=0; + check(certificate.lower_bound(V(n,0),V(n,1),bound) && bound==static_cast(n), + "large sparse certificate bound"); + } +} +int main() { + try { + if (!C::supported) { + Matrix matrix; I bound=123; + check(!C::lower_bound(matrix.view(),{},{},{},{},{},bound) && bound==123, + "unsupported arithmetic produced a bound"); + std::cout << "PASS sparse unsupported-arithmetic fallback\n"; return 0; + } + corruption(); equivalence(); scaling(); + std::cout << "PASS sparse CSR corruption/overflow, 3000 dense/sparse oracle/filter cases, " + "32768/65536 diagonal storage and operation scaling\n"; + } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; } +} diff --git a/experiments/lp-relaxation/tests/sparse-storage.cpp b/experiments/lp-relaxation/tests/sparse-storage.cpp new file mode 100644 index 0000000000..d9d04b585e --- /dev/null +++ b/experiments/lp-relaxation/tests/sparse-storage.cpp @@ -0,0 +1,118 @@ +// Structural memory regression: dense materialization cannot fit this allocation +// guard. No timing threshold, RSS comparison or performance claim is involved. +#include +#include +#include +#include +#include +#include +#include + +static std::atomic allocation_limit{std::numeric_limits::max()}; +static std::atomic largest_allocation{0}; +void* operator new(std::size_t size) { + if (size>allocation_limit.load()) throw std::bad_alloc(); + auto previous=largest_allocation.load(); + while (previous&,LP::Frequency); + LegacyPost post=&LP::binary_linear_minimize; + (void) post; + struct Derived : LP::Backend { using LP::Backend::Backend; }; + const std::shared_ptr derived; + LP::binary_linear_minimize(home,x,cost,derived); +} + +class Problem : public Gecode::Space { +public: + Gecode::IntVarArray x; + Gecode::IntVar cost; + Problem(const std::shared_ptr& backend) + : x(*this,static_cast(backend->model.c.size()),0,1),cost(*this,0,x.size()) { + LP::binary_linear_minimize(*this,x,cost,backend); + } + Problem(Problem& other) : Gecode::Space(other) { + x.update(*this,other.x); cost.update(*this,other.cost); + } + Gecode::Space* copy() override { return new Problem(*this); } +}; +class IntegerProblem : public Gecode::Space { +public: + Gecode::IntVarArray x; + Gecode::IntVar cost; + IntegerProblem(const std::shared_ptr& backend) + : x(*this,static_cast(backend->model.linear.c.size()),-1,1),cost(*this,-x.size(),x.size()) { + LP::integer_linear_minimize(*this,x,cost,backend); + } + IntegerProblem(IntegerProblem& other):Gecode::Space(other) { + x.update(*this,other.x);cost.update(*this,other.cost); + } + Gecode::Space* copy() override {return new IntegerProblem(*this);} +}; +int main() { + try { + const std::size_t n=16384; + // A dense int64 array is 2 GiB. All stages must work with allocations + // below 16 MiB, including CSR backend import and native actor posting. + allocation_limit.store(16*1024*1024); + LP::SparseLinearModel model; + model.row_start.reserve(n+1); model.column.reserve(n); model.a.reserve(n); + model.b.assign(n,1); model.c.assign(n,1); + for (std::size_t i=0;i(std::move(model)); + check(backend->model.nonzeros()==n,"CSR payload is not sparse"); + { + Problem problem(backend); + check(problem.status()!=Gecode::SS_FAILED,"large sparse posting failed"); + check(problem.cost.assigned() && problem.cost.val()==static_cast(n), + "native original sparse rows/objective not enforced"); + for (int j=0;jbound(std::vector(n,1), + std::vector(n,1),true); + check(bound.valid && bound.lower_bound==static_cast(n), + "large sparse backend certificate failed"); + auto integer_backend=std::make_shared(LP::BoundedIntegerModel{ + backend->model,std::vector(n,-1),std::vector(n,1)}); + { + IntegerProblem problem(integer_backend); + check(problem.status()!=Gecode::SS_FAILED && problem.cost.assigned() && + problem.cost.val()==static_cast(n),"large sparse integer native posting"); + for(int j=0;jbound(std::vector(n,1), + std::vector(n,1),true); + check(integer_bound.valid && integer_bound.lower_bound==static_cast(n), + "large sparse integer backend certificate failed"); + const auto largest=largest_allocation.load(); + allocation_limit.store(std::numeric_limits::max()); + std::cout << "PASS binary and integer 16384x16384 CSR backend/import/native-posting/certificate with " + "16 MiB single-allocation guard; largest request " << largest << " bytes\n"; + } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; } +} diff --git a/experiments/optimize/benchmark_boundaries.py b/experiments/optimize/benchmark_boundaries.py new file mode 100644 index 0000000000..ddacd7a20c --- /dev/null +++ b/experiments/optimize/benchmark_boundaries.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +"""Adaptive paired size search; ten seconds per solve, no builds or oracle jobs. + +Freeze this source/generator before invocation. Inputs are deterministic and saved +before their first solve. Binary search is a sampling heuristic, not a proof of +monotonic difficulty. Each cohort is bracketed independently; shared timing points are filled only +within the smaller confirmed range. Larger unmeasured outcomes remain unknown. +Boundary candidates and neighboring sizes receive two paired repetitions; failed +confirmations are retained. Reported exact optima have independently checked +original witnesses, but no independent optimum oracle is claimed for this study. +""" +import argparse +from datetime import datetime, timezone +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import subprocess +import sys +import time + +sys.dont_write_bytecode = True +ROOT = Path(__file__).resolve().parents[2] +HERE = Path(__file__).resolve().parent +LIMITS = {'knapsack': (8, 32, 512), 'assignment': (3, 16, 32), + 'facility_location': (2, 8, 16), 'bin_packing': (4, 16, 32), + 'production': (3, 6, 48), 'native_tsp': (4, 16, 96), + 'weighted_queens': (4, 12, 32)} +SECONDS, WALL_SECONDS, WHOLE_SECONDS, MAX_ATTEMPTS, MAX_SIZES = 10, 11, 2400, 480, 32 +COHORTS = ('before', 'after') +DRIVER_HASH = 'fa2a8b1f7afcc93589d941dd9e92383bf79a9f11a3bdf73b8213cae11f3c49a4' + + +def require(test, message): + if not test: + raise ValueError(message) + + +def module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + result = importlib.util.module_from_spec(spec) + spec.loader.exec_module(result) + return result + + +common = module('boundary_common', HERE/'benchmark_native_algorithms.py') +generator = module('boundary_instances', HERE/'boundary_instances.py') +capture = module('boundary_capture', HERE/'benchmark_progress.py').capture_command +sha = common.sha + + +def validate(raw, model): + """Check protocol/primal/auxiliaries; trust and label backend proof explicitly.""" + n, kind = model['n'], model['kind'] + require(type(raw.get('schema_version')) is int and raw['schema_version'] == 1 and raw.get('kind') == kind and + raw.get('route') == 'native' and raw.get('backend') == 'Gecode native' and + raw.get('guarantee') == 'exact' and raw.get('start_submitted') is False, + 'Driver protocol mismatch') + require(isinstance(raw.get('backend_version'), str) and raw['backend_version'] and + type(raw.get('model_id')) is int and raw['model_id'] > 0 and + type(raw.get('revision')) is int and raw['revision'] >= 0, 'Invalid model identity') + for key in ('solve_seconds', 'build_seconds', 'driver_seconds'): + require(common.finite(raw.get(key)) and raw[key] >= 0, 'Invalid elapsed time') + require(raw['build_seconds'] + raw['solve_seconds'] <= raw['driver_seconds'] + 1e-6, + 'Inconsistent elapsed time') + for key in ('objective', 'best_bound', 'absolute_gap', 'relative_gap'): + require(raw.get(key) is None or common.finite(raw[key]), 'Nonfinite scalar') + expected = (n, len(model['rows']), 0) if kind == 'binary' else ( + n*(2 if kind == 'native_tsp' else 4), 0 if kind == 'native_tsp' else 2*n, + n+(1 if kind == 'native_tsp' else 3)) + require(tuple(raw.get(k) for k in ('model_columns', 'model_rows', 'model_globals')) == expected, + 'Compiled model dimensions differ') + require(all(raw.get(k) is None for k in ('nodes', 'expanded_nodes', 'budget_nodes', + 'peak_open_nodes', 'unresolved_regions')), 'Unexpected ordinary-search counters') + require(raw.get('status') in ('optimal', 'time_limit'), 'Unexpected solver status') + point = raw.get('has_solution') + require(type(point) is bool and raw.get('solution_validated') is point, 'Presence mismatch') + values, full = raw.get('assignment'), raw.get('full_values') + require(type(values) is list and type(full) is list, 'Missing values') + if point: + require(len(values) == n and len(full) == expected[0] and all( + common.finite(v) and v == round(v) for v in values + full), 'Invalid exact values') + values, full = list(map(int, values)), list(map(int, full)) + checked = generator.validate_assignment(model, values) + require(checked['valid'] and checked['objective'] == raw['objective'], 'Original witness failed') + expected_full = values[:] + if kind == 'weighted_queens': + expected_full += [v for i, x in enumerate(values) for v in (x+i, x-i)] + if kind != 'binary': + expected_full += [model['data'][i][x] for i, x in enumerate(values)] + require(full == expected_full, 'Auxiliary values differ') + else: + require(not values and not full and raw['objective'] is None, 'Absent-point values') + bound, objective = raw['best_bound'], raw['objective'] + if point and bound is not None: + gap = objective-bound + require(gap >= 0 and raw['absolute_gap'] == gap and + abs(raw['relative_gap']-gap/max(1, abs(objective), abs(bound))) <= 1e-12, + 'Bound/gap inconsistency') + else: + require(raw['absolute_gap'] is None and raw['relative_gap'] is None, 'Gap without both sides') + optimal = raw['status'] == 'optimal' + require(not optimal or (point and bound == objective and raw['absolute_gap'] == 0), + 'Incomplete optimal result') + return dict(status=raw['status'], passed=optimal and raw['solve_seconds'] <= SECONDS, + primal_checked=point, independent_optimality_verified=False, + backend_reported_optimal=optimal, solve_seconds=raw['solve_seconds'], + objective=objective, best_bound=bound, backend_result=raw) + + +class Search: + def __init__(self, output): + self.output = output.resolve() + self.output.mkdir(parents=True, exist_ok=False) + (self.output/'models').mkdir() + self.started = time.monotonic() + self.binary = ROOT/'build/capacity-scaling/fixed-driver/optimize-native-benchmark' + self.directories = {'before': [ROOT/'build/comparison-algorithms/before/lib'], + 'after': [ROOT/'build/native-compat/gecode/optimize', ROOT/'build/native-compat']} + self.models, self.records, self.decisions = {}, [], [] + paths = [Path(__file__), HERE/'boundary_instances.py', HERE/'category_instances.py', + HERE/'scaling_instances.py', HERE/'benchmark_native_algorithms.py', + HERE/'benchmark_progress.py', ROOT/'experiments/solver-bench/validate.py', + ROOT/'experiments/solver-bench/native.py'] + self.sources = {str(p.relative_to(ROOT)): sha(p) for p in paths} + prior = ROOT/'build/category-scaling/results/report.json' + # This fixed artifact supplies expected library hashes, never new timing outcomes. + expected_sha = json.loads((ROOT.parent.parent/'benchmark-site/scripts/category-scaling-evidence.json').read_text())['files']['report']['sha256'] + require(sha(prior) == expected_sha, 'Prior provenance artifact changed') + old = json.loads(prior.read_text()) + self.expected = old['provenance']['cohorts'] + self.runtime_sources = old['provenance']['runtime_source_sha256'] + self.provenance = dict(source_head=subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip(), + sources=self.sources, prior_report_sha256=expected_sha, driver_sha256=sha(self.binary), + runtime_sources=self.runtime_sources, expected_libraries=self.expected) + self.protocol = dict(seconds=SECONDS, capture_seconds=WALL_SECONDS, whole_seconds=WHOLE_SECONDS, + max_attempts=MAX_ATTEMPTS, max_sizes_per_category=MAX_SIZES, limits=LIMITS, + selection='Independent anchor/exponential bracketing, integer bisection and adjacent two-repeat confirmation. Stop expanding each cohort at its first failure. Fill shared points only through the smaller confirmed boundary. No retries.', + optimality='Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.', + capacity='Largest sampled size with all variants passing both repetitions. Untested sizes remain unknown.') + self.complete = False + self.publish() + require(sha(self.binary) == DRIVER_HASH, 'Fixed driver changed') + for name, digest in self.runtime_sources.items(): + require(sha(ROOT/name) == digest, 'Solver source changed') + for cohort in COHORTS: + self.execute('knapsack', 8, 'uncorrelated', cohort, 0, probe=True) + + def publish(self): + report = dict(protocol=self.protocol, provenance=self.provenance, + started_utc=getattr(self, 'utc', None), elapsed_seconds=time.monotonic()-self.started, + complete=self.complete, models=list(self.models.values()), records=self.records, + decisions=self.decisions) + common.write(self.output/'report.json', common.public_copy(report, [(str(ROOT), 'REPOSITORY')])) + + def model(self, category, size, variant): + key = f'{category}-{size}-{variant}' + if key not in self.models: + model = generator.make(category, size, variant) + common.write(self.output/'models'/(key+'.json'), model) + text = generator.encode_txt(model) + (self.output/'models'/(key+'.txt')).write_text(text) + self.models[key] = dict(id=key, category=category, size=size, variant=variant, + model=model, json_sha256=sha(self.output/'models'/(key+'.json')), + txt_sha256=sha(self.output/'models'/(key+'.txt'))) + self.publish() + return key, self.models[key]['model'] + + def execute(self, category, size, variant, cohort, repetition, probe=False): + require(len(self.records) < MAX_ATTEMPTS and time.monotonic()-self.started < WHOLE_SECONDS, + 'Preregistered whole-run allowance exhausted') + key, model = self.model(category, size, variant) + label = f'{key}-{cohort}-r{repetition}' + record = dict(case=key, category=category, size=size, variant=variant, cohort=cohort, + repetition=repetition, probe=probe, status='pending', passed=False) + self.records.append(record) + self.publish() + env = {k: v for k, v in os.environ.items() if not k.startswith('DYLD_')} + env['DYLD_LIBRARY_PATH'] = ':'.join(map(str, self.directories[cohort])) + if probe: + env['DYLD_PRINT_LIBRARIES'] = '1' + command = [str(self.binary), '--input', str(self.output/'models'/(key+'.txt')), + '--kind', model['kind'], '--route', 'native', '--seconds', str(SECONDS)] + record['offset_start'] = time.monotonic()-self.started + try: + raw = capture(command, self.output, env, min(WALL_SECONDS, WHOLE_SECONDS-record['offset_start']), max_output=262144) + record['offset_end'] = time.monotonic()-self.started + stdout, stderr = raw.pop('stdout'), raw.pop('stderr') + (self.output/(label+'.stdout')).write_bytes(stdout) + (self.output/(label+'.stderr')).write_bytes(stderr) + record.update(raw) + require(raw['returncode'] == 0 and not raw['hard_timeout'] and not raw['output_limit'], 'Process capture failed') + record.update(validate(common.strict_json(stdout.decode()), model)) + if probe: + loaded = set() + for line in stderr.decode().splitlines(): + if 'libgecode' not in line: + continue + p = Path(line[line.index('/'):].strip()).resolve(strict=True) + require(p.parent in self.directories[cohort], 'Mixed loader paths') + loaded.add((p.name, sha(p))) + expected = {(x['name'], x['sha256']) for x in self.expected[cohort]['libraries']} + require(loaded == expected, 'Loaded cohort differs from preserved product') + self.provenance[cohort+'_loaded'] = sorted(loaded) + peers = [r['objective'] for r in self.records if r['case'] == key and r.get('backend_reported_optimal')] + require(len(set(peers)) <= 1, 'Paired optimum disagreement') + if peers: + for peer in (r for r in self.records if r['case'] == key): + require(peer.get('objective') is None or peer['objective'] >= peers[0], 'Feasible peer contradicts reported optimum') + require(peer.get('best_bound') is None or peer['best_bound'] <= peers[0], 'Peer bound contradicts reported optimum') + except Exception as error: + record.update(status='error', error=str(error), passed=False) + self.publish() + raise + self.publish() + print(label, record['status'], record.get('solve_seconds'), flush=True) + + def rows(self, category, size, cohort): + return [r for r in self.records if not r['probe'] and r['category'] == category and + r['size'] == size and r['cohort'] == cohort] + + def sizes(self, category): + return sorted({r['size'] for r in self.records if not r['probe'] and r['category'] == category}) + + def passed(self, category, size, cohort, confirmed=False): + rows = self.rows(category, size, cohort) + required = (2 if category == 'knapsack' else 1)*(2 if confirmed else 1) + return len(rows) >= required and all(r['passed'] for r in rows) + + def query(self, category, size, reason, repeats=1, cohorts=COHORTS): + minimum, _, maximum = LIMITS[category] + require(minimum <= size <= maximum, 'Query outside fixed domain') + require(size in self.sizes(category) or len(self.sizes(category)) < MAX_SIZES, 'Category size allowance exhausted') + self.decisions.append(dict(category=category, size=size, reason=reason, repeats=repeats, + after_records=len(self.records), cohorts=list(cohorts))) + self.publish() + variants = ('uncorrelated', 'correlated') if category == 'knapsack' else ('single',) + for repetition in range(1, repeats+1): + for cohort in (cohorts if repetition == 1 else cohorts[::-1]): + for variant in variants: + if not any(r['category'] == category and r['size'] == size and r['cohort'] == cohort and + r['variant'] == variant and r['repetition'] == repetition for r in self.records): + self.execute(category, size, variant, cohort, repetition) + + def run(self): + self.utc = datetime.now(timezone.utc).isoformat() + # Independent searches stop expanding a cohort after its first failure. + for category, (minimum, anchor, cap) in LIMITS.items(): + for cohort in COHORTS: + self.query(category, anchor, cohort+' starting size', cohorts=(cohort,)) + if not self.passed(category, anchor, cohort): + self.query(category, minimum, cohort+' minimum fallback', cohorts=(cohort,)) + passing = [s for s in self.sizes(category) if self.passed(category, s, cohort)] + if not passing: + continue + low, high = max(passing), None + failures = [s for s in self.sizes(category) if s > low and + self.rows(category, s, cohort) and not self.passed(category, s, cohort)] + if failures: + high = min(failures) + while high is None and low < cap: + nxt = min(low*2, cap) + self.query(category, nxt, cohort+' exponential bracket', cohorts=(cohort,)) + if self.passed(category, nxt, cohort): + low = nxt + else: + high = nxt + if high is not None: + while high-low > 1: + mid = (low+high)//2 + self.query(category, mid, cohort+' integer bisection', cohorts=(cohort,)) + if self.passed(category, mid, cohort): + low = mid + else: + high = mid + # Confirm the candidate and adjacent inputs without exploring + # a previously failed upper interval again. + for _ in range(6): + passing = [s for s in self.sizes(category) if self.passed(category, s, cohort)] + if not passing: + break + candidate = max(passing) + for size in range(max(minimum, candidate-1), min(cap, candidate+1)+1): + self.query(category, size, cohort+' boundary confirmation', repeats=2, cohorts=(cohort,)) + updated = [s for s in self.sizes(category) if self.passed(category, s, cohort)] + if updated and max(updated) == candidate and self.passed(category, candidate, cohort, True): + break + maxima = [max((s for s in self.sizes(category) if self.passed(category, s, c, True)), + default=minimum) for c in COHORTS] + shared_ceiling = min(maxima)+1 + for size in list(self.sizes(category)): + if size <= shared_ceiling: + self.query(category, size, 'shared timing point within smaller boundary', cohorts=COHORTS) + self.provenance['integrity'] = dict( + sources_unchanged=all(sha(ROOT/p) == h for p, h in self.sources.items()), + runtime_sources_unchanged=all(sha(ROOT/p) == h for p, h in self.runtime_sources.items()), + driver_unchanged=sha(self.binary) == DRIVER_HASH, + models_unchanged=all(sha(self.output/'models'/(k+'.json')) == v['json_sha256'] and + sha(self.output/'models'/(k+'.txt')) == v['txt_sha256'] for k, v in self.models.items()), + libraries_unchanged=all(any((d/x['name']).is_file() and sha(d/x['name']) == x['sha256'] + for d in self.directories[c]) for c in COHORTS for x in self.expected[c]['libraries'])) + require(all(self.provenance['integrity'].values()), 'Measurement integrity failed') + require(time.monotonic()-self.started < WHOLE_SECONDS, 'Whole-run allowance exhausted before completion') + self.complete = True + self.publish() + if time.monotonic()-self.started >= WHOLE_SECONDS: + self.complete = False + self.publish() + raise ValueError('Whole-run allowance exhausted during publication') + print('Adaptive search complete:', len(self.records)-2, 'measured runs;', round(time.monotonic()-self.started, 2), 'seconds', flush=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output-dir', type=Path, required=True) + args = parser.parse_args() + Search(args.output_dir).run() diff --git a/experiments/optimize/benchmark_capacity_scaling.py b/experiments/optimize/benchmark_capacity_scaling.py new file mode 100644 index 0000000000..41666ea020 --- /dev/null +++ b/experiments/optimize/benchmark_capacity_scaling.py @@ -0,0 +1,455 @@ +#!/usr/bin/env python3 +"""Freeze and measure a small, capacity-first native size ladder. + +First run --freeze-only --freeze-dir NEW_DIRECTORY. It generates the fixed 13 +instances and exact references without running a solver, then prints the SHA256 +of manifest.json. Measurement is a separate invocation requiring that literal +--manifest-sha256, the same --freeze-dir, --binary, repeated --before-libraries +and --after-libraries directories, and a new --output-dir. The before libraries +must match the preserved pre-algorithm manifest (optional --baseline-manifest). + +Use one newly frozen native-benchmark executable accepting --seconds 10 for +both cohorts. The earlier two-second study's executable rejects values above +five seconds and is intentionally left untouched. No builds or downloads occur. + +Every solve receives exactly 10 seconds; process capture allows 11 seconds plus +at most 0.5 seconds for cleanup. The full measured invocation has a cooperative +600-second allowance. Two alternating paired repeats give 52 required records; +unattempted records after whole-run exhaustion remain failures in the report. +Only original, independently verified optima returned within the internal solve +allowance count toward largest tested size. Preparation and external wall times +are recorded separately. This is a small fixed ladder, not a statistical estimate +of a solver's maximum capacity or a general speed claim. +""" + +import argparse +from datetime import datetime, timezone +import hashlib +import importlib.util +import json +import os +from pathlib import Path +import re +import statistics +import subprocess +import sys +import time + +sys.dont_write_bytecode = True +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +REPETITIONS = 2 +SOLVE_SECONDS = 10 +PROCESS_SECONDS = 11 +WHOLE_SECONDS = 600 +FAMILIES = ('capacity_uncorrelated', 'capacity_correlated', 'assignment') +PLANNED = ( + [('capacity_uncorrelated', n) for n in (8, 32, 128, 384)] + + [('capacity_correlated', n) for n in (8, 32, 128, 384)] + + [('assignment', n) for n in (9, 25, 81, 256)] + + [('capacity_uncorrelated', 512)] +) + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def load_module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + result = importlib.util.module_from_spec(spec) + spec.loader.exec_module(result) + return result + + +def modules(): + return (load_module('capacity_common', HERE/'benchmark_native_algorithms.py'), + load_module('capacity_instances', HERE/'scaling_instances.py')) + + +def sha(path): + digest = hashlib.sha256() + with path.open('rb') as stream: + for block in iter(lambda: stream.read(1024*1024), b''): + digest.update(block) + return digest.hexdigest() + + +def write(path, value): + path.write_text(json.dumps(value, indent=2, allow_nan=False)+'\n', encoding='utf8') + + +def source_files(): + return (Path(__file__).resolve(), HERE/'scaling_instances.py', + HERE/'benchmark_native_algorithms.py', HERE/'benchmark_progress.py', + HERE/'native_benchmark.cpp') + + +def source_hashes(): + return {str(path.relative_to(ROOT)): sha(path) for path in source_files()} + + +def protocol(): + return dict( + schema_version=1, purpose='largest_verified_size_within_ten_second_solver_budget', + selection='Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.', + planned=[dict(family=family, variables=n) for family, n in PLANNED], + repetitions=REPETITIONS, expected_measured_runs=52, loader_probes=2, + backend='Native', guarantee='Exact', route='native', threads=1, + random_seed=0, primal_start=False, relative_gap=0, absolute_gap=0, + solver_seconds=SOLVE_SECONDS, process_seconds=PROCESS_SECONDS, + whole_seconds=WHOLE_SECONDS, + ordering='First repeat before/after per case; second after/before per case.', + capacity_rule='Largest tested variable count, including the stress point, with independently verified Optimal results and internal solve_seconds <= 10 in both repetitions.', + boundary_rule='The n=512 uncorrelated case retains its DP-table-overflow stress flag and participates in the largest-tested-size calculation.', + reference_rule='Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima.', + ) + + +def ordered_models(models): + require(isinstance(models, list) and len(models)==len(PLANNED), + 'Expected exactly 13 frozen models') + keyed = {(model['family'], model['n']): model for model in models} + require(len(keyed)==len(models) and set(keyed)==set(PLANNED), + 'Generator models differ from preregistered families/sizes') + require(len({model['id'] for model in models})==len(models), 'Duplicate model ID') + for model in models: + require(re.fullmatch(r'[A-Za-z0-9_-]+', model['id']) is not None, + 'Unsafe model ID') + require(model['kind']=='binary', 'Scaling driver supports binary matrices') + return [keyed[key] for key in PLANNED] + + +def freeze(directory): + common, generator = modules() + require(not directory.exists(), 'Freeze directory already exists') + sources = source_hashes() + started = time.monotonic() + models = ordered_models(generator.generate_suite()) + directory.mkdir(parents=True) + (directory/'models').mkdir() + write(directory/'protocol.json', protocol()) + records = [] + for model in models: + checked = generator.verify_reference(model) + require(checked['valid'] and checked['witness_checked'] and + not checked['optimality_recomputed'], 'Reference validation failed') + stem = 'models/'+model['id'] + json_path, txt_path = directory/(stem+'.json'), directory/(stem+'.txt') + write(json_path, model) + txt_path.write_text(generator.encode_txt(model), encoding='utf8') + require(common.strict_json(json_path.read_text())==model, 'JSON round-trip differs') + records.append(dict( + id=model['id'], family=model['family'], tier=model['tier'], + tier_size=model['tier_size'], variables=model['n'], + dimensions=model['dimensions'], seed=model['seed'], + stress=model['n']==512, kind='binary', route='native', + objective=model['reference']['objective'], + reference_method=model['reference']['method'], + semantic_sha256=generator.semantic_hash(model), + parameters=model['parameters'], json=stem+'.json', txt=stem+'.txt', + json_sha256=sha(json_path), txt_sha256=sha(txt_path), + )) + require(source_hashes()==sources, 'Generation/measurement source changed while freezing') + manifest = dict( + schema_version=1, ready=True, created_utc=datetime.now(timezone.utc).isoformat(), + protocol_sha256=sha(directory/'protocol.json'), protocol=protocol(), + sources=sources, records=records, generation_seconds=time.monotonic()-started, + ) + write(directory/'manifest.json', manifest) + return dict(manifest_sha256=sha(directory/'manifest.json'), models=len(records), + generation_seconds=manifest['generation_seconds']) + + +def inside(directory, relative): + directory = directory.resolve(strict=True) + name = Path(relative) + require(not name.is_absolute() and '..' not in name.parts, 'Unsafe frozen relative path') + path = directory/name + require(not path.is_symlink(), 'Frozen files must not be symbolic links') + resolved = path.resolve(strict=True) + require(directory in resolved.parents and resolved.is_file(), 'Frozen file escaped its directory') + return resolved + + +def read_frozen(directory, expected_hash, common, generator): + require(re.fullmatch(r'[0-9a-f]{64}', expected_hash) is not None, + 'A literal manifest SHA256 is required') + path = inside(directory, 'manifest.json') + require(sha(path)==expected_hash, 'Frozen manifest hash mismatch') + manifest = common.strict_json(path.read_text(encoding='utf8')) + require(manifest.get('schema_version')==1 and manifest.get('ready') is True and + manifest['protocol']==protocol(), 'Frozen protocol differs') + require(sha(inside(directory, 'protocol.json'))==manifest['protocol_sha256'], + 'Frozen protocol bytes changed') + require(manifest['sources']==source_hashes(), 'Frozen generator/measurement source changed') + models, hashes = {}, {'manifest.json': expected_hash, + 'protocol.json': manifest['protocol_sha256']} + for record in manifest['records']: + jp, tp = (inside(directory, record[key]) for key in ('json', 'txt')) + require(sha(jp)==record['json_sha256'] and sha(tp)==record['txt_sha256'], + 'Frozen model bytes changed: '+record['id']) + model = common.strict_json(jp.read_text(encoding='utf8')) + require(model['id']==record['id'] and model['family']==record['family'] and + model['n']==record['variables'] and model['tier']==record['tier'] and + model['dimensions']==record['dimensions'] and model['parameters']==record['parameters'] and + model['seed']==record['seed'] and model['tier_size']==record['tier_size'], + 'Frozen manifest/model metadata mismatch') + require(generator.encode_txt(model)==tp.read_text(encoding='utf8'), + 'Frozen TXT/JSON semantics differ') + checked = generator.verify_reference(model) + require(checked['valid'] and checked['witness_checked'] and + not checked['optimality_recomputed'] and checked['objective']==record['objective'] and + generator.semantic_hash(model)==record['semantic_sha256'], + 'Frozen reference identity/witness failed') + models[record['id']] = model + hashes[record['json']], hashes[record['txt']] = record['json_sha256'], record['txt_sha256'] + ordered = ordered_models(list(models.values())) + require([model['id'] for model in ordered]==[record['id'] for record in manifest['records']], + 'Frozen measurement ordering differs') + require(all(record['stress']==(record['variables']==512) and record['route']=='native' and + record['kind']=='binary' for record in manifest['records']), 'Frozen route/stress mismatch') + return manifest, models, hashes + + +def checked_observation(raw, unit, model, common, generator): + descriptor = dict(unit, kind='binary', route='native') + checked = common.checked_result(raw, descriptor, model, generator, None) + checked['proved_within_limit'] = checked['completed'] and checked['solve_seconds']<=SOLVE_SECONDS + return checked + + +def summarize(records, manifest, provenance, valid, elapsed): + result = dict( + schema_version=1, comparison_valid=bool(valid), elapsed_seconds=elapsed, + required_runs=52, recorded_runs=len(records), repetitions=REPETITIONS, + solver_seconds=SOLVE_SECONDS, primary_measure='largest_tested_proved_variables', + provenance=provenance, cases=[], families=[], + caveats=[ + 'One nested seeded instance per size, repeated twice; repetitions are not independent input samples.', + 'Largest tested size is an observed ladder result, not the true solver capacity.', + 'Only independently verified optimal results within the internal 10-second allowance count as proved.', + 'All failures and capped solves remain in the denominator; no solve-time ratio uses a censored baseline.', + 'Capacity and table size also affect the pseudo-polynomial DP; variable count alone is not its complexity.', + 'The separate 512-variable stress case crosses the implementation table cap and must remain visible.', + 'Internal solve times are primary; external times include process startup, input parsing and model construction.', + ], + ) + for unit in manifest['records']: + case = {key: unit[key] for key in ('id', 'family', 'tier', 'tier_size', 'variables', + 'dimensions', 'stress', 'objective', 'parameters')} + groups = {} + for cohort in ('before', 'after'): + rows = [record for record in records if record['case']==unit['id'] and record['cohort']==cohort] + groups[cohort] = rows + internal = [row.get('solve_seconds') for row in rows] + external = [row.get('external_seconds') for row in rows] + case[cohort] = dict( + attempts=len(rows), proved=sum(row['proved_within_limit'] for row in rows), + proved_all=bool(valid and len(rows)==REPETITIONS and all(row['proved_within_limit'] for row in rows)), + statuses=[row['status'] for row in rows], internal_seconds=internal, + external_seconds=external, + median_internal_seconds=statistics.median(internal) if len(internal)==REPETITIONS and all(v is not None for v in internal) else None, + median_external_seconds=statistics.median(external) if len(external)==REPETITIONS and all(v is not None for v in external) else None, + objectives=[row.get('objective') for row in rows], bounds=[row.get('best_bound') for row in rows], + ) + all_proved = case['before']['proved_all'] and case['after']['proved_all'] + for clock in ('solve_seconds', 'external_seconds'): + ratios = [b[clock]/a[clock] for a, b in zip(groups['before'], groups['after']) + if a.get(clock, 0)>0 and b.get(clock, 0)>0] if all_proved else [] + case['median_paired_'+clock+'_ratio_after_before'] = statistics.median(ratios) if len(ratios)==REPETITIONS else None + result['cases'].append(case) + for family in FAMILIES: + ladder = sorted((case for case in result['cases'] if case['family']==family), + key=lambda case: case['variables']) + item = dict(family=family, tested_variables=[case['variables'] for case in ladder]) + for cohort in ('before', 'after'): + proved = [case['variables'] for case in ladder if case[cohort]['proved_all']] + largest = max(proved) if proved else None + item[cohort] = dict(largest_tested_proved_variables=largest, + proved_tiers=len(proved), total_tiers=len(ladder), + larger_tested_unproved_variables=[case['variables'] for case in ladder + if largest is not None and case['variables']>largest and not case[cohort]['proved_all']]) + before, after = (item[c]['largest_tested_proved_variables'] for c in ('before', 'after')) + item['ratio_of_largest_tested_proved_variables'] = after/before if before and after else None + result['families'].append(item) + return result + + +def measure(args, started): + deadline = started+WHOLE_SECONDS + common, generator = modules() + frozen = args.freeze_dir.resolve(strict=True) + manifest, models, frozen_hashes = read_frozen(frozen, args.manifest_sha256, common, generator) + binary = args.binary.resolve(strict=True) + directories = {cohort: [path.resolve(strict=True) for path in paths] for cohort, paths in + (('before', args.before_libraries), ('after', args.after_libraries))} + require(all(path.is_dir() for paths in directories.values() for path in paths), 'Library directory required') + require(not set(directories['before']) & set(directories['after']), 'Library cohorts overlap') + preserved_path = (args.baseline_manifest or directories['before'][0].parent/'manifest.json').resolve(strict=True) + preserved, expected_before = common.baseline_manifest(preserved_path) + destination = args.output_dir.resolve() + destination.mkdir(parents=True, exist_ok=False) + capture = load_module('capacity_capture', HERE/'benchmark_progress.py').capture_command + replacements = sorted([(str(ROOT), 'REPOSITORY'), (str(frozen), 'FROZEN'), + (str(destination), 'OUTPUT'), (str(binary), 'BINARY')] + + [(str(path), cohort.upper()+'_LIBRARIES') for cohort, paths in directories.items() for path in paths], + key=lambda item: len(item[0]), reverse=True) + def publish(name, value): + write(destination/name, common.public_copy(value, replacements)) + runtime_sources = {str(path.relative_to(ROOT)): sha(path) + for folder in (ROOT/'gecode/optimize', ROOT/'gecode/int/linear') + for path in sorted(folder.rglob('*')) if path.suffix in ('.cpp', '.hpp')} + provenance = dict(driver_name=binary.name, driver_sha256=sha(binary), + source_head=subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True, timeout=2).strip(), + runtime_source_sha256=runtime_sources, measurement_source_sha256=source_hashes(), + frozen_manifest_sha256=args.manifest_sha256, + frozen_protocol_sha256=manifest['protocol_sha256'], preserved_baseline=preserved, cohorts={}) + report = dict(schema_version=1, started_utc=datetime.now(timezone.utc).isoformat(), + expected_runs=52, protocol=protocol(), frozen_manifest=manifest, + provenance=provenance, comparison_valid=False, loader_probes=[], records=[]) + loaded, local = {}, {} + def execute(unit, cohort, label, trace=False): + remaining = deadline-time.monotonic() + require(remaining>0, 'Whole-run allowance exhausted') + command = [str(binary), '--input', str(inside(frozen, unit['txt'])), '--kind', 'binary', + '--route', 'native', '--seconds', str(SOLVE_SECONDS)] + environment = {key: value for key, value in os.environ.items() if not key.startswith('DYLD_')} + environment['DYLD_LIBRARY_PATH'] = ':'.join(map(str, directories[cohort])) + if trace: + environment['DYLD_PRINT_LIBRARIES'] = '1' + utc = datetime.now(timezone.utc).isoformat() + outcome = capture(command, destination, environment, min(PROCESS_SECONDS, remaining), max_output=262144) + stdout, stderr = outcome.pop('stdout'), outcome.pop('stderr') + (destination/(label+'.stdout')).write_bytes(stdout) + (destination/(label+'.stderr')).write_bytes(stderr) + outcome.update(started_utc=utc, stdout_file=label+'.stdout', stderr_file=label+'.stderr', + command=['BINARY', '--input', unit['txt'], '--kind', 'binary', + '--route', 'native', '--seconds', str(SOLVE_SECONDS)]) + return outcome, stdout.decode('utf8', errors='replace'), stderr.decode('utf8', errors='replace') + publish('report.json', report) + for cohort in ('before', 'after'): + probe_record = dict(cohort=cohort, status='pending') + report['loader_probes'].append(probe_record) + publish('report.json', report) + try: + unit = manifest['records'][0] + probe, out, err = execute(unit, cohort, 'provenance-'+cohort, trace=True) + probe_record.update(probe) + publish('report.json', report) # Retain even rejected probe outcomes. + require(probe['returncode']==0 and not probe['hard_timeout'] and not probe['output_limit'], 'Loader probe failed') + checked_observation(common.strict_json(out), unit, models[unit['id']], common, generator) + paths = set() + for line in err.splitlines(): + if 'libgecode' not in line: + continue + require('/' in line, 'Malformed loader trace') + path = Path(line[line.index('/'):].strip()).resolve(strict=True) + require(path.parent in directories[cohort], 'Unexpected mixed runtime library') + paths.add(path) + require(any(path.name=='libgecodeoptimize.dylib' for path in paths), 'No observed Optimize library') + libraries = [dict(name=path.name, sha256=sha(path)) for path in sorted(paths)] + if cohort=='before': + require(all(expected_before.get(item['name'])==item['sha256'] for item in libraries), 'Preserved baseline library differs') + loaded[cohort] = paths + provenance['cohorts'][cohort] = dict(libraries=libraries, loader_probe=probe) + local[cohort] = dict(directories=list(map(str, directories[cohort])), loaded=list(map(str, sorted(paths)))) + if cohort=='after': + facade_hashes = [next(item['sha256'] for item in provenance['cohorts'][name]['libraries'] + if item['name']=='libgecodeoptimize.dylib') for name in ('before', 'after')] + require(facade_hashes[0]!=facade_hashes[1], 'Candidate facade is byte-identical to the preserved baseline') + probe_record['status'] = 'validated' + publish('report.json', report) + except (ValueError, KeyError, TypeError, OverflowError, OSError, RuntimeError) as error: + probe_record.update(status='failed', error=str(error)) + report.update(preflight_failure=True, elapsed_seconds=time.monotonic()-started, + finished_utc=datetime.now(timezone.utc).isoformat()) + publish('report.json', report) + publish('summary.json', summarize([], manifest, provenance, False, report['elapsed_seconds'])) + print('Scaling loader preflight failed:', str(error), flush=True) + return 1 + write(destination/'paths.local.json', dict(binary=str(binary), frozen=str(frozen), + baseline_manifest=str(preserved_path), cohorts=local)) + publish('report.json', report) + for repetition in range(REPETITIONS): + for unit in manifest['records']: + for cohort in (('before', 'after') if repetition==0 else ('after', 'before')): + label = f"{unit['id']}-r{repetition+1}-{cohort}" + record = dict(case=unit['id'], family=unit['family'], variables=unit['variables'], + tier=unit['tier'], stress=unit['stress'], cohort=cohort, + repetition=repetition+1, completed=False, proved_within_limit=False, + witness_checked=False, expected_objective=unit['objective']) + if time.monotonic()>=deadline: + record.update(status='not_run_whole_limit', error='Required case could not start within whole-run allowance') + else: + try: + outcome, out, err = execute(unit, cohort, label) + record.update(outcome) + if outcome['hard_timeout']: + record['status'] = 'external_timeout' + elif outcome['output_limit']: + record['status'] = 'output_limit' + elif outcome['returncode']!=0: + record['status'] = 'process_error' + else: + record.update(checked_observation(common.strict_json(out), unit, models[unit['id']], common, generator)) + except (ValueError, KeyError, TypeError, OverflowError, OSError, RuntimeError) as error: + record.update(status='validation_error', error=str(error)) + report['records'].append(record) + publish('report.json', report) + print(label, record['status'], record.get('solve_seconds'), flush=True) + integrity = dict( + frozen_unchanged=all(sha(inside(frozen, name))==digest for name, digest in frozen_hashes.items()), + measurement_source_unchanged=source_hashes()==provenance['measurement_source_sha256'], + runtime_source_unchanged=all(sha(ROOT/name)==digest for name, digest in runtime_sources.items()), + driver_unchanged=sha(binary)==provenance['driver_sha256'], + preserved_manifest_unchanged=sha(preserved_path)==preserved['manifest_sha256'], + libraries_unchanged=all(sha(path)==next(item['sha256'] for item in provenance['cohorts'][cohort]['libraries'] + if item['name']==path.name) + for cohort, paths in loaded.items() for path in paths), + ) + failures = {'not_run_whole_limit', 'external_timeout', 'output_limit', 'process_error', 'validation_error'} + valid = (all(integrity.values()) and len(report['records'])==52 and time.monotonic()=deadline: + valid = False + report.update(comparison_valid=False, elapsed_seconds=time.monotonic()-started, + final_publication_limit=True) + summary = summarize(report['records'], manifest, provenance, False, report['elapsed_seconds']) + publish('report.json', report) + publish('summary.json', summary) + print('Scaling panel:', len(report['records']), 'records; comparison valid:', bool(valid)) + return 0 if valid else 1 + + +def main(argv=None): + started = time.monotonic() + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--freeze-only', action='store_true') + parser.add_argument('--freeze-dir', type=Path, required=True) + parser.add_argument('--manifest-sha256') + parser.add_argument('--binary', type=Path) + parser.add_argument('--before-libraries', type=Path, action='append') + parser.add_argument('--after-libraries', type=Path, action='append') + parser.add_argument('--baseline-manifest', type=Path) + parser.add_argument('--output-dir', type=Path) + args = parser.parse_args(argv) + if args.freeze_only: + print(json.dumps(freeze(args.freeze_dir.resolve()), indent=2)) + return 0 + for name in ('manifest_sha256', 'binary', 'before_libraries', 'after_libraries', 'output_dir'): + if not getattr(args, name): + parser.error('--'+name.replace('_', '-')+' is required for measurement') + if sys.platform!='darwin': + parser.error('Measured loader provenance currently requires macOS') + return measure(args, started) + + +if __name__=='__main__': + raise SystemExit(main()) diff --git a/experiments/optimize/benchmark_category_scaling.py b/experiments/optimize/benchmark_category_scaling.py new file mode 100644 index 0000000000..49a58bbda4 --- /dev/null +++ b/experiments/optimize/benchmark_category_scaling.py @@ -0,0 +1,538 @@ +#!/usr/bin/env python3 +"""Freeze and measure seven native model categories on a fixed size ladder. + +Freeze first with --freeze-only --freeze-dir NEW_DIRECTORY. The separate measured +invocation requires that directory, its literal --manifest-sha256, one --binary, +repeated --before-libraries/--after-libraries, and a new --output-dir. The before +libraries must match the preserved pre-algorithm manifest. No builds, downloads, +starts or reference witnesses are supplied to the solver. + +The same existing ten-second native benchmark executable runs both cohorts. +Each solve receives exactly 10 seconds; capture allows 11 seconds plus at most +0.5 seconds cleanup. The whole invocation has a cooperative 1500-second budget. +All 132 required observations remain recorded, including unattempted cases after +an exhausted budget or rejected loader probe. Internal solve time is primary. + +Main knapsack size groups require both distributions to prove their independent +reference optimum in both repetitions. Its separate single-distribution stress +point never counts as an all-distribution main group. Other categories each have +one variant. Model variables include native auxiliary columns; input variables +and size units are retained separately. Capacity comparisons stay within each +category and describe this sampled ladder, not an estimated general maximum. +""" + +import argparse +from datetime import datetime, timezone +import hashlib +import importlib.util +import json +import os +from pathlib import Path +import re +import statistics +import subprocess +import sys +import time + +sys.dont_write_bytecode = True +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +REPETITIONS = 2 +SOLVE_SECONDS = 10 +PROCESS_SECONDS = 11 +WHOLE_SECONDS = 1500 +CATEGORIES = ('knapsack', 'assignment', 'facility_location', 'bin_packing', + 'production', 'native_tsp', 'weighted_queens') +TIERS = ('sanity', 'small', 'medium', 'large') +PLANNED = ( + [('knapsack', 'uncorrelated', n) for n in (8, 32, 128, 384)] + + [('knapsack', 'correlated', n) for n in (8, 32, 128, 384)] + + [('assignment', 'single', n) for n in (9, 25, 81, 256)] + + [('facility_location', 'single', n) for n in (8, 28, 104, 300)] + + [('bin_packing', 'single', n) for n in (15, 36, 65, 102)] + + [('production', 'single', n) for n in (24, 48, 96, 192)] + + [('native_tsp', 'single', n) for n in (4, 8, 12, 16)] + + [('weighted_queens', 'single', n) for n in (4, 8, 10, 12)] + + [('knapsack', 'uncorrelated', 512)] +) +EXPECTED_RUNS = len(PLANNED)*REPETITIONS*2 + + +def model_columns(category, input_count): + return input_count*({'native_tsp': 2, 'weighted_queens': 4}.get(category, 1)) + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def load_module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + result = importlib.util.module_from_spec(spec) + spec.loader.exec_module(result) + return result + + +def modules(): + return (load_module('category_common', HERE/'benchmark_native_algorithms.py'), + load_module('category_instances', HERE/'category_instances.py')) + + +def sha(path): + digest = hashlib.sha256() + with path.open('rb') as stream: + for block in iter(lambda: stream.read(1024*1024), b''): + digest.update(block) + return digest.hexdigest() + + +def write(path, value): + path.write_text(json.dumps(value, indent=2, allow_nan=False)+'\n', encoding='utf8') + + +def source_files(): + return (Path(__file__).resolve(), HERE/'category_instances.py', + HERE/'scaling_instances.py', HERE/'benchmark_native_algorithms.py', + HERE/'benchmark_progress.py', HERE/'native_benchmark.cpp', + ROOT/'experiments/solver-bench/validate.py', + ROOT/'experiments/solver-bench/native.py') + + +def source_hashes(): + return {str(path.relative_to(ROOT)): sha(path) for path in source_files()} + + +def protocol(): + return dict( + schema_version=1, purpose='sampled_category_capacity_within_ten_second_solver_budget', + selection='Fixed families, prefixes, sizes and seeds before measurements; no replacement after outcomes.', + planned=[dict(category=category, variant=variant, input_variables=n, + model_variables=model_columns(category, n)) + for category, variant, n in PLANNED], + repetitions=REPETITIONS, expected_measured_runs=EXPECTED_RUNS, loader_probes=2, + backend='Native', guarantee='Exact', route='native', threads=1, + random_seed=0, primal_start=False, relative_gap=0, absolute_gap=0, + solver_seconds=SOLVE_SECONDS, process_seconds=PROCESS_SECONDS, + whole_seconds=WHOLE_SECONDS, + ordering='First repeat before/after per case; second after/before per case.', + capacity_rule='Largest sampled main group with every variant independently verified Optimal within internal solve_seconds <= 10 in both repetitions. Knapsack requires both distributions; other categories have one variant.', + boundary_rule='The 512-variable uncorrelated stress point is a separate single-variant group. Largest-any-group statistics retain its stress and variant_count; it cannot increase the all-variant main maximum.', + reference_rule='Independent exact references generated before freezing; measured phase checks hashes and original witnesses without recomputing optima.', + ) + + +def ordered_models(models): + require(isinstance(models, list) and len(models)==len(PLANNED), + 'Expected exactly 33 frozen models') + keyed = {(m['category'], m['variant'], m['n']): m for m in models} + require(len(keyed)==len(models) and set(keyed)==set(PLANNED), + 'Generator models differ from preregistered categories/variants/sizes') + require(len({m['id'] for m in models})==len(models), 'Duplicate model ID') + for i, key in enumerate(PLANNED): + model = keyed[key] + category, _, n = key + stress = key==('knapsack', 'uncorrelated', 512) + require(re.fullmatch(r'[A-Za-z0-9_-]+', model['id']) is not None, + 'Unsafe model ID') + expected_kind = category if category in ('native_tsp', 'weighted_queens') else 'binary' + require(model['kind']==expected_kind, 'Driver kind differs from fixed category') + require(model['modelled_variables']==model_columns(category, n) and + model['dimensions']['input_variables']==n and + model['dimensions']['variables']==model['modelled_variables'], + 'Original input/modelled variable counts differ') + require(model['stress'] is stress and + (stress or model['tier']==TIERS[i % len(TIERS)]), + 'Fixed tier/stress metadata differs') + return [keyed[key] for key in PLANNED] + + +def unit_metadata(model): + return dict(id=model['id'], category=model['category'], variant=model['variant'], + family=model['family'], tier=model['tier'], tier_size=model['tier_size'], + size_unit=model['size_unit'], input_variables=model['n'], + model_variables=model['modelled_variables'], dimensions=model['dimensions'], + seed=model['seed'], stress=model['stress'], kind=model['kind'], route='native', + objective=model['reference']['objective'], + reference_method=model['reference']['method'], parameters=model['parameters']) + + +def freeze(directory): + common, generator = modules() + require(not directory.exists(), 'Freeze directory already exists') + sources = source_hashes() + started = time.monotonic() + models = ordered_models(generator.generate_suite()) + directory.mkdir(parents=True) + (directory/'models').mkdir() + write(directory/'protocol.json', protocol()) + records = [] + for model in models: + checked = generator.verify_reference(model) + require(checked['valid'] and checked['witness_checked'] and + not checked['optimality_recomputed'], 'Reference validation failed') + stem = 'models/'+model['id'] + json_path, txt_path = directory/(stem+'.json'), directory/(stem+'.txt') + write(json_path, model) + txt_path.write_text(generator.encode_txt(model), encoding='utf8') + require(common.strict_json(json_path.read_text())==model, 'JSON round-trip differs') + records.append(dict( + unit_metadata(model), semantic_sha256=generator.semantic_hash(model), + json=stem+'.json', txt=stem+'.txt', + json_sha256=sha(json_path), txt_sha256=sha(txt_path), + )) + require(source_hashes()==sources, 'Generation/measurement source changed while freezing') + manifest = dict( + schema_version=1, ready=True, created_utc=datetime.now(timezone.utc).isoformat(), + protocol_sha256=sha(directory/'protocol.json'), protocol=protocol(), + sources=sources, records=records, generation_seconds=time.monotonic()-started, + ) + write(directory/'manifest.json', manifest) + return dict(manifest_sha256=sha(directory/'manifest.json'), models=len(records), + generation_seconds=manifest['generation_seconds']) + + +def inside(directory, relative): + directory = directory.resolve(strict=True) + name = Path(relative) + require(not name.is_absolute() and '..' not in name.parts, 'Unsafe frozen relative path') + path = directory/name + require(not path.is_symlink(), 'Frozen files must not be symbolic links') + resolved = path.resolve(strict=True) + require(directory in resolved.parents and resolved.is_file(), 'Frozen file escaped its directory') + return resolved + + +def read_frozen(directory, expected_hash, common, generator): + require(re.fullmatch(r'[0-9a-f]{64}', expected_hash) is not None, + 'A literal manifest SHA256 is required') + path = inside(directory, 'manifest.json') + require(sha(path)==expected_hash, 'Frozen manifest hash mismatch') + manifest = common.strict_json(path.read_text(encoding='utf8')) + require(manifest.get('schema_version')==1 and manifest.get('ready') is True and + manifest['protocol']==protocol(), 'Frozen protocol differs') + require(sha(inside(directory, 'protocol.json'))==manifest['protocol_sha256'], + 'Frozen protocol bytes changed') + require(manifest['sources']==source_hashes(), 'Frozen generator/measurement source changed') + models, hashes = {}, {'manifest.json': expected_hash, + 'protocol.json': manifest['protocol_sha256']} + for record in manifest['records']: + jp, tp = (inside(directory, record[key]) for key in ('json', 'txt')) + require(sha(jp)==record['json_sha256'] and sha(tp)==record['txt_sha256'], + 'Frozen model bytes changed: '+record['id']) + model = common.strict_json(jp.read_text(encoding='utf8')) + require(all(record.get(key)==value for key, value in unit_metadata(model).items()), + 'Frozen manifest/model metadata mismatch') + require(generator.encode_txt(model)==tp.read_text(encoding='utf8'), + 'Frozen TXT/JSON semantics differ') + checked = generator.verify_reference(model) + require(checked['valid'] and checked['witness_checked'] and + not checked['optimality_recomputed'] and checked['objective']==record['objective'] and + generator.semantic_hash(model)==record['semantic_sha256'], + 'Frozen reference identity/witness failed') + models[record['id']] = model + hashes[record['json']], hashes[record['txt']] = record['json_sha256'], record['txt_sha256'] + ordered = ordered_models(list(models.values())) + require([model['id'] for model in ordered]==[record['id'] for record in manifest['records']], + 'Frozen measurement ordering differs') + return manifest, models, hashes + + +def checked_observation(raw, unit, model, common, generator): + descriptor = dict(unit, route='native') + checked = common.checked_result(raw, descriptor, model, generator, generator) + checked['proved_within_limit'] = checked['completed'] and checked['solve_seconds']<=SOLVE_SECONDS + return checked + + +def summarize(records, manifest, provenance, valid, elapsed): + result = dict( + schema_version=1, comparison_valid=bool(valid), elapsed_seconds=elapsed, + required_runs=EXPECTED_RUNS, recorded_runs=len(records), repetitions=REPETITIONS, + solver_seconds=SOLVE_SECONDS, primary_measure='largest_main_group_proved_model_variables', + provenance=provenance, cases=[], categories=[], + caveats=[ + 'One seeded instance per variant/size, repeated twice; repetitions are not independent samples.', + 'Largest sampled size is an observed ladder result, not the true solver capacity.', + 'Every variant and repetition must prove the independently checked optimum within 10 seconds.', + 'The knapsack stress group has only one variant; it is separate from the two-variant main ladder.', + 'Model variables include auxiliary columns; input variables, cities/queens and dimensions remain explicit.', + 'No cross-category capacity ratio or pooled variable count is defined.', + 'All failures and capped solves remain in the denominator; no time ratio uses a censored solve.', + 'Internal solve times are primary; external times also include startup, parsing and model construction.', + 'Capacity, constraints and formulation affect complexity; variable count alone does not.', + ], + ) + for unit in manifest['records']: + keys = ('id', 'category', 'variant', 'family', 'tier', 'tier_size', 'size_unit', + 'input_variables', 'model_variables', 'dimensions', 'stress', 'kind', + 'objective', 'parameters') + case = {key: unit[key] for key in keys} + groups = {} + for cohort in ('before', 'after'): + rows = sorted((r for r in records if r['case']==unit['id'] and r['cohort']==cohort), + key=lambda r: r['repetition']) + groups[cohort] = rows + internal = [r.get('solve_seconds') for r in rows] + external = [r.get('external_seconds') for r in rows] + complete_slots = [r['repetition'] for r in rows]==list(range(1, REPETITIONS+1)) + case[cohort] = dict( + required_runs=REPETITIONS, recorded_runs=len(rows), + attempted_runs=sum(r.get('attempted', True) for r in rows), + proved=sum(r['proved_within_limit'] for r in rows), + proved_all=bool(valid and complete_slots and all(r['proved_within_limit'] for r in rows)), + statuses=[r['status'] for r in rows], internal_seconds=internal, + external_seconds=external, + median_internal_seconds=statistics.median(internal) if complete_slots and all(v is not None for v in internal) else None, + median_external_seconds=statistics.median(external) if complete_slots and all(v is not None for v in external) else None, + objectives=[r.get('objective') for r in rows], bounds=[r.get('best_bound') for r in rows], + ) + all_proved = case['before']['proved_all'] and case['after']['proved_all'] + for clock in ('solve_seconds', 'external_seconds'): + ratios = [b[clock]/a[clock] for a, b in zip(groups['before'], groups['after']) + if a.get(clock, 0)>0 and b.get(clock, 0)>0] if all_proved else [] + case['median_paired_'+clock+'_ratio_after_before'] = statistics.median(ratios) if len(ratios)==REPETITIONS else None + result['cases'].append(case) + for category in CATEGORIES: + cases = [case for case in result['cases'] if case['category']==category] + item = dict(category=category, main_groups=[], stress_groups=[]) + grouped = [(tier, False, [c for c in cases if not c['stress'] and c['tier']==tier]) + for tier in TIERS] + grouped += [(c['tier'], True, [c]) for c in cases if c['stress']] + for tier, stress, selected in grouped: + expected_variants = ['uncorrelated'] if stress else ( + ['correlated', 'uncorrelated'] if category=='knapsack' else ['single']) + require(sorted(c['variant'] for c in selected)==expected_variants, + 'Summary lacks the complete preregistered variant group') + require(len({(c['input_variables'], c['model_variables']) for c in selected})==1, + 'Cannot pool variants with different variable counts') + group = dict(tier=tier, stress=stress, variant_count=len(selected), + variants=sorted(c['variant'] for c in selected), + cases=[c['id'] for c in selected], + input_variables=selected[0]['input_variables'], + model_variables=selected[0]['model_variables']) + for cohort in ('before', 'after'): + group[cohort] = dict( + required_runs=len(selected)*REPETITIONS, + recorded_runs=sum(c[cohort]['recorded_runs'] for c in selected), + proved=sum(c[cohort]['proved'] for c in selected), + proved_all=bool(valid and all(c[cohort]['proved_all'] for c in selected)), + statuses=[status for c in selected for status in c[cohort]['statuses']], + ) + item['stress_groups' if stress else 'main_groups'].append(group) + for cohort in ('before', 'after'): + main = [g for g in item['main_groups'] if g[cohort]['proved_all']] + any_group = [g for g in item['main_groups']+item['stress_groups'] if g[cohort]['proved_all']] + largest_main = max((g['model_variables'] for g in main), default=None) + largest_any = max(any_group, key=lambda g: g['model_variables'], default=None) + item[cohort] = dict( + largest_main_group_proved_model_variables=largest_main, + largest_any_sampled_group_proved_model_variables=largest_any['model_variables'] if largest_any else None, + largest_any_sampled_group_variant_count=largest_any['variant_count'] if largest_any else None, + largest_any_sampled_group_stress=largest_any['stress'] if largest_any else None, + proved_main_groups=len(main), total_main_groups=len(item['main_groups']), + larger_main_groups_unproved_model_variables=[g['model_variables'] for g in item['main_groups'] + if largest_main is not None and g['model_variables']>largest_main and not g[cohort]['proved_all']], + ) + before, after = (item[c]['largest_main_group_proved_model_variables'] for c in ('before', 'after')) + item['ratio_of_largest_main_group_proved_model_variables'] = after/before if before and after else None + result['categories'].append(item) + return result + + +def pending_record(unit, cohort, repetition): + return dict(case=unit['id'], family=unit['family'], category=unit['category'], + variant=unit['variant'], input_variables=unit['input_variables'], + model_variables=unit['model_variables'], tier=unit['tier'], stress=unit['stress'], + cohort=cohort, repetition=repetition, attempted=False, completed=False, + proved_within_limit=False, witness_checked=False, expected_objective=unit['objective']) + + +def planned_slots(manifest): + for repetition in range(1, REPETITIONS+1): + for unit in manifest['records']: + for cohort in (('before', 'after') if repetition==1 else ('after', 'before')): + yield unit, cohort, repetition + + +def measure(args, started): + deadline = started+WHOLE_SECONDS + common, generator = modules() + frozen = args.freeze_dir.resolve(strict=True) + manifest, models, frozen_hashes = read_frozen(frozen, args.manifest_sha256, common, generator) + binary = args.binary.resolve(strict=True) + directories = {cohort: [path.resolve(strict=True) for path in paths] for cohort, paths in + (('before', args.before_libraries), ('after', args.after_libraries))} + require(all(path.is_dir() for paths in directories.values() for path in paths), 'Library directory required') + require(not set(directories['before']) & set(directories['after']), 'Library cohorts overlap') + preserved_path = (args.baseline_manifest or directories['before'][0].parent/'manifest.json').resolve(strict=True) + preserved, expected_before = common.baseline_manifest(preserved_path) + destination = args.output_dir.resolve() + destination.mkdir(parents=True, exist_ok=False) + capture = load_module('category_capture', HERE/'benchmark_progress.py').capture_command + replacements = sorted([(str(ROOT), 'REPOSITORY'), (str(frozen), 'FROZEN'), + (str(destination), 'OUTPUT'), (str(binary), 'BINARY')] + + [(str(path), cohort.upper()+'_LIBRARIES') for cohort, paths in directories.items() for path in paths], + key=lambda item: len(item[0]), reverse=True) + def publish(name, value): + write(destination/name, common.public_copy(value, replacements)) + runtime_sources = {str(path.relative_to(ROOT)): sha(path) + for folder in (ROOT/'gecode/optimize', ROOT/'gecode/int/linear') + for path in sorted(folder.rglob('*')) if path.suffix in ('.cpp', '.hpp')} + provenance = dict(driver_name=binary.name, driver_sha256=sha(binary), + source_head=subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True, timeout=2).strip(), + runtime_source_sha256=runtime_sources, measurement_source_sha256=source_hashes(), + frozen_manifest_sha256=args.manifest_sha256, + frozen_protocol_sha256=manifest['protocol_sha256'], preserved_baseline=preserved, cohorts={}) + report = dict(schema_version=1, started_utc=datetime.now(timezone.utc).isoformat(), + expected_runs=EXPECTED_RUNS, protocol=protocol(), frozen_manifest=manifest, + provenance=provenance, comparison_valid=False, loader_probes=[], records=[ + dict(pending_record(unit, cohort, repetition), status='not_run_pending') + for unit, cohort, repetition in planned_slots(manifest)]) + loaded, local = {}, {} + def execute(unit, cohort, label, trace=False): + remaining = deadline-time.monotonic() + require(remaining>0, 'Whole-run allowance exhausted') + command = [str(binary), '--input', str(inside(frozen, unit['txt'])), '--kind', unit['kind'], + '--route', 'native', '--seconds', str(SOLVE_SECONDS)] + environment = {key: value for key, value in os.environ.items() if not key.startswith('DYLD_')} + environment['DYLD_LIBRARY_PATH'] = ':'.join(map(str, directories[cohort])) + if trace: + environment['DYLD_PRINT_LIBRARIES'] = '1' + utc = datetime.now(timezone.utc).isoformat() + offset_start = time.monotonic()-started + outcome = capture(command, destination, environment, min(PROCESS_SECONDS, remaining), max_output=262144) + offset_end = time.monotonic()-started + stdout, stderr = outcome.pop('stdout'), outcome.pop('stderr') + (destination/(label+'.stdout')).write_bytes(stdout) + (destination/(label+'.stderr')).write_bytes(stderr) + outcome.update(started_utc=utc, invocation_offset_start_seconds=offset_start, + invocation_offset_end_seconds=offset_end, + stdout_file=label+'.stdout', stderr_file=label+'.stderr', + command=['BINARY', '--input', unit['txt'], '--kind', unit['kind'], + '--route', 'native', '--seconds', str(SOLVE_SECONDS)]) + return outcome, stdout.decode('utf8', errors='replace'), stderr.decode('utf8', errors='replace') + publish('report.json', report) + for cohort in ('before', 'after'): + probe_record = dict(cohort=cohort, status='pending') + report['loader_probes'].append(probe_record) + publish('report.json', report) + try: + unit = manifest['records'][0] + probe, out, err = execute(unit, cohort, 'provenance-'+cohort, trace=True) + probe_record.update(probe) + publish('report.json', report) # Retain even rejected probe outcomes. + require(probe['returncode']==0 and not probe['hard_timeout'] and not probe['output_limit'], 'Loader probe failed') + checked_observation(common.strict_json(out), unit, models[unit['id']], common, generator) + paths = set() + for line in err.splitlines(): + if 'libgecode' not in line: + continue + require('/' in line, 'Malformed loader trace') + path = Path(line[line.index('/'):].strip()).resolve(strict=True) + require(path.parent in directories[cohort], 'Unexpected mixed runtime library') + paths.add(path) + require(any(path.name=='libgecodeoptimize.dylib' for path in paths), 'No observed Optimize library') + libraries = [dict(name=path.name, sha256=sha(path)) for path in sorted(paths)] + if cohort=='before': + require(all(expected_before.get(item['name'])==item['sha256'] for item in libraries), 'Preserved baseline library differs') + loaded[cohort] = paths + provenance['cohorts'][cohort] = dict(libraries=libraries, loader_probe=probe) + local[cohort] = dict(directories=list(map(str, directories[cohort])), loaded=list(map(str, sorted(paths)))) + if cohort=='after': + facade_hashes = [next(item['sha256'] for item in provenance['cohorts'][name]['libraries'] + if item['name']=='libgecodeoptimize.dylib') for name in ('before', 'after')] + require(facade_hashes[0]!=facade_hashes[1], 'Candidate facade is byte-identical to the preserved baseline') + probe_record['status'] = 'validated' + publish('report.json', report) + except (ValueError, KeyError, TypeError, OverflowError, OSError, RuntimeError) as error: + probe_record.update(status='failed', error=str(error)) + report['records'] = [dict(pending_record(unit, name, repetition), + status='not_run_preflight', error='Loader provenance preflight rejected') + for unit, name, repetition in planned_slots(manifest)] + report.update(preflight_failure=True, elapsed_seconds=time.monotonic()-started, + finished_utc=datetime.now(timezone.utc).isoformat()) + publish('report.json', report) + publish('summary.json', summarize(report['records'], manifest, provenance, False, report['elapsed_seconds'])) + print('Category loader preflight failed:', str(error), flush=True) + return 1 + write(destination/'paths.local.json', dict(binary=str(binary), frozen=str(frozen), + baseline_manifest=str(preserved_path), cohorts=local)) + publish('report.json', report) + for slot, (unit, cohort, repetition) in enumerate(planned_slots(manifest)): + label = f"{unit['id']}-r{repetition}-{cohort}" + record = pending_record(unit, cohort, repetition) + if time.monotonic()>=deadline: + record.update(status='not_run_whole_limit', error='Required case could not start within whole-run allowance') + else: + try: + record['attempted'] = True + outcome, out, err = execute(unit, cohort, label) + record.update(outcome) + if outcome['hard_timeout']: + record['status'] = 'external_timeout' + elif outcome['output_limit']: + record['status'] = 'output_limit' + elif outcome['returncode']!=0: + record['status'] = 'process_error' + else: + record.update(checked_observation(common.strict_json(out), unit, models[unit['id']], common, generator)) + except (ValueError, KeyError, TypeError, OverflowError, OSError, RuntimeError) as error: + record.update(status='validation_error', error=str(error)) + report['records'][slot] = record + publish('report.json', report) + print(label, record['status'], record.get('solve_seconds'), flush=True) + integrity = dict( + frozen_unchanged=all(sha(inside(frozen, name))==digest for name, digest in frozen_hashes.items()), + measurement_source_unchanged=source_hashes()==provenance['measurement_source_sha256'], + runtime_source_unchanged=all(sha(ROOT/name)==digest for name, digest in runtime_sources.items()), + driver_unchanged=sha(binary)==provenance['driver_sha256'], + preserved_manifest_unchanged=sha(preserved_path)==preserved['manifest_sha256'], + libraries_unchanged=all(sha(path)==next(item['sha256'] for item in provenance['cohorts'][cohort]['libraries'] + if item['name']==path.name) + for cohort, paths in loaded.items() for path in paths), + ) + failures = {'not_run_pending', 'not_run_preflight', 'not_run_whole_limit', 'external_timeout', 'output_limit', 'process_error', 'validation_error'} + valid = (all(integrity.values()) and len(report['records'])==EXPECTED_RUNS and time.monotonic()=deadline: + valid = False + report.update(comparison_valid=False, elapsed_seconds=time.monotonic()-started, + final_publication_limit=True) + summary = summarize(report['records'], manifest, provenance, False, report['elapsed_seconds']) + publish('report.json', report) + publish('summary.json', summary) + print('Category panel:', len(report['records']), 'records; comparison valid:', bool(valid)) + return 0 if valid else 1 + + +def main(argv=None): + started = time.monotonic() + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--freeze-only', action='store_true') + parser.add_argument('--freeze-dir', type=Path, required=True) + parser.add_argument('--manifest-sha256') + parser.add_argument('--binary', type=Path) + parser.add_argument('--before-libraries', type=Path, action='append') + parser.add_argument('--after-libraries', type=Path, action='append') + parser.add_argument('--baseline-manifest', type=Path) + parser.add_argument('--output-dir', type=Path) + args = parser.parse_args(argv) + if args.freeze_only: + print(json.dumps(freeze(args.freeze_dir.resolve()), indent=2)) + return 0 + for name in ('manifest_sha256', 'binary', 'before_libraries', 'after_libraries', 'output_dir'): + if not getattr(args, name): + parser.error('--'+name.replace('_', '-')+' is required for measurement') + if sys.platform!='darwin': + parser.error('Measured loader provenance currently requires macOS') + return measure(args, started) + + +if __name__=='__main__': + raise SystemExit(main()) diff --git a/experiments/optimize/benchmark_configured.py b/experiments/optimize/benchmark_configured.py new file mode 100644 index 0000000000..f540520099 --- /dev/null +++ b/experiments/optimize/benchmark_configured.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python3 +"""Compare current ordinary Native/BAB with explicit, frozen family settings. + +The pilot retains every attempted configuration. The separate adaptive run +uses a policy frozen before timing; it does not select a per-instance winner. +Both cohorts load the same accepted solver libraries. All solves receive ten +seconds, with no oracle or supplied start. Earlier studies remain separate. +""" +import argparse +import hashlib +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import time + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] + + +def module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + result = importlib.util.module_from_spec(spec) + spec.loader.exec_module(result) + return result + + +legacy = module('configured_boundary_tools', HERE/'benchmark_boundaries.py') +common, generator, require, sha = legacy.common, legacy.generator, legacy.require, legacy.sha +ROUTES = ('native', 'lp-root', 'lp-cuts', 'lp-updated', 'dfs-reliability', + 'lp-reliability', 'lp-reliability-neighborhood') +PILOT_CASES = (('assignment', 18), ('facility_location', 9), + ('bin_packing', 18), ('production', 12), ('knapsack', 408)) + + +def validate(raw, model, route): + """Independently check original witnesses, model identity and result protocol.""" + require(route in ROUTES, 'Unknown route') + require(type(raw) is dict and type(raw.get('schema_version')) is int and + raw.get('schema_version') == 1 and raw.get('kind') == model['kind'] and + raw.get('route') == route and raw.get('guarantee') == 'exact' and + raw.get('start_submitted') is False, 'Driver protocol mismatch') + lp, reliability, neighborhood = route.startswith('lp-'), 'reliability' in route, route.endswith('-neighborhood') + covers = lp and route != 'lp-root' + expected_backend = ('Gecode native' + (' frontier' if reliability else '') + + (' + checked LP' if lp else '') + (' + BinaryHamming' if neighborhood else '')) + require(raw.get('backend') == expected_backend and type(raw.get('backend_version')) is str and + bool(raw['backend_version']), 'Unexpected backend') + for key in ('model_id', 'revision'): + require(type(raw.get(key)) is int and raw[key] > 0, 'Invalid model identity') + for key in ('solve_seconds', 'backend_solve_seconds', 'build_seconds', 'driver_seconds'): + require(common.finite(raw.get(key)) and raw[key] >= 0, 'Invalid duration') + require(raw['build_seconds'] + raw['solve_seconds'] <= raw['driver_seconds'] + 1e-5, + 'Inconsistent elapsed time') + require(raw['backend_solve_seconds'] <= raw['solve_seconds'] + 1e-5, + 'Backend duration exceeds owning solve') + n, kind = model['n'], model['kind'] + expected = (n, len(model['rows']), 0) if kind == 'binary' else ( + n*(2 if kind == 'native_tsp' else 4), 0 if kind == 'native_tsp' else 2*n, + n+(1 if kind == 'native_tsp' else 3)) + require(all(type(raw.get(k)) is int for k in ('model_columns', 'model_rows', 'model_globals')) and + tuple(raw.get(k) for k in ('model_columns', 'model_rows', 'model_globals')) == expected, + 'Model dimensions differ') + require(raw.get('status') in ('optimal', 'time_limit', 'memory_limit'), + 'Unexpected solver status: '+str(raw.get('status'))) + point = raw.get('has_solution') + require(type(point) is bool and raw.get('solution_validated') is point, 'Presence mismatch') + values, full = raw.get('assignment'), raw.get('full_values') + require(type(values) is list and type(full) is list, 'Missing values') + if point: + require(len(values) == n and len(full) == expected[0] and all( + common.finite(v) and v == round(v) for v in values+full), 'Invalid exact values') + values, full = list(map(int, values)), list(map(int, full)) + checked = generator.validate_assignment(model, values) + require(checked['valid'] and checked['objective'] == raw['objective'], 'Original witness failed') + expected_full = values[:] + if kind == 'weighted_queens': + expected_full += [v for i, x in enumerate(values) for v in (x+i, x-i)] + if kind != 'binary': + expected_full += [model['data'][i][x] for i, x in enumerate(values)] + require(full == expected_full, 'Auxiliary values differ') + else: + require(not values and not full and raw['objective'] is None, 'Absent-point values') + for key in ('objective', 'best_bound', 'absolute_gap', 'relative_gap'): + require(raw.get(key) is None or common.finite(raw[key]), 'Nonfinite scalar') + bound, objective = raw['best_bound'], raw['objective'] + if point and bound is not None: + gap = objective-bound + require(gap >= 0 and raw['absolute_gap'] == gap and + abs(raw['relative_gap']-gap/max(1, abs(objective), abs(bound))) <= 1e-12, + 'Bound/gap inconsistency') + else: + require(raw['absolute_gap'] is None and raw['relative_gap'] is None, 'Gap without both sides') + optimal = raw['status'] == 'optimal' + require(not optimal or (point and bound == objective and raw['absolute_gap'] == 0), + 'Incomplete optimal result') + config = raw.get('algorithm_configuration') + require(type(config) is dict, 'Missing algorithm configuration') + expected_config = dict( + entry_point=('solve_native_neighborhoods' if neighborhood else 'solve_native_search' if reliability + else 'solve_native_lp' if lp else 'solve_native'), + search_order='depth_first' if reliability else 'native_bab', checked_lp=lp, + lp_frequency=('root' if route in ('lp-root', 'lp-cuts') else 'after_bound_changes') if lp else None, + bound_tightening=lp, bound_change_interval=(1 if route in ('lp-root', 'lp-cuts') else 4) if lp else None, + root_cover_cuts=covers, binary_reliability=reliability, neighborhoods=neighborhood, + knapsack_dp_eligible_route=not lp, presolve=False, max_open_nodes=1024 if reliability else None, + cover_settings=dict(max_rounds=4, max_work=4000000, max_cuts=64, max_cut_nonzeros=4096, + max_model_columns=200000, max_model_rows=200000, max_model_nonzeros=2000000, + max_separation_rows=256, max_terms_per_row=512, denominator=1048576) if covers else None, + branching_settings=dict(policy='binary_reliability', max_candidates_per_decision=8, + max_probe_status_calls=128, max_probe_status_calls_per_decision=8, max_branching_work=100000, + reliability_samples=2, max_nonimproving_pairs=2, max_history_entries=4096) if reliability else None, + neighborhood_settings=dict(policy='binary_hamming', radius=4, max_status_calls=128, + max_distance_variables=4096, max_source_entries=100000, max_coordinator_work=100000, + max_local_spaces=64, time_limit_seconds=0.05) if neighborhood else None) + require(json.dumps(config, sort_keys=True, allow_nan=False) == + json.dumps(expected_config, sort_keys=True, allow_nan=False), 'Algorithm configuration differs') + relaxation = raw.get('relaxation') + branching = raw.get('branching') + local = raw.get('neighborhood') + require(all(type(g) is dict for g in (relaxation, branching, local)), 'Missing mechanism statistics') + cover = relaxation.get('root_cover') + require(type(cover) is dict, 'Missing cover statistics') + + def counters(group, names, seconds=()): + require(all(type(group.get(k)) is int and group[k] >= 0 for k in names.split()), + 'Invalid/missing mechanism counter') + require(all(common.finite(group.get(k)) and 0 <= group[k] <= raw['solve_seconds'] + 1e-5 + for k in seconds), 'Invalid mechanism duration') + + counters(relaxation, 'lp_calls valid_bounds rejected_bounds numerical_infeasibility_reports ' + 'certificate_evaluations conditional_checks variable_fixings variable_bound_tightenings', ('lp_seconds',)) + counters(cover, 'rounds augmentations cuts nonzeros work projected_coordinates unsupported_rows ' + 'oversized_rows separated_cuts duplicate_cuts arithmetic_rejections lp_calls valid_bounds ' + 'rejected_bounds numerical_infeasibility_reports', ('lp_seconds',)) + counters(branching, 'decisions manual_splits fallback_decisions probe_status_calls completed_pairs ' + 'published_pairs finite_samples zero_gain_samples failed_directions reliable_candidates ' + 'probe_propagations budget_nodes work history_entries probe_lp_calls', ('probe_lp_seconds',)) + counters(local, 'attempts eligible_variables source_entries coordinator_work status_attempts ' + 'completed_status_calls failed_nodes feasible_candidates accepted_improvements peak_local_spaces ' + 'peak_total_spaces budget_nodes', ('elapsed_seconds',)) + require(cover.get('requested') is covers and branching.get('requested') is reliability and + local.get('requested') is neighborhood, 'Mechanism request differs') + require(cover.get('completion') in ('NotRequested', 'NotStarted', 'NoNewCuts', 'RoundLimit', 'WorkLimit', + 'StorageLimit', 'SeparationLimit', 'Cancelled', 'TimeLimit', 'NoPrimalSuggestion', + 'InvalidSuggestion', 'CallbackError', 'BackendError', 'AllocationFailure'), 'Unknown cover completion') + require(local.get('completion') in ('NotStarted', 'NoIncumbent', 'ProofCompletedBeforeAttempt', + 'NoEligibleBinary', 'NonrestrictingRadius', 'FormulationLimit', 'SourceLimit', 'WorkLimit', + 'StatusLimit', 'SharedNodeReserve', 'LocalStorageLimit', 'LocalTimeLimit', 'NoImprovement', + 'Improved', 'GlobalStop', 'Error'), 'Unknown neighborhood completion') + require('stop_reason' in local and (local['stop_reason'] is None or local['stop_reason'] in + ('time_limit', 'memory_limit', 'node_limit', 'cancelled')), 'Invalid neighborhood stop') + require(cover['lp_calls'] <= relaxation['lp_calls'] and + branching['probe_lp_calls'] <= relaxation['lp_calls'] and + cover['lp_seconds'] <= relaxation['lp_seconds'] + 1e-5 and + branching['probe_lp_seconds'] <= relaxation['lp_seconds'] + 1e-5, + 'LP subset accounting differs') + require(local['attempts'] <= 1 and local['accepted_improvements'] <= local['feasible_candidates'] and + local['completed_status_calls'] <= local['status_attempts'], 'Neighborhood accounting differs') + if not lp: + require(all(v == 0 for k, v in relaxation.items() if k != 'root_cover'), 'LP work on non-LP route') + if not covers: + require(cover['completion'] == 'NotRequested' and all(v == 0 for k, v in cover.items() + if k not in ('requested', 'completion')), 'Unrequested cover work') + if not reliability: + require(all(v == 0 for k, v in branching.items() if k != 'requested'), 'Unrequested branching work') + if not neighborhood: + require(local['completion'] == 'NotStarted' and local['stop_reason'] is None and + all(v == 0 for k, v in local.items() if k not in ('requested', 'completion', 'stop_reason')), + 'Unrequested neighborhood work') + node_keys = ('nodes', 'expanded_nodes', 'budget_nodes', 'peak_open_nodes', 'unresolved_regions') + require(all(k in raw for k in node_keys), 'Missing search counters') + if reliability: + require(all(type(raw[k]) is int and raw[k] >= 0 for k in node_keys), 'Invalid frontier counter') + require(raw['budget_nodes'] == branching['budget_nodes'] == + raw['nodes'] + branching['probe_status_calls'] + local['status_attempts'], + 'Shared node accounting differs') + require(raw['expanded_nodes'] <= raw['nodes'] and raw['peak_open_nodes'] <= config['max_open_nodes'] and + (not optimal or raw['unresolved_regions'] == 0), 'Frontier accounting differs') + if neighborhood: + require(local['budget_nodes'] == raw['budget_nodes'], 'Neighborhood shared budget differs') + else: + require(all(raw[k] is None for k in node_keys), 'Unexpected ordinary-search counters') + return dict(status=raw['status'], passed=optimal and raw['solve_seconds'] <= 10, + primal_checked=point, independent_optimality_verified=False, + backend_reported_optimal=optimal, solve_seconds=raw['solve_seconds'], + objective=objective, best_bound=bound, backend_result=raw) + + +class ConfiguredSearch(legacy.Search): + def passed(self, category, size, cohort, confirmed=False): + """A boundary needs distinct complete observations for every variant.""" + rows = self.rows(category, size, cohort) + variants = ('uncorrelated', 'correlated') if category == 'knapsack' else ('single',) + identities = [(r.get('variant'), r.get('repetition')) for r in rows] + required = {(v, r) for v in variants for r in range(1, 3 if confirmed else 2)} + allowed = {(v, r) for v in variants for r in (1, 2)} + return (len(identities) == len(set(identities)) and required <= set(identities) <= allowed and + all(r.get('passed') is True and r.get('status') == 'optimal' and + r.get('primal_checked') is True and r.get('backend_reported_optimal') is True and + common.finite(r.get('solve_seconds')) and 0 <= r['solve_seconds'] <= 10 + for r in rows)) + + def __init__(self, output, binary, policy_path=None, pilot=False): + self.output = output.resolve() + self.output.mkdir(parents=True, exist_ok=False) + (self.output/'models').mkdir() + self.started = time.monotonic() + self.binary = binary.resolve(strict=True) + build_path = self.binary.parent/'build.local.json' + build = json.loads(build_path.read_text()) + require(build['source_sha256'] == sha(HERE/'configured_benchmark.cpp') and + build['binary_sha256'] == sha(self.binary) and build['runtime_libraries_unchanged'], + 'Driver build identity differs from current source/executable') + require(all(Path(p).is_file() and sha(Path(p)) == h + for p, h in build['runtime_libraries_sha256'].items()), + 'Built driver runtime libraries changed') + policy_path = policy_path.resolve(strict=True) if policy_path else None + self.directories = {c: [ROOT/'build/native-compat/gecode/optimize', ROOT/'build/native-compat'] + for c in ('before', 'after')} + prior = ROOT/'build/category-scaling/results/report.json' + manifest = json.loads((ROOT.parent.parent/'benchmark-site/scripts/category-scaling-evidence.json').read_text()) + require(sha(prior) == manifest['files']['report']['sha256'], 'Prior provenance changed') + old = json.loads(prior.read_text()) + self.expected = {c: old['provenance']['cohorts']['after'] for c in ('before', 'after')} + self.runtime_sources = old['provenance']['runtime_source_sha256'] + self.models, self.records, self.decisions = {}, [], [] + self.policy = json.loads(policy_path.read_text()) if policy_path else None + self.policy_path = policy_path + self.pilot = pilot + paths = [Path(__file__), HERE/'configured_benchmark.cpp', HERE/'build_configured_benchmark.py', + build_path, HERE/'benchmark_boundaries.py', + HERE/'boundary_instances.py', HERE/'category_instances.py', HERE/'scaling_instances.py', + HERE/'benchmark_native_algorithms.py', HERE/'benchmark_progress.py', + ROOT/'experiments/solver-bench/validate.py', ROOT/'experiments/solver-bench/native.py'] + if policy_path: + paths.append(policy_path) + require(set(self.policy['families']) == set(legacy.LIMITS), 'Policy family mismatch') + for family, value in self.policy['families'].items(): + require(value['route'] in ROUTES, 'Unknown policy route') + if value.get('outside_dp_route'): + require(family == 'knapsack' and value['route'] == 'native' and + value['outside_dp_route'] in ROUTES, 'Invalid DP dispatch') + require(pilot != bool(policy_path), 'Choose pilot or a frozen policy') + self.sources = {str(p.relative_to(ROOT)): sha(p) for p in paths} + self.provenance = dict(source_head=subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip(), + sources=self.sources, runtime_sources=self.runtime_sources, + driver_sha256=sha(self.binary), expected_libraries=self.expected, + driver_build=dict(source_sha256=build['source_sha256'], binary_sha256=build['binary_sha256'], + compiler_flags_sha256=build['flags_sha256'], link_metadata_sha256=build['link_metadata_sha256']), + comparison='Same accepted current solver libraries; ordinary settings versus selected explicit settings.') + self.protocol = dict(seconds=10, capture_seconds=11, whole_seconds=legacy.WHOLE_SECONDS, + max_attempts=legacy.MAX_ATTEMPTS, max_sizes_per_category=legacy.MAX_SIZES, + limits=legacy.LIMITS, pilot=pilot, pilot_cases=PILOT_CASES if pilot else None, + candidate_routes=ROUTES if pilot else None, policy=self.policy, + cohort_labels={'before': 'Previous settings', 'after': 'Configured'}, + selection='Pilot is exploratory and preserves every candidate. Adaptive policy is fixed before timing; independent doubling/bisection and adjacent two-repeat confirmation.', + optimality='Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.', + capacity='Largest sampled size with all variants passing both repetitions. Untested sizes remain unknown.', + timing='Steady-clock wall time around the entire owning solve call; ten seconds per solve. No supplied starts.', + generalization='Policy selection and adaptive measurement reuse seeded families; this is not an independent holdout.') + self.complete = False + self.publish() + for name, digest in self.runtime_sources.items(): + require(sha(ROOT/name) == digest, 'Accepted solver source changed') + self.execute('knapsack', 8, 'uncorrelated', 'before', 0, probe=True) + self.execute('knapsack', 8, 'uncorrelated', 'after', 0, probe=True) + + def route(self, category, model, cohort): + if cohort == 'before' or self.pilot: + return 'native' + selected = self.policy['families'][category] + if category == 'knapsack' and not model['parameters']['dp_eligible']: + return selected.get('outside_dp_route', selected['route']) + return selected['route'] + + def execute(self, category, size, variant, cohort, repetition, probe=False, route_override=None): + require(len(self.records) < legacy.MAX_ATTEMPTS and time.monotonic()-self.started < legacy.WHOLE_SECONDS, + 'Whole-run allowance exhausted') + key, model = self.model(category, size, variant) + route = route_override or self.route(category, model, cohort) + label = f'{key}-{cohort}-{route}-r{repetition}' + record = dict(case=key, category=category, size=size, variant=variant, cohort=cohort, + repetition=repetition, route=route, probe=probe, status='pending', passed=False) + self.records.append(record) + self.publish() + env = {k: v for k, v in os.environ.items() if not k.startswith('DYLD_')} + directories = self.directories['after'] + env['DYLD_LIBRARY_PATH'] = ':'.join(map(str, directories)) + if probe: + env['DYLD_PRINT_LIBRARIES'] = '1' + command = [str(self.binary), '--input', str(self.output/'models'/(key+'.txt')), + '--kind', model['kind'], '--route', route, '--seconds', '10'] + record['offset_start'] = time.monotonic()-self.started + try: + raw = legacy.capture(command, self.output, env, + min(11, legacy.WHOLE_SECONDS-record['offset_start']), max_output=262144) + record['offset_end'] = time.monotonic()-self.started + stdout, stderr = raw.pop('stdout'), raw.pop('stderr') + (self.output/(label+'.stdout')).write_bytes(stdout) + (self.output/(label+'.stderr')).write_bytes(stderr) + record.update(raw) + require(raw['returncode'] == 0 and not raw['hard_timeout'] and not raw['output_limit'], + 'Process capture failed: '+stderr.decode(errors='replace')[:500]) + record.update(validate(common.strict_json(stdout.decode()), model, route)) + if probe: + loaded = set() + for line in stderr.decode().splitlines(): + if 'libgecode' not in line: + continue + p = Path(line[line.index('/'):].strip()).resolve(strict=True) + require(p.parent in directories, 'Mixed loader paths') + loaded.add((p.name, sha(p))) + expected = {(x['name'], x['sha256']) for x in self.expected['after']['libraries']} + require(loaded == expected, 'Loaded product differs from accepted current libraries') + self.provenance[cohort+'_loaded'] = sorted(loaded) + peers = [r['objective'] for r in self.records if r['case'] == key and r.get('backend_reported_optimal')] + require(len(set(peers)) <= 1, 'Reported optima disagree') + if peers: + for peer in (r for r in self.records if r['case'] == key): + require(peer.get('objective') is None or peer['objective'] >= peers[0], 'Feasible peer contradicts optimum') + require(peer.get('best_bound') is None or peer['best_bound'] <= peers[0], 'Peer bound contradicts optimum') + except Exception as error: + record.update(status='error', error=str(error), passed=False) + self.publish() + raise + self.publish() + print(label, record['status'], round(record.get('solve_seconds', 0), 6), flush=True) + + def integrity(self): + self.provenance['integrity'] = dict( + sources_unchanged=all(sha(ROOT/p) == h for p, h in self.sources.items()), + runtime_sources_unchanged=all(sha(ROOT/p) == h for p, h in self.runtime_sources.items()), + driver_unchanged=sha(self.binary) == self.provenance['driver_sha256'], + models_unchanged=all(sha(self.output/'models'/(k+'.json')) == v['json_sha256'] and + sha(self.output/'models'/(k+'.txt')) == v['txt_sha256'] for k, v in self.models.items()), + libraries_unchanged=all(any((d/x['name']).is_file() and sha(d/x['name']) == x['sha256'] + for d in self.directories['after']) for x in self.expected['after']['libraries'])) + require(all(self.provenance['integrity'].values()), 'Measurement integrity failed') + + def run_pilot(self): + for category, size in PILOT_CASES: + for route in ROUTES: + variants = ('uncorrelated', 'correlated') if category == 'knapsack' else ('single',) + for variant in variants: + self.execute(category, size, variant, route, 1, route_override=route) + self.integrity() + self.complete = True + self.publish() + print('Pilot complete:', len(self.records)-2, 'measurements', flush=True) + + def run(self): + # Use the existing independent search policy, but verify this new driver + # against its own frozen identity rather than the historical executable. + original_hash = legacy.DRIVER_HASH + legacy.DRIVER_HASH = self.provenance['driver_sha256'] + try: + super().run() + finally: + legacy.DRIVER_HASH = original_hash + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output-dir', type=Path, required=True) + parser.add_argument('--binary', type=Path, required=True) + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--pilot', action='store_true') + group.add_argument('--policy', type=Path) + args = parser.parse_args() + study = ConfiguredSearch(args.output_dir, args.binary, args.policy, args.pilot) + study.run_pilot() if args.pilot else study.run() diff --git a/experiments/optimize/benchmark_final.py b/experiments/optimize/benchmark_final.py new file mode 100644 index 0000000000..51557cbaac --- /dev/null +++ b/experiments/optimize/benchmark_final.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +"""One serial three-cohort study; ten seconds includes all automatic racing work. + +Each cohort gets independent bracketing/bisection and two-repeat boundary checks. +This samples seeded families; difficulty need not be monotonic and a tested ceiling +is not a solver limit. Original witnesses are independently checked; exact optimal +status is backend-reported, not an independently proved optimum. No timing result +is selected from alternative configured routes. Historical artifacts stay intact. +""" +import argparse +import json +import os +from pathlib import Path +import subprocess +import time + +import benchmark_configured as configured + +legacy, common, generator = configured.legacy, configured.common, configured.generator +ROOT, HERE, sha, require = configured.ROOT, configured.HERE, configured.sha, configured.require +COHORTS = ('before', 'auto', 'configured') +legacy.COHORTS = COHORTS +legacy.MAX_ATTEMPTS = 720 +legacy.WHOLE_SECONDS = 3600 +# Retain the earlier preregistered domains so the final comparison is comparable. + + +def validate(raw, model, route): + if route != 'auto-race': + return configured.validate(raw, model, route) + require(raw.get('route') == route and raw.get('backend', '').startswith('Gecode native'), + 'Automatic driver route/backend differs') + require(raw.get('algorithm_configuration') == dict(entry_point='solve_native_race', + exploration_seconds=2, probe_node_limit=4096, + candidates=['structural_auto', 'ordinary_native'], presolve='automatic', + components='automatic', symmetry='identical_columns', cpu_warning=True), + 'Automatic racing configuration differs') + # Shared witness/gap/status validation; only the explicitly different route + # metadata is normalized for the established original-model validator. + normalized = dict(raw, route='native', backend='Gecode native') + checked = legacy.validate(normalized, model) + require(common.finite(raw.get('backend_solve_seconds')) and + 0 <= raw['backend_solve_seconds'] <= raw['solve_seconds'] + 1e-5, + 'Invalid owning solve duration') + checked['backend_result'] = raw + return checked + + +class FinalSearch(configured.ConfiguredSearch): + def __init__(self, output, binary, runtime, policy): + self.output = output.resolve() + self.output.mkdir(parents=True, exist_ok=False) + (self.output/'models').mkdir() + self.started = time.monotonic() + self.binary = binary.resolve(strict=True) + self.old_binary = ROOT/'build/capacity-scaling/fixed-driver/optimize-native-benchmark' + self.runtime = runtime.resolve(strict=True) + self.directories = { + 'before': [ROOT/'build/comparison-algorithms/before/lib'], + 'auto': [self.runtime/'gecode/optimize', self.runtime], + 'configured': [self.runtime/'gecode/optimize', self.runtime]} + old = json.loads((ROOT/'build/category-scaling/results/report.json').read_text()) + old_manifest = ROOT/'build/comparison-algorithms/before/manifest.json' + frozen = json.loads(old_manifest.read_text()) + require(frozen['source_head'] == '530a3b7837205d8255c6640425018831d3f8ee0e' and + frozen['compiled_product'] == 'c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60', + 'Unexpected original pre-algorithm baseline') + require(all(sha(old_manifest.parent/p['copy']) == p['sha256'] for p in frozen['files']), + 'Preserved original baseline changed') + require(sha(self.old_binary) == legacy.DRIVER_HASH, 'Original driver changed') + build_path = self.binary.parent/'build.local.json' + build = json.loads(build_path.read_text()) + require(build['source_sha256'] == sha(HERE/'final_benchmark.cpp') and + build['binary_sha256'] == sha(self.binary) and build['runtime_libraries_unchanged'], + 'Current driver build differs') + self.current_libraries = build['runtime_libraries_sha256'] + require(all(sha(Path(p)) == h for p, h in self.current_libraries.items()), + 'Current runtime differs from driver build') + current = [{'name': Path(p).name, 'sha256': h} for p, h in self.current_libraries.items() + if Path(p).name.startswith(('libgecodeoptimize.', 'libgecodeint.', + 'libgecodekernel.', 'libgecodesearch.', 'libgecodesupport.'))] + self.expected = {'before': old['provenance']['cohorts']['before'], + 'auto': {'libraries': current}, 'configured': {'libraries': current}} + self.policy = json.loads(policy.resolve(strict=True).read_text()) + require(set(self.policy['families']) == set(legacy.LIMITS), 'Policy families differ') + self.models, self.records, self.decisions = {}, [], [] + paths = [HERE/name for name in ('benchmark_final.py', 'final_benchmark.cpp', + 'build_final_benchmark.py', 'export_final_benchmark.py', 'benchmark_configured.py', 'configured_benchmark.cpp', + 'benchmark_boundaries.py', 'boundary_instances.py', 'category_instances.py', + 'scaling_instances.py', 'benchmark_native_algorithms.py', 'benchmark_progress.py')] + paths += [policy.resolve(), build_path, ROOT/'experiments/solver-bench/validate.py', + ROOT/'experiments/solver-bench/native.py'] + self.sources = {str(p.relative_to(ROOT)): sha(p) for p in paths} + self.runtime_sources = {str(p.relative_to(ROOT)): sha(p) for p in + (ROOT/'gecode/optimize').glob('*') if p.suffix in ('.hpp', '.cpp')} + self.provenance = dict(source_head=subprocess.check_output(['git','rev-parse','HEAD'], + cwd=ROOT,text=True).strip(), sources=self.sources, runtime_sources=self.runtime_sources, + driver_sha256=sha(self.binary), original_driver_sha256=sha(self.old_binary), + original_manifest_sha256=sha(old_manifest), original_source_head=frozen['source_head'], + original_compiled_product=frozen['compiled_product'], expected_libraries=self.expected, + comparison='Fresh serial observations: preserved pre-algorithm native baseline; current automatic racing; current frozen family presets.', + current_runtime_libraries_sha256={str(Path(p).relative_to(ROOT)):h for p,h in self.current_libraries.items()}, + driver_build={k:v for k,v in build.items() if k!='runtime_libraries_sha256'}) + self.protocol = dict(seconds=10, capture_seconds=11, whole_seconds=legacy.WHOLE_SECONDS, + max_attempts=legacy.MAX_ATTEMPTS, max_sizes_per_category=legacy.MAX_SIZES, + limits=legacy.LIMITS, policy=self.policy, + cohort_labels={'before':'Original Gecode','auto':'Auto + race','configured':'Configured'}, + selection='Independent anchor/doubling/bisection; adjacent two-repeat confirmation. Frozen family presets, no per-instance route selection. All discovery observations retained.', + capacity='Largest sampled size passing both repetitions and every variant. Bisection assumes local monotonicity only as a sampling heuristic; reversals are reported. A ceiling is a lower bound on capacity, not a measured solver maximum.', + timing='One thread, serial processes, steady-clock wall time around the entire owning solve; ten seconds includes all race probes, restart and selected search. No supplied starts.', + automatic_racing=dict(exploration_seconds=2,probe_node_limit=4096, + candidates=['structural_auto','ordinary_native'], + warning='Exploration and restarting can increase total CPU use or solve time; an effective strategy can pay back that cost on longer solves.'), + optimality='Backend-reported exact optimum; original witness independently checked. No independent optimum oracle.', + generalization='Same deterministic seeded families as earlier policy selection, not an independent holdout.') + self.complete = False + self.publish() + for cohort in COHORTS: + self.execute('knapsack',8,'uncorrelated',cohort,0,probe=True) + + def route(self, category, model, cohort): + if cohort == 'before': return 'native' + if cohort == 'auto': return 'auto-race' + selected = self.policy['families'][category] + # Compact current DP has a larger exact admission window. This preset + # deliberately uses native DP for every knapsack size in the frozen domain. + return selected['route'] + + def execute(self, category, size, variant, cohort, repetition, probe=False): + require(len(self.records) < legacy.MAX_ATTEMPTS and time.monotonic()-self.started < legacy.WHOLE_SECONDS, + 'Preregistered whole-run allowance exhausted') + key, model = self.model(category,size,variant) + route = self.route(category,model,cohort) + label = f'{key}-{cohort}-{route}-r{repetition}' + record = dict(case=key,category=category,size=size,variant=variant,cohort=cohort, + repetition=repetition,route=route,probe=probe,status='pending',passed=False) + self.records.append(record); self.publish() + env = {k:v for k,v in os.environ.items() if not k.startswith('DYLD_')} + env['DYLD_LIBRARY_PATH'] = ':'.join(map(str,self.directories[cohort])) + if probe: env['DYLD_PRINT_LIBRARIES'] = '1' + binary = self.old_binary if cohort == 'before' else self.binary + command = [str(binary),'--input',str(self.output/'models'/(key+'.txt')), + '--kind',model['kind'],'--route',route,'--seconds','10'] + record['offset_start'] = time.monotonic()-self.started + try: + captured = legacy.capture(command,self.output,env, + min(11,legacy.WHOLE_SECONDS-record['offset_start']),max_output=262144) + record['offset_end'] = time.monotonic()-self.started + stdout,stderr = captured.pop('stdout'),captured.pop('stderr') + (self.output/(label+'.stdout')).write_bytes(stdout) + (self.output/(label+'.stderr')).write_bytes(stderr) + record.update(captured) + require(captured['returncode']==0 and not captured['hard_timeout'] and not captured['output_limit'], + 'Process capture failed: '+stderr.decode(errors='replace')[:500]) + raw = common.strict_json(stdout.decode()) + record.update(legacy.validate(raw,model) if cohort=='before' else validate(raw,model,route)) + if probe: + loaded=set() + for line in stderr.decode().splitlines(): + if 'libgecode' not in line: continue + p=Path(line[line.index('/'):].strip()).resolve(strict=True) + require(p.parent in self.directories[cohort], 'Mixed loader paths') + loaded.add((p.name,sha(p))) + expected={(p['name'],p['sha256']) for p in self.expected[cohort]['libraries']} + require(loaded==expected,'Loaded runtime differs: '+str((loaded,expected))) + self.provenance[cohort+'_loaded']=sorted(loaded) + peers=[r['objective'] for r in self.records if r['case']==key and r.get('backend_reported_optimal')] + require(len(set(peers))<=1,'Reported exact optima disagree across cohorts') + if peers: + for r in (r for r in self.records if r['case']==key): + require(r.get('objective') is None or r['objective']>=peers[0], 'Witness contradicts optimum') + require(r.get('best_bound') is None or r['best_bound']<=peers[0], 'Bound contradicts optimum') + except Exception as error: + record.update(status='error',error=str(error),passed=False); self.publish(); raise + self.publish() + print(label,record['status'],round(record.get('solve_seconds',0),6),flush=True) + + def run(self): + # Reuse the frozen size-search algorithm with the three explicit cohorts. + # Its final source/model/library audit checks runtime_sources (every current + # optimize .cpp/.hpp hash) and loader hashes for all three runtimes. + previous=legacy.DRIVER_HASH + legacy.DRIVER_HASH=self.provenance['driver_sha256'] + try: legacy.Search.run(self) + finally: legacy.DRIVER_HASH=previous + self.provenance['integrity']['original_driver_unchanged'] = sha(self.old_binary)==self.provenance['original_driver_sha256'] + self.provenance['integrity']['all_current_libraries_unchanged'] = all(sha(Path(p))==h for p,h in self.current_libraries.items()) + self.complete = all(self.provenance['integrity'].values()) + self.publish() + require(self.complete, 'Post-run driver/runtime integrity failed') + + +if __name__=='__main__': + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output-dir',type=Path,required=True) + parser.add_argument('--binary',type=Path,required=True) + parser.add_argument('--runtime-build',type=Path,required=True) + parser.add_argument('--policy',type=Path,default=HERE/'final-policy.json') + args=parser.parse_args() + FinalSearch(args.output_dir,args.binary,args.runtime_build,args.policy).run() diff --git a/experiments/optimize/benchmark_native_algorithms.py b/experiments/optimize/benchmark_native_algorithms.py new file mode 100644 index 0000000000..cef6280590 --- /dev/null +++ b/experiments/optimize/benchmark_native_algorithms.py @@ -0,0 +1,508 @@ +#!/usr/bin/env python3 +"""Fixed native before/after panel: existing inputs, one binary, owning exact APIs. + +Run only after all project builds/tests are quiet. No build, fetch or source +mutation occurs. --freeze-only validates immutable inputs and writes their +manifest without launching a process. Measured runs use three alternating pairs, +two-second solver limits, three-second child limits and a 240-second outer cap. + +Example from the repository root, after building optimize-native-benchmark: + python3 experiments/optimize/benchmark_native_algorithms.py \\ + --binary build/native-compat/bin/optimize-native-benchmark \\ + --before-libraries build/comparison-algorithms/before/lib \\ + --after-libraries build/native-compat/gecode/optimize \\ + --after-libraries build/native-compat \\ + --output-dir build/comparison-algorithms/results + +The before directory must match its preserved manifest; building today's source +does not reconstruct that historical product. Directory options may be repeated. +The output directory must not exist. summary.json/report.json omit host paths; +paths.local.json and raw stderr retain local reproduction details. The eight +stored reference optima are hash-pinned and their witnesses are revalidated, +not recomputed or passed to the solver. Ordinary node counts are unavailable. +""" +import argparse +from datetime import datetime, timezone +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import re +import statistics +import subprocess +import sys +import time + +sys.dont_write_bytecode = True +ROOT = Path(__file__).resolve().parents[2] +SUITE = ROOT / 'experiments/solver-bench' +FROZEN_INPUTS = [ + { + "id": "test_knapsack_large_1312000", + "kind": "binary", + "stem": "instances/test_knapsack_large_1312000", + "json_sha256": "7058d2ad2e22d58f800c860f451b73f916ddb326974fd0c21432b9af5e8e63cd", + "txt_sha256": "78b2364ca6925017ca930517489c7fc56cf6e908c7c8e033e2a2e1c254a9e28e", + "objective": -2464, + "semantic_sha256": "0e974e09f297a80d3615b5468c02b9b2e504de97e79deba0b7e46bb0efd31741" + }, + { + "id": "test_facility_location_large_1812000", + "kind": "binary", + "stem": "instances/test_facility_location_large_1812000", + "json_sha256": "b93e5c15d83bff49cd4aee1dde60df72638a37d4674299e3629fa01406659d65", + "txt_sha256": "e627b916143364e246990b9451164c9f3b1c1ec98730680b91ad1a0d06bb46a1", + "objective": 240, + "semantic_sha256": "e1860a148b48ab19be2fb3d23d4e3323b958ee0f969c32b843e02074f4853af2" + }, + { + "id": "test_assignment_large_2012000", + "kind": "binary", + "stem": "instances/test_assignment_large_2012000", + "json_sha256": "86186c3a82b3012c48da2d5362e354bbc32ff8d7c163df6e31f79b7e6d68da78", + "txt_sha256": "785ac7cb5bcea26a813715f5cfe593eb80ca512aa6928d1444d32ee61b60bdf1", + "objective": 164, + "semantic_sha256": "125ff7049cca1b7fa457c9c147a513a04875d81d2179bf8272d91242e2afee05" + }, + { + "id": "test_tsp_large_2412000", + "kind": "binary", + "stem": "instances/test_tsp_large_2412000", + "json_sha256": "984de574f27830e6cb7b5ce94383b335ed90624c9963d8da31c9e243dfa8eb45", + "txt_sha256": "1659002ab70dd6ba37bef182d0577654542ad810d227a450998a3b59cae8afdd", + "objective": 168, + "semantic_sha256": "ee5430e34e118638173bf3373858eb42d0c6fa4cf710420fac97d4dd74d481a8" + }, + { + "id": "test_production_large_2712000", + "kind": "binary", + "stem": "instances/test_production_large_2712000", + "json_sha256": "d6e359a10be09c35a9ee2c8b53b15c16ce6bd7defcb90f572d70ca261104e87a", + "txt_sha256": "5991ecd6e9795e3084780551212c3e93722b63bb6c6bb3e0bb59c628aeed25a8", + "objective": 512, + "semantic_sha256": "aec49df05779029d8b78b322837a807a6c2401081abbc004692db664c80f7030" + }, + { + "id": "test_bin_packing_small_2202000", + "kind": "binary", + "stem": "instances/test_bin_packing_small_2202000", + "json_sha256": "cb6b44423fd1f72565301576a6da35360d66e39a2a23a964ca641bf2a4ba09ba", + "txt_sha256": "dc779b85821f0b752eb2bb5313f3cffdce03474dc39620545e0baaf368780943", + "objective": 3, + "semantic_sha256": "f2b1b623a08201a1d16b003201fa02bedd2d64ae93c581ac06c75145f752827c" + }, + { + "id": "test_native_tsp_large_9112000", + "kind": "native_tsp", + "stem": "native-instances/test_native_tsp_large_9112000", + "json_sha256": "7946df28b5f4f2a85db52932c3a61431c8dcf950709fed69d2969e8a9d238dec", + "txt_sha256": "b8c212e821fe3d5f2a90035898b8bcf295fdd8fb41e71f134c55db587bb289b8", + "objective": 390, + "semantic_sha256": "97070e1d2126f3dea60fe61a7ec586b8ce8c86b38e3d739b9ef360bda14961e3" + }, + { + "id": "test_weighted_queens_large_9312000", + "kind": "weighted_queens", + "stem": "native-instances/test_weighted_queens_large_9312000", + "json_sha256": "47d48e4ad3ed2cd384ffab6111570081801af12c4b1e4f7ab811b05c08c45bca", + "txt_sha256": "d6c023e6f6b2ae1e61bde3228337c4b84a596440e9a46edfe446b1bd6c79ba1a", + "objective": 129, + "semantic_sha256": "7ee39f26c494d0d5bfd66cb8f4113acdf9d7d959abdf3f9c08c08721a15dba0f" + } +] +REPETITIONS, SOLVE_SECONDS, PROCESS_SECONDS, WHOLE_SECONDS = 3, 2, 3, 240 +BASELINE_SOURCE = '530a3b7837205d8255c6640425018831d3f8ee0e' +BASELINE_COMPILED = 'c2fabb78f1fc3bcfd7432eb71cfdb22656cd3f60' + + +def sha(path): + digest = hashlib.sha256() + with path.open('rb') as stream: + for block in iter(lambda: stream.read(1024*1024), b''): + digest.update(block) + return digest.hexdigest() + + +def write(path, value): + path.write_text(json.dumps(value, indent=2, allow_nan=False)+'\n', encoding='utf8') + + +def module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + loaded = importlib.util.module_from_spec(spec) + spec.loader.exec_module(loaded) + return loaded + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def strict_json(text): + def number(token): + value = float(token) + require(math.isfinite(value), 'Nonfinite JSON number') + return value + def object_pairs(pairs): + result = {} + for key, value in pairs: + require(key not in result, 'Duplicate JSON field: '+key) + result[key] = value + return result + return json.loads(text, parse_float=number, object_pairs_hook=object_pairs, + parse_constant=lambda token: number(token)) + + +def expected_binary_text(model): + lines = [f"{model['n']} {len(model['rows'])}", ' '.join(map(str, model['c']))] + for row in model['rows']: + lines.append(' '.join(map(str, [row['b'], len(row['a'])] + + [item for pair in row['a'] for item in pair]))) + present = 'incumbent' in model + lines.append('incumbent '+str(int(present))) + if present: + lines.append(' '.join(map(str, model['incumbent']))) + return '\n'.join(lines)+'\n' + + +def expected_native_text(model): + n = model['size'] + return (f"{model['family']} {n} {model.get('machines',0)} {n}\n" + + ' '.join(str(value) for row in model['data'] for value in row)+'\n' + + ' '.join(map(str, model['incumbent']))+'\n') + + +def prepare_inputs(): + # Existing independent mathematical validators; no Optimize/compiler oracle. + sys.path.insert(0, str(SUITE)) + import validate + import native + models, manifest = {}, [] + for item in FROZEN_INPUTS: + jp, tp = (SUITE/(item['stem']+suffix) for suffix in ('.json', '.txt')) + require(sha(jp) == item['json_sha256'] and sha(tp) == item['txt_sha256'], + 'Frozen input bytes changed: '+item['id']) + model = strict_json(jp.read_text()) + encoded = expected_binary_text(model) if item['kind']=='binary' else expected_native_text(model) + require(encoded == tp.read_text(), 'TXT/JSON semantic mismatch: '+item['id']) + semantic = validate.input_hash(model) if item['kind']=='binary' else native.mathematical_hash(model) + require(semantic == item['semantic_sha256'] == model['reference']['input_sha256'], + 'Reference identity mismatch: '+item['id']) + require(model['reference']['status']=='optimal' and model['reference']['objective']==item['objective'], + 'Frozen independent optimum mismatch') + # Exact references were generated before this comparison. Freeze their + # complete JSON bytes and validate the retained witness independently; + # do not spend the run allowance repeating DP/Held-Karp enumeration. + checker = validate if item['kind']=='binary' else native + witness = checker.validate_assignment(model, model['reference']['assignment']) + require(witness['valid'] and witness['objective']==item['objective'], + 'Stored independent optimum witness failed: '+item['id']) + models[item['id']] = model + manifest.append(dict(item, reference_method=model['reference']['method'], + input_variables=model['n'], reference_record_verified=True, + reference_witness_checked=True, reference_recomputed=False)) + return models, manifest, validate, native + + +def units(): + return [dict(item, route='native', unit=item['id']+'-native') for item in FROZEN_INPUTS] + [ + dict(FROZEN_INPUTS[index], route='dfs', unit=FROZEN_INPUTS[index]['id']+'-dfs') for index in (0,5)] + + +def finite(value): + return type(value) in (int,float) and math.isfinite(value) + + +def checked_result(raw, unit, model, binary_validator, native_validator): + require(type(raw.get('schema_version')) is int and raw['schema_version']==1 and + raw.get('kind')==unit['kind'] and raw.get('route')==unit['route'], + 'Driver identity/protocol mismatch') + expected_backend = 'Gecode native' if unit['route']=='native' else 'Gecode native frontier' + require(raw.get('guarantee')=='exact' and raw.get('backend')==expected_backend, + 'Wrong backend or guarantee') + require(isinstance(raw.get('backend_version'),str) and raw['backend_version'], + 'Missing backend version') + require(raw.get('start_submitted') is False, 'Unexpected solver start') + require(type(raw.get('model_id')) is int and raw['model_id']>0 and + type(raw.get('revision')) is int and raw['revision']>=0, 'Invalid original identity') + for name in ('build_seconds','solve_seconds','driver_seconds'): + require(finite(raw.get(name)) and raw[name]>=0, 'Invalid elapsed time') + require(raw['build_seconds']+raw['solve_seconds']<=raw['driver_seconds']+1e-6, + 'Inconsistent driver/solve elapsed times') + for name in ('objective','best_bound','absolute_gap','relative_gap'): + require(raw.get(name) is None or finite(raw[name]), 'Invalid scalar '+name) + require(raw.get('absolute_gap') is None or raw['absolute_gap']>=0, 'Negative gap') + require(raw.get('relative_gap') is None or raw['relative_gap']>=0, 'Negative gap') + status = raw.get('status') + require(status in ('optimal','time_limit','node_limit','memory_limit','cancelled','unknown'), + 'Unsupported/error or impossible source status: '+str(status)) + n = model['n'] + expected_columns = n if unit['kind']=='binary' else n*(2 if unit['kind']=='native_tsp' else 4) + expected_rows = len(model['rows']) if unit['kind']=='binary' else (0 if unit['kind']=='native_tsp' else 2*n) + expected_globals = 0 if unit['kind']=='binary' else n+(1 if unit['kind']=='native_tsp' else 3) + require((raw.get('model_columns'),raw.get('model_rows'),raw.get('model_globals')) == + (expected_columns,expected_rows,expected_globals), 'Compiled workload dimensions differ') + if unit['route']=='native': + require(all(raw.get(k) is None for k in ('nodes','expanded_nodes','budget_nodes','peak_open_nodes','unresolved_regions')), + 'Ordinary solve invented unavailable counters') + else: + for name in ('nodes','expanded_nodes','budget_nodes','peak_open_nodes','unresolved_regions'): + require(type(raw.get(name)) is int and raw[name]>=0, 'Invalid frontier counter') + require(raw['nodes']==raw['budget_nodes'] and raw['expanded_nodes']<=raw['nodes'] and + raw['peak_open_nodes']<=1024, 'Frontier accounting mismatch') + point = raw.get('has_solution') + require(type(point) is bool and type(raw.get('solution_validated')) is bool, 'Invalid presence flag') + require(raw['solution_validated']==point, 'Solution presence disagreement') + assignment, full = raw.get('assignment'), raw.get('full_values') + require(type(assignment) is list and type(full) is list, 'Missing assignments') + checked = False + if point: + require(len(assignment)==n and len(full)==expected_columns, 'Original assignment length') + require(all(finite(v) and v==round(v) for v in assignment+full), 'Nonintegral/nonfinite exact assignment') + assignment = list(map(int, assignment));full = list(map(int, full)) + validation = (binary_validator if unit['kind']=='binary' else native_validator).validate_assignment(model, assignment) + require(validation['valid'] and validation['objective']==raw['objective'], 'Independent original witness/objective failed') + expected_full = assignment[:] + if unit['kind']=='weighted_queens': + expected_full += [value for i,x in enumerate(assignment) for value in (x+i,x-i)] + if unit['kind']!='binary': + expected_full += [model['data'][i][x] for i,x in enumerate(assignment)] + require(full==expected_full, 'Original/auxiliary global assignment mapping failed') + require(raw['objective']>=unit['objective'], 'Incumbent contradicts independent minimum') + checked = True + else: + require(not assignment and not full and raw['objective'] is None, 'Unexpected absent-point data') + bound = raw['best_bound'] + if bound is not None: + require(bound<=unit['objective'] and (not point or bound<=raw['objective']), 'Bound contradicts original optimum') + if point and bound is not None: + gap = abs(raw['objective']-bound) + require(raw['absolute_gap']==gap and abs(raw['relative_gap']-gap/max(1,abs(raw['objective']),abs(bound)))<=1e-12, + 'Reported gap inconsistent') + else: + require(raw['absolute_gap'] is None and raw['relative_gap'] is None, 'Gaps without both sides') + completed = status=='optimal' + if completed: + require(point and raw['objective']==unit['objective'] and bound==raw['objective'], + 'Claimed optimum differs from independent oracle') + if unit['route']=='dfs':require(raw['unresolved_regions']==0, 'Completed frontier remains unresolved') + return dict(completed=completed, witness_checked=checked, status=status, + objective=raw['objective'], best_bound=bound, + absolute_primal_gap_to_oracle=(raw['objective']-unit['objective']) if point else None, + solve_seconds=raw['solve_seconds'], nodes=raw['nodes'], backend_result=raw) + + +def baseline_manifest(path): + data = strict_json(path.read_text(encoding='utf8')) + require(data.get('source_head')==BASELINE_SOURCE and + data.get('compiled_product')==BASELINE_COMPILED, + 'Preserved baseline source/product identity differs') + libraries = {} + for entry in data['files']: + relative = Path(entry['copy']) + require(not relative.is_absolute() and '..' not in relative.parts, + 'Malformed preserved baseline entry') + if relative.parent != Path('lib'): + continue + name, digest = relative.name, entry['sha256'] + require(re.fullmatch(r'[0-9a-f]{64}', digest) is not None, + 'Malformed preserved baseline digest') + require(name not in libraries or libraries[name]==digest, + 'Conflicting preserved baseline entries') + libraries[name] = digest + require('libgecodeoptimize.dylib' in libraries, 'Preserved baseline facade missing') + return dict(manifest_sha256=sha(path), source_head=BASELINE_SOURCE, + compiled_product=BASELINE_COMPILED), libraries + + +def public_copy(value, replacements): + """Keep host paths only in *.local.json and raw process logs.""" + if isinstance(value, str): + for source, replacement in replacements: + value = value.replace(source, replacement) + # Diagnostics can include an unexpected OS path; it is not provenance. + return re.sub(r'/(?:Users|private|home|tmp|Volumes)/[^\s\"\']+', '', value) + if isinstance(value, dict): + return {key: public_copy(item,replacements) for key,item in value.items()} + if isinstance(value, list): + return [public_copy(item,replacements) for item in value] + return value + + +def main(argv=None): + started=time.monotonic();deadline=started+WHOLE_SECONDS + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--before-libraries',type=Path,action='append',required=True) + parser.add_argument('--after-libraries',type=Path,action='append',required=True) + parser.add_argument('--binary',type=Path,required=True) + parser.add_argument('--output-dir',type=Path,required=True) + parser.add_argument('--baseline-manifest',type=Path, + help='Defaults to ../manifest.json beside the first before-library directory') + parser.add_argument('--freeze-only',action='store_true') + args=parser.parse_args(argv) + if sys.platform!='darwin':parser.error('Actual dyld runtime provenance is macOS-specific') + dest=args.output_dir.resolve();dest.mkdir(parents=True,exist_ok=False) + models, inputs, validator, native_validator=prepare_inputs() + write(dest/'inputs.json',inputs) + panel=units() + write(dest/'protocol.json',dict(schema_version=1,units=[u['unit'] for u in panel],repetitions=REPETITIONS, + solver_seconds=SOLVE_SECONDS,process_seconds=PROCESS_SECONDS,whole_seconds=WHOLE_SECONDS, + backend='Native',guarantee='Exact',threads=1,random_seed=0, + absolute_gap=0,relative_gap=0, + warm_start=False,baseline_source=BASELINE_SOURCE, + baseline_compiled=BASELINE_COMPILED, + frontier='DepthFirst, no optional branching/LP, max_open_nodes1024', + ordinary_nodes='Not present in SolveResult; reported as null',inputs=inputs)) + if args.freeze_only: + print('Frozen 10 units and 8 independent input/oracle pairs; no subprocess launched.');return 0 + binary=args.binary.resolve(strict=True) + directories={c:[p.resolve(strict=True) for p in paths] for c,paths in + [('before',args.before_libraries),('after',args.after_libraries)]} + for paths in directories.values():require(all(p.is_dir() for p in paths),'Library directory required') + require(not set(directories['before'])&set(directories['after']),'Cohorts must have distinct library directories') + preserved_path = (args.baseline_manifest or directories['before'][0].parent/'manifest.json').resolve(strict=True) + preserved, expected_baseline = baseline_manifest(preserved_path) + replacements = sorted([(str(binary),'BINARY'),(str(dest),'OUTPUT'),(str(ROOT),'REPOSITORY')] + + [(str(path),cohort.upper()+'_LIBRARIES') + for cohort,paths in directories.items() for path in paths], + key=lambda pair:len(pair[0]), reverse=True) + def publish(path,value): + write(path,public_copy(value,replacements)) + capture=module('native_benchmark_capture',Path(__file__).with_name('benchmark_progress.py')).capture_command + # Source fingerprints supplement the current commit ID when a candidate is + # intentionally tested before its commit. Binary hashes remain authoritative. + source_paths = sorted(path for folder in (ROOT/'gecode/optimize',ROOT/'gecode/int/linear') + for path in folder.rglob('*') if path.suffix in ('.cpp','.hpp')) + provenance=dict(driver_sha256=sha(binary),driver_name=binary.name, + source_head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True,timeout=2).strip(), + candidate_source_sha256={str(p.relative_to(ROOT)):sha(p) for p in source_paths}, + driver_source_sha256=sha(Path(__file__).with_name('native_benchmark.cpp')), + runner_sha256=sha(Path(__file__)),capture_sha256=sha(Path(__file__).with_name('benchmark_progress.py')), + validators={p.name:sha(p) for p in (SUITE/'validate.py',SUITE/'native.py')}, + preserved_baseline=preserved,cohorts={}) + measurement_files = [Path(__file__),Path(__file__).with_name('native_benchmark.cpp'), + Path(__file__).with_name('benchmark_progress.py'), + SUITE/'validate.py',SUITE/'native.py'] + measurement_hashes = {str(p.relative_to(ROOT)):sha(p) for p in measurement_files} + provenance['measurement_source_sha256'] = measurement_hashes + report=dict(schema_version=1,started_utc=datetime.now(timezone.utc).isoformat(), + purpose='native_algorithm_changes_from_current_pre_algorithm_baseline',expected_runs=60, + inputs=inputs,provenance=provenance,records=[]) + local_paths={};loaded_paths={} + def execute(unit,cohort,label,trace=False): + remaining=deadline-time.monotonic() + require(remaining>0,'Whole native panel deadline exhausted') + command=[str(binary),'--input',str(SUITE/(unit['stem']+'.txt')),'--kind',unit['kind'], + '--route',unit['route'],'--seconds',str(SOLVE_SECONDS)] + environment={k:v for k,v in os.environ.items() if not k.startswith('DYLD_')} + environment['DYLD_LIBRARY_PATH']=':'.join(map(str,directories[cohort])) + if trace:environment['DYLD_PRINT_LIBRARIES']='1' + begin=datetime.now(timezone.utc).isoformat() + raw=capture(command,dest,environment,min(PROCESS_SECONDS,remaining),max_output=262144) + stdout,stderr=raw.pop('stdout'),raw.pop('stderr') + (dest/(label+'.stdout')).write_bytes(stdout);(dest/(label+'.stderr')).write_bytes(stderr) + # Command provenance remains reproducible without publishing host paths. + raw.update(command=['BINARY','--input',unit['stem']+'.txt','--kind',unit['kind'], + '--route',unit['route'],'--seconds',str(SOLVE_SECONDS)],started_utc=begin, + stdout_file=label+'.stdout',stderr_file=label+'.stderr') + return raw,stdout.decode('utf8',errors='replace'),stderr.decode('utf8',errors='replace') + for cohort in ('before','after'): + probe,out,err=execute(panel[0],cohort,'provenance-'+cohort,True) + require(probe['returncode']==0 and not probe['hard_timeout'] and not probe['output_limit'],'Loader probe failed') + checked_result(strict_json(out),panel[0],models[panel[0]['id']],validator,native_validator) + paths=set() + for line in err.splitlines(): + if 'libgecode' not in line:continue + require('/' in line,'Malformed loader trace') + path=Path(line[line.index('/'):].strip()).resolve(strict=True) + require(path.parent in directories[cohort],'Unexpected mixed runtime library') + paths.add(path) + require(any(p.name=='libgecodeoptimize.dylib' for p in paths),'No observed Optimize library load') + libraries = [dict(name=p.name,sha256=sha(p)) for p in sorted(paths)] + if cohort=='before': + require(all(expected_baseline.get(item['name'])==item['sha256'] for item in libraries), + 'Loaded before library differs from preserved baseline manifest') + loaded_paths[cohort]=paths + provenance['cohorts'][cohort]=dict(libraries=libraries, + loader_probe=probe) + local_paths[cohort]=dict(directories=list(map(str,directories[cohort])),loaded=list(map(str,sorted(paths)))) + facade_hashes = [next(item['sha256'] for item in provenance['cohorts'][cohort]['libraries'] + if item['name']=='libgecodeoptimize.dylib') for cohort in ('before','after')] + require(facade_hashes[0]!=facade_hashes[1], 'Candidate facade is byte-identical to the preserved baseline') + write(dest/'paths.local.json',dict(binary=str(binary),baseline_manifest=str(preserved_path),cohorts=local_paths)) + publish(dest/'report.json',report) + for rep in range(REPETITIONS): + for unit in panel: + for cohort in (('before','after') if rep%2==0 else ('after','before')): + label=f"{unit['unit']}-r{rep+1}-{cohort}" + record=dict(unit=unit['unit'],case=unit['id'],kind=unit['kind'],route=unit['route'],cohort=cohort, + repetition=rep+1,expected_objective=unit['objective'],completed=False,witness_checked=False) + try: + captured,out,err=execute(unit,cohort,label);record.update(captured) + if captured['hard_timeout']:record['status']='external_timeout' + elif captured['output_limit']:record['status']='output_limit' + elif captured['returncode']!=0:record['status']='process_error' + else:record.update(checked_result(strict_json(out),unit,models[unit['id']],validator,native_validator)) + except (ValueError,KeyError,TypeError,OverflowError,OSError,RuntimeError) as error: + record.update(status='validation_error',error=str(error)) + report['records'].append(record);publish(dest/'report.json',report) + print(label,record['status'],record.get('external_seconds'),flush=True) + unchanged=sha(binary)==provenance['driver_sha256'] + for cohort,paths in loaded_paths.items(): + original={p['name']:p['sha256'] for p in provenance['cohorts'][cohort]['libraries']} + unchanged &= all(sha(p)==original[p.name] for p in paths) + inputs_unchanged = all(sha(SUITE/(item['stem']+suffix))==item[key] + for item in FROZEN_INPUTS for suffix,key in + (('.json','json_sha256'),('.txt','txt_sha256'))) + sources_unchanged = all(sha(ROOT/path)==digest for path,digest in provenance['candidate_source_sha256'].items()) + measurement_unchanged = all(sha(ROOT/path)==digest for path,digest in measurement_hashes.items()) + preserved_unchanged = sha(preserved_path)==preserved['manifest_sha256'] + report.update(runtime_hashes_unchanged=bool(unchanged),finished_utc=datetime.now(timezone.utc).isoformat(), + input_hashes_unchanged=inputs_unchanged,candidate_source_hashes_unchanged=sources_unchanged, + measurement_source_hashes_unchanged=measurement_unchanged, + preserved_manifest_unchanged=preserved_unchanged, + elapsed_seconds=time.monotonic()-started) + integrity_ok = bool(unchanged and inputs_unchanged and sources_unchanged and + measurement_unchanged and preserved_unchanged) + summary=dict(schema_version=1,cohorts={'before':'Pre-algorithm 530a3b783 / compiled c2fabb78f', + 'after':'Candidate, identical driver and verified runtime libraries'},repetitions=3, + required_units=10,required_runs=60,actual_runs=len(report['records']),units=[], + elapsed_seconds=report['elapsed_seconds'],provenance=provenance, + caveats=['Fixed saved instances; no post-result selection, starts or reference feed.', + 'Ordinary Native and explicit DFS frontier are separate routes; no HiGHS solve is requested.', + 'No timing ratio unless every repetition completed and independently matched the optimum.', + 'Capped incumbents/bounds and failures remain in all denominators.', + 'Ordinary native node counts are unavailable through the frozen public API.', + 'External times include process and model construction; internal solve time is also retained.', + 'Three paired repetitions are a small diagnostic, not a statistical speed guarantee.']) + for unit in panel: + item=dict(unit=unit['unit'],case=unit['id'],route=unit['route'],known_optimum=unit['objective']) + for cohort in ('before','after'): + records=[r for r in report['records'] if r['unit']==unit['unit'] and r['cohort']==cohort] + walls=[r['external_seconds'] for r in records if 'external_seconds' in r] + internal=[r['solve_seconds'] for r in records if 'solve_seconds' in r] + item[cohort]=dict(attempts=len(records),completed=sum(r['completed'] for r in records), + statuses=[r['status'] for r in records],external_seconds=walls, + median_external_seconds=statistics.median(walls) if len(walls)==3 else None, + median_solve_seconds=statistics.median(internal) if len(internal)==3 else None, + objectives=[r.get('objective') for r in records],bounds=[r.get('best_bound') for r in records], + nodes=[r.get('nodes') for r in records]) + complete=integrity_ok and all(item[c]['completed']==3 for c in ('before','after')) + item['median_paired_ratio_after_before']=(statistics.median([b/a for a,b in zip(item['before']['external_seconds'],item['after']['external_seconds'])]) if complete else None) + summary['units'].append(item) + publish(dest/'report.json',report);publish(dest/'summary.json',summary) + failures={'validation_error','process_error','output_limit','external_timeout'} + ok=(len(report['records'])==60 and integrity_ok and + time.monotonic()<=deadline and not any(r['status'] in failures for r in report['records'])) + report['comparison_valid']=summary['comparison_valid']=bool(ok) + report['elapsed_seconds']=summary['elapsed_seconds']=time.monotonic()-started + publish(dest/'report.json',report);publish(dest/'summary.json',summary) + print('Complete native panel:',len(report['records']),'records; validation/process gate:',ok) + return 0 if ok else 1 + + +if __name__=='__main__': + raise SystemExit(main()) diff --git a/experiments/optimize/benchmark_progress.py b/experiments/optimize/benchmark_progress.py new file mode 100644 index 0000000000..23e20919db --- /dev/null +++ b/experiments/optimize/benchmark_progress.py @@ -0,0 +1,634 @@ +#!/usr/bin/env python3 +"""Bounded pre-project/current benchmark using existing macOS binaries. + +No builds, source modifications or downloads. Run only during a quiet window. +A relocation-friendly reproduction of the measured 2026-09-05 panel; original +raw records identify the exact measured script hash. Requires the preserved +pre-project binary manifests and conventional combined current build layout. +""" +import argparse +from datetime import datetime, timezone +from fractions import Fraction +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import platform +import signal +import statistics +import subprocess +import sys +import tempfile +import time + +sys.dont_write_bytecode = True +ROOT = Path(__file__).resolve().parents[2] + + +def capture_command( + command, directory, environment, timeout, max_output=4 * 1024 * 1024 +): + """Capture trusted POSIX fixtures with bounded memory and group cleanup. + + Temporary files avoid pipe hangs from descendants and unbounded communicate + buffering. The output allowance is checked during polling and after exit; + only its bounded prefix is loaded or returned. Ordinary descendants retain + the child's process group; programs deliberately escaping it are outside + this benchmark harness. Cleanup can take up to 0.5 seconds after the deadline. + """ + if os.name != 'posix': + raise ValueError('POSIX process-group containment is required') + if not math.isfinite(timeout) or timeout <= 0: + raise ValueError('timeout must be finite and positive') + if type(max_output) is not int or max_output <= 0: + raise ValueError('max_output must be a positive integer') + started = time.perf_counter() + finish = time.monotonic() + timeout + proc = None + timed_out = False + oversized = False + with tempfile.TemporaryFile(dir=directory) as stdout, tempfile.TemporaryFile( + dir=directory + ) as stderr: + try: + proc = subprocess.Popen( + command, + stdin=subprocess.DEVNULL, + stdout=stdout, + stderr=stderr, + cwd=directory, + env=environment, + start_new_session=True, + close_fds=True, + ) + while True: + oversized = ( + max( + os.fstat(stdout.fileno()).st_size, + os.fstat(stderr.fileno()).st_size, + ) + > max_output + ) + timed_out = time.monotonic() >= finish + if oversized or timed_out or proc.poll() is not None: + break + time.sleep(min(0.002, max(0, finish - time.monotonic()))) + finally: + if proc is not None: + # The leader may already have exited while descendants still + # hold inherited descriptors; always terminate the whole group. + cleanup_deadline = time.monotonic() + 0.5 + retry_group = False + try: + os.killpg(proc.pid, signal.SIGKILL) + except ProcessLookupError: + pass + except PermissionError: + retry_group = True + finally: + try: + proc.wait(timeout=max(0, cleanup_deadline-time.monotonic())) + except subprocess.TimeoutExpired as error: + raise RuntimeError( + 'benchmark child cleanup deadline exceeded' + ) from error + if retry_group: + # Darwin can return EPERM while an exiting leader is not + # yet waitable, or for a zombie-only group. The single wait + # above must finish before retrying group termination once. + # Reaping a leader alone does not prove descendants gone. + try: + os.killpg(proc.pid, signal.SIGKILL) + except ProcessLookupError: + pass + sizes = [os.fstat(stream.fileno()).st_size for stream in (stdout, stderr)] + oversized = oversized or max(sizes) > max_output + stdout.seek(0) + stderr.seek(0) + result = { + 'returncode': proc.returncode, + 'hard_timeout': timed_out, + 'output_limit': oversized, + 'stdout_bytes_observed': sizes[0], + 'stderr_bytes_observed': sizes[1], + 'stdout': stdout.read(max_output), + 'stderr': stderr.read(max_output), + 'external_seconds': time.perf_counter() - started, + } + return result + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + '--before-source', + type=Path, + required=True, + help='Read-only pre-project checkout containing original inputs', + ) + parser.add_argument( + '--before-binary-dir', + type=Path, + help='Directory containing enhanced-binary, enhanced-fzn and their build manifests; default BEFORE_SOURCE/build/solver-bench/bin', + ) + parser.add_argument( + '--current-build', + type=Path, + default=ROOT / 'build/native-compat', + help='Existing combined shared build; default build/native-compat', + ) + parser.add_argument( + '--output-dir', + type=Path, + required=True, + help='New result directory; refuses overwrite', + ) + parser.add_argument('--repetitions', type=int, default=3) + parser.add_argument( + '--seconds', type=float, default=2, help='Internal solver limit, seconds (0,5]' + ) + parser.add_argument( + '--budget-seconds', type=float, default=180, help='Whole-call limit (0,300]' + ) + args = parser.parse_args(argv) + if sys.platform != 'darwin': + parser.error( + 'This reproduction uses verified macOS dyld provenance; other platforms need their own loader verification' + ) + if not 1 <= args.repetitions <= 5: + parser.error('repetitions must be in [1,5]') + if not math.isfinite(args.seconds) or not 0 < args.seconds <= 5: + parser.error('seconds must be finite in (0,5]') + if not math.isfinite(args.budget_seconds) or not 0 < args.budget_seconds <= 300: + parser.error('budget-seconds must be finite in (0,300]') + if args.seconds * 1000 != round(args.seconds * 1000): + parser.error('seconds must be an integral number of milliseconds') + HERE = args.output_dir.resolve() + OLD = args.before_source.resolve(strict=True) + BEFORE_BIN = (args.before_binary_dir or OLD / 'build/solver-bench/bin').resolve( + strict=True + ) + CURRENT = args.current_build.resolve(strict=True) + LIMIT = args.seconds + HARD_LIMIT = LIMIT + 1.5 + REPETITIONS = args.repetitions + SUITE = ROOT / 'experiments/solver-bench' + sys.path.insert(0, str(SUITE)) + import miplib_import, validate, public_catalog + + spec = importlib.util.spec_from_file_location('fznb', SUITE / 'fzn-bench.py') + fznb = importlib.util.module_from_spec(spec) + spec.loader.exec_module(fznb) + BIN = { + 'mip': { + 'before': BEFORE_BIN / 'enhanced-binary', + 'now': CURRENT / 'bin/optimize-file', + }, + 'native_cp': { + 'before': BEFORE_BIN / 'enhanced-fzn', + 'now': CURRENT / 'bin/fzn-gecode', + }, + } + LIBDIRS = [CURRENT / 'gecode/optimize', CURRENT] + + def sha(p): + return hashlib.sha256(p.read_bytes()).hexdigest() + + def dump(p, x): + p.write_text(json.dumps(x, indent=2, allow_nan=False) + '\n') + + def env(cohort, trace=False): + e = {k: v for k, v in os.environ.items() if not k.startswith('DYLD_')} + e['PYTHONDONTWRITEBYTECODE'] = '1' + if cohort == 'now': + e['DYLD_LIBRARY_PATH'] = ':'.join(map(str, LIBDIRS)) + if trace: + e['DYLD_PRINT_LIBRARIES'] = '1' + return e + + START = time.monotonic() + DEADLINE = START + args.budget_seconds + DEST = HERE + DEST.mkdir(parents=True, exist_ok=False) + report = { + 'schema_version': 1, + 'started_utc': datetime.now(timezone.utc).isoformat(), + 'purpose': 'pre_project_to_current_bounded_comparison', + 'source_head': subprocess.check_output( + ['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True + ).strip(), + 'platform': platform.platform(), + 'machine': platform.machine(), + 'whole_budget_seconds': args.budget_seconds, + 'per_solve_seconds': LIMIT, + 'hard_process_seconds': HARD_LIMIT, + 'repetitions': REPETITIONS, + 'warm_start': False, + 'records': [], + 'provenance': {}, + 'inputs': {}, + } + + def run(cmd, cohort, label, trace=False): + remaining = DEADLINE - time.monotonic() + if remaining <= 0: + raise RuntimeError('Whole comparison budget exhausted') + utc_start = datetime.now(timezone.utc).isoformat() + captured = capture_command( + cmd, HERE, env(cohort, trace), min(HARD_LIMIT, remaining) + ) + out, err = captured.pop('stdout'), captured.pop('stderr') + (DEST / (label + '.stdout')).write_bytes(out) + (DEST / (label + '.stderr')).write_bytes(err) + return ( + dict( + captured, + command=cmd, + started_utc=utc_start, + finished_utc=datetime.now(timezone.utc).isoformat(), + stdout_path=label + '.stdout', + stderr_path=label + '.stderr', + ), + out.decode(errors='replace'), + err.decode(errors='replace'), + ) + + def finite(x): + if not math.isfinite(float(x)): + raise ValueError('Nonfinite JSON') + return float(x) + + def load(s): + return json.loads( + s, + parse_constant=lambda s: (_ for _ in ()).throw( + ValueError('Nonfinite JSON') + ), + parse_float=finite, + ) + + # Assertions are input/evidence guards here, not optional diagnostics. + if not __debug__: + raise RuntimeError( + 'Run without python -O; validation assertions must be enabled' + ) + # Frozen original identities must match their existing build manifests. + for track, meta, key in [ + ('mip', 'build-metadata.json', 'enhanced-binary'), + ('native_cp', 'fzn-build-metadata.json', 'enhanced-fzn'), + ]: + p = BEFORE_BIN / meta + md = json.loads(p.read_text()) + want = md['binary_hashes'][key] + assert sha(BIN[track]['before']) == want + report['provenance'][track] = { + 'old_metadata_sha256': sha(p), + 'old_metadata_file': str(p), + 'old_baseline_commit': md['baseline_commit'], + 'old_build_finished': md['finished_utc'], + 'binaries': { + c: {'path': str(v), 'sha256': sha(v)} for c, v in BIN[track].items() + }, + } + # Exact equivalence of existing old driver TXT to original MPS; no regenerated input. + MIPS = {} + for n, (_, _, opt, dig) in miplib_import.MODELS.items(): + mps = SUITE / 'miplib-cache' / (n + '.mps') + txt = ( + OLD + / 'experiments/solver-bench/miplib-instances' + / ('public_miplib3_' + n + '.txt') + ) + j = txt.with_suffix('.json') + model, md = miplib_import.parse_mps(mps.read_text()) + old = json.loads(j.read_text()) + assert sha(mps) == dig + assert all(model[k] == old[k] for k in ('n', 'c', 'rows')) + assert public_catalog.encode(old) == txt.read_text() + MIPS[n] = (mps, txt, model, md, opt) + report['inputs'][n] = { + 'mps_sha256': sha(mps), + 'old_txt_sha256': sha(txt), + 'old_json_sha256': sha(j), + 'exact_equivalent': True, + 'known_optimum': opt, + 'columns': model['n'], + 'original_rows': md['original_rows'], + } + chosen = [ + 'public_fzn_jobshop', + 'public_fzn_cumulatives', + 'public_fzn_sudoku', + 'public_fzn_multidim_knapsack_simple', + ] + manifest = json.loads((SUITE / 'fzn-manifest.json').read_text()) + FZN = {r['id']: r for r in manifest['instances'] if r['id'] in chosen} + assert len(FZN) == 4 + for name, r in FZN.items(): + for key in ('fzn', 'expected'): + p = SUITE / r[key] + assert sha(p) == r[key + '_sha256'] + assert sha(OLD / 'experiments/solver-bench' / r[key]) == sha(p) + report['inputs'][name] = { + 'fzn_sha256': r['fzn_sha256'], + 'expected_sha256': r['expected_sha256'], + 'family': r['family'], + 'method': r['solve'], + 'all_solutions': r['all_solutions'], + } + + def command(track, cohort, name): + b = str(BIN[track][cohort]) + if track == 'mip': + mps, txt, *_ = MIPS[name] + return ( + [b, str(txt), 'auto', 'afc', str(round(LIMIT * 1000)), '0', '1'] + if cohort == 'before' + else [ + b, + str(mps), + '--time-limit', + str(LIMIT), + '--relative-gap', + '0', + '--absolute-gap', + '0', + '--seed', + '0', + ] + ) + r = FZN[name] + return ( + [b, '-p', '1', '-time', str(round(LIMIT * 1000)), '-s'] + + (['-a'] if r['all_solutions'] else []) + + [str(SUITE / r['fzn'])] + ) + + # Untimed dynamic provenance probes use the exact measured commands with dyld tracing. + loaded = set() + for track, name in [('mip', 'p0033'), ('native_cp', 'public_fzn_sudoku')]: + for c in ('before', 'now'): + rec, out, err = run( + command(track, c, name), c, 'provenance-' + track + '-' + c, True + ) + assert ( + not rec['hard_timeout'] + and not rec['output_limit'] + and rec['returncode'] == 0 + ) + paths = [] + for line in err.splitlines(): + if 'libgecode' not in line: + continue + p = Path(line[line.index('/') :].strip()).resolve(strict=True) + assert c == 'now' and p.parent in [d.resolve() for d in LIBDIRS], str(p) + paths.append(str(p)) + loaded.add(p) + assert bool(paths) == (c == 'now') + report['provenance'][track][c + '_loaded_libraries'] = paths + report['libraries'] = [{'path': str(p), 'sha256': sha(p)} for p in sorted(loaded)] + report['runner_sha256'] = sha(Path(__file__)) + report['validation_source_hashes'] = { + str(p): sha(p) + for p in ( + SUITE / 'miplib_import.py', + SUITE / 'validate.py', + SUITE / 'public_catalog.py', + SUITE / 'fzn-bench.py', + ) + } + report['methodology'] = [ + 'Before static binaries and now shared binaries differ in process startup/layout.', + 'MIP before is a pre-existing binary auto adapter; now is numerical HiGHS.', + 'Current known-optimal completion is numerical-qualified, not an exact proof certificate.', + 'Original CP globals already existed; this native track preserves the default FlatZinc route.', + ] + dump(DEST / 'report.json', report) + + def check_mip(cohort, name, out): + x = load(out) + _, _, model, md, opt = MIPS[name] + status = x['status'] if cohort == 'before' else x['termination'] + values = x['assignment'] if cohort == 'before' else x['values'] + d = { + 'reported_status': status, + 'objective': x.get('objective'), + 'validation': 'no_witness', + 'completed': False, + 'internal_seconds': ( + x['elapsed_ms'] / 1000 if cohort == 'before' else x['solve_seconds'] + ), + 'raw_result': x, + } + if values: + if cohort == 'now': + names = x['variable_names'] + assert len(names) == len(values) == len(set(names)) + mapped = dict(zip(names, values)) + assert set(mapped) == set(md['column_names']) + values = [mapped[k] for k in md['column_names']] + assert all( + type(v) in (int, float) + and math.isfinite(v) + and abs(v - round(v)) <= 1e-6 + for v in values + ) + witness = [round(v) for v in values] + checked = validate.validate_assignment(model, witness) + assert checked['valid'], checked + objective = md['sign'] * Fraction( + checked['objective'], md['objective_scale'] + ) + Fraction(md['original_objective_offset']) + shown = checked['objective'] if cohort == 'before' else float(objective) + assert x['objective'] is not None and abs(x['objective'] - shown) <= 1e-6 + d.update( + validation='independent_exact_original_rows_and_domains', + objective=float(objective), + witness_valid=True, + at_known_optimum=objective == opt, + ) + if status == 'optimal': + assert objective == opt + if cohort == 'now': + assert ( + x['solution_validated'] and abs(x['best_bound'] - opt) <= 1e-6 + ) + d['completed'] = True + else: + assert status in ( + 'unknown', + 'time_limit', + 'time limit', + 'node_limit', + ), status + return d + + for repetition in range(REPETITIONS): + for track, names in [('mip', list(MIPS)), ('native_cp', chosen)]: + for name in names: + for c in ( + ('before', 'now') if repetition % 2 == 0 else ('now', 'before') + ): + label = f'{track}-{name}-r{repetition+1}-{c}' + r, out, err = run(command(track, c, name), c, label) + r.update( + track=track, + case=name, + cohort=c, + repetition=repetition + 1, + completed=False, + validation='not_checked', + ) + try: + if r['output_limit']: + r['reported_status'] = 'output_limit' + elif r['hard_timeout']: + r['reported_status'] = 'external_timeout' + elif r['returncode'] != 0: + r['reported_status'] = 'process_error' + elif track == 'mip': + r.update(check_mip(c, name, out)) + else: + text, stats, ok = fznb.output_and_statistics(out) + expected = (SUITE / FZN[name]['expected']).read_text() + status, reason = fznb.classify( + FZN[name], text, expected, r['returncode'], False + ) + r.update( + reported_status=status, + validation=( + 'exact_unchanged_upstream_output' + if text == expected + else 'output_mismatch' + ), + completed=status == 'passed', + reason=reason, + statistics=stats, + internal_seconds=stats.get('solveTime'), + statistics_parsed=ok, + ) + except ( + ValueError, + AssertionError, + KeyError, + TypeError, + ZeroDivisionError, + ) as e: + r.update(reported_status='validation_error', error=str(e)) + report['records'].append(r) + dump(DEST / 'report.json', report) + print( + label, + r['reported_status'], + round(r['external_seconds'], 4), + flush=True, + ) + report['hashes_unchanged'] = all( + sha(Path(v['path'])) == v['sha256'] for v in report['libraries'] + ) and all( + sha(Path(v['path'])) == v['sha256'] + for p in report['provenance'].values() + for v in p['binaries'].values() + ) + assert report['hashes_unchanged'] + dump(DEST / 'report.json', report) + summary = { + 'schema_version': 1, + 'before_label': 'Pre-project experimental checkout', + 'now_label': 'Current integrated implementation', + 'source_head': report['source_head'], + 'repetitions': REPETITIONS, + 'per_solve_seconds': LIMIT, + 'wall_seconds': time.monotonic() - START, + 'all_records': len(report['records']), + 'tracks': [], + 'caveats': [ + 'Five pure-binary MIPLIB3 classics; not a broad MILP performance score.', + 'Before binaries are static, now binaries are shared; startup/loading differences are included.', + 'Current optimal results are numerical-qualified and checked against known optima; these are not exact proof certificates.', + 'Native CP uses the unchanged default FlatZinc path and pre-existing capabilities.', + 'MIP before is the pre-existing experimental binary auto adapter; now is the numerical HiGHS facade. Different public file formats have exact mathematical equivalence.', + 'Native CP uses exact upstream expected output, not an independent mathematical checker.', + 'End-to-end times include startup, import, search and output; tiny cases are startup-sensitive.', + 'Alternating paired repetitions; one process at a time. No warm starts or reference assignments.', + 'No speedup ratio is published for a case with a censored or unsuccessful repetition.', + ], + } + for track, names in [('mip', list(MIPS)), ('native_cp', chosen)]: + t = { + 'id': track, + 'cases': [], + 'required_runs_per_cohort': len(names) * REPETITIONS, + } + for name in names: + entry = {'id': name, 'before': {}, 'now': {}} + for c in ('before', 'now'): + rr = [ + r + for r in report['records'] + if r['track'] == track and r['case'] == name and r['cohort'] == c + ] + walls = [r['external_seconds'] for r in rr] + internals = [ + r['internal_seconds'] + for r in rr + if r.get('internal_seconds') is not None + ] + entry[c] = { + 'runs': len(rr), + 'completed': sum(r['completed'] for r in rr), + 'statuses': [r['reported_status'] for r in rr], + 'wall_seconds': walls, + 'median_wall_seconds': statistics.median(walls), + 'median_internal_seconds': ( + statistics.median(internals) + if len(internals) == len(rr) + else None + ), + 'objectives': [r.get('objective') for r in rr], + 'validation': [r['validation'] for r in rr], + } + complete = all( + entry[c]['completed'] == REPETITIONS for c in ('before', 'now') + ) + entry['uncensored_ratio_now_over_before'] = ( + statistics.median( + [ + b / a + for a, b in zip( + entry['before']['wall_seconds'], + entry['now']['wall_seconds'], + ) + ] + ) + if complete + else None + ) + entry['censored'] = not complete + t['cases'].append(entry) + for c in ('before', 'now'): + rows = [ + r for r in report['records'] if r['track'] == track and r['cohort'] == c + ] + t[c] = { + 'completed_runs': sum(r['completed'] for r in rows), + 'all_runs': len(rows), + 'all_repetitions_completed_cases': sum( + e[c]['completed'] == REPETITIONS for e in t['cases'] + ), + } + summary['tracks'].append(t) + report['finished_utc'] = datetime.now(timezone.utc).isoformat() + dump(DEST / 'report.json', report) + dump(DEST / 'summary.json', summary) + print( + 'DONE', + json.dumps({k: summary[k] for k in ('wall_seconds', 'all_records')}), + flush=True, + ) + + +if __name__ == "__main__": + main() diff --git a/experiments/optimize/boundary_instances.py b/experiments/optimize/boundary_instances.py new file mode 100644 index 0000000000..6f731ce807 --- /dev/null +++ b/experiments/optimize/boundary_instances.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +"""Deterministic adaptive-size inputs; no references, solver calls or starts. + +Version 1 preserves the old random master blocks, extending their streams only +after those blocks are complete. Facility customers are now twice the sites; +candidate bin count is ceil(items/3). Those dimensions deliberately differ from +some earlier fixed cases. Native n counts input variables, while model_variables +also counts the existing driver's diagonal/cost auxiliaries. Their full-value +validation remains the runner's responsibility. +""" +from __future__ import annotations + +import importlib.util +import json +from pathlib import Path +import random + + +_spec = importlib.util.spec_from_file_location("boundary_category_instances", + Path(__file__).resolve().with_name("category_instances.py")) +category = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(category) + + +GENERATOR_VERSION = "boundary-prefix-v1" +BOUNDS = {"knapsack": (8, 512), "assignment": (3, 32), + "facility_location": (2, 16), "bin_packing": (4, 32), + "production": (3, 48), "native_tsp": (4, 96), "weighted_queens": (4, 32)} +SOURCE_DEPENDENCIES = (category.HERE / "category_instances.py",) + category.SOURCE_DEPENDENCIES +_require = category._require + + +def _admit(name, size, variant): + _require(type(name) is str and name in BOUNDS, "unknown boundary category") + low, high = BOUNDS[name] + _require(type(size) is int and low <= size <= high, f"{name} size must be an integer in [{low},{high}]") + _require(variant in (("uncorrelated", "correlated") if name == "knapsack" else ("single",)), + "knapsack needs an explicit distribution; other categories use single") + + +def _extended_matrix(seed, original, maximum, upper): + rng = random.Random(seed) + matrix = [[0] * maximum for _ in range(maximum)] + for i in range(original): + for j in range(original): + matrix[i][j] = rng.randint(1, upper) + for i in range(maximum): + for j in range(maximum): + if i >= original or j >= original: + matrix[i][j] = rng.randint(1, upper) + return matrix + + +def make(name, size, variant="single"): + """Build one bounded original model, without computing a reference optimum.""" + _admit(name, size, variant) + family = "capacity_" + variant if name == "knapsack" else name + seed = category.scaling.FAMILY_SEEDS.get(family, category.SEEDS.get(family)) + rng = random.Random(seed) + model = {"id": f"{name}_{variant}_{size}", "category": name, "family": family, + "variant": variant, "kind": "binary", "tier": "adaptive", "tier_size": size, + "natural_size": size, "seed": seed, "generator_version": GENERATOR_VERSION, + "prefix_policy": "preserve old master blocks, then extend the same seeded stream"} + if name == "knapsack": + items = [] + for _ in range(512): + weight = rng.randint(1, 31) + profit = rng.randint(1, 100) if variant == "uncorrelated" else weight + rng.randint(0, 10) + items.append((weight, profit)) + weights, profits = [w for w, _ in items[:size]], [p for _, p in items[:size]] + capacity, cells = 6 * size, (size + 1) * (6 * size + 1) + p = {"weights": [weights], "profits": profits, "capacities": [capacity], "capacity": capacity, + "table_cells": cells, "dp_eligible": cells <= 1000000, + "dp_eligibility_reason": "eligible" if cells <= 1000000 else "full_table_cell_cap_exceeded"} + model.update(n=size, c=[-p for p in profits], rows=category.scaling._capacity_rows(weights, capacity)) + elif name == "assignment": + master = _extended_matrix(seed, 16, 32, 100) + matrix = [row[:size] for row in master[:size]] + p = {"size": size, "costs": matrix, "table_cells": None, "dp_eligible": False, + "dp_eligibility_reason": "multiple_assignment_equality_rows"} + model.update(n=size * size, c=[c for row in matrix for c in row], + rows=category.scaling._assignment_rows(size)) + elif name == "facility_location": + point = lambda: (rng.randint(0, 30), rng.randint(0, 30)) + sites = [point() for _ in range(12)] + customers = [point() for _ in range(24)] + opening = [rng.randint(15, 60) for _ in range(12)] + sites += [point() for _ in range(4)] + customers += [point() for _ in range(8)] + opening += [rng.randint(15, 60) for _ in range(4)] + p = {"facilities": size, "customers": 2 * size, "opening_costs": opening[:size], + "assignment_costs": [[abs(a - x) + abs(b - y) + 1 for x, y in sites[:size]] + for a, b in customers[:2 * size]]} + elif name == "bin_packing": + weights = [rng.randint(2, 10) for _ in range(32)][:size] + bins = (size + 2) // 3 + capacity = max(max(weights), (sum(weights) + bins - 2) // (bins - 1)) + while category._first_fit(weights, capacity) > bins: + capacity += 1 + p = {"items": size, "bins": bins, "weights": weights, "capacity": capacity, + "symmetry": "enabled bins form a prefix"} + elif name == "production": + demands = [rng.randint(1, 7) for _ in range(24)] + storage, holding = rng.randint(3, 10), rng.randint(1, 4) + def costs(): + fixed, unit = rng.randint(5, 20), rng.randint(2, 12) + return [0 if q == 0 else fixed + unit * q + max(0, q - 4) * 5 for q in range(8)] + matrix = [costs() for _ in range(24)] + demands += [rng.randint(1, 7) for _ in range(24)] + matrix += [costs() for _ in range(24)] + p = {"periods": size, "options": 8, "demands": demands[:size], "storage": storage, + "holding_cost": holding, "production_costs": matrix[:size], + "objective_constant": -holding * sum(sum(demands[:t + 1]) for t in range(size))} + else: + if name == "native_tsp": + points = [(rng.randrange(100), rng.randrange(100)) for _ in range(96)][:size] + matrix = [[abs(a - x) + abs(b - y) + (i != j) for j, (x, y) in enumerate(points)] + for i, (a, b) in enumerate(points)] + else: + master = _extended_matrix(seed, 12, 32, 50) + matrix = [row[:size] for row in master[:size]] + p = {"size": size} + model.update(kind=name, n=size, size=size, machines=0, data=matrix) + if name in ("facility_location", "bin_packing", "production"): + model.update(category._formulation(name, p)) + p.update(table_cells=None, dp_eligible=False, dp_eligibility_reason="multiple_original_rows") + model["parameters"] = p + model["dimensions"] = category._dimensions(model) + model["input_variables"] = model["n"] + model["model_variables"] = model["modelled_variables"] = model["dimensions"]["variables"] + model["size_unit"] = {"knapsack": "items", "assignment": "tasks", "facility_location": "sites", + "bin_packing": "items", "production": "periods", + "native_tsp": "cities", "weighted_queens": "queens"}[name] + return model + + +def _check_model(model): + _require(type(model) is dict, "model must be an object") + expected = make(model.get("category"), model.get("natural_size"), model.get("variant")) + # Canonical JSON distinguishes booleans/floats from exact integer fields. + actual = {key: model.get(key) for key in expected} + _require(json.dumps(actual, sort_keys=True, allow_nan=False) == + json.dumps(expected, sort_keys=True, allow_nan=False), + "boundary metadata or original formulation differs from deterministic input") + + +def semantic_hash(model): + _check_model(model) + return category.semantic_hash(model) + + +input_hash = semantic_hash + + +def validate_assignment(model, assignment): + """Check original feasibility/objective only; never certify optimality.""" + try: + _check_model(model) + _require(type(assignment) is list and len(assignment) == model["n"] and + all(type(v) is int for v in assignment), "expected exact original integer assignment") + original = dict(model) + if model["category"] == "knapsack": + original["family"] = "knapsack" + validator = category.binary_validator if model["kind"] == "binary" else category.native_validator + checked = validator.validate_assignment(original, assignment) + if checked["valid"]: + checked["domain_semantics_checked"] = True + return checked + except (ValueError, KeyError, TypeError, IndexError) as error: + return {"valid": False, "error": str(error)} + + +def encode_txt(model): + """Encode the existing sparse/native driver protocol without a warm start.""" + _check_model(model) + if model["kind"] == "binary": + lines = [f"{model['n']} {len(model['rows'])}", " ".join(map(str, model["c"]))] + for row in model["rows"]: + lines.append(" ".join(map(str, [row["b"], len(row["a"])] + + [v for pair in row["a"] for v in pair]))) + return "\n".join(lines) + "\nincumbent 0\n" + n = model["n"] + return (f"{model['family']} {n} 0 {n}\n" + + " ".join(str(c) for row in model["data"] for c in row) + "\n" + + " ".join("0" for _ in range(n)) + "\n") + + +expected_binary_text = encode_txt +expected_native_text = encode_txt diff --git a/experiments/optimize/build_configured_benchmark.py b/experiments/optimize/build_configured_benchmark.py new file mode 100644 index 0000000000..fb28e3522f --- /dev/null +++ b/experiments/optimize/build_configured_benchmark.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Build only the new benchmark driver against the accepted existing runtime. + +Uses the ordinary benchmark target's recorded compiler and compile flags. +Never invokes CMake or rebuilds/rewrites any solver library. The new executable +and build provenance are placed in build/configured-bench by default. +""" +import argparse +import hashlib +import json +from pathlib import Path +import shlex +import subprocess + +ROOT = Path(__file__).resolve().parents[2] + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--runtime-build', type=Path, default=ROOT/'build/native-compat') + parser.add_argument('--output-dir', type=Path, default=ROOT/'build/configured-bench') + args = parser.parse_args() + runtime = args.runtime_build.resolve() + output = args.output_dir.resolve() + flags_path = runtime/'gecode/optimize/CMakeFiles/optimize-native-benchmark.dir/flags.make' + link_path = flags_path.with_name('link.txt') + flags = flags_path.read_text() + compiler = next(line.removeprefix('# compile CXX with ') for line in flags.splitlines() + if line.startswith('# compile CXX with ')) + settings = {} + for line in flags.splitlines(): + if line.startswith(('CXX_DEFINES =', 'CXX_INCLUDES =', 'CXX_FLAGS =')): + name, value = line.split('=', 1) + settings[name.strip()] = shlex.split(value) + source = ROOT/'experiments/optimize/configured_benchmark.cpp' + library = runtime/'gecode/optimize/libgecodeoptimize.dylib' + libraries = sorted({path.resolve() for path in runtime.glob('libgecode*.dylib')} | + {library.resolve()}) + before = {str(path): sha(path) for path in libraries} + output.mkdir(parents=True, exist_ok=True) + binary = output/'optimize-configured-benchmark' + command = ([compiler] + settings['CXX_DEFINES'] + settings['CXX_INCLUDES'] + + settings['CXX_FLAGS'] + [str(source), '-o', str(binary), str(library), + '-Wl,-search_paths_first', '-Wl,-headerpad_max_install_names', + '-Wl,-rpath,'+str(library.parent), '-Wl,-rpath,'+str(runtime)]) + subprocess.run(command, cwd=ROOT, check=True) + after = {str(path): sha(path) for path in libraries} + if before != after: + raise RuntimeError('Accepted runtime libraries changed during driver-only build') + manifest = {'schema_version': 1, 'source': str(source), 'source_sha256': sha(source), + 'binary': str(binary), 'binary_sha256': sha(binary), + 'compiler_flags_metadata': str(flags_path), 'flags_sha256': sha(flags_path), + 'link_metadata': str(link_path), 'link_metadata_sha256': sha(link_path), + 'command': command, 'runtime_libraries_sha256': before, + 'runtime_libraries_unchanged': True} + (output/'build.local.json').write_text(json.dumps(manifest, indent=2)+'\n') + print(json.dumps({'binary': str(binary), 'manifest': str(output/'build.local.json'), + 'runtime_libraries_unchanged': True})) + + +if __name__ == '__main__': + main() diff --git a/experiments/optimize/build_final_benchmark.py b/experiments/optimize/build_final_benchmark.py new file mode 100644 index 0000000000..d99fbc483e --- /dev/null +++ b/experiments/optimize/build_final_benchmark.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Build the final driver against the separately validated current runtime. + +Uses the ordinary benchmark target's recorded compiler and compile flags. +Never invokes CMake or rebuilds/rewrites any solver library. The new executable +and build provenance are placed in build/final-benchmark by default. +""" +import argparse +import hashlib +import json +from pathlib import Path +import shlex +import subprocess + +ROOT = Path(__file__).resolve().parents[2] + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--runtime-build', type=Path, default=ROOT/'build/native-structure/native-build') + parser.add_argument('--output-dir', type=Path, default=ROOT/'build/final-benchmark') + args = parser.parse_args() + runtime = args.runtime_build.resolve() + output = args.output_dir.resolve() + flags_path = runtime/'gecode/optimize/CMakeFiles/optimize-native-benchmark.dir/flags.make' + link_path = flags_path.with_name('link.txt') + flags = flags_path.read_text() + compiler = next(line.removeprefix('# compile CXX with ') for line in flags.splitlines() + if line.startswith('# compile CXX with ')) + settings = {} + for line in flags.splitlines(): + if line.startswith(('CXX_DEFINES =', 'CXX_INCLUDES =', 'CXX_FLAGS =')): + name, value = line.split('=', 1) + settings[name.strip()] = shlex.split(value) + source = ROOT/'experiments/optimize/final_benchmark.cpp' + library = runtime/'gecode/optimize/libgecodeoptimize.dylib' + libraries = sorted({path.resolve() for path in runtime.glob('libgecode*.dylib')} | + {library.resolve()}) + before = {str(path): sha(path) for path in libraries} + output.mkdir(parents=True, exist_ok=True) + binary = output/'optimize-final-benchmark' + command = ([compiler] + settings['CXX_DEFINES'] + settings['CXX_INCLUDES'] + + settings['CXX_FLAGS'] + [str(source), '-o', str(binary), str(library), + '-Wl,-search_paths_first', '-Wl,-headerpad_max_install_names', + '-Wl,-rpath,'+str(library.parent), '-Wl,-rpath,'+str(runtime)]) + subprocess.run(command, cwd=ROOT, check=True) + after = {str(path): sha(path) for path in libraries} + if before != after: + raise RuntimeError('Accepted runtime libraries changed during driver-only build') + manifest = {'schema_version': 1, 'source': str(source), 'source_sha256': sha(source), + 'binary': str(binary), 'binary_sha256': sha(binary), + 'compiler_flags_metadata': str(flags_path), 'flags_sha256': sha(flags_path), + 'link_metadata': str(link_path), 'link_metadata_sha256': sha(link_path), + 'command': command, 'runtime_libraries_sha256': before, + 'runtime_libraries_unchanged': True} + (output/'build.local.json').write_text(json.dumps(manifest, indent=2)+'\n') + print(json.dumps({'binary': str(binary), 'manifest': str(output/'build.local.json'), + 'runtime_libraries_unchanged': True})) + + +if __name__ == '__main__': + main() diff --git a/experiments/optimize/build_large_final_benchmark.py b/experiments/optimize/build_large_final_benchmark.py new file mode 100644 index 0000000000..f1b1c8eaab --- /dev/null +++ b/experiments/optimize/build_large_final_benchmark.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""Expand transport guards in a generated copy of the frozen final driver. + +Assignment size 128 produces 16384 binary variables, exceeding the original +10000-variable parser guard after size 64 was solved. Such a harness rejection +is not a measured solver limit. This driver-only amendment changes six explicit +parser constants; algorithms, options, ten-second solve budgets and JSON schema +are unchanged. The original source and all solver libraries remain immutable. +""" +import argparse +import hashlib +import json +from pathlib import Path +import shlex +import subprocess + +ROOT=Path(__file__).resolve().parents[2] + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +TRANSFORMATIONS=( + ('bytes > 4*1024*1024','bytes > 256*1024*1024','TXT byte allowance: 4 MiB to 256 MiB'), + ('input.integer(1, 10000)','input.integer(1, 1000000)','Binary variable allowance: 10000 to 1000000'), + ('const auto m = static_cast(input.integer(0, 100000));', + 'const auto m = static_cast(input.integer(0, 10000000));', + 'Binary row allowance: 100000 to 10000000'), + ('count > 2000000-total','count > 100000000-total','Nonzero allowance: 2000000 to 100000000'), + ('input.integer(1, 100)','input.integer(1, 10000)','Global dimension allowance: 100 to 10000'), +) + + +def main(): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--runtime-build',type=Path,default=ROOT/'build/native-structure/native-build') + parser.add_argument('--output-dir',type=Path,default=ROOT/'build/final-benchmark/large-driver') + args=parser.parse_args();runtime=args.runtime_build.resolve(strict=True) + output=args.output_dir.resolve();output.mkdir(parents=True,exist_ok=False) + original=ROOT/'experiments/optimize/final_benchmark.cpp' + original_hash=sha(original);text=original.read_text();changes=[] + for before,after,reason in TRANSFORMATIONS: + count=text.count(before);expected=2 if before=='input.integer(1, 100)' else 1 + if count!=expected:raise RuntimeError('Frozen guard changed: '+before) + text=text.replace(before,after) + changes.append(dict(before=before,after=after,occurrences=count,reason=reason)) + source=output/'final_benchmark_large.cpp';source.write_text(text) + flags_path=runtime/'gecode/optimize/CMakeFiles/optimize-native-benchmark.dir/flags.make' + link_path=flags_path.with_name('link.txt');flags=flags_path.read_text() + compiler=next(line.removeprefix('# compile CXX with ') for line in flags.splitlines() + if line.startswith('# compile CXX with ')) + settings={} + for line in flags.splitlines(): + if line.startswith(('CXX_DEFINES =','CXX_INCLUDES =','CXX_FLAGS =')): + name,value=line.split('=',1);settings[name.strip()]=shlex.split(value) + library=runtime/'gecode/optimize/libgecodeoptimize.dylib' + libraries=sorted({p.resolve() for p in runtime.glob('libgecode*.dylib')}|{library.resolve()}) + before={str(p):sha(p) for p in libraries};binary=output/'optimize-final-benchmark' + command=([compiler]+settings['CXX_DEFINES']+settings['CXX_INCLUDES']+settings['CXX_FLAGS']+ + [str(source),'-o',str(binary),str(library),'-Wl,-search_paths_first', + '-Wl,-headerpad_max_install_names','-Wl,-rpath,'+str(library.parent),'-Wl,-rpath,'+str(runtime)]) + subprocess.run(command,cwd=ROOT,check=True) + if before!={str(p):sha(p) for p in libraries} or sha(original)!=original_hash: + raise RuntimeError('Original driver source or accepted solver libraries changed') + manifest=dict(schema_version=1,source=str(source),source_sha256=sha(source), + original_source=str(original),original_source_sha256=original_hash, + source_transformations=changes, + amendment='Expand driver transport guards after assignment128 exceeded the original parser allowance; no algorithm, search setting, solve budget or JSON schema changes.', + binary=str(binary),binary_sha256=sha(binary),compiler_flags_metadata=str(flags_path), + flags_sha256=sha(flags_path),link_metadata=str(link_path),link_metadata_sha256=sha(link_path), + command=command,runtime_libraries_sha256=before,runtime_libraries_unchanged=True, + original_source_unchanged=True) + (output/'build.local.json').write_text(json.dumps(manifest,indent=2)+'\n') + print(json.dumps(dict(binary=str(binary),manifest=str(output/'build.local.json'), + runtime_libraries_unchanged=True,original_source_unchanged=True))) + + +if __name__=='__main__':main() diff --git a/experiments/optimize/category_instances.py b/experiments/optimize/category_instances.py new file mode 100644 index 0000000000..d7b9d63ae2 --- /dev/null +++ b/experiments/optimize/category_instances.py @@ -0,0 +1,386 @@ +#!/usr/bin/env python3 +"""Seven bounded benchmark categories; no solver calls or performance selection. + +The existing capacity/assignment inputs are preserved semantically. Other +families use the existing solver-bench formulations and original-domain +validators. Reference preparation is separate from measurement. Native TXT +ends in a syntactic zero vector that the existing driver parses and discards; +neither that vector nor the independent optimum is submitted as a primal start. +""" +from __future__ import annotations + +import copy +import importlib.util +from pathlib import Path +import random + + +HERE = Path(__file__).resolve().parent +LEGACY = HERE.parent / "solver-bench" +SOURCE_DEPENDENCIES = (HERE / "scaling_instances.py", LEGACY / "validate.py", LEGACY / "native.py") +TIERS = ("sanity", "small", "medium", "large") +FACILITY_SIZES = ((2, 3), (4, 6), (8, 12), (12, 24)) +BIN_SIZES = ((4, 3), (8, 4), (12, 5), (16, 6)) +PRODUCTION_SIZES = (3, 6, 12, 24) +ROUTING_SIZES = (4, 8, 12, 16) +QUEENS_SIZES = (4, 8, 10, 12) +SEEDS = {"facility_location": 20260909, "bin_packing": 20260910, + "production": 20260911, "native_tsp": 20260912, "weighted_queens": 20260913} +CATEGORIES = ("knapsack", "assignment", "facility_location", "bin_packing", + "production", "native_tsp", "weighted_queens") + + +def _load(name, path): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +scaling = _load("category_scaling_instances", SOURCE_DEPENDENCIES[0]) +binary_validator = _load("category_binary_validator", SOURCE_DEPENDENCIES[1]) +native_validator = _load("category_native_validator", SOURCE_DEPENDENCIES[2]) + + +def _require(condition, message): + if not condition: + raise ValueError(message) + + +def _integer(value): + return type(value) is int + + +class _Rows: + """Canonical Ax>=b builder, matching the existing binary TXT convention.""" + def __init__(self, costs): + self.costs, self.rows = list(costs), [] + + def ge(self, terms, bound): + coefficients = {} + for column, value in terms: + coefficients[column] = coefficients.get(column, 0) + value + self.rows.append({"a": [[j, v] for j, v in sorted(coefficients.items()) if v], "b": bound}) + + def le(self, terms, bound): + self.ge(((j, -v) for j, v in terms), -bound) + + def eq(self, terms, bound): + terms = list(terms) + self.ge(terms, bound) + self.le(terms, bound) + + +def _formulation(family, p): + if family == "facility_location": + f, customers = p["facilities"], p["customers"] + rows = _Rows(p["opening_costs"] + [c for row in p["assignment_costs"] for c in row]) + for customer in range(customers): + rows.eq(((f + customer * f + j, 1) for j in range(f)), 1) + for j in range(f): + rows.ge(((j, 1), (f + customer * f + j, -1)), 0) + elif family == "bin_packing": + items, bins = p["items"], p["bins"] + rows = _Rows([0] * (items * bins) + [1] * bins) + for item in range(items): + rows.eq(((item * bins + b, 1) for b in range(bins)), 1) + for b in range(bins): + rows.ge(((items * bins + b, 1), (item * bins + b, -1)), 0) + for b in range(bins): + rows.ge([(items * bins + b, p["capacity"])] + + [(item * bins + b, -p["weights"][item]) for item in range(items)], 0) + for b in range(bins - 1): + rows.ge(((items * bins + b, 1), (items * bins + b + 1, -1)), 0) + elif family == "production": + periods, options = p["periods"], p["options"] + rows = _Rows([p["production_costs"][t][q] + p["holding_cost"] * (periods - t) * q + for t in range(periods) for q in range(options)]) + for t in range(periods): + rows.eq(((t * options + q, 1) for q in range(options)), 1) + prefix = [(s * options + q, q) for s in range(t + 1) for q in range(1, options)] + demand = sum(p["demands"][:t + 1]) + rows.ge(prefix, demand) + rows.le(prefix, demand + p["storage"]) + rows.eq(((t * options + q, q) for t in range(periods) for q in range(1, options)), sum(p["demands"])) + else: + raise ValueError("unsupported binary category") + return {"n": len(rows.costs), "c": rows.costs, "rows": rows.rows} + + +def _scaling_view(model): + result = dict(model) + result["dimensions"] = {"variables": model["n"], "rows": len(model["rows"]), + "nonzeros": sum(len(row["a"]) for row in model["rows"])} + return result + + +def semantic_hash(model): + if model["kind"] == "binary": + return scaling.semantic_hash(model) + return native_validator.mathematical_hash(model) + + +input_hash = semantic_hash + + +def _dimensions(model): + n = model["n"] + if model["kind"] == "binary": + return {"input_variables": n, "variables": n, "rows": len(model["rows"]), + "nonzeros": sum(len(row["a"]) for row in model["rows"]), "globals": 0} + routing = model["kind"] == "native_tsp" + return {"input_variables": n, "variables": (2 if routing else 4) * n, + "rows": 0 if routing else 2 * n, "nonzeros": 0 if routing else 4 * n, + "globals": n + (1 if routing else 3)} + + +def _check_model(model): + _require(type(model) is dict and model.get("category") in CATEGORIES, "invalid category model") + n = model.get("n") + _require(_integer(n) and 1 <= n <= 512, "invalid input variable count") + family, kind = model.get("family"), model.get("kind") + if kind == "binary": + if family in ("capacity_uncorrelated", "capacity_correlated", "assignment"): + scaling._check_model(_scaling_view(model)) + else: + _require(family in ("facility_location", "bin_packing", "production"), "unknown binary family") + binary_validator.check_instance(model) + p = model.get("parameters") + _require(type(p) is dict, "missing original parameters") + if family == "facility_location": + f, c = p.get("facilities"), p.get("customers") + _require(_integer(f) and 1 <= f <= 12 and _integer(c) and 1 <= c <= 24, "facility dimensions") + _require(type(p.get("opening_costs")) is list and len(p["opening_costs"]) == f and + all(_integer(v) and v >= 0 for v in p["opening_costs"]), "facility opening costs") + matrix = p.get("assignment_costs") + _require(type(matrix) is list and len(matrix) == c and + all(type(row) is list and len(row) == f and all(_integer(v) and v >= 0 for v in row) + for row in matrix), "facility assignment costs") + elif family == "bin_packing": + items, bins, capacity = p.get("items"), p.get("bins"), p.get("capacity") + _require(_integer(items) and 1 <= items <= 16 and _integer(bins) and 1 <= bins <= 16 and + _integer(capacity) and capacity > 0, "bin dimensions") + _require(type(p.get("weights")) is list and len(p["weights"]) == items and + all(_integer(w) and 0 < w <= capacity for w in p["weights"]), "bin weights") + else: + periods, options = p.get("periods"), p.get("options") + _require(_integer(periods) and 1 <= periods <= 24 and _integer(options) and 2 <= options <= 8, + "production dimensions") + _require(_integer(p.get("storage")) and 0 <= p["storage"] <= 10 and + _integer(p.get("holding_cost")) and p["holding_cost"] >= 0, "production storage/holding") + _require(type(p.get("demands")) is list and len(p["demands"]) == periods and + all(_integer(v) and 0 <= v < options for v in p["demands"]), "production demands") + matrix = p.get("production_costs") + _require(type(matrix) is list and len(matrix) == periods and + all(type(row) is list and len(row) == options and all(_integer(v) and v >= 0 for v in row) + for row in matrix), "production costs") + constant = -p["holding_cost"] * sum(sum(p["demands"][:t + 1]) for t in range(periods)) + _require(p.get("objective_constant") == constant, "production objective constant") + expected = _formulation(family, p) + _require(all(model[key] == expected[key] for key in ("n", "c", "rows")), + "original family parameters disagree with sparse formulation") + else: + _require(kind in ("native_tsp", "weighted_queens") and family == kind and + model.get("size") == n and model.get("machines") == 0 and 4 <= n <= (16 if kind == "native_tsp" else 12), + "native family dimensions") + matrix = model.get("data") + _require(type(matrix) is list and len(matrix) == n and + all(type(row) is list and len(row) == n and all(_integer(c) and 0 <= c <= 100000 for c in row) + for row in matrix), "native cost matrix") + expected_category = {"capacity_uncorrelated": "knapsack", "capacity_correlated": "knapsack"}.get(family, family) + variant = {"capacity_uncorrelated": "uncorrelated", "capacity_correlated": "correlated"}.get(family, "single") + _require(model["category"] == expected_category and model.get("variant") == variant, "category/variant mismatch") + dimensions = _dimensions(model) + _require(model.get("dimensions") == dimensions and model.get("modelled_variables") == dimensions["variables"], + "compiled dimension metadata mismatch") + + +def validate_assignment(model, assignment): + try: + _check_model(model) + _require(type(assignment) is list and len(assignment) == model["n"] and all(_integer(v) for v in assignment), + "original assignment must contain exact integers") + if model["family"] in ("capacity_uncorrelated", "capacity_correlated", "assignment"): + return scaling.validate_assignment(_scaling_view(model), assignment) + validator = binary_validator if model["kind"] == "binary" else native_validator + return validator.validate_assignment(model, assignment) + except (ValueError, KeyError, TypeError, IndexError) as error: + return {"valid": False, "error": str(error)} + + +def bin_reference(weights, capacity, bins): + """Exact subset DP over (used bins, last load), unrelated to solver search. + + For each item subset retain its lexicographically best state. A lower last + load dominates at equal bin count. An item is appended to the current bin + when it fits, otherwise a new bin starts. Every packing has such an item + order; reconstruction records each appended item and bin boundary. + """ + _require(type(weights) is list and 1 <= len(weights) <= 16 and + _integer(capacity) and capacity > 0 and _integer(bins) and bins > 0 and + all(_integer(w) and 0 < w <= capacity for w in weights), "bin reference domain") + size = 1 << len(weights) + states, item, new_bin = [None] * size, [-1] * size, bytearray(size) + states[0] = (1, 0) + for mask in range(1, size): + for j, weight in enumerate(weights): + if not mask & (1 << j): + continue + count, load = states[mask ^ (1 << j)] + opens = load + weight > capacity + candidate = (count + 1, weight) if opens else (count, load + weight) + if states[mask] is None or candidate < states[mask]: + states[mask], item[mask], new_bin[mask] = candidate, j, opens + _require(states[-1][0] <= bins, "model has too few bins for the exact optimum") + order, mask = [], size - 1 + while mask: + order.append((item[mask], bool(new_bin[mask]))) + mask ^= 1 << item[mask] + assigned, current = [0] * len(weights), 0 + for j, opens in reversed(order): + current += int(opens) + assigned[j] = current + witness = [int(assigned[j] == b) for j in range(len(weights)) for b in range(bins)] + witness += [int(b < states[-1][0]) for b in range(bins)] + return {"status": "optimal", "objective": states[-1][0], "assignment": witness, + "method": "exact item-subset minimum-bin/last-load dynamic programming"} + + +def _reference(model): + family = model["family"] + if family in ("capacity_uncorrelated", "capacity_correlated", "assignment"): + return scaling._reference(_scaling_view(model)) + if family == "bin_packing": + p = model["parameters"] + reference = bin_reference(p["weights"], p["capacity"], p["bins"]) + elif family in ("facility_location", "production"): + reference = binary_validator.exact_reference(model) + else: + oracle = native_validator.tsp_reference if family == "native_tsp" else native_validator.queens_reference + best, witness = oracle(model["data"]) + reference = {"status": "optimal", "objective": best, "assignment": witness, + "method": "Held-Karp subset dynamic programming" if family == "native_tsp" + else "independent exhaustive weighted-queen enumeration"} + reference["input_sha256"] = semantic_hash(model) + checked = validate_assignment(model, reference.get("assignment")) + _require(reference.get("status") == "optimal" and checked["valid"] and + checked["objective"] == reference["objective"], "exact reference original witness failed") + return reference + + +def verify_reference(model, *, recompute=False): + """Cheap frozen identity/original witness check; exact reproof is opt-in.""" + try: + _check_model(model) + reference = model["reference"] + identity = semantic_hash(model) + _require(type(reference) is dict and reference.get("status") == "optimal" and + _integer(reference.get("objective")) and reference.get("input_sha256") == identity and + type(reference.get("method")) is str and reference["method"], "reference identity/status mismatch") + checked = validate_assignment(model, reference.get("assignment")) + _require(checked["valid"] and checked["objective"] == reference["objective"], "reference witness mismatch") + if recompute: + _require(_reference(model)["objective"] == reference["objective"], "reference optimum mismatch") + return {"valid": True, "input_sha256": identity, "witness_checked": True, + "optimality_recomputed": bool(recompute), "objective": reference["objective"]} + except (ValueError, KeyError, TypeError, IndexError) as error: + return {"valid": False, "witness_checked": False, "optimality_recomputed": False, "error": str(error)} + + +def encode_txt(model): + _check_model(model) + if model["kind"] == "binary": + lines = [f"{model['n']} {len(model['rows'])}", " ".join(map(str, model["c"]))] + for row in model["rows"]: + lines.append(" ".join(map(str, [row["b"], len(row["a"])] + + [v for pair in row["a"] for v in pair]))) + return "\n".join(lines) + "\nincumbent 0\n" + n = model["n"] + return (f"{model['family']} {n} 0 {n}\n" + + " ".join(str(c) for row in model["data"] for c in row) + "\n" + + " ".join("0" for _ in range(n)) + "\n") + + +expected_binary_text = encode_txt +expected_native_text = encode_txt + + +def _finish(model, with_references): + family = model["family"] + model["category"] = {"capacity_uncorrelated": "knapsack", "capacity_correlated": "knapsack"}.get(family, family) + model["variant"] = {"capacity_uncorrelated": "uncorrelated", "capacity_correlated": "correlated"}.get(family, "single") + model["stress"] = family == "capacity_uncorrelated" and model["n"] == 512 + model["size_unit"] = {"native_tsp": "cities", "weighted_queens": "queens"}.get(family, "binary variables") + model["dimensions"] = _dimensions(model) + model["modelled_variables"] = model["dimensions"]["variables"] + _check_model(model) + if with_references and "reference" not in model: + model["reference"] = _reference(model) + return model + + +def _first_fit(weights, capacity): + loads = [] + for weight in sorted(weights, reverse=True): + index = next((j for j, load in enumerate(loads) if load + weight <= capacity), len(loads)) + if index == len(loads): + loads.append(0) + loads[index] += weight + return len(loads) + + +def generate_suite(*, with_references=True): + """Return 33 fixed cases. No timings, file writes or solver-derived choices.""" + result = [_finish(copy.deepcopy(m), with_references) + for m in scaling.generate_suite(with_references=with_references)] + rng = random.Random(SEEDS["facility_location"]) + sites = [(rng.randint(0, 30), rng.randint(0, 30)) for _ in range(12)] + customers = [(rng.randint(0, 30), rng.randint(0, 30)) for _ in range(24)] + opening = [rng.randint(15, 60) for _ in range(12)] + for tier, (f, c) in zip(TIERS, FACILITY_SIZES): + p = {"facilities": f, "customers": c, "opening_costs": opening[:f], + "assignment_costs": [[abs(a - x) + abs(b - y) + 1 for x, y in sites[:f]] for a, b in customers[:c]]} + model = dict(_formulation("facility_location", p), parameters=p, family="facility_location", kind="binary", + id=f"facility_location_{tier}_{f}x{c}", tier=tier, tier_size=f, seed=SEEDS["facility_location"]) + result.append(_finish(model, with_references)) + rng = random.Random(SEEDS["bin_packing"]) + weights = [rng.randint(2, 10) for _ in range(16)] + for tier, (items, bins) in zip(TIERS, BIN_SIZES): + selected = weights[:items] + capacity = max(max(selected), (sum(selected) + bins - 2) // (bins - 1)) + while _first_fit(selected, capacity) > bins: + capacity += 1 + p = {"items": items, "bins": bins, "weights": selected, "capacity": capacity, + "symmetry": "enabled bins form a prefix"} + model = dict(_formulation("bin_packing", p), parameters=p, family="bin_packing", kind="binary", + id=f"bin_packing_{tier}_{items}x{bins}", tier=tier, tier_size=items, seed=SEEDS["bin_packing"]) + result.append(_finish(model, with_references)) + rng = random.Random(SEEDS["production"]) + demands = [rng.randint(1, 7) for _ in range(24)] + storage, holding = rng.randint(3, 10), rng.randint(1, 4) + costs = [] + for _ in range(24): + fixed, unit = rng.randint(5, 20), rng.randint(2, 12) + costs.append([0 if q == 0 else fixed + unit * q + max(0, q - 4) * 5 for q in range(8)]) + for tier, periods in zip(TIERS, PRODUCTION_SIZES): + p = {"periods": periods, "options": 8, "demands": demands[:periods], "storage": storage, + "holding_cost": holding, "production_costs": costs[:periods], + "objective_constant": -holding * sum(sum(demands[:t + 1]) for t in range(periods))} + model = dict(_formulation("production", p), parameters=p, family="production", kind="binary", + id=f"production_{tier}_{periods}x8", tier=tier, tier_size=periods, seed=SEEDS["production"]) + result.append(_finish(model, with_references)) + for family, sizes in (("native_tsp", ROUTING_SIZES), ("weighted_queens", QUEENS_SIZES)): + rng = random.Random(SEEDS[family]) + if family == "native_tsp": + points = [(rng.randrange(100), rng.randrange(100)) for _ in range(16)] + matrix = [[abs(a - x) + abs(b - y) + (i != j) for j, (x, y) in enumerate(points)] + for i, (a, b) in enumerate(points)] + else: + matrix = [[rng.randint(1, 50) for _ in range(12)] for _ in range(12)] + for tier, n in zip(TIERS, sizes): + model = dict(family=family, kind=family, id=f"{family}_{tier}_{n}", tier=tier, tier_size=n, + seed=SEEDS[family], n=n, size=n, machines=0, data=[row[:n] for row in matrix[:n]], + parameters={"size": n}) + result.append(_finish(model, with_references)) + _require(len(result) == 33 and len({m["id"] for m in result}) == 33, "category panel dimensions") + return result diff --git a/experiments/optimize/configured-policy.json b/experiments/optimize/configured-policy.json new file mode 100644 index 0000000000..d524a43324 --- /dev/null +++ b/experiments/optimize/configured-policy.json @@ -0,0 +1,54 @@ +{ + "schema_version": 1, + "purpose": "Explicit benchmark presets for the accepted current native solver", + "selected_from_pilot": { + "report": "build/configured-bench/pilot/report.json", + "sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8", + "runs": 42 + }, + "selection_rule": "Choose effective settings from the structural audit and exploratory pilot; prefer simpler configurations when optional work adds overhead. Frozen before adaptive measurement. No per-instance fastest-route selection.", + "families": { + "knapsack": { + "route": "native", + "outside_dp_route": "lp-reliability", + "label": "Exact capacity DP; LP + reliability above its cap", + "rationale": "Preserve the fast DP on admitted models. Larger tables use updated checked LP bounds, verified covers and bounded reliability branching." + }, + "assignment": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "facility_location": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "bin_packing": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "production": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "native_tsp": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "weighted_queens": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + } + }, + "excluded": { + "neighborhoods": "The bounded radius-four candidate was measured, but did not improve total pilot solve time; every attempt and result remains in the pilot.", + "presolve": "The existing original-model postsolve API does not transfer optimal status or global bound, so proof-preserving composition is not claimed.", + "learning": "No production learning runtime has been implemented.", + "numerical_backend": "This comparison remains native Gecode; it does not substitute the numerical HiGHS MILP route." + } +} diff --git a/experiments/optimize/configured_benchmark.cpp b/experiments/optimize/configured_benchmark.cpp new file mode 100644 index 0000000000..a0c3e5ab70 --- /dev/null +++ b/experiments/optimize/configured_benchmark.cpp @@ -0,0 +1,414 @@ +/* Explicit algorithm benchmark driver; frozen inputs provide no solver start. */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +using Clock = std::chrono::steady_clock; + +namespace { +struct Reader { + std::ifstream file; + explicit Reader(const std::string& path) : file(path) { + if (!file) throw std::runtime_error("Cannot open frozen TXT input"); + file.seekg(0, std::ios::end); + const auto bytes = file.tellg(); + if (bytes < 0 || bytes > 4*1024*1024) + throw std::runtime_error("TXT input size limit"); + file.seekg(0); + } + std::string token() { + std::string value; + if (!(file >> value) || value.size() > 100) + throw std::runtime_error("Missing/oversized TXT token"); + return value; + } + std::int64_t integer(std::int64_t lower, std::int64_t upper) { + const auto text = token(); + std::int64_t value = 0; + const auto parsed = std::from_chars(text.data(), text.data()+text.size(), value); + if (parsed.ec != std::errc() || parsed.ptr != text.data()+text.size() || + value < lower || value > upper) + throw std::runtime_error("Invalid/out-of-range TXT integer"); + return value; + } + void end() { + std::string extra; + if (file >> extra) throw std::runtime_error("Trailing TXT content"); + if (!file.eof()) throw std::runtime_error("TXT read failure"); + } +}; + +struct Built { + O::Model model; + std::vector original; +}; + +Built binary(Reader& input) { + Built out; + const auto n = static_cast(input.integer(1, 10000)); + const auto m = static_cast(input.integer(0, 100000)); + out.original = out.model.add_variables( + std::vector(n, {O::VariableType::Binary, 0, 1, {}})); + std::vector objective; + for (std::size_t j=0; j(cost)}); + } + O::SparseRowBatch rows; + rows.columns = out.original; + std::size_t total = 0; + for (std::size_t i=0; i(input.integer(-1000000000,1000000000))); + rows.upper.push_back(std::numeric_limits::infinity()); + const auto count = static_cast(input.integer(0, static_cast(n))); + if (count > 2000000-total) throw std::runtime_error("TXT nonzero limit"); + total += count; + std::int64_t previous = -1; + for (std::size_t k=0; k(n)-1); + const auto coefficient = input.integer(-1000000000, 1000000000); + if (column <= previous || !coefficient) + throw std::runtime_error("Noncanonical TXT row"); + previous = column; + rows.column.push_back(static_cast(column)); + rows.coefficient.push_back(static_cast(coefficient)); + } + rows.row_start.push_back(rows.column.size()); + } + out.model.add_rows_sparse(rows); + out.model.minimize(objective); + if (input.token() != "incumbent") + throw std::runtime_error("Missing legacy incumbent marker"); + const auto present = input.integer(0, 1); + // Legacy files contain a reference-free initial witness. Parse and discard it; + // neither this witness nor any reference objective enters solve options. + if (present) + for (std::size_t i=0; i(input.integer(1, 100)); + if (input.integer(0, 0) != 0 || input.integer(1, 100) != static_cast(n)) + throw std::runtime_error("Native TXT dimensions"); + std::vector costs(n*n); + for (auto& cost : costs) cost = input.integer(0, 100000); + for (std::size_t j=0; j(n)-1); + input.end(); + Built out; + for (std::size_t j=0; j(n)-1)); + if (expected == "native_tsp") O::add_circuit(out.model, out.original); + else { + O::add_all_different(out.model,out.original); + std::vector rising, falling; + for (std::size_t j=0; j(j),static_cast(n+j-1)); + const auto b=out.model.add_integer(-static_cast(j),static_cast(n-1)-j); + out.model.add_row({{a,1},{out.original[j],-1}},static_cast(j),static_cast(j)); + out.model.add_row({{b,1},{out.original[j],-1}},-static_cast(j),-static_cast(j)); + rising.push_back(a); + falling.push_back(b); + } + O::add_all_different(out.model, rising); + O::add_all_different(out.model, falling); + } + std::vector objective; + for (std::size_t j=0; j(*std::min_element(begin,end)), + static_cast(*std::max_element(begin,end))); + std::vector> tuples; + for (std::size_t k=0; k(k), costs[j*n+k]}); + O::add_table(out.model, {out.original[j], cost}, tuples); + objective.push_back({cost, 1}); + } + out.model.minimize(objective); + return out; +} + +std::string quote(const std::string& text) { + std::ostringstream out; + out << '"'; + for (unsigned char c : text) { + if (c == '"' || c == '\\') out << '\\' << c; + else if (c < 32) + out << "\\u" << std::hex << std::setw(4) << std::setfill('0') << unsigned(c) << std::dec; + else out << c; + } + out << '"'; + return out.str(); +} + +void optional(const std::optional& value) { + if (!value) std::cout << "null"; + else if (!std::isfinite(*value)) throw std::runtime_error("Nonfinite original result scalar"); + else std::cout << *value; +} + +const char* completion(O::NativeRootCoverCompletion value) { +#define COVER_CASE(name) case O::NativeRootCoverCompletion::name: return #name + switch (value) { + COVER_CASE(NotRequested); COVER_CASE(NotStarted); COVER_CASE(NoNewCuts); + COVER_CASE(RoundLimit); COVER_CASE(WorkLimit); COVER_CASE(StorageLimit); + COVER_CASE(SeparationLimit); COVER_CASE(Cancelled); COVER_CASE(TimeLimit); + COVER_CASE(NoPrimalSuggestion); COVER_CASE(InvalidSuggestion); + COVER_CASE(CallbackError); COVER_CASE(BackendError); COVER_CASE(AllocationFailure); + } +#undef COVER_CASE + throw std::runtime_error("Unknown root-cover completion"); +} + +const char* completion(O::NativeNeighborhoodCompletion value) { +#define NEIGHBOR_CASE(name) case O::NativeNeighborhoodCompletion::name: return #name + switch (value) { + NEIGHBOR_CASE(NotStarted); NEIGHBOR_CASE(NoIncumbent); + NEIGHBOR_CASE(ProofCompletedBeforeAttempt); NEIGHBOR_CASE(NoEligibleBinary); + NEIGHBOR_CASE(NonrestrictingRadius); NEIGHBOR_CASE(FormulationLimit); + NEIGHBOR_CASE(SourceLimit); NEIGHBOR_CASE(WorkLimit); NEIGHBOR_CASE(StatusLimit); + NEIGHBOR_CASE(SharedNodeReserve); NEIGHBOR_CASE(LocalStorageLimit); + NEIGHBOR_CASE(LocalTimeLimit); NEIGHBOR_CASE(NoImprovement); + NEIGHBOR_CASE(Improved); NEIGHBOR_CASE(GlobalStop); NEIGHBOR_CASE(Error); + } +#undef NEIGHBOR_CASE + throw std::runtime_error("Unknown neighborhood completion"); +} + +struct Configuration { + bool frontier = false, checked_lp = false, covers = false; + bool reliability = false, neighborhoods = false; + O::NativeLpSettings lp; + O::NativeBranchingSettings branching; + O::NativeNeighborhoodSettings neighborhood; + std::size_t max_open_nodes = 1024; + + explicit Configuration(const std::string& route) { + if (route == "native") return; + if (route == "lp-root") checked_lp = true; + else if (route == "lp-cuts") checked_lp = covers = true; + else if (route == "lp-updated") { + checked_lp = covers = true; + lp.frequency = O::NativeLpFrequency::AfterBoundChanges; + } else if (route == "dfs-reliability") frontier = reliability = true; + else if (route == "lp-reliability" || route == "lp-reliability-neighborhood") { + frontier = reliability = checked_lp = covers = true; + lp.frequency = O::NativeLpFrequency::AfterBoundChanges; + neighborhoods = route == "lp-reliability-neighborhood"; + } else throw std::runtime_error("Invalid driver route"); + if (lp.frequency == O::NativeLpFrequency::AfterBoundChanges) + lp.bound_change_interval = 4; + if (covers) lp.root_cover_cuts = O::NativeRootCoverSettings{}; + neighborhood.radius = 4; + neighborhood.time_limit_seconds = 0.05; + } + + void print() const { + const auto flag = [](bool value) { return value ? "true" : "false"; }; + std::cout << "{\"entry_point\":" << quote(neighborhoods ? "solve_native_neighborhoods" : + frontier ? "solve_native_search" : checked_lp ? "solve_native_lp" : "solve_native") + << ",\"search_order\":" << quote(frontier ? "depth_first" : "native_bab") + << ",\"checked_lp\":" << flag(checked_lp) + << ",\"lp_frequency\":"; + if (checked_lp) std::cout << quote(lp.frequency == O::NativeLpFrequency::Root ? "root" : "after_bound_changes"); + else std::cout << "null"; + std::cout << ",\"bound_tightening\":" << flag(checked_lp && lp.bound_tightening) + << ",\"bound_change_interval\":"; + if (checked_lp) std::cout << lp.bound_change_interval; else std::cout << "null"; + std::cout << ",\"root_cover_cuts\":" << flag(covers) + << ",\"binary_reliability\":" << flag(reliability) + << ",\"neighborhoods\":" << flag(neighborhoods) + // Eligibility of this route is not a claim that the model passes the + // internal DP admission checks. The public API has no DP-used counter. + << ",\"knapsack_dp_eligible_route\":" << flag(!checked_lp) + << ",\"presolve\":false,\"max_open_nodes\":"; + if (frontier) std::cout << max_open_nodes; else std::cout << "null"; + std::cout << ",\"cover_settings\":"; + if (covers) { + const auto& c = *lp.root_cover_cuts; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"max_rounds\":" << c.max_rounds + CONFIG_FIELD(max_work) CONFIG_FIELD(max_cuts) CONFIG_FIELD(max_cut_nonzeros) + CONFIG_FIELD(max_model_columns) CONFIG_FIELD(max_model_rows) + CONFIG_FIELD(max_model_nonzeros) CONFIG_FIELD(max_separation_rows) + CONFIG_FIELD(max_terms_per_row) CONFIG_FIELD(denominator) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << ",\"branching_settings\":"; + if (reliability) { + const auto& c = branching; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"policy\":\"binary_reliability\"" + CONFIG_FIELD(max_candidates_per_decision) CONFIG_FIELD(max_probe_status_calls) + CONFIG_FIELD(max_probe_status_calls_per_decision) CONFIG_FIELD(max_branching_work) + CONFIG_FIELD(reliability_samples) CONFIG_FIELD(max_nonimproving_pairs) + CONFIG_FIELD(max_history_entries) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << ",\"neighborhood_settings\":"; + if (neighborhoods) { + const auto& c = neighborhood; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"policy\":\"binary_hamming\"" + CONFIG_FIELD(radius) CONFIG_FIELD(max_status_calls) CONFIG_FIELD(max_distance_variables) + CONFIG_FIELD(max_source_entries) CONFIG_FIELD(max_coordinator_work) + CONFIG_FIELD(max_local_spaces) CONFIG_FIELD(time_limit_seconds) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << '}'; + } +}; + +void print_statistics(const O::NativeLpStatistics& lp, + const O::NativeBranchingStatistics& branching, + const O::NativeNeighborhoodStatistics& neighborhood) { + std::cout << ",\"relaxation\":{\"lp_calls\":" << lp.lp_calls; +#define LP_FIELD(name) << ",\"" #name "\":" << lp.name + std::cout LP_FIELD(lp_seconds) LP_FIELD(valid_bounds) LP_FIELD(rejected_bounds) + LP_FIELD(numerical_infeasibility_reports) LP_FIELD(certificate_evaluations) + LP_FIELD(conditional_checks) LP_FIELD(variable_fixings) LP_FIELD(variable_bound_tightenings); +#undef LP_FIELD + const auto& c = lp.root_cover; + std::cout << ",\"root_cover\":{\"requested\":" << (c.requested ? "true" : "false") + << ",\"completion\":" << quote(completion(c.completion)); +#define CUT_FIELD(name) << ",\"" #name "\":" << c.name + std::cout CUT_FIELD(rounds) CUT_FIELD(augmentations) CUT_FIELD(cuts) CUT_FIELD(nonzeros) + CUT_FIELD(work) CUT_FIELD(projected_coordinates) CUT_FIELD(unsupported_rows) + CUT_FIELD(oversized_rows) CUT_FIELD(separated_cuts) CUT_FIELD(duplicate_cuts) + CUT_FIELD(arithmetic_rejections) CUT_FIELD(lp_calls) CUT_FIELD(valid_bounds) + CUT_FIELD(rejected_bounds) CUT_FIELD(numerical_infeasibility_reports) + CUT_FIELD(lp_seconds) << "}}"; +#undef CUT_FIELD + const auto& b = branching; + std::cout << ",\"branching\":{\"requested\":" << (b.requested ? "true" : "false"); +#define BRANCH_FIELD(name) << ",\"" #name "\":" << b.name + std::cout BRANCH_FIELD(decisions) BRANCH_FIELD(manual_splits) BRANCH_FIELD(fallback_decisions) + BRANCH_FIELD(probe_status_calls) BRANCH_FIELD(completed_pairs) BRANCH_FIELD(published_pairs) + BRANCH_FIELD(finite_samples) BRANCH_FIELD(zero_gain_samples) BRANCH_FIELD(failed_directions) + BRANCH_FIELD(reliable_candidates) BRANCH_FIELD(probe_propagations) BRANCH_FIELD(budget_nodes) + BRANCH_FIELD(work) BRANCH_FIELD(history_entries) BRANCH_FIELD(probe_lp_calls) + BRANCH_FIELD(probe_lp_seconds) << '}'; +#undef BRANCH_FIELD + const auto& n = neighborhood; + std::cout << ",\"neighborhood\":{\"requested\":" << (n.requested ? "true" : "false") + << ",\"completion\":" << quote(completion(n.completion)) << ",\"stop_reason\":"; + if (n.stop_reason) std::cout << quote(O::to_string(*n.stop_reason)); else std::cout << "null"; +#define NEIGHBOR_FIELD(name) << ",\"" #name "\":" << n.name + std::cout NEIGHBOR_FIELD(attempts) NEIGHBOR_FIELD(eligible_variables) + NEIGHBOR_FIELD(source_entries) NEIGHBOR_FIELD(coordinator_work) + NEIGHBOR_FIELD(status_attempts) NEIGHBOR_FIELD(completed_status_calls) + NEIGHBOR_FIELD(failed_nodes) NEIGHBOR_FIELD(feasible_candidates) + NEIGHBOR_FIELD(accepted_improvements) NEIGHBOR_FIELD(peak_local_spaces) + NEIGHBOR_FIELD(peak_total_spaces) NEIGHBOR_FIELD(budget_nodes) + NEIGHBOR_FIELD(elapsed_seconds) << '}'; +#undef NEIGHBOR_FIELD +} +} + +int main(int argc, char** argv) { + const auto start=Clock::now(); + const auto elapsed=[&] {return std::chrono::duration(Clock::now()-start).count();}; + try { + if (argc!=9 || std::string(argv[1])!="--input" || std::string(argv[3])!="--kind" || + std::string(argv[5])!="--route" || std::string(argv[7])!="--seconds") + throw std::runtime_error("Usage: configured-benchmark --input TXT --kind binary|native_tsp|weighted_queens --route native|lp-root|lp-cuts|lp-updated|dfs-reliability|lp-reliability|lp-reliability-neighborhood --seconds N (0 < N <= 10)"); + const std::string kind=argv[4],route=argv[6],time_text=argv[8];std::size_t used=0; + const double seconds=std::stod(time_text,&used); + if (used!=time_text.size() || !std::isfinite(seconds) || seconds<=0 || seconds>10 || + (kind!="binary" && kind!="native_tsp" && kind!="weighted_queens")) + throw std::runtime_error("Invalid driver kind, route or seconds"); + const Configuration configuration(route); + Reader input(argv[2]);auto built=kind=="binary"?binary(input):global(input,kind); + const auto snapshot=built.model.snapshot();const double build_seconds=elapsed(); + O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + options.time_limit_seconds=seconds;options.random_seed=0;options.threads=1; + options.relative_gap=0;options.absolute_gap=0; + O::SolveResult result;std::optional frontier; + O::NativeLpStatistics relaxation; + O::NativeNeighborhoodStatistics neighborhood; + const auto solve_start=Clock::now(); + if (configuration.frontier) { + O::NativeSearchOptions search;search.solve=options;search.order=O::NativeSearchOrder::DepthFirst; + search.max_open_nodes=configuration.max_open_nodes; + if (configuration.checked_lp) search.relaxation=configuration.lp; + if (configuration.reliability) search.branching=configuration.branching; + if (configuration.neighborhoods) { + O::NativeNeighborhoodOptions local; + local.search=search;local.neighborhood=configuration.neighborhood; + auto solved=O::solve_native_neighborhoods(snapshot,local); + neighborhood=solved.neighborhood;frontier=std::move(solved.search); + } else frontier=O::solve_native_search(snapshot,search); + result=frontier->result;relaxation=frontier->relaxation; + } else if (configuration.checked_lp) { + O::NativeLpOptions lp; + static_cast(lp)=configuration.lp;lp.solve=options; + auto solved=O::solve_native_lp(snapshot,lp); + result=std::move(solved.result);relaxation=solved.relaxation; + } else result=O::solve_native(snapshot,options); + const double solve_seconds=std::chrono::duration(Clock::now()-solve_start).count(); + const bool point=result.has_solution(); + if (result.model_id!=snapshot.model_id || result.revision!=snapshot.revision) + throw std::runtime_error("Result original identity mismatch"); + if (point && (result.values.size()!=snapshot.variables.size() || result.active_variables.size()!=snapshot.variables.size())) + throw std::runtime_error("Result original slot dimensions"); + std::cout<frontier.admitted_nodes;else std::cout<<"null"; + std::cout<<",\"node_count_scope\":"<frontier.expanded_nodes;else std::cout<<"null"; + std::cout<<",\"budget_nodes\":"; + if(frontier)std::cout<branching.budget_nodes;else std::cout<<"null"; + std::cout<<",\"peak_open_nodes\":"; + if(frontier)std::cout<frontier.peak_open_nodes;else std::cout<<"null"; + std::cout<<",\"unresolved_regions\":"; + if(frontier)std::cout<frontier.unresolved_regions;else std::cout<<"null"; + std::cout<<",\"algorithm_configuration\":";configuration.print(); + print_statistics(relaxation,frontier?frontier->branching:O::NativeBranchingStatistics{},neighborhood); + std::cout<<"}\n";return 0; + } catch (const std::exception& error) { + std::cerr<<"configured benchmark error: "<=self.protocol['limits'][category][0],'Invalid size') + self.decisions.append(dict(category=category,size=size,reason=reason,repeats=repeats, + after_records=len(self.records),cohorts=list(cohorts),phase=2)) + self.publish() + variants=('uncorrelated','correlated') if category=='knapsack' else ('single',) + for repetition in range(1,repeats+1): + for cohort in (cohorts if repetition==1 else cohorts[::-1]): + for variant in variants: + if not any(r['category']==category and r['size']==size and r['cohort']==cohort and + r['variant']==variant and r['repetition']==repetition for r in self.records): + self.execute(category,size,variant,cohort,repetition) + + def failed(self,category,size,cohort): + rows=self.rows(category,size,cohort) + variants=('uncorrelated','correlated') if category=='knapsack' else ('single',) + require(len(rows)==len({(r['variant'],r['repetition']) for r in rows}),'Duplicate observation') + complete={(v,r) for v in variants for r in (1,2)} <= {(r['variant'],r['repetition']) for r in rows} + return complete and all(any(not r['passed'] for r in rows if r['repetition']==rep) for rep in (1,2)) + + def run(self): + for category in self.protocol['limits']: + self.protocol['extended_boundaries'][category]={} + for cohort in COHORTS: + sizes=self.sizes(category) + passes=[s for s in sizes if self.passed(category,s,cohort,True)] + require(passes,'No initial confirmed passing size for '+category+'/'+cohort) + low=max(passes) + failed=[s for s in sizes if s>low and self.failed(category,s,cohort)] + high=min(failed,default=None) + # Reuse any discovered but not yet repeated larger failure first. + for candidate in sorted(s for s in sizes if s>low and self.rows(category,s,cohort)): + if high is not None:break + self.query(category,candidate,'confirm existing upper observation',cohorts=(cohort,)) + if self.passed(category,candidate,cohort,True):low=candidate + elif self.failed(category,candidate,cohort):high=candidate + next_size=low*2 + while high is None: + self.query(category,next_size,'uncapped exponential upper search',cohorts=(cohort,)) + if self.passed(category,next_size,cohort,True):low=next_size + elif self.failed(category,next_size,cohort):high=next_size + next_size*=2 + while high-low>max(1,math.ceil(0.02*low)): + mid=(low+high)//2 + seen={r['size'] for r in self.records if not r['probe'] and r['category']==category and r['cohort']==cohort and r['repetition']==2} + candidate=None + for distance in range(len(seen)+1): + for value in (mid-distance,mid+distance): + if lowbracket['lower'], 'Invalid observed bracket') + continued.require(bracket['target_width_met']==(bracket['width']<=bracket['target_width']), 'Incorrect convergence flag') + continued.require(bracket['target_width_met'] or bool(bracket['unresolved_reason']), 'Unexplained broad bracket') + upper_rows=[r for r in report['records'] if not r['probe'] and r['category']==family['id'] and r['cohort']==cohort and r['size']==bracket['upper']] + variants=('uncorrelated','correlated') if family['id']=='knapsack' else ('single',) + continued.require({(r['variant'],r['repetition']) for r in upper_rows}=={(v,n) for v in variants for n in (1,2)}, 'Incomplete failed upper') + continued.require(all(any(not r['passed'] for r in upper_rows if r['repetition']==n) for n in (1,2)), 'Upper did not fail both repetitions') + boundary=family[cohort+'_boundary'] + continued.require(boundary['confirmed_size']==bracket['lower'],'Projection lower differs') + boundary.update(censored=False,next_failure_size=bracket['upper'], + failed_upper_size=bracket['upper'],bracket_width=bracket['width'], + target_width_met=bracket['target_width_met'],unresolved_reason=bracket['unresolved_reason'], + next=f"Confirmed failed upper: {bracket['upper']}; sampled bracket width {bracket['width']}.") + projection['unresolved_brackets']=[dict(category=f,cohort=c,**b) for f,groups in brackets.items() for c,b in groups.items() if not b['target_width_met']] + projection['protocol_amendment']='After bounded discovery started, the user requested observed failed upper inputs. All initial measurements were retained and each cohort was extended without a study size ceiling.' + full=json.dumps(dict(projection=projection,report=report),indent=2,allow_nan=False)+'\n' + (path.parent/'projection.json').write_text(json.dumps(projection,indent=2,allow_nan=False)+'\n') + for name in ('public.json','gecode-final.json'):(path.parent/name).write_text(full) + lines=['# Final native algorithm comparison','', + 'All three cohorts use the same deterministic original models, one thread, and ten seconds per owning solve. The automatic clock includes every sequential racing probe and selected restart. Measured processes ran serially.', '', + 'Original Gecode is the preserved optimization-facade baseline before the algorithm changes, not a pristine upstream release. Auto + race combines exact structural preprocessing, compact DP, checked LP/branching selection, and opt-in sequential exploration. Configured uses the frozen family presets; no strategy was changed in response to this final study.', '', + '| Problem | Original solved / failed upper | Auto + race solved / failed upper | Configured solved / failed upper |', + '|---|---:|---:|---:|'] + for family in projection['families']: + cells=[] + for cohort in continued.COHORTS: + b=family[cohort+'_boundary'];cells.append(f"{b['label']} / {b['failed_upper_size']}") + lines.append('| '+family['name']+' | '+' | '.join(cells)+' |') + lines += ['',f"{projection['runs']} measured attempts plus three runtime-loader probes; cumulative active study wall time {report['elapsed_seconds']:.2f} seconds (preparation between phases excluded).",'', + 'The user removed the initial study ceilings after discovery had started. The original phase is preserved by hash, and every prior observation was retained. Each cohort was extended until a failed upper input was observed in both repetitions. Bisection narrows large brackets to approximately 2% of the solved lower size (one-unit brackets for small sizes). Any unresolved wider bracket caused by mixed confirmations is explicitly flagged in the export. No harness cap is reported as solver failure.', '', + 'Bars show the largest sampled size passing both repetitions and every variant. The table also reports the observed failed upper. Seeded-instance difficulty need not be monotonic: reversals and mixed confirmations remain in the raw report, so these are sampled brackets, not mathematical maximum-size guarantees.', '', + 'Every returned original witness was independently checked. Exact optimal status is backend-reported; no independent optimum oracle is claimed. The same seeded families informed the earlier frozen configured policy, so this is not a holdout study.', '', + f"Automatic diagnostics across measured attempts: {race['skipped']} races skipped for direct-path compatibility; {race['one_probe']} one-probe results; {race['two_probes']} two-probe results; {race['selected_automatic']} selected automatic; {race['selected_ordinary']} selected ordinary. Counts are parsed from the saved solver diagnostics, and runtime probes are excluded.", '', + 'This comparison measures combined policies, not an ablation. A first automatic probe that proves optimality does not establish a benefit from racing; the gains may come from DP, preprocessing, LP bounds or branching. A separate ablation would be required to isolate individual contributions.', '', + 'Racing may increase total CPU burden or solve time because exploration and restarting repeat work. Several seconds or longer can still be worthwhile when exploration identifies a much more effective strategy for the remaining solve. Early progress is a heuristic, not a promise of future speedup.', '', + 'The public JSON retains every initial and extension probe/attempt, wall time, objective, bound, original witness, frozen model hash, policy, source hash, phase amendment, and verified loader identity.', '', + 'Original source: '+report['provenance']['original_source_head'], + 'Current source / extension runner: '+report['provenance']['source_head'], + 'Report SHA256: '+continued.sha(path), ''] + (path.parent/'FINAL-BENCHMARK.md').write_text('\n'.join(lines)) + print(json.dumps({'race_activity':race,'runs':projection['runs'],'sha256':continued.sha(path)})) + + +if __name__=='__main__': + parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('report',type=Path) + export(parser.parse_args().report) diff --git a/experiments/optimize/export_final_benchmark.py b/experiments/optimize/export_final_benchmark.py new file mode 100644 index 0000000000..fa946ea2e1 --- /dev/null +++ b/experiments/optimize/export_final_benchmark.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Export all three observed cohorts for the existing dashboard; never run solvers.""" +import argparse +import json +from pathlib import Path +import statistics + +from benchmark_final import COHORTS, ROOT, require, sha, generator, validate, legacy + +CATEGORIES = { + 'knapsack': ('Knapsack', 'Both random and correlated profits'), + 'assignment': ('Assignment', 'One task per worker'), + 'facility_location': ('Facility location', 'Two customers per candidate site'), + 'bin_packing': ('Bin packing', 'Weighted items; candidate bins grow with size'), + 'production': ('Production planning', 'Eight quantity options per period'), + 'native_tsp': ('Routing', 'Minimum-cost tour through all cities'), + 'weighted_queens': ('Weighted queens', 'Minimum-cost non-attacking placement'), +} + + +def export(path): + report=json.loads(path.read_text()) + require(report['complete'] and all(report['provenance']['integrity'].values()),'Incomplete study') + require(set(report['protocol']['cohort_labels'])==set(COHORTS),'Incorrect cohorts') + records=[r for r in report['records'] if not r['probe']] + require(all(r['status'] in ('optimal','time_limit','memory_limit') for r in records),'Invalid attempt') + keys=[(r['case'],r['cohort'],r['repetition']) for r in records] + require(len(keys)==len(set(keys)),'Duplicate observation') + models={m['id']:m for m in report['models']} + for key,value in models.items(): + for suffix in ('json','txt'): + require(sha(path.parent/'models'/(key+'.'+suffix))==value[suffix+'_sha256'],'Input changed') + for r in report['records']: + model=models[r['case']]['model'];raw=r['backend_result'] + selected=report['protocol']['policy']['families'][r['category']]['route'] + route='native' if r['cohort']=='before' else 'auto-race' if r['cohort']=='auto' else selected + require(route==r['route']==raw['route'],'Route differs from frozen policy') + checked=legacy.validate(raw,model) if r['cohort']=='before' else validate(raw,model,route) + for key in ('passed','status','solve_seconds','primal_checked','objective','best_bound'): + require(checked[key]==r[key],'Validation projection differs') + families=[] + for category,(name,detail) in CATEGORIES.items(): + selected=[r for r in records if r['category']==category] + sizes=sorted({r['size'] for r in selected});variants=2 if category=='knapsack' else 1 + def rows(size,cohort): + return [r for r in selected if r['size']==size and r['cohort']==cohort] + def passing(size,cohort,confirmed=False): + found=rows(size,cohort) + identities={(r['variant'],r['repetition']) for r in found} + names=('uncorrelated','correlated') if variants==2 else ('single',) + needed={(v,r) for v in names for r in range(1,3 if confirmed else 2)} + return needed<=identities and all(r['passed'] for r in found) + def label(size): + if size is None:return 'No confirmed size' + model=models[next(r['case'] for r in selected if r['size']==size)]['model'] + return f"{size} {model['size_unit']}" + cases=[] + for size in sizes: + model=models[next(r['case'] for r in selected if r['size']==size)]['model'] + item=dict(id=f'{category}-{size}',size=size,tier='adaptive',variables=model['model_variables'], + size_label=label(size),dimensions=label(size),eligible=category=='knapsack',variant_count=variants) + for cohort in COHORTS: + found=rows(size,cohort) + require(len(found) in (0,variants,2*variants),'Incomplete variant group') + solved=bool(found) and all(r['passed'] for r in found) + ms=[r['solve_seconds']*1000 for r in found];wall=[r['external_seconds']*1000 for r in found] + status='not_tested' if not found else 'solved' if solved else 'limited' if any(r['status'] in ('time_limit','memory_limit') for r in found) else 'mixed' + item[cohort]=dict(completed=sum(r['passed'] for r in found),attempts=len(found),status=status, + median_solve_ms=statistics.median(ms) if solved else None, + min_solve_ms=min(ms) if solved else None,max_solve_ms=max(ms) if solved else None, + median_wall_ms=statistics.median(wall) if solved else None) + cases.append(item) + family=dict(id=category,name=name,detail=detail,role='target',cases=cases, + configuration=report['protocol']['policy']['families'][category], + capacity_note='Largest sampled size confirmed twice in every variant. Ceiling bars are lower bounds; untested sizes remain unknown.') + for cohort in COHORTS: + best=max((s for s in sizes if passing(s,cohort,True)),default=None) + bigger=[s for s in sizes if best is not None and s>best and rows(s,cohort) and not passing(s,cohort)] + failure=min(bigger,default=None) + capped=best==report['protocol']['limits'][category][2] + if best is None:note='No size passed both confirmation runs.' + elif failure is not None:note=f'Next tested failure: {label(failure)}.' + elif capped:note='Search ceiling reached; upper limit unknown.' + else:note='No larger failure confirmed; upper limit unknown.' + exploratory=[s for s in sizes if passing(s,cohort) and (best is None or s>best)] + if exploratory:note+=' Larger discovery pass unconfirmed: '+label(max(exploratory))+'.' + reversals=sum(bool(rows(s,cohort)) and not passing(s,cohort) and any(t>s and passing(t,cohort) for t in sizes) for s in sizes) + family[cohort+'_boundary']=dict(label=label(best),next=note,reversals=reversals, + confirmed_size=best,next_failure_size=failure,censored=capped) + family[cohort+'_max']=next((c['variables'] for c in cases if c['size']==best),None) + families.append(family) + anomalies=[dict(case=r['case'],cohort=r['cohort'],repetition=r['repetition']) for r in records + if r['backend_result']['driver_seconds']>r['external_seconds']+0.1] + require(all(not r['passed'] for r in records if + r['backend_result']['driver_seconds']>r['external_seconds']+0.1), + 'A claimed passing result has inconsistent process/solve clocks; review required') + payload=dict(schema_version=1,families=families,runs=len(records),cases=len({r['case'] for r in records}), + elapsed_seconds=report['elapsed_seconds'],clock_anomalies=anomalies,seconds=10, + source_commit=report['provenance']['source_head'],report_sha256=sha(path), + cohort_labels=report['protocol']['cohort_labels'],configured=True,final=True,policy=report['protocol']['policy']) + output=json.dumps(dict(projection=payload,report=report),indent=2,allow_nan=False)+'\n' + require(all(p not in output for p in ('/Users/','/home/','file://')),'Private path in export') + (path.parent/'projection.json').write_text(json.dumps(payload,indent=2,allow_nan=False)+'\n') + (path.parent/'gecode-final.json').write_text(output) + (path.parent/'public.json').write_text(output) + lines=['# Final native algorithm comparison','', + 'Three freshly measured cohorts use the same deterministic original models, one thread and ten seconds per solve. The automatic clock includes every racing probe and selected restart. All processes run serially.', '', + 'Original Gecode is the preserved optimization-facade baseline before the algorithm changes, not a pristine upstream distribution. Automatic uses structural preprocessing and a bounded sequential race; configured uses the frozen family policy, with compact DP for knapsack.', '', + '| Problem size unit | Original | Auto + race | Configured |', '|---|---:|---:|---:|'] + for f in families: + cells=[] + for c in COHORTS: + b=f[c+'_boundary'];cells.append(('≥' if b['censored'] else '')+b['label']) + lines.append('| '+f['name']+' | '+' | '.join(cells)+' |') + lines += ['',f'{len(records)} measured attempts plus three runtime probes; total elapsed {report["elapsed_seconds"]:.2f} seconds.', '', + 'Each bar is the largest sampled size passing two repetitions and every variant. ≥ marks a search ceiling, not a measured upper limit. Bisection is a sampling heuristic; difficulty need not be monotonic and raw reversals are retained. Every returned original witness is independently checked; exact optimality is backend-reported. No independent optimum oracle or holdout-family claim is made.', '', + 'Racing can increase total CPU use and elapsed solve time by repeating exploratory work and restarting a strategy. A short exploration may identify a much more effective route for a longer solve; gains are workload-dependent.', '', + 'The JSON export contains every probe, attempt, status, timing, bound, objective, original witness, frozen input hash, policy, source hash and verified loader identity. No unsuccessful attempt is silently removed.', '', + 'Report SHA256: '+sha(path), ''] + (path.parent/'FINAL-BENCHMARK.md').write_text('\n'.join(lines)) + print(json.dumps({'runs':len(records),'families':len(families),'report_sha256':sha(path)})) + + +if __name__=='__main__': + parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('report',type=Path) + export(parser.parse_args().report.resolve(strict=True)) diff --git a/experiments/optimize/fast-fixtures/cancellation.lp b/experiments/optimize/fast-fixtures/cancellation.lp new file mode 100644 index 0000000000..7b1848a4cf --- /dev/null +++ b/experiments/optimize/fast-fixtures/cancellation.lp @@ -0,0 +1,7 @@ +Minimize + obj: x +Subject To + cancellation: x + 1 - 1e16 >= -1e16 +Bounds + x free +End diff --git a/experiments/optimize/fast-fixtures/precision.lp b/experiments/optimize/fast-fixtures/precision.lp new file mode 100644 index 0000000000..561795fcf5 --- /dev/null +++ b/experiments/optimize/fast-fixtures/precision.lp @@ -0,0 +1,9 @@ +Minimize + obj: x +Subject To + precision: 100000000000000.125 x >= 100000000000000.25 +Bounds + 0 <= x <= 10 +General + x +End diff --git a/experiments/optimize/fast_regression.py b/experiments/optimize/fast_regression.py new file mode 100644 index 0000000000..42a45da361 --- /dev/null +++ b/experiments/optimize/fast_regression.py @@ -0,0 +1,353 @@ +#!/usr/bin/env python3 +"""Bounded correctness/regression panel for PREBUILT Gecode binaries (POSIX). + +Windows containment is implemented for CI verification, with production support +disabled until those platform tests provide evidence. +""" +import time +ENTRY = time.monotonic() +import argparse +import hashlib +import json +import math +import os +from pathlib import Path +import platform +import signal +import subprocess +import sys +import tempfile +import threading + +NATIVE_CASES = ( + ("cp_distinct", "Int::Distinct::Dom::Dense"), + ("cp_element", "Int::Element::Matrix::Int::IntVar::XY"), + ("cp_cumulative", "Int::Cumulative::Man::Fix::0::2::[1,1,1,1]::[1,1,1,1]::Def+B+A"), + ("cp_search", "Search::DFS::Sol::Binary::Binary::Binary::2::1::1"), +) +INTEGER_ORACLE = min(4*n + 5*k + 2 for n in range(-3, 8) for k in range(6) if 2*n+3*k >= 7) +RECOURSE_ORACLE = [min(-4 + 7*b + 3*n + 1.5*max(0, d-3*n) + for b in range(2) for n in range(6) if max(0, d-3*n) <= 25*b) + for d in (3, 7, 11, 17, 19, 23)] +NATIVE_OBJECTIVES = [-2*n + 3*s - 4*b + (1-b) - 7 + for b in range(2) for n in range(-3, 4) for s in (0, 2, 3, 4) + if (-2 <= 2*n-s+b <= 1 if b else n+s <= 2)] +HYBRID_OBJECTIVES = [4*n + 5*k + 2 for n in range(-3, 8) for k in range(6) if 7 <= 2*n+3*k <= 12] +PRESOLVED_OBJECTIVES = [5 + 2*y for y in range(-2, 3) if 4 <= 6-2*y <= 8] +START_OBJECTIVES = [x - 10*b + 3 for b in (0, 1) for x in range(5) if not b or x >= 3] +REGULAR_OBJECTIVES = [a+b+c for a in (-1, 1) for b in (-1, 1) for c in (-1, 1) + if ((a == 1) + (b == 1) + (c == 1)) % 2 == 0] +OPTIMIZE_CASES = { + "native_neighborhoods": ("optimal", [-29]), + "lp_sensitivity": ("sensitivity_checked", []), + "lp_evidence": ("evidence_checked", []), + "scenario_batches": ("optimal", [5, 9, -11, 7]), + "native_regular": ("optimal", [min(REGULAR_OBJECTIVES), max(REGULAR_OBJECTIVES)]), + "lp_observations": ("optimal", [15, 19]), + "lp_min_offset": ("optimal", [4]), "lp_max_offset": ("optimal", [15]), + "bounded_integer": ("optimal", [INTEGER_ORACLE]), "mixed_recourse": ("optimal", RECOURSE_ORACLE), + "indicators_boolean": ("optimal", [-13]), "semis": ("optimal", [8, -1]), + "multiobjective": ("optimal", [14, 1]), "infeasible": ("infeasible", []), + "unbounded": ("unbounded", []), "edits_io": ("optimal", [5, 7, 7, 7, -1]), + "limit_contracts": ("contract_pass", []), + "session_reoptimization": ("optimal", [5, 13, 18, -6, 2, 3, 5, 5]), + "diagnostics_groups": ("irreducible", []), + "native_exact_reified": ("optimal", [min(NATIVE_OBJECTIVES), max(NATIVE_OBJECTIVES)]), + "native_globals": ("optimal", [7, 30]), + "c_api_ownership": ("optimal", [5.75, 6.25]), + "feasibility_repair": ("optimal", [1, -1, 0, -2]), + "native_checked_lp": ("optimal", [min(HYBRID_OBJECTIVES), max(HYBRID_OBJECTIVES)]), + "solution_pool": ("optimal", sorted(n + max(0, 4-2*n) - 1 for n in range(3))), + "integer_presolve": ("optimal", [min(PRESOLVED_OBJECTIVES), max(PRESOLVED_OBJECTIVES)]), + "native_frontier_bounds": ("optimal", [-17, -15, -17, 17, 15, 17]), + "convex_quadratic": ("optimal", [3.5, 2.5]), + "native_root_covers": ("optimal", [15, 19]), + "native_binary_branching": ("optimal", [-17, 17]), + "native_complete_start": ("optimal", [min(START_OBJECTIVES), max(START_OBJECTIVES)]), +} +REQUIRED = [name for name, _ in NATIVE_CASES] + list(OPTIMIZE_CASES) +MAX_OUTPUT = 65536 +_CONTAINMENT = None + + +def containment_module(): + # This file is also loaded directly through importlib by runner tests, where + # its directory need not be on sys.path. Do not change the caller's sys.path. + global _CONTAINMENT + if _CONTAINMENT is None: + import importlib.util + spec = importlib.util.spec_from_file_location( + "gecode_fast_process_containment", Path(__file__).with_name("process_containment.py")) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + _CONTAINMENT = module + return _CONTAINMENT + + +def platform_support_error(name): + if name == "posix": + return None + if name == "nt": + if containment_module().WINDOWS_RUNTIME_VERIFIED: + return None + return ("Unsupported: Windows FAST support is unfinished. Job Object containment " + "requires real Windows CI verification before this command is enabled.") + return "Unsupported: this platform has no verified process-tree containment" + + +class Failure(RuntimeError): + pass + + +class Budget: + """One outer monotonic deadline; reserve time for cleanup and final report.""" + def __init__(self, seconds, start=None, watchdog=False): + self.start = time.monotonic() if start is None else start + self.deadline = self.start + seconds + self.work_deadline = self.deadline - min(0.75, seconds / 4) + self.pid = None + self.containment = None + if watchdog: + timer = threading.Timer(max(0, self.deadline-time.monotonic()), self.emergency) + timer.daemon = True + timer.start() + + def emergency(self): + # Do not risk blocking on output from the last-resort watchdog. + try: + self.kill_group() + finally: + os._exit(124) + + def kill_group(self): + if self.containment is not None: + self.containment.terminate() + elif self.pid is not None: + try: + os.killpg(self.pid, signal.SIGKILL) + except ProcessLookupError: + pass + + def remaining(self): + return max(0.0, self.work_deadline-time.monotonic()) + + def check(self): + if self.remaining() <= 0: + raise Failure("whole-run wall budget exhausted") + + +def sha256(path, budget): + digest = hashlib.sha256() + with Path(path).open("rb") as stream: + while True: + budget.check() + data = stream.read(1024*1024) + if not data: + return digest.hexdigest() + digest.update(data) + + +def run_command(command, budget, seconds, directory): + """Capture bounded output without inherited-pipe hangs; kill descendants.""" + budget.check() + if budget.containment is not None: + raise Failure("prior Windows Job Object cleanup failed; refusing another launch") + started = time.monotonic() + finish = min(budget.work_deadline, started+seconds) + result = {"command": [str(x) for x in command], "returncode": None, "stdout": "", "stderr": ""} + proc = None + with tempfile.TemporaryFile(dir=directory) as stdout, tempfile.TemporaryFile(dir=directory) as stderr: + try: + if os.name == "nt": + proc = containment_module().WindowsJobProcess() + # The watchdog must know the job owner before ANY process exists. + budget.containment = proc + proc.start(command, stdout, stderr, directory) + else: + proc = subprocess.Popen(command, stdin=subprocess.DEVNULL, stdout=stdout, stderr=stderr, + start_new_session=True, cwd=directory, close_fds=True) + budget.pid = proc.pid + while proc.poll() is None: + if max(os.fstat(stdout.fileno()).st_size, os.fstat(stderr.fileno()).st_size) > MAX_OUTPUT: + raise Failure("subprocess output limit exceeded") + if time.monotonic() >= finish: + raise Failure("subprocess wall deadline exceeded") + time.sleep(min(0.01, max(0, finish-time.monotonic()))) + if time.monotonic() >= finish: + raise Failure("subprocess completed after wall deadline") + except (Failure, OSError, ValueError) as error: + result["error"] = str(error) + finally: + if proc is not None: + # Also terminate descendants after a successful parent exit. + reserve = max(0, min(0.2, budget.deadline-time.monotonic())) + if budget.containment is not None: + try: + proc.cleanup(timeout=reserve) + except (OSError, subprocess.TimeoutExpired) as error: + result["error"] = "Windows subprocess cleanup failed: " + str(error) + # On a failed handle close, retain the job for the watchdog. + if proc.job is None: + budget.containment = None + else: + budget.kill_group() + try: + proc.wait(timeout=max(0.001, min(0.2, budget.deadline-time.monotonic()))) + except subprocess.TimeoutExpired: + result["error"] = "subprocess could not be reaped within cleanup reserve" + result["returncode"] = proc.returncode + budget.pid = None + for label, stream in (("stdout", stdout), ("stderr", stderr)): + stream.seek(0) + data = stream.read(MAX_OUTPUT+1) + if len(data) > MAX_OUTPUT: + result["error"] = "subprocess output limit exceeded" + result[label] = data[:MAX_OUTPUT].decode("utf-8", errors="replace") + result["wall_seconds"] = time.monotonic()-started + return result + + +def validate_output(name, result, native=None): + if result.get("error"): + raise Failure(result["error"]) + if result["returncode"] != 0: + raise Failure("subprocess failed with exit code " + str(result["returncode"])) + if result["stderr"]: + raise Failure("unexpected subprocess stderr") + if native is not None: + if result["stdout"].strip() != native + " +": + raise Failure("required native case missing, duplicated, or failed") + return {"status": "passed_native_oracle", "checks": 1, "objectives": [], + "backend": "native Gecode CP"} + def reject_constant(value): + raise Failure("nonfinite JSON number: " + value) + try: + payload = json.loads(result["stdout"], parse_constant=reject_constant) + except (ValueError, TypeError) as error: + raise Failure("invalid panel JSON: " + str(error)) from error + if not isinstance(payload, dict) or payload.get("case") != name: + raise Failure("wrong or missing panel case") + status, expected = OPTIMIZE_CASES[name] + if payload.get("status") != status: + raise Failure("unexpected optimization status") + if type(payload.get("checks")) is not int or payload["checks"] < 1: + raise Failure("panel performed no checks") + for field in ("backend", "backend_version"): + if not isinstance(payload.get(field), str) or not payload[field]: + raise Failure("missing backend identity") + native_bridge = name in ("native_exact_reified", "native_globals", "native_regular", "native_checked_lp", "integer_presolve", "native_frontier_bounds", "native_root_covers", "native_binary_branching", "native_complete_start", "native_neighborhoods") + expected_backend = {"native_neighborhoods": "Gecode native frontier + BinaryHamming", "native_checked_lp": "Gecode native + checked LP", "native_root_covers": "Gecode native + checked LP", "native_frontier_bounds": "Gecode native frontier", "native_binary_branching": "Gecode native frontier", "convex_quadratic": "HiGHS QP"}.get(name, "Gecode native" if native_bridge else "HiGHS") + if payload["backend"] != expected_backend: + raise Failure("wrong backend provenance for required case") + if payload.get("guarantee") != ("exact" if native_bridge else "numerical"): + raise Failure("wrong guarantee for required case") + elapsed = payload.get("elapsed_seconds") + if type(elapsed) not in (int, float) or not math.isfinite(elapsed) or elapsed < 0: + raise Failure("invalid panel elapsed time") + values = payload.get("objectives") + if not isinstance(values, list) or len(values) != len(expected): + raise Failure("missing objective observations") + for value, oracle in zip(values, expected): + if (type(value) not in (int, float) or not math.isfinite(value) + or (value != oracle if native_bridge else abs(value-oracle) > 1e-6)): + raise Failure("independent objective oracle mismatch") + return payload + + +def source_fingerprint(root, budget): + files = [Path("test/optimize/fast_benchmark.cpp"), Path("test/test.cpp"), Path("test/int.cpp"), + Path("test/int.hh"), Path("test/int/distinct.cpp"), Path("test/int/element.cpp"), + Path("test/int/cumulative.cpp"), Path("test/search.cpp"), + Path("gecode/kernel/core.cpp"), Path("gecode/kernel/core.hpp"), + Path("experiments/optimize/fast_regression.py"), + Path("experiments/optimize/process_containment.py")] + files += [p.relative_to(root) for p in (root/"gecode/optimize").glob("*") if p.suffix in (".h", ".hpp", ".cpp")] + files += [Path("gecode/minimodel")/name for name in + ("lp-model.hpp", "lp-backend.hpp", "lp-relaxation.hpp", "lp-certificate.hpp")] + files += [p.relative_to(root) for p in (root/"experiments/optimize/fast-fixtures").glob("*") if p.is_file()] + hashes = {str(p): sha256(root/p, budget) for p in sorted(set(files))} + aggregate = hashlib.sha256(json.dumps(hashes, sort_keys=True).encode()).hexdigest() + return {"sha256": aggregate, "files": hashes} + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--native-binary", required=True, type=Path) + parser.add_argument("--optimize-binary", required=True, type=Path) + parser.add_argument("--source-root", type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument("--library", action="append", type=Path, default=[], help="also hash each dynamically linked solver library") + parser.add_argument("--budget-seconds", type=float, default=28.0) + parser.add_argument("--case-seconds", type=float, default=4.0) + parser.add_argument("--output", type=Path, help="optional NEW report path; never overwrite") + args = parser.parse_args(argv) + if not (math.isfinite(args.budget_seconds) and 1 <= args.budget_seconds <= 28): + parser.error("--budget-seconds must be finite and between 1 and 28") + if not (math.isfinite(args.case_seconds) and 0 < args.case_seconds <= args.budget_seconds): + parser.error("--case-seconds must be positive, finite and within the outer budget") + budget = Budget(args.budget_seconds, ENTRY, watchdog=True) + report = {"schema": 1, "passed": False, "budget_seconds": args.budget_seconds, "timing_comparable": False, + "timing_note": "Correctness gate; compare timings only on an uncontended host with matching build configuration.", + "platform": platform.platform(), "python": platform.python_version(), "seed": 1701, + "native_bridge_seed": 0, "threads": 1, + "required_cases": REQUIRED, "cases": []} + unsupported = platform_support_error(os.name) + if unsupported: + report["error"] = unsupported + report["cases"] = [{"case": name, "correctness": "not_run", + "error": unsupported} for name in REQUIRED] + report["elapsed_seconds"] = time.monotonic()-ENTRY + print(json.dumps(report, allow_nan=False)) + return 1 + try: + root = args.source_root.resolve(strict=True) + binaries = {"native": args.native_binary.resolve(strict=True), "optimize": args.optimize_binary.resolve(strict=True)} + if args.output and args.output.exists(): + raise Failure("report destination already exists") + report["source"] = source_fingerprint(root, budget) + report["binaries"] = {name: {"path": str(path), "sha256": sha256(path, budget)} for name, path in binaries.items()} + report["libraries"] = [{"path": str(path.resolve()), "sha256": sha256(path, budget)} for path in args.library] + with tempfile.TemporaryDirectory(prefix="gecode-fast-") as temporary: + for name in REQUIRED: + if not budget.remaining(): + report["cases"].append({"case": name, "correctness": "not_run", "error": "whole-run wall budget exhausted"}) + continue + native = dict(NATIVE_CASES).get(name) + seconds = min(args.case_seconds, budget.remaining()) + directory = Path(temporary)/name + directory.mkdir() + if native: + command = [str(binaries["native"]), "-threads", "1", "-seed", "1701", "-iter", "1", "-test", "^"+native] + else: + command = [str(binaries["optimize"]), "--case", name, "--work-dir", str(directory), + "--fixtures", str(root/"experiments/optimize/fast-fixtures"), "--seconds", str(seconds)] + result = run_command(command, budget, seconds, directory) + result.update(case=name, correctness="fail") + try: + result["observation"] = validate_output(name, result, native) + result["correctness"] = "pass" + except Failure as error: + result["error"] = str(error) + report["cases"].append(result) + report["passed"] = len(report["cases"]) == len(REQUIRED) and all(c["correctness"] == "pass" for c in report["cases"]) + except (Failure, OSError) as error: + report["error"] = str(error) + present = {case["case"] for case in report["cases"]} + report["cases"] += [{"case": name, "correctness": "not_run", "error": report.get("error", "required case absent")} for name in REQUIRED if name not in present] + report["elapsed_seconds"] = time.monotonic()-ENTRY + if report["elapsed_seconds"] >= args.budget_seconds: + report.update(passed=False, error="whole-run wall budget exceeded") + text = json.dumps(report, indent=2, sort_keys=True, allow_nan=False)+"\n" + if args.output and not args.output.exists(): + try: + with args.output.open("x") as output: + output.write(text) + except OSError as error: + report.update(passed=False, error="cannot create report: "+str(error)) + text = json.dumps(report, indent=2, sort_keys=True, allow_nan=False)+"\n" + sys.stdout.write(text) + sys.stdout.flush() + return 0 if report["passed"] and time.monotonic() < budget.deadline else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/experiments/optimize/final-policy.json b/experiments/optimize/final-policy.json new file mode 100644 index 0000000000..6a07791596 --- /dev/null +++ b/experiments/optimize/final-policy.json @@ -0,0 +1,53 @@ +{ + "schema_version": 1, + "purpose": "Frozen intuition-selected presets for the final three-cohort study", + "selected_from_pilot": { + "report": "build/configured-bench/pilot/report.json", + "sha256": "ab5ad4b31502a48511ec18ae7c6165d63cbb7331e5f8419c0157544f8c83feb8", + "runs": 42 + }, + "selection_rule": "Reuse the earlier frozen family presets, updating knapsack to the expanded exact DP admission. No new pilot or per-instance fastest-route selection.", + "families": { + "knapsack": { + "route": "native", + "label": "Compact exact capacity DP", + "rationale": "All frozen-domain knapsack sizes fit the expanded DP work/memory admission; native falls back to BAB if its local time cap is reached." + }, + "assignment": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "One root LP solved the pilot; extra LP updates, cuts and probes added work." + }, + "facility_location": { + "route": "lp-updated", + "label": "Checked LP bounds updated during search", + "rationale": "Updates every four bound changes improved the pilot. The bounded cover check emits cuts only when found; its unit rows yielded none." + }, + "bin_packing": { + "route": "lp-root", + "label": "Checked LP bounds at the root", + "rationale": "Root bounds solved the pilot quickly. Extra cover rounds and probes increased solve time on the selection case." + }, + "production": { + "route": "lp-reliability", + "label": "Updated LP bounds, covers and reliability branching", + "rationale": "Updated bounds and bounded probes reduced the pilot from a timeout to about 43 ms. Covers are checked against original rows." + }, + "native_tsp": { + "route": "native", + "label": "Native circuit and table constraints", + "rationale": "Binary probes and Hamming neighborhoods do not apply to these integer variables; LP omits the global constraints." + }, + "weighted_queens": { + "route": "native", + "label": "Native distinct and table constraints", + "rationale": "Preserve global propagation. The available new branching and neighborhood rules target binary variables." + } + }, + "excluded": { + "neighborhoods": "The bounded radius-four candidate was measured, but did not improve total pilot solve time; every attempt and result remains in the pilot.", + "presolve": "Automatic cohort alone composes exact presolve, independent components and identical-column symmetry. Explicit configured routes preserve their declared settings.", + "learning": "No production learning runtime has been implemented.", + "numerical_backend": "This comparison remains native Gecode; it does not substitute the numerical HiGHS MILP route." + } +} diff --git a/experiments/optimize/final_benchmark.cpp b/experiments/optimize/final_benchmark.cpp new file mode 100644 index 0000000000..a943b81eb4 --- /dev/null +++ b/experiments/optimize/final_benchmark.cpp @@ -0,0 +1,428 @@ +/* Final three-cohort driver. Whole solve time includes every racing probe. */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +using Clock = std::chrono::steady_clock; + +namespace { +struct Reader { + std::ifstream file; + explicit Reader(const std::string& path) : file(path) { + if (!file) throw std::runtime_error("Cannot open frozen TXT input"); + file.seekg(0, std::ios::end); + const auto bytes = file.tellg(); + if (bytes < 0 || bytes > 4*1024*1024) + throw std::runtime_error("TXT input size limit"); + file.seekg(0); + } + std::string token() { + std::string value; + if (!(file >> value) || value.size() > 100) + throw std::runtime_error("Missing/oversized TXT token"); + return value; + } + std::int64_t integer(std::int64_t lower, std::int64_t upper) { + const auto text = token(); + std::int64_t value = 0; + const auto parsed = std::from_chars(text.data(), text.data()+text.size(), value); + if (parsed.ec != std::errc() || parsed.ptr != text.data()+text.size() || + value < lower || value > upper) + throw std::runtime_error("Invalid/out-of-range TXT integer"); + return value; + } + void end() { + std::string extra; + if (file >> extra) throw std::runtime_error("Trailing TXT content"); + if (!file.eof()) throw std::runtime_error("TXT read failure"); + } +}; + +struct Built { + O::Model model; + std::vector original; +}; + +Built binary(Reader& input) { + Built out; + const auto n = static_cast(input.integer(1, 10000)); + const auto m = static_cast(input.integer(0, 100000)); + out.original = out.model.add_variables( + std::vector(n, {O::VariableType::Binary, 0, 1, {}})); + std::vector objective; + for (std::size_t j=0; j(cost)}); + } + O::SparseRowBatch rows; + rows.columns = out.original; + std::size_t total = 0; + for (std::size_t i=0; i(input.integer(-1000000000,1000000000))); + rows.upper.push_back(std::numeric_limits::infinity()); + const auto count = static_cast(input.integer(0, static_cast(n))); + if (count > 2000000-total) throw std::runtime_error("TXT nonzero limit"); + total += count; + std::int64_t previous = -1; + for (std::size_t k=0; k(n)-1); + const auto coefficient = input.integer(-1000000000, 1000000000); + if (column <= previous || !coefficient) + throw std::runtime_error("Noncanonical TXT row"); + previous = column; + rows.column.push_back(static_cast(column)); + rows.coefficient.push_back(static_cast(coefficient)); + } + rows.row_start.push_back(rows.column.size()); + } + out.model.add_rows_sparse(rows); + out.model.minimize(objective); + if (input.token() != "incumbent") + throw std::runtime_error("Missing legacy incumbent marker"); + const auto present = input.integer(0, 1); + // Legacy files contain a reference-free initial witness. Parse and discard it; + // neither this witness nor any reference objective enters solve options. + if (present) + for (std::size_t i=0; i(input.integer(1, 100)); + if (input.integer(0, 0) != 0 || input.integer(1, 100) != static_cast(n)) + throw std::runtime_error("Native TXT dimensions"); + std::vector costs(n*n); + for (auto& cost : costs) cost = input.integer(0, 100000); + for (std::size_t j=0; j(n)-1); + input.end(); + Built out; + for (std::size_t j=0; j(n)-1)); + if (expected == "native_tsp") O::add_circuit(out.model, out.original); + else { + O::add_all_different(out.model,out.original); + std::vector rising, falling; + for (std::size_t j=0; j(j),static_cast(n+j-1)); + const auto b=out.model.add_integer(-static_cast(j),static_cast(n-1)-j); + out.model.add_row({{a,1},{out.original[j],-1}},static_cast(j),static_cast(j)); + out.model.add_row({{b,1},{out.original[j],-1}},-static_cast(j),-static_cast(j)); + rising.push_back(a); + falling.push_back(b); + } + O::add_all_different(out.model, rising); + O::add_all_different(out.model, falling); + } + std::vector objective; + for (std::size_t j=0; j(*std::min_element(begin,end)), + static_cast(*std::max_element(begin,end))); + std::vector> tuples; + for (std::size_t k=0; k(k), costs[j*n+k]}); + O::add_table(out.model, {out.original[j], cost}, tuples); + objective.push_back({cost, 1}); + } + out.model.minimize(objective); + return out; +} + +std::string quote(const std::string& text) { + std::ostringstream out; + out << '"'; + for (unsigned char c : text) { + if (c == '"' || c == '\\') out << '\\' << c; + else if (c < 32) + out << "\\u" << std::hex << std::setw(4) << std::setfill('0') << unsigned(c) << std::dec; + else out << c; + } + out << '"'; + return out.str(); +} + +void optional(const std::optional& value) { + if (!value) std::cout << "null"; + else if (!std::isfinite(*value)) throw std::runtime_error("Nonfinite original result scalar"); + else std::cout << *value; +} + +const char* completion(O::NativeRootCoverCompletion value) { +#define COVER_CASE(name) case O::NativeRootCoverCompletion::name: return #name + switch (value) { + COVER_CASE(NotRequested); COVER_CASE(NotStarted); COVER_CASE(NoNewCuts); + COVER_CASE(RoundLimit); COVER_CASE(WorkLimit); COVER_CASE(StorageLimit); + COVER_CASE(SeparationLimit); COVER_CASE(Cancelled); COVER_CASE(TimeLimit); + COVER_CASE(NoPrimalSuggestion); COVER_CASE(InvalidSuggestion); + COVER_CASE(CallbackError); COVER_CASE(BackendError); COVER_CASE(AllocationFailure); + } +#undef COVER_CASE + throw std::runtime_error("Unknown root-cover completion"); +} + +const char* completion(O::NativeNeighborhoodCompletion value) { +#define NEIGHBOR_CASE(name) case O::NativeNeighborhoodCompletion::name: return #name + switch (value) { + NEIGHBOR_CASE(NotStarted); NEIGHBOR_CASE(NoIncumbent); + NEIGHBOR_CASE(ProofCompletedBeforeAttempt); NEIGHBOR_CASE(NoEligibleBinary); + NEIGHBOR_CASE(NonrestrictingRadius); NEIGHBOR_CASE(FormulationLimit); + NEIGHBOR_CASE(SourceLimit); NEIGHBOR_CASE(WorkLimit); NEIGHBOR_CASE(StatusLimit); + NEIGHBOR_CASE(SharedNodeReserve); NEIGHBOR_CASE(LocalStorageLimit); + NEIGHBOR_CASE(LocalTimeLimit); NEIGHBOR_CASE(NoImprovement); + NEIGHBOR_CASE(Improved); NEIGHBOR_CASE(GlobalStop); NEIGHBOR_CASE(Error); + } +#undef NEIGHBOR_CASE + throw std::runtime_error("Unknown neighborhood completion"); +} + +struct Configuration { + bool automatic_race = false; + bool frontier = false, checked_lp = false, covers = false; + bool reliability = false, neighborhoods = false; + O::NativeLpSettings lp; + O::NativeBranchingSettings branching; + O::NativeNeighborhoodSettings neighborhood; + std::size_t max_open_nodes = 1024; + + explicit Configuration(const std::string& route) { + if (route == "auto-race") { automatic_race = true; return; } + if (route == "native") return; + if (route == "lp-root") checked_lp = true; + else if (route == "lp-cuts") checked_lp = covers = true; + else if (route == "lp-updated") { + checked_lp = covers = true; + lp.frequency = O::NativeLpFrequency::AfterBoundChanges; + } else if (route == "dfs-reliability") frontier = reliability = true; + else if (route == "lp-reliability" || route == "lp-reliability-neighborhood") { + frontier = reliability = checked_lp = covers = true; + lp.frequency = O::NativeLpFrequency::AfterBoundChanges; + neighborhoods = route == "lp-reliability-neighborhood"; + } else throw std::runtime_error("Invalid driver route"); + if (lp.frequency == O::NativeLpFrequency::AfterBoundChanges) + lp.bound_change_interval = 4; + if (covers) lp.root_cover_cuts = O::NativeRootCoverSettings{}; + neighborhood.radius = 4; + neighborhood.time_limit_seconds = 0.05; + } + + void print() const { + if (automatic_race) { + std::cout << "{\"entry_point\":\"solve_native_race\"," + "\"exploration_seconds\":2,\"probe_node_limit\":4096," + "\"candidates\":[\"structural_auto\",\"ordinary_native\"]," + "\"presolve\":\"automatic\",\"components\":\"automatic\"," + "\"symmetry\":\"identical_columns\",\"cpu_warning\":true}"; + return; + } + const auto flag = [](bool value) { return value ? "true" : "false"; }; + std::cout << "{\"entry_point\":" << quote(neighborhoods ? "solve_native_neighborhoods" : + frontier ? "solve_native_search" : checked_lp ? "solve_native_lp" : "solve_native") + << ",\"search_order\":" << quote(frontier ? "depth_first" : "native_bab") + << ",\"checked_lp\":" << flag(checked_lp) + << ",\"lp_frequency\":"; + if (checked_lp) std::cout << quote(lp.frequency == O::NativeLpFrequency::Root ? "root" : "after_bound_changes"); + else std::cout << "null"; + std::cout << ",\"bound_tightening\":" << flag(checked_lp && lp.bound_tightening) + << ",\"bound_change_interval\":"; + if (checked_lp) std::cout << lp.bound_change_interval; else std::cout << "null"; + std::cout << ",\"root_cover_cuts\":" << flag(covers) + << ",\"binary_reliability\":" << flag(reliability) + << ",\"neighborhoods\":" << flag(neighborhoods) + // Eligibility of this route is not a claim that the model passes the + // internal DP admission checks. The public API has no DP-used counter. + << ",\"knapsack_dp_eligible_route\":" << flag(!checked_lp) + << ",\"presolve\":false,\"max_open_nodes\":"; + if (frontier) std::cout << max_open_nodes; else std::cout << "null"; + std::cout << ",\"cover_settings\":"; + if (covers) { + const auto& c = *lp.root_cover_cuts; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"max_rounds\":" << c.max_rounds + CONFIG_FIELD(max_work) CONFIG_FIELD(max_cuts) CONFIG_FIELD(max_cut_nonzeros) + CONFIG_FIELD(max_model_columns) CONFIG_FIELD(max_model_rows) + CONFIG_FIELD(max_model_nonzeros) CONFIG_FIELD(max_separation_rows) + CONFIG_FIELD(max_terms_per_row) CONFIG_FIELD(denominator) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << ",\"branching_settings\":"; + if (reliability) { + const auto& c = branching; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"policy\":\"binary_reliability\"" + CONFIG_FIELD(max_candidates_per_decision) CONFIG_FIELD(max_probe_status_calls) + CONFIG_FIELD(max_probe_status_calls_per_decision) CONFIG_FIELD(max_branching_work) + CONFIG_FIELD(reliability_samples) CONFIG_FIELD(max_nonimproving_pairs) + CONFIG_FIELD(max_history_entries) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << ",\"neighborhood_settings\":"; + if (neighborhoods) { + const auto& c = neighborhood; +#define CONFIG_FIELD(name) << ",\"" #name "\":" << c.name + std::cout << "{\"policy\":\"binary_hamming\"" + CONFIG_FIELD(radius) CONFIG_FIELD(max_status_calls) CONFIG_FIELD(max_distance_variables) + CONFIG_FIELD(max_source_entries) CONFIG_FIELD(max_coordinator_work) + CONFIG_FIELD(max_local_spaces) CONFIG_FIELD(time_limit_seconds) << '}'; +#undef CONFIG_FIELD + } else std::cout << "null"; + std::cout << '}'; + } +}; + +void print_statistics(const O::NativeLpStatistics& lp, + const O::NativeBranchingStatistics& branching, + const O::NativeNeighborhoodStatistics& neighborhood) { + std::cout << ",\"relaxation\":{\"lp_calls\":" << lp.lp_calls; +#define LP_FIELD(name) << ",\"" #name "\":" << lp.name + std::cout LP_FIELD(lp_seconds) LP_FIELD(valid_bounds) LP_FIELD(rejected_bounds) + LP_FIELD(numerical_infeasibility_reports) LP_FIELD(certificate_evaluations) + LP_FIELD(conditional_checks) LP_FIELD(variable_fixings) LP_FIELD(variable_bound_tightenings); +#undef LP_FIELD + const auto& c = lp.root_cover; + std::cout << ",\"root_cover\":{\"requested\":" << (c.requested ? "true" : "false") + << ",\"completion\":" << quote(completion(c.completion)); +#define CUT_FIELD(name) << ",\"" #name "\":" << c.name + std::cout CUT_FIELD(rounds) CUT_FIELD(augmentations) CUT_FIELD(cuts) CUT_FIELD(nonzeros) + CUT_FIELD(work) CUT_FIELD(projected_coordinates) CUT_FIELD(unsupported_rows) + CUT_FIELD(oversized_rows) CUT_FIELD(separated_cuts) CUT_FIELD(duplicate_cuts) + CUT_FIELD(arithmetic_rejections) CUT_FIELD(lp_calls) CUT_FIELD(valid_bounds) + CUT_FIELD(rejected_bounds) CUT_FIELD(numerical_infeasibility_reports) + CUT_FIELD(lp_seconds) << "}}"; +#undef CUT_FIELD + const auto& b = branching; + std::cout << ",\"branching\":{\"requested\":" << (b.requested ? "true" : "false"); +#define BRANCH_FIELD(name) << ",\"" #name "\":" << b.name + std::cout BRANCH_FIELD(decisions) BRANCH_FIELD(manual_splits) BRANCH_FIELD(fallback_decisions) + BRANCH_FIELD(probe_status_calls) BRANCH_FIELD(completed_pairs) BRANCH_FIELD(published_pairs) + BRANCH_FIELD(finite_samples) BRANCH_FIELD(zero_gain_samples) BRANCH_FIELD(failed_directions) + BRANCH_FIELD(reliable_candidates) BRANCH_FIELD(probe_propagations) BRANCH_FIELD(budget_nodes) + BRANCH_FIELD(work) BRANCH_FIELD(history_entries) BRANCH_FIELD(probe_lp_calls) + BRANCH_FIELD(probe_lp_seconds) << '}'; +#undef BRANCH_FIELD + const auto& n = neighborhood; + std::cout << ",\"neighborhood\":{\"requested\":" << (n.requested ? "true" : "false") + << ",\"completion\":" << quote(completion(n.completion)) << ",\"stop_reason\":"; + if (n.stop_reason) std::cout << quote(O::to_string(*n.stop_reason)); else std::cout << "null"; +#define NEIGHBOR_FIELD(name) << ",\"" #name "\":" << n.name + std::cout NEIGHBOR_FIELD(attempts) NEIGHBOR_FIELD(eligible_variables) + NEIGHBOR_FIELD(source_entries) NEIGHBOR_FIELD(coordinator_work) + NEIGHBOR_FIELD(status_attempts) NEIGHBOR_FIELD(completed_status_calls) + NEIGHBOR_FIELD(failed_nodes) NEIGHBOR_FIELD(feasible_candidates) + NEIGHBOR_FIELD(accepted_improvements) NEIGHBOR_FIELD(peak_local_spaces) + NEIGHBOR_FIELD(peak_total_spaces) NEIGHBOR_FIELD(budget_nodes) + NEIGHBOR_FIELD(elapsed_seconds) << '}'; +#undef NEIGHBOR_FIELD +} +} + +int main(int argc, char** argv) { + const auto start=Clock::now(); + const auto elapsed=[&] {return std::chrono::duration(Clock::now()-start).count();}; + try { + if (argc!=9 || std::string(argv[1])!="--input" || std::string(argv[3])!="--kind" || + std::string(argv[5])!="--route" || std::string(argv[7])!="--seconds") + throw std::runtime_error("Usage: configured-benchmark --input TXT --kind binary|native_tsp|weighted_queens --route native|lp-root|lp-cuts|lp-updated|dfs-reliability|lp-reliability|lp-reliability-neighborhood --seconds N (0 < N <= 10)"); + const std::string kind=argv[4],route=argv[6],time_text=argv[8];std::size_t used=0; + const double seconds=std::stod(time_text,&used); + if (used!=time_text.size() || !std::isfinite(seconds) || seconds<=0 || seconds>10 || + (kind!="binary" && kind!="native_tsp" && kind!="weighted_queens")) + throw std::runtime_error("Invalid driver kind, route or seconds"); + const Configuration configuration(route); + Reader input(argv[2]);auto built=kind=="binary"?binary(input):global(input,kind); + const auto snapshot=built.model.snapshot();const double build_seconds=elapsed(); + O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + options.time_limit_seconds=seconds;options.random_seed=0;options.threads=1; + options.relative_gap=0;options.absolute_gap=0; + O::SolveResult result;std::optional frontier; + O::NativeLpStatistics relaxation; + O::NativeNeighborhoodStatistics neighborhood; + const auto solve_start=Clock::now(); + if (configuration.automatic_race) { + O::NativeRaceOptions race; race.solve=options; + race.exploration_seconds=2.0; race.probe_node_limit=4096; + result=O::solve_native_race(snapshot,race); + } else if (configuration.frontier) { + O::NativeSearchOptions search;search.solve=options;search.order=O::NativeSearchOrder::DepthFirst; + search.max_open_nodes=configuration.max_open_nodes; + if (configuration.checked_lp) search.relaxation=configuration.lp; + if (configuration.reliability) search.branching=configuration.branching; + if (configuration.neighborhoods) { + O::NativeNeighborhoodOptions local; + local.search=search;local.neighborhood=configuration.neighborhood; + auto solved=O::solve_native_neighborhoods(snapshot,local); + neighborhood=solved.neighborhood;frontier=std::move(solved.search); + } else frontier=O::solve_native_search(snapshot,search); + result=frontier->result;relaxation=frontier->relaxation; + } else if (configuration.checked_lp) { + O::NativeLpOptions lp; + static_cast(lp)=configuration.lp;lp.solve=options; + auto solved=O::solve_native_lp(snapshot,lp); + result=std::move(solved.result);relaxation=solved.relaxation; + } else result=O::solve_native(snapshot,options); + const double solve_seconds=std::chrono::duration(Clock::now()-solve_start).count(); + const bool point=result.has_solution(); + if (result.model_id!=snapshot.model_id || result.revision!=snapshot.revision) + throw std::runtime_error("Result original identity mismatch"); + if (point && (result.values.size()!=snapshot.variables.size() || result.active_variables.size()!=snapshot.variables.size())) + throw std::runtime_error("Result original slot dimensions"); + std::cout<frontier.admitted_nodes;else std::cout<<"null"; + std::cout<<",\"node_count_scope\":"<frontier.expanded_nodes;else std::cout<<"null"; + std::cout<<",\"budget_nodes\":"; + if(frontier)std::cout<branching.budget_nodes;else std::cout<<"null"; + std::cout<<",\"peak_open_nodes\":"; + if(frontier)std::cout<frontier.peak_open_nodes;else std::cout<<"null"; + std::cout<<",\"unresolved_regions\":"; + if(frontier)std::cout<frontier.unresolved_regions;else std::cout<<"null"; + std::cout<<",\"algorithm_configuration\":";configuration.print(); + print_statistics(relaxation,frontier?frontier->branching:O::NativeBranchingStatistics{},neighborhood); + std::cout<<"}\n";return 0; + } catch (const std::exception& error) { + std::cerr<<"configured benchmark error: "<= original or j >= original: + matrix[i][j] = rng.randint(1, upper) + for k in range(old_maximum, size): + matrix.append([rng.randint(1, upper) for _ in range(k + 1)]) + for i in range(k): + matrix[i].append(rng.randint(1, upper)) + return matrix + + +def make(name, size, variant='single'): + category._require(type(name) is str and name in legacy.BOUNDS, 'unknown final category') + minimum, old_maximum = legacy.BOUNDS[name] + category._require(type(size) is int and size >= minimum, 'size must be an integer above family minimum') + category._require(variant in (('uncorrelated', 'correlated') if name == 'knapsack' else ('single',)), + 'invalid family variant') + if size <= old_maximum: + return legacy.make(name, size, variant) + model = legacy.make(name, old_maximum, variant) + rng = random.Random(model['seed']) + p = model['parameters'] + if name == 'knapsack': + items = [] + for _ in range(size): + weight = rng.randint(1, 31) + profit = rng.randint(1, 100) if variant == 'uncorrelated' else weight + rng.randint(0, 10) + items.append((weight, profit)) + weights, profits = [w for w, _ in items], [p for _, p in items] + capacity, cells = 6 * size, (size + 1) * (6 * size + 1) + p.update(weights=[weights], profits=profits, capacities=[capacity], capacity=capacity, + table_cells=cells, dp_eligible=False, dp_eligibility_reason='full_table_cell_cap_exceeded') + model.update(n=size, c=[-v for v in profits], rows=category.scaling._capacity_rows(weights, capacity)) + elif name == 'assignment': + matrix = _matrix(model['seed'], 16, 32, size, 100) + p.update(size=size, costs=matrix) + model.update(n=size * size, c=[v for row in matrix for v in row], + rows=category.scaling._assignment_rows(size)) + elif name == 'facility_location': + point = lambda: (rng.randint(0, 30), rng.randint(0, 30)) + sites = [point() for _ in range(12)] + customers = [point() for _ in range(24)] + opening = [rng.randint(15, 60) for _ in range(12)] + sites += [point() for _ in range(4)] + customers += [point() for _ in range(8)] + opening += [rng.randint(15, 60) for _ in range(4)] + for _ in range(16, size): + sites.append(point()); customers.extend((point(), point())) + opening.append(rng.randint(15, 60)) + p.update(facilities=size, customers=2 * size, opening_costs=opening, + assignment_costs=[[abs(a-x) + abs(b-y) + 1 for x, y in sites] for a, b in customers]) + elif name == 'bin_packing': + weights = [rng.randint(2, 10) for _ in range(size)] + bins = (size + 2) // 3 + capacity = max(max(weights), (sum(weights) + bins - 2) // (bins - 1)) + while category._first_fit(weights, capacity) > bins: + capacity += 1 + p.update(items=size, bins=bins, weights=weights, capacity=capacity) + elif name == 'production': + demands = [rng.randint(1, 7) for _ in range(24)] + storage, holding = rng.randint(3, 10), rng.randint(1, 4) + def costs(): + fixed, unit = rng.randint(5, 20), rng.randint(2, 12) + return [0 if q == 0 else fixed + unit*q + max(0, q-4)*5 for q in range(8)] + matrix = [costs() for _ in range(24)] + demands += [rng.randint(1, 7) for _ in range(24)] + matrix += [costs() for _ in range(24)] + for _ in range(48, size): + demands.append(rng.randint(1, 7)); matrix.append(costs()) + p.update(periods=size, demands=demands, storage=storage, holding_cost=holding, + production_costs=matrix, + objective_constant=-holding * sum((size-i)*d for i, d in enumerate(demands))) + else: + if name == 'native_tsp': + points = [(rng.randrange(100), rng.randrange(100)) for _ in range(size)] + matrix = [[abs(a-x)+abs(b-y)+(i != j) for j, (x, y) in enumerate(points)] + for i, (a, b) in enumerate(points)] + else: + matrix = _matrix(model['seed'], 12, 32, size, 50) + p.update(size=size) + model.update(n=size, size=size, data=matrix) + if name in ('facility_location', 'bin_packing', 'production'): + model.update(category._formulation(name, p)) + model.update(id=f'{name}_{variant}_{size}', tier_size=size, natural_size=size, + generator_version=GENERATOR_VERSION, + prefix_policy='preserve legacy master blocks, then append stream values or matrix shells') + model['dimensions'] = category._dimensions(model) + model['input_variables'] = model['n'] + model['model_variables'] = model['modelled_variables'] = model['dimensions']['variables'] + return model + + +def _check_model(model): + category._require(type(model) is dict, 'model must be an object') + expected = make(model.get('category'), model.get('natural_size'), model.get('variant')) + category._require(json.dumps({k: model.get(k) for k in expected}, sort_keys=True, allow_nan=False) == + json.dumps(expected, sort_keys=True, allow_nan=False), + 'final metadata or original formulation differs from deterministic input') + + +def semantic_hash(model): + _check_model(model) + return category.semantic_hash(model) + + +input_hash = semantic_hash + + +def validate_assignment(model, assignment): + try: + _check_model(model) + category._require(type(assignment) is list and len(assignment) == model['n'] and + all(type(v) is int for v in assignment), 'expected exact integer assignment') + original = dict(model) + if model['category'] == 'knapsack': + original['family'] = 'knapsack' + validator = category.binary_validator if model['kind'] == 'binary' else category.native_validator + checked = validator.validate_assignment(original, assignment) + if checked['valid']: + checked['domain_semantics_checked'] = True + return checked + except (ValueError, KeyError, TypeError, IndexError) as error: + return {'valid': False, 'error': str(error)} + + +def encode_txt(model): + _check_model(model) + if model['kind'] == 'binary': + lines = [f"{model['n']} {len(model['rows'])}", ' '.join(map(str, model['c']))] + for row in model['rows']: + lines.append(' '.join(map(str, [row['b'], len(row['a'])] + [v for pair in row['a'] for v in pair]))) + return '\n'.join(lines) + '\nincumbent 0\n' + n = model['n'] + return (f"{model['family']} {n} 0 {n}\n" + + ' '.join(str(c) for row in model['data'] for c in row) + '\n' + + ' '.join('0' for _ in range(n)) + '\n') + + +expected_binary_text = encode_txt +expected_native_text = encode_txt diff --git a/experiments/optimize/native_benchmark.cpp b/experiments/optimize/native_benchmark.cpp new file mode 100644 index 0000000000..55d61ba598 --- /dev/null +++ b/experiments/optimize/native_benchmark.cpp @@ -0,0 +1,236 @@ +/* Fixed-input native algorithm comparison driver; no reference or start is used. */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +using Clock = std::chrono::steady_clock; + +namespace { +struct Reader { + std::ifstream file; + explicit Reader(const std::string& path) : file(path) { + if (!file) throw std::runtime_error("Cannot open frozen TXT input"); + file.seekg(0, std::ios::end); + const auto bytes = file.tellg(); + if (bytes < 0 || bytes > 4*1024*1024) + throw std::runtime_error("TXT input size limit"); + file.seekg(0); + } + std::string token() { + std::string value; + if (!(file >> value) || value.size() > 100) + throw std::runtime_error("Missing/oversized TXT token"); + return value; + } + std::int64_t integer(std::int64_t lower, std::int64_t upper) { + const auto text = token(); + std::int64_t value = 0; + const auto parsed = std::from_chars(text.data(), text.data()+text.size(), value); + if (parsed.ec != std::errc() || parsed.ptr != text.data()+text.size() || + value < lower || value > upper) + throw std::runtime_error("Invalid/out-of-range TXT integer"); + return value; + } + void end() { + std::string extra; + if (file >> extra) throw std::runtime_error("Trailing TXT content"); + if (!file.eof()) throw std::runtime_error("TXT read failure"); + } +}; + +struct Built { + O::Model model; + std::vector original; +}; + +Built binary(Reader& input) { + Built out; + const auto n = static_cast(input.integer(1, 10000)); + const auto m = static_cast(input.integer(0, 100000)); + out.original = out.model.add_variables( + std::vector(n, {O::VariableType::Binary, 0, 1, {}})); + std::vector objective; + for (std::size_t j=0; j(cost)}); + } + O::SparseRowBatch rows; + rows.columns = out.original; + std::size_t total = 0; + for (std::size_t i=0; i(input.integer(-1000000000,1000000000))); + rows.upper.push_back(std::numeric_limits::infinity()); + const auto count = static_cast(input.integer(0, static_cast(n))); + if (count > 2000000-total) throw std::runtime_error("TXT nonzero limit"); + total += count; + std::int64_t previous = -1; + for (std::size_t k=0; k(n)-1); + const auto coefficient = input.integer(-1000000000, 1000000000); + if (column <= previous || !coefficient) + throw std::runtime_error("Noncanonical TXT row"); + previous = column; + rows.column.push_back(static_cast(column)); + rows.coefficient.push_back(static_cast(coefficient)); + } + rows.row_start.push_back(rows.column.size()); + } + out.model.add_rows_sparse(rows); + out.model.minimize(objective); + if (input.token() != "incumbent") + throw std::runtime_error("Missing legacy incumbent marker"); + const auto present = input.integer(0, 1); + // Legacy files contain a reference-free initial witness. Parse and discard it; + // neither this witness nor any reference objective enters solve options. + if (present) + for (std::size_t i=0; i(input.integer(1, 100)); + if (input.integer(0, 0) != 0 || input.integer(1, 100) != static_cast(n)) + throw std::runtime_error("Native TXT dimensions"); + std::vector costs(n*n); + for (auto& cost : costs) cost = input.integer(0, 100000); + for (std::size_t j=0; j(n)-1); + input.end(); + Built out; + for (std::size_t j=0; j(n)-1)); + if (expected == "native_tsp") O::add_circuit(out.model, out.original); + else { + O::add_all_different(out.model,out.original); + std::vector rising, falling; + for (std::size_t j=0; j(j),static_cast(n+j-1)); + const auto b=out.model.add_integer(-static_cast(j),static_cast(n-1)-j); + out.model.add_row({{a,1},{out.original[j],-1}},static_cast(j),static_cast(j)); + out.model.add_row({{b,1},{out.original[j],-1}},-static_cast(j),-static_cast(j)); + rising.push_back(a); + falling.push_back(b); + } + O::add_all_different(out.model, rising); + O::add_all_different(out.model, falling); + } + std::vector objective; + for (std::size_t j=0; j(*std::min_element(begin,end)), + static_cast(*std::max_element(begin,end))); + std::vector> tuples; + for (std::size_t k=0; k(k), costs[j*n+k]}); + O::add_table(out.model, {out.original[j], cost}, tuples); + objective.push_back({cost, 1}); + } + out.model.minimize(objective); + return out; +} + +std::string quote(const std::string& text) { + std::ostringstream out; + out << '"'; + for (unsigned char c : text) { + if (c == '"' || c == '\\') out << '\\' << c; + else if (c < 32) + out << "\\u" << std::hex << std::setw(4) << std::setfill('0') << unsigned(c) << std::dec; + else out << c; + } + out << '"'; + return out.str(); +} + +void optional(const std::optional& value) { + if (!value) std::cout << "null"; + else if (!std::isfinite(*value)) throw std::runtime_error("Nonfinite original result scalar"); + else std::cout << *value; +} +} + +int main(int argc, char** argv) { + const auto start=Clock::now(); + const auto elapsed=[&] {return std::chrono::duration(Clock::now()-start).count();}; + try { + if (argc!=9 || std::string(argv[1])!="--input" || std::string(argv[3])!="--kind" || + std::string(argv[5])!="--route" || std::string(argv[7])!="--seconds") + throw std::runtime_error("Usage: native-benchmark --input TXT --kind binary|native_tsp|weighted_queens --route native|dfs --seconds N"); + const std::string kind=argv[4],route=argv[6],time_text=argv[8];std::size_t used=0; + const double seconds=std::stod(time_text,&used); + if (used!=time_text.size() || !std::isfinite(seconds) || seconds<=0 || seconds>10 || + (kind!="binary" && kind!="native_tsp" && kind!="weighted_queens") || (route!="native"&&route!="dfs")) + throw std::runtime_error("Invalid driver kind, route or seconds"); + Reader input(argv[2]);auto built=kind=="binary"?binary(input):global(input,kind); + const auto snapshot=built.model.snapshot();const double build_seconds=elapsed(); + O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + options.time_limit_seconds=seconds;options.random_seed=0;options.threads=1; + options.relative_gap=0;options.absolute_gap=0; + O::SolveResult result;std::optional frontier; + if (route=="native") result=O::solve_native(snapshot,options); + else { + O::NativeSearchOptions search;search.solve=options;search.order=O::NativeSearchOrder::DepthFirst; + search.max_open_nodes=1024;frontier=O::solve_native_search(snapshot,search);result=frontier->result; + } + const bool point=result.has_solution(); + if (result.model_id!=snapshot.model_id || result.revision!=snapshot.revision) + throw std::runtime_error("Result original identity mismatch"); + if (point && (result.values.size()!=snapshot.variables.size() || result.active_variables.size()!=snapshot.variables.size())) + throw std::runtime_error("Result original slot dimensions"); + std::cout<frontier.admitted_nodes;else std::cout<<"null"; + std::cout<<",\"node_count_scope\":"<frontier.expanded_nodes;else std::cout<<"null"; + std::cout<<",\"budget_nodes\":"; + if(frontier)std::cout<branching.budget_nodes;else std::cout<<"null"; + std::cout<<",\"peak_open_nodes\":"; + if(frontier)std::cout<frontier.peak_open_nodes;else std::cout<<"null"; + std::cout<<",\"unresolved_regions\":"; + if(frontier)std::cout<frontier.unresolved_regions;else std::cout<<"null"; + std::cout<<"}\n";return 0; + } catch (const std::exception& error) { + std::cerr<<"native benchmark error: "< 32767: + raise ValueError("Windows command exceeds the 32767 UTF-16-unit CreateProcessW limit") + return command, directory, line + + +class WindowsJobProcess: + """One launch, owned process/thread/job handles, explicit bounded cleanup. + + Publish this object to the outer watchdog BEFORE start(). Creation-time job + assignment closes the suspended-process orphan window even if that watchdog + exits between CreateProcessW and its return to Python. The job handle is never + inherited. There is no fallback to launching an uncontained process. + """ + def __init__(self, api=None, fd_to_handle=None): + self.api = WinAPI() if api is None else api + if fd_to_handle is None: + import msvcrt + fd_to_handle = msvcrt.get_osfhandle + self.fd_to_handle = fd_to_handle + self.job = self.process = self.thread = None + self.pid = self.returncode = None + self.command = [] + self._stdio = [] + self._attributes = None + self._attribute_storage = None + self._attribute_values = [] + self._started = False + self._membership_verified = False + + def _error(self, operation): + return OSError("{} failed (Windows error {})".format(operation, self.api.last_error())) + + def _check(self, result, operation): + if not result: + raise self._error(operation) + + def _duplicate(self, stream): + handle = HANDLE() + current = self.api.GetCurrentProcess() + self._check(self.api.DuplicateHandle(current, self.fd_to_handle(stream.fileno()), current, + C.byref(handle), 0, True, DUPLICATE_SAME_ACCESS), + "DuplicateHandle(stdio)") + self._stdio.append(handle.value) + return handle.value + + def start(self, command, stdout, stderr, directory): + if self._started: + raise ValueError("WindowsJobProcess permits exactly one start") + self.command, directory, line = checked_command(command, directory) + self._started = True + try: + try: + self.job = self.api.CreateJobObjectW(None, None) or None + self._check(self.job, "CreateJobObjectW") + limits = JOBOBJECT_EXTENDED_LIMIT_INFORMATION() + limits.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + self._check(self.api.SetInformationJobObject( + self.job, JOB_OBJECT_EXTENDED_LIMIT_INFORMATION, C.byref(limits), C.sizeof(limits)), + "SetInformationJobObject(KILL_ON_JOB_CLOSE)") + with open(os.devnull, "rb") as stdin: + inherited = (HANDLE * 3)(self._duplicate(stdin), self._duplicate(stdout), + self._duplicate(stderr)) + jobs = (HANDLE * 1)(self.job) + self._attribute_values = [inherited, jobs] + size = SIZE_T() + result = self.api.InitializeProcThreadAttributeList(None, 2, 0, C.byref(size)) + if result or self.api.last_error() != ERROR_INSUFFICIENT_BUFFER or not size.value: + raise self._error("InitializeProcThreadAttributeList(size)") + self._attribute_storage = C.create_string_buffer(size.value) + self._check(self.api.InitializeProcThreadAttributeList( + self._attribute_storage, 2, 0, C.byref(size)), "InitializeProcThreadAttributeList") + self._attributes = self._attribute_storage + for key, value in ((PROC_THREAD_ATTRIBUTE_HANDLE_LIST, inherited), + (PROC_THREAD_ATTRIBUTE_JOB_LIST, jobs)): + self._check(self.api.UpdateProcThreadAttribute( + self._attributes, 0, key, C.byref(value), C.sizeof(value), None, None), + "UpdateProcThreadAttribute({:#x})".format(key)) + startup = STARTUPINFOEXW() + startup.StartupInfo.cb = C.sizeof(startup) + startup.StartupInfo.dwFlags = STARTF_USESTDHANDLES + startup.StartupInfo.hStdInput, startup.StartupInfo.hStdOutput, startup.StartupInfo.hStdError = inherited + startup.lpAttributeList = C.cast(self._attributes, POINTER) + info = PROCESS_INFORMATION() + self._check(self.api.CreateProcessW( + self.command[0], C.create_unicode_buffer(line), None, None, True, + CREATE_SUSPENDED | CREATE_NO_WINDOW | EXTENDED_STARTUPINFO_PRESENT, + None, directory, C.byref(startup), C.byref(info)), "CreateProcessW(atomic job assignment)") + self.process, self.thread, self.pid = info.hProcess, info.hThread, info.dwProcessId + member = BOOL() + self._check(self.api.IsProcessInJob(self.process, self.job, C.byref(member)), "IsProcessInJob") + if not member.value: + raise OSError("CreateProcessW did not assign the process to its required Job Object") + self._membership_verified = True + previous = self.api.ResumeThread(self.thread) + if previous == WAIT_FAILED: + raise self._error("ResumeThread") + if previous != 1: + raise OSError("ResumeThread returned unexpected suspend count {}".format(previous)) + self._check(self.api.CloseHandle(self.thread), "CloseHandle(primary thread)") + self.thread = None + finally: + self._release_setup() + except BaseException: + # This also handles a post-create verification failure: the primary + # thread remains suspended, and both job and process are terminated. + self.cleanup(timeout=0.2) + raise + return self + + def _release_setup(self): + if self._attributes is not None: + self.api.DeleteProcThreadAttributeList(self._attributes) + self._attributes = None + self._attribute_values = [] + self._attribute_storage = None + errors = [] + for handle in self._stdio[:]: + if self.api.CloseHandle(handle): + self._stdio.remove(handle) + else: + errors.append(str(self._error("CloseHandle(stdio duplicate)"))) + if errors: + raise OSError("; ".join(errors)) + + def _exit_code(self): + result = DWORD() + self._check(self.api.GetExitCodeProcess(self.process, C.byref(result)), "GetExitCodeProcess") + self.returncode = result.value + return self.returncode + + def poll(self): + if self.returncode is not None: + return self.returncode + if self.process is None: + raise OSError("process has not been started or has already been closed") + state = self.api.WaitForSingleObject(self.process, 0) + if state == WAIT_TIMEOUT: + return None + if state != WAIT_OBJECT_0: + raise self._error("WaitForSingleObject") + return self._exit_code() + + def wait(self, timeout): + if not math.isfinite(timeout) or timeout < 0: + raise ValueError("cleanup timeout must be finite and nonnegative") + if self.returncode is not None: + return self.returncode + if self.process is None: + raise OSError("process has not been started or has already been closed") + # Never use INFINITE, nor round a wait beyond its caller's reserve. + milliseconds = int(min((WAIT_FAILED - 1) / 1000, timeout) * 1000) + state = self.api.WaitForSingleObject(self.process, milliseconds) + if state == WAIT_TIMEOUT: + raise subprocess.TimeoutExpired(self.command, timeout) + if state != WAIT_OBJECT_0: + raise self._error("WaitForSingleObject") + return self._exit_code() + + def terminate(self): + """Nonwaiting watchdog action; final process exit also closes the job.""" + errors = [] + terminated = False + if self.job is not None: + terminated = bool(self.api.TerminateJobObject(self.job, 124)) + if not terminated: + errors.append(str(self._error("TerminateJobObject"))) + if self.process is not None and (not terminated or not self._membership_verified): + if not self.api.TerminateProcess(self.process, 124): + errors.append(str(self._error("TerminateProcess"))) + if errors: + raise OSError("; ".join(errors)) + + def cleanup(self, timeout): + """Terminate descendants even after root success; close every owned handle. + + Any cleanup failure fails the case. No unbounded wait is used. Keep any + unsuccessfully closed handles available to the outer watchdog for retry. + """ + if not math.isfinite(timeout) or timeout < 0: + raise ValueError("cleanup timeout must be finite and nonnegative") + deadline = time.monotonic() + timeout + errors = [] + try: + try: + self.terminate() + except OSError as error: + errors.append(str(error)) + if self.process is not None: + try: + self.wait(max(0, deadline-time.monotonic())) + except (OSError, subprocess.TimeoutExpired) as error: + errors.append(str(error)) + if self.job is not None: + # Waiting for the root cannot establish that grandchildren died. + while True: + accounting = JOBOBJECT_BASIC_ACCOUNTING_INFORMATION() + if not self.api.QueryInformationJobObject( + self.job, JOB_OBJECT_BASIC_ACCOUNTING_INFORMATION, + C.byref(accounting), C.sizeof(accounting), None): + errors.append(str(self._error("QueryInformationJobObject"))) + break + if accounting.ActiveProcesses == 0: + break + remaining = deadline-time.monotonic() + if remaining <= 0: + errors.append("Job Object descendants did not exit within cleanup reserve") + break + time.sleep(min(0.005, remaining)) + finally: + try: + self._release_setup() + except OSError as error: + errors.append(str(error)) + # Closing the last, non-inherited job handle is the final kill path. + for name in ("thread", "process", "job"): + handle = getattr(self, name) + if handle is not None: + if self.api.CloseHandle(handle): + setattr(self, name, None) + else: + errors.append(str(self._error("CloseHandle({})".format(name)))) + if errors: + raise OSError("; ".join(errors)) diff --git a/experiments/optimize/resume_final_benchmark.py b/experiments/optimize/resume_final_benchmark.py new file mode 100644 index 0000000000..809c6ce8c0 --- /dev/null +++ b/experiments/optimize/resume_final_benchmark.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""Resume after a missing backend-version diagnostic, preserving the captured solve. + +A time-limited automatic result may omit backend_version. +Verified driver/runtime hashes establish the executing product independently. +Only this diagnostic requirement is relaxed; model identity, original witnesses, +status, bounds, gaps, clocks, route and configuration checks are unchanged. +""" +import argparse +from datetime import datetime, timezone +import json +from pathlib import Path +import shutil +import subprocess +import time + +import continue_final_benchmark as continuation + +initial=continuation.initial +_original_validate=initial.validate + + +def validate(raw,model,route): + missing=(route=='auto-race' and raw.get('status')=='time_limit' and + raw.get('backend_version')=='') + if not missing:return _original_validate(raw,model,route) + checked=_original_validate(dict(raw,backend_version='unavailable on interrupted preprocessing'),model,route) + checked['backend_result']=raw + checked['backend_metadata_note']='Backend version omitted on interrupted native preprocessing; actual driver and loaded library hashes verified separately.' + return checked + + +# benchmark_final.execute resolves this module-global validator dynamically. +# Importing export_extended after this module uses the same corrected validator. +initial.validate=validate +ROOT,HERE,sha,require=continuation.ROOT,continuation.HERE,continuation.sha,continuation.require + + +def resume(report_path,output,binary,runtime): + report_path=report_path.resolve(strict=True);old=json.loads(report_path.read_text()) + require(not old['complete'],'Use the regular continuation for a complete report') + require(all(sha(ROOT/p)==h for p,h in old['provenance']['sources'].items()),'Previous measurement source changed') + require(all(sha(ROOT/p)==h for p,h in old['provenance']['runtime_sources'].items()),'Runtime source changed') + errors=[r for r in old['records'] if r['status']=='error'] + require(len(errors)==1 and errors[0].get('error')=='Invalid model identity','Unexpected interrupted phase') + row=errors[0] + label=f"{row['case']}-{row['cohort']}-{row['route']}-r{row['repetition']}" + raw_path=report_path.parent/(label+'.stdout');raw=json.loads(raw_path.read_text()) + require(row['cohort']=='auto' and raw['status']=='time_limit' and raw['backend_version']=='' and raw['has_solution'] is False, + 'The rejected packet is not the narrowly admitted metadata case') + model=next(m['model'] for m in old['models'] if m['id']==row['case']) + repaired=validate(raw,model,row['route']) + row['original_validation_error']=row.pop('error');row.update(repaired) + row['validation_repair']=dict(source='resume_final_benchmark.py',stdout_sha256=sha(raw_path), + reason='Revalidated the original captured packet; no solve repeated.') + state=continuation.ContinuedSearch.__new__(continuation.ContinuedSearch) + state.output=output.resolve();require(not state.output.exists(),'Resume output exists') + shutil.copytree(report_path.parent,state.output) + shutil.copy2(report_path,state.output/'rejected-phase2-report.json') + state.started=time.monotonic()-old['elapsed_seconds'];state.utc=old['started_utc'] + state.binary=binary.resolve(strict=True);state.runtime=runtime.resolve(strict=True) + state.old_binary=ROOT/'build/capacity-scaling/fixed-driver/optimize-native-benchmark' + state.directories={'before':[ROOT/'build/comparison-algorithms/before/lib'], + 'auto':[state.runtime/'gecode/optimize',state.runtime], + 'configured':[state.runtime/'gecode/optimize',state.runtime]} + state.models={m['id']:m for m in old['models']};state.records=old['records'];state.decisions=old['decisions'] + state.sources=dict(old['provenance']['sources']);state.sources['experiments/optimize/resume_final_benchmark.py']=sha(Path(__file__)) + state.runtime_sources=old['provenance']['runtime_sources'];state.provenance=old['provenance'] + state.current_libraries=json.loads((state.binary.parent/'build.local.json').read_text())['runtime_libraries_sha256'] + state.expected=state.provenance['expected_libraries'] + require(sha(state.binary)==state.provenance['driver_sha256'] and sha(state.old_binary)==state.provenance['original_driver_sha256'],'Driver changed') + require(all(sha(Path(p))==h for p,h in state.current_libraries.items()),'Current runtime changed') + for c in continuation.COHORTS: + require(all(any((d/x['name']).is_file() and sha(d/x['name'])==x['sha256'] for d in state.directories[c]) + for x in state.expected[c]['libraries']),'Loaded product hash changed') + head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip() + state.provenance['phases'].append(dict(name='diagnostic validator correction; captured observation retained', + source_head=head,started_utc=datetime.now(timezone.utc).isoformat(), + previous_report_sha256=sha(report_path),previous_records=len(state.records), + validator_source_sha256=sha(Path(__file__)),revalidated_stdout_sha256=sha(raw_path), + reason='Empty version string accepted only for interrupted automatic results; all incumbent/bound validation retained and loaded runtime independently pinned.')) + state.provenance['source_head']=head;state.provenance['sources']=state.sources + state.protocol=old['protocol'];state.policy=state.protocol['policy'];state.complete=False + state.protocol['validator_amendment']='Optional empty backend-version metadata on automatic time limit; all semantic checks retained and runtime identity verified by hashes.' + state.publish();return state + + +if __name__=='__main__': + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--report',type=Path,required=True) + for flag in ('output-dir','binary','runtime-build'):parser.add_argument('--'+flag,type=Path) + parser.add_argument('--validate-only',action='store_true') + parser.add_argument('--export-only',action='store_true') + args=parser.parse_args() + if args.export_only: + import export_extended_benchmark + export_extended_benchmark.export(args.report) + else: + if not all((args.output_dir,args.binary,args.runtime_build)): + parser.error('resuming requires --output-dir, --binary and --runtime-build') + state=resume(args.report,args.output_dir,args.binary,args.runtime_build) + if args.validate_only:print('Captured timeout revalidated; all prior records preserved; no solve run') + else:state.run() diff --git a/experiments/optimize/resume_large_final_benchmark.py b/experiments/optimize/resume_large_final_benchmark.py new file mode 100644 index 0000000000..c35d05a316 --- /dev/null +++ b/experiments/optimize/resume_large_final_benchmark.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Resume after a TXT transport guard, using a driver with wider parser guards. + +The rejected invocation never entered solve. Archive it as a harness attempt, +then run that model once with the expanded driver and identical solver libraries. +All earlier solve observations and their original driver identity remain recorded. +""" +import argparse +from datetime import datetime, timezone +import json +from pathlib import Path +import shutil +import subprocess +import time + +import resume_final_benchmark as metadata + +continuation=metadata.continuation +ROOT,HERE,sha,require=metadata.ROOT,metadata.HERE,metadata.sha,metadata.require + + +def resume(report_path,output,binary,runtime): + report_path=report_path.resolve(strict=True);old=json.loads(report_path.read_text()) + require(not old['complete'],'Use the regular continuation for completed input') + require(all(sha(ROOT/p)==h for p,h in old['provenance']['sources'].items()),'Old measurement source changed') + require(all(sha(ROOT/p)==h for p,h in old['provenance']['runtime_sources'].items()),'Solver source changed') + errors=[r for r in old['records'] if r['status']=='error'] + require(len(errors)==1 and errors[0]['returncode']==2 and + errors[0]['stdout_bytes_observed']==0 and 'Invalid/out-of-range TXT integer' in errors[0]['error'], + 'Unexpected failure; cannot treat as a pre-solve parser rejection') + rejected=errors[0];label=f"{rejected['case']}-{rejected['cohort']}-{rejected['route']}-r{rejected['repetition']}" + state=continuation.ContinuedSearch.__new__(continuation.ContinuedSearch) + state.output=output.resolve();require(not state.output.exists(),'Resume output exists') + shutil.copytree(report_path.parent,state.output) + shutil.copy2(report_path,state.output/'parser-rejected-phase3-report.json') + archive=state.output/'harness-attempts';archive.mkdir(exist_ok=True) + event=dict(rejected,classification='driver parser guard; solver not entered',counted_as_solver_failure=False) + for suffix in ('stdout','stderr'): + original=state.output/(label+'.'+suffix);destination=archive/(label+'.'+suffix) + original.rename(destination) + event[suffix+'_file']=str(destination.relative_to(state.output));event[suffix+'_sha256']=sha(destination) + state.started=time.monotonic()-old['elapsed_seconds'];state.utc=old['started_utc'] + state.binary=binary.resolve(strict=True);state.runtime=runtime.resolve(strict=True) + state.old_binary=ROOT/'build/capacity-scaling/fixed-driver/optimize-native-benchmark' + state.directories={'before':[ROOT/'build/comparison-algorithms/before/lib'], + 'auto':[state.runtime/'gecode/optimize',state.runtime], + 'configured':[state.runtime/'gecode/optimize',state.runtime]} + state.models={m['id']:m for m in old['models']} + state.records=[r for r in old['records'] if r is not rejected];state.decisions=old['decisions'] + state.sources=dict(old['provenance']['sources']) + build_path=state.binary.parent/'build.local.json';build=json.loads(build_path.read_text()) + require(build['binary_sha256']==sha(state.binary) and build['runtime_libraries_unchanged'],'Large driver build mismatch') + for p in (Path(__file__),HERE/'build_large_final_benchmark.py',build_path,Path(build['source'])): + state.sources[str(p.resolve().relative_to(ROOT))]=sha(p) + state.runtime_sources=old['provenance']['runtime_sources'];state.provenance=old['provenance'] + state.current_libraries=build['runtime_libraries_sha256'];state.expected=state.provenance['expected_libraries'] + require(sha(state.old_binary)==state.provenance['original_driver_sha256'],'Original driver changed') + require(all(sha(Path(p))==h for p,h in state.current_libraries.items()),'Current runtime changed') + require({str(Path(p).relative_to(ROOT)):h for p,h in state.current_libraries.items()}==state.provenance['current_runtime_libraries_sha256'], + 'Expanded driver was linked to a different solver product') + for c in continuation.COHORTS: + require(all(any((d/x['name']).is_file() and sha(d/x['name'])==x['sha256'] for d in state.directories[c]) + for x in state.expected[c]['libraries']),'Previously loaded product changed') + head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip() + state.provenance['phases'].append(dict(name='expanded transport parser; solver unchanged',source_head=head, + started_utc=datetime.now(timezone.utc).isoformat(),previous_report_sha256=sha(report_path), + previous_driver_sha256=state.provenance['driver_sha256'],driver_sha256=sha(state.binary), + first_new_solve_record=len(state.records),parser_build_manifest_sha256=sha(build_path), + reason='Assignment128 exceeded the old 10000-variable TXT guard before solve. Guard-only driver rebuild; identical input encoding and solver libraries. Earlier clocks surround solve and exclude model parsing.')) + state.provenance['driver_sha256']=sha(state.binary) + state.provenance['source_head']=head;state.provenance['sources']=state.sources + state.protocol=old['protocol'];state.policy=state.protocol['policy'];state.complete=False + state.protocol.setdefault('harness_attempts',[]).append(event) + state.protocol['transport_amendment']='A pre-solve parser rejection is archived separately, never treated as solver capacity. Larger parser guards do not alter solving or timing boundaries.' + state.publish();return state + + +if __name__=='__main__': + parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--report',type=Path,required=True) + for flag in ('output-dir','binary','runtime-build'):parser.add_argument('--'+flag,type=Path) + parser.add_argument('--validate-only',action='store_true');parser.add_argument('--export-only',action='store_true') + args=parser.parse_args() + if args.export_only: + import export_extended_benchmark + export_extended_benchmark.export(args.report) + else: + if not all((args.output_dir,args.binary,args.runtime_build)):parser.error('resume needs output-dir,binary,runtime-build') + state=resume(args.report,args.output_dir,args.binary,args.runtime_build) + if args.validate_only:print('Parser attempt archived separately; previous solves preserved; no solve run') + else:state.run() diff --git a/experiments/optimize/scaling_instances.py b/experiments/optimize/scaling_instances.py new file mode 100644 index 0000000000..80ae8a3f51 --- /dev/null +++ b/experiments/optimize/scaling_instances.py @@ -0,0 +1,323 @@ +#!/usr/bin/env python3 +"""Frozen deterministic capacity/assignment scaling inputs and exact references. + +There is no solver, binding, subprocess or filesystem dependency. Capacity +references minimize weight for each attainable profit, independently of the +product's weight-indexed objective DP. Assignment references use subsets of +columns. Reference witnesses are never included in the driver TXT stream. + +``verify_reference`` defaults to cheap record/identity/witness checks. These do +not re-prove a stored optimum: a benchmark must freeze the complete generated +reference bytes before measurement. Pass ``recompute=True`` only outside the +measurement window to repeat the independent exact oracle. +""" +from __future__ import annotations + +import hashlib +import json +import random + + +CAPACITY_TIERS = (("sanity", 8), ("small", 32), ("medium", 128), ("large", 384)) +ASSIGNMENT_TIERS = (("sanity", 3), ("small", 5), ("medium", 9), ("large", 16)) +FAMILY_SEEDS = { + "capacity_uncorrelated": 20260906, + "capacity_correlated": 20260907, + "assignment": 20260908, +} +MAX_REFERENCE_TRANSITIONS = 16000000 + + +def _require(condition, message): + if not condition: + raise ValueError(message) + + +def _integer(value): + return type(value) is int + + +def semantic_hash(model): + """Match solver-bench/validate.input_hash: hash only n/c/rows.""" + data = {key: model[key] for key in ("n", "c", "rows")} + encoded = json.dumps(data, sort_keys=True, separators=(",", ":"), allow_nan=False) + return hashlib.sha256(encoded.encode("utf8")).hexdigest() + + +input_hash = semantic_hash + + +def _capacity_rows(weights, capacity): + return [{"b": -capacity, "a": [[j, -weight] for j, weight in enumerate(weights)]}] + + +def _assignment_rows(size): + rows = [] + for columns in ([i * size + j for j in range(size)] for i in range(size)): + rows.extend(({"b": 1, "a": [[j, 1] for j in columns]}, + {"b": -1, "a": [[j, -1] for j in columns]})) + for columns in ([i * size + j for i in range(size)] for j in range(size)): + rows.extend(({"b": 1, "a": [[j, 1] for j in columns]}, + {"b": -1, "a": [[j, -1] for j in columns]})) + return rows + + +def _check_model(model): + _require(type(model) is dict, "model must be an object") + n, costs, rows = model.get("n"), model.get("c"), model.get("rows") + _require(_integer(n) and 1 <= n <= 512, "invalid binary column count") + _require(type(costs) is list and len(costs) == n and all(_integer(c) for c in costs), + "costs must be n exact integers") + _require(type(rows) is list, "rows must be a list") + for row in rows: + _require(type(row) is dict and _integer(row.get("b")) and type(row.get("a")) is list, + "invalid sparse row") + previous = -1 + for pair in row["a"]: + _require(type(pair) is list and len(pair) == 2, "invalid sparse term") + column, value = pair + _require(_integer(column) and previous < column < n and _integer(value) and value != 0, + "sparse terms must be ordered, unique, nonzero and in range") + previous = column + parameters = model.get("parameters") + _require(type(parameters) is dict, "missing original domain parameters") + family = model.get("family") + if family in ("capacity_uncorrelated", "capacity_correlated"): + weights, capacities, profits = (parameters.get(k) for k in ("weights", "capacities", "profits")) + _require(type(weights) is list and len(weights) == 1 and type(weights[0]) is list and + len(weights[0]) == n and all(_integer(w) and w > 0 for w in weights[0]), + "invalid original capacity weights") + _require(type(capacities) is list and len(capacities) == 1 and + _integer(capacities[0]) and capacities[0] >= 0, "invalid original capacity") + _require(type(profits) is list and len(profits) == n and + all(_integer(p) and p > 0 for p in profits), "invalid original profits") + _require(costs == [-p for p in profits] and rows == _capacity_rows(weights[0], capacities[0]), + "original capacity semantics differ from sparse model") + cells = (n + 1) * (capacities[0] + 1) + eligible = capacities[0] <= 65536 and cells <= 1000000 + _require(parameters.get("capacity") == capacities[0] and parameters.get("table_cells") == cells and + type(parameters.get("dp_eligible")) is bool and parameters["dp_eligible"] == eligible and + parameters.get("dp_eligibility_reason") == + ("eligible" if eligible else "full_table_cell_cap_exceeded"), + "capacity admission metadata differs from original model") + elif family == "assignment": + size, matrix = parameters.get("size"), parameters.get("costs") + _require(_integer(size) and 1 <= size <= 16 and size * size == n, + "invalid original assignment size") + _require(type(matrix) is list and len(matrix) == size and + all(type(row) is list and len(row) == size and + all(_integer(c) and c >= 0 for c in row) for row in matrix), + "invalid original assignment matrix") + _require(costs == [c for row in matrix for c in row] and rows == _assignment_rows(size), + "original assignment semantics differ from sparse model") + _require(parameters.get("table_cells") is None and parameters.get("dp_eligible") is False and + parameters.get("dp_eligibility_reason") == "multiple_assignment_equality_rows", + "assignment admission metadata mismatch") + else: + raise ValueError("unknown scaling family") + _require(model.get("dimensions") == {"variables": n, "rows": len(rows), + "nonzeros": sum(len(row["a"]) for row in rows)}, + "model dimensions metadata mismatch") + + +def validate_assignment(model, assignment): + """Check binary values, every sparse row and original family semantics.""" + try: + _check_model(model) + n = model["n"] + _require(type(assignment) is list and len(assignment) == n and + all(_integer(x) and x in (0, 1) for x in assignment), + "assignment must contain n exact binary integers") + _require(all(sum(a * assignment[j] for j, a in row["a"]) >= row["b"] + for row in model["rows"]), "original sparse row violated") + parameters = model["parameters"] + if model["family"] == "assignment": + size = parameters["size"] + _require(all(sum(assignment[i * size:(i + 1) * size]) == 1 for i in range(size)) and + all(sum(assignment[i * size + j] for i in range(size)) == 1 for j in range(size)), + "original assignment bijection violated") + domain_cost = sum(parameters["costs"][i][j] * assignment[i * size + j] + for i in range(size) for j in range(size)) + else: + _require(sum(w * x for w, x in zip(parameters["weights"][0], assignment)) <= + parameters["capacities"][0], "original capacity violated") + domain_cost = -sum(p * x for p, x in zip(parameters["profits"], assignment)) + objective = sum(c * x for c, x in zip(model["c"], assignment)) + _require(domain_cost == objective, "original objective differs from sparse objective") + return {"valid": True, "objective": objective, "domain_semantics_checked": True} + except (ValueError, KeyError, TypeError, IndexError) as error: + return {"valid": False, "error": str(error)} + + +def capacity_reference(weights, profits, capacity): + """Exact minimum weight by profit, with per-item decisions for reconstruction.""" + _require(type(weights) is list and type(profits) is list and + 1 <= len(weights) <= 512 and len(profits) == len(weights), "reference item count") + _require(all(_integer(w) and w > 0 for w in weights) and + all(_integer(p) and p > 0 for p in profits) and + _integer(capacity) and capacity >= 0, "reference needs positive integer items") + total_profit = sum(profits) + prefix, work = 0, 0 + for profit in profits: + work += prefix + 1 + prefix += profit + _require(total_profit <= 51200 and work <= MAX_REFERENCE_TRANSITIONS, "reference work cap") + # Weights above capacity are unreachable for all later positive-weight items. + unreachable = capacity + 1 + minimum_weight = [unreachable] * (total_profit + 1) + minimum_weight[0] = 0 + decisions, prefix, transitions = [], 0, 0 + for weight, profit in zip(weights, profits): + prefix += profit + chosen = bytearray(prefix + 1) + for value in range(prefix, profit - 1, -1): + transitions += 1 + previous = minimum_weight[value - profit] + if previous <= capacity - weight and previous + weight < minimum_weight[value]: + minimum_weight[value] = previous + weight + chosen[value] = 1 + decisions.append(chosen) + best = max(value for value, weight in enumerate(minimum_weight) if weight <= capacity) + remaining = best + assignment = [0] * len(weights) + for i in range(len(weights) - 1, -1, -1): + if remaining < len(decisions[i]) and decisions[i][remaining]: + assignment[i] = 1 + remaining -= profits[i] + _require(remaining == 0 and sum(w * x for w, x in zip(weights, assignment)) <= capacity and + sum(p * x for p, x in zip(profits, assignment)) == best, "reference reconstruction") + return {"status": "optimal", "objective": -best, "assignment": assignment, + "method": "exact minimum-weight-by-profit dynamic programming", + "oracle_transitions": transitions} + + +def assignment_reference(costs): + """Exact minimum assignment cost over subsets of already used columns.""" + _require(type(costs) is list and 1 <= len(costs) <= 16, "assignment reference size") + size = len(costs) + _require(all(type(row) is list and len(row) == size and + all(_integer(c) and c >= 0 for c in row) for row in costs), "assignment reference costs") + values, previous_column = [None] * (1 << size), [-1] * (1 << size) + values[0] = 0 + transitions = 0 + for mask in range((1 << size) - 1): + row = mask.bit_count() + for column in range(size): + if mask & (1 << column): + continue + transitions += 1 + target = mask | (1 << column) + candidate = values[mask] + costs[row][column] + if values[target] is None or candidate < values[target]: + values[target] = candidate + previous_column[target] = column + mask = (1 << size) - 1 + assignment = [0] * (size * size) + for row in range(size - 1, -1, -1): + column = previous_column[mask] + _require(column >= 0 and mask & (1 << column), "assignment reference reconstruction") + assignment[row * size + column] = 1 + mask ^= 1 << column + _require(mask == 0, "assignment reference incomplete reconstruction") + return {"status": "optimal", "objective": values[-1], "assignment": assignment, + "method": "exact subset-column assignment dynamic programming", + "oracle_transitions": transitions} + + +def _reference(model): + _check_model(model) + p = model["parameters"] + reference = assignment_reference(p["costs"]) if model["family"] == "assignment" else \ + capacity_reference(p["weights"][0], p["profits"], p["capacities"][0]) + reference["input_sha256"] = semantic_hash(model) + checked = validate_assignment(model, reference["assignment"]) + _require(checked["valid"] and checked["objective"] == reference["objective"], "reference witness failed") + return reference + + +def verify_reference(model, *, recompute=False): + """Validate a frozen reference; recomputation is explicit and never implicit.""" + try: + _check_model(model) + reference = model["reference"] + identity = semantic_hash(model) + _require(type(reference) is dict and reference.get("status") == "optimal" and + reference.get("input_sha256") == identity and _integer(reference.get("objective")), + "reference status/identity/objective mismatch") + expected_method = ("exact subset-column assignment dynamic programming" if model["family"] == "assignment" + else "exact minimum-weight-by-profit dynamic programming") + _require(reference.get("method") == expected_method and + _integer(reference.get("oracle_transitions")) and reference["oracle_transitions"] >= 0, + "reference method/work mismatch") + checked = validate_assignment(model, reference.get("assignment")) + _require(checked["valid"] and checked["objective"] == reference["objective"], "reference witness mismatch") + if recompute: + _require(_reference(model)["objective"] == reference["objective"], "reference optimum mismatch") + return {"valid": True, "input_sha256": identity, "witness_checked": True, + "optimality_recomputed": bool(recompute), "objective": reference["objective"]} + except (ValueError, KeyError, TypeError, IndexError) as error: + return {"valid": False, "error": str(error), "witness_checked": False, + "optimality_recomputed": False} + + +def encode_txt(model): + """Encode the fixed binary driver protocol, always without a primal start.""" + _check_model(model) + lines = [f"{model['n']} {len(model['rows'])}", " ".join(map(str, model["c"]))] + for row in model["rows"]: + tokens = [row["b"], len(row["a"])] + [value for pair in row["a"] for value in pair] + lines.append(" ".join(map(str, tokens))) + return "\n".join(lines) + "\nincumbent 0\n" + + +expected_binary_text = encode_txt + + +def _complete(model, with_references): + model["kind"] = "binary" + model["dimensions"] = {"variables": model["n"], "rows": len(model["rows"]), + "nonzeros": sum(len(row["a"]) for row in model["rows"])} + _check_model(model) + if with_references: + model["reference"] = _reference(model) + return model + + +def generate_suite(*, with_references=True): + """Return the 13 prespecified models in stable order, without file writes. + + ``with_references=False`` is for cheap generator/schema tests only; such + records must not be frozen for a measured comparison. + """ + result = [] + for family in ("capacity_uncorrelated", "capacity_correlated"): + rng = random.Random(FAMILY_SEEDS[family]) + items = [] + for _ in range(512): + weight = rng.randint(1, 31) + profit = rng.randint(1, 100) if family == "capacity_uncorrelated" else weight + rng.randint(0, 10) + items.append((weight, profit)) + tiers = CAPACITY_TIERS + (("cap_overflow", 512),) if family == "capacity_uncorrelated" else CAPACITY_TIERS + for tier, size in tiers: + weights, profits = [w for w, _ in items[:size]], [p for _, p in items[:size]] + capacity = 6 * size + cells = (size + 1) * (capacity + 1) + eligible = capacity <= 65536 and cells <= 1000000 + parameters = {"weights": [weights], "profits": profits, "capacities": [capacity], + "capacity": capacity, "table_cells": cells, "dp_eligible": eligible, + "dp_eligibility_reason": "eligible" if eligible else "full_table_cell_cap_exceeded"} + model = {"id": f"{family}_{tier}_{size}", "family": family, "tier": tier, + "tier_size": size, "seed": FAMILY_SEEDS[family], "n": size, + "c": [-p for p in profits], "rows": _capacity_rows(weights, capacity), "parameters": parameters} + result.append(_complete(model, with_references)) + rng = random.Random(FAMILY_SEEDS["assignment"]) + master = [[rng.randint(1, 100) for _ in range(16)] for _ in range(16)] + for tier, size in ASSIGNMENT_TIERS: + matrix = [row[:size] for row in master[:size]] + model = {"id": f"assignment_{tier}_{size}", "family": "assignment", "tier": tier, + "tier_size": size, "seed": FAMILY_SEEDS["assignment"], "n": size * size, + "c": [c for row in matrix for c in row], "rows": _assignment_rows(size), + "parameters": {"size": size, "costs": matrix, "table_cells": None, "dp_eligible": False, + "dp_eligibility_reason": "multiple_assignment_equality_rows"}} + result.append(_complete(model, with_references)) + return result diff --git a/experiments/optimize/test_benchmark_progress.py b/experiments/optimize/test_benchmark_progress.py new file mode 100644 index 0000000000..d9b68f45b4 --- /dev/null +++ b/experiments/optimize/test_benchmark_progress.py @@ -0,0 +1,328 @@ +"""Process containment checks using short Python fixtures; never solver timings.""" + +from contextlib import closing +import importlib.util +import os +from pathlib import Path +import select +import signal +import subprocess +import sys +import tempfile +import time +import unittest +from unittest import mock + +SPEC = importlib.util.spec_from_file_location( + 'benchmark_progress', Path(__file__).with_name('benchmark_progress.py') +) +BENCH = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(BENCH) + + +@unittest.skipUnless(os.name == 'posix', 'POSIX benchmark containment') +class CaptureTests(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.directory = Path(self.temporary.name) + + def tearDown(self): + self.temporary.cleanup() + + def capture(self, source, timeout=1, **kwargs): + return BENCH.capture_command( + [sys.executable, '-u', '-c', source], + self.directory, + os.environ.copy(), + timeout, + **kwargs, + ) + + def assert_gone(self, pid): + # An adopted, killed grandchild may briefly remain a zombie before init + # reaps it. It has no running code and cannot retain the output files. + end = time.monotonic() + 0.5 + while time.monotonic() < end: + try: + os.kill(pid, 0) + except ProcessLookupError: + return + state = subprocess.run( + ['ps', '-p', str(pid), '-o', 'stat='], + capture_output=True, + text=True, + timeout=0.2, + ) + if not state.stdout.strip() or state.stdout.strip().startswith('Z'): + return + time.sleep(0.01) + self.fail(f'fixture process {pid} survived cleanup') + + def descendant_source(self, parent_wait): + return ( + 'import pathlib,subprocess,sys,time\n' + "p=subprocess.Popen([sys.executable,'-c','import time;time.sleep(30)'])\n" + "pathlib.Path('descendant.pid').write_text(str(p.pid))\n" + "pathlib.Path('leader.pid').write_text(str(__import__('os').getpid()))\n" + f'time.sleep({parent_wait})\n' + ) + + def assert_fixture_gone(self): + for name in ('leader.pid', 'descendant.pid'): + self.assert_gone(int((self.directory / name).read_text())) + + def test_success_and_nonzero_exit_preserve_both_streams(self): + result = self.capture( + "import sys;print('answer');print('diagnostic',file=sys.stderr)" + ) + self.assertEqual(result['returncode'], 0) + self.assertEqual(result['stdout'], b'answer\n') + self.assertEqual(result['stderr'], b'diagnostic\n') + self.assertFalse(result['hard_timeout']) + self.assertFalse(result['output_limit']) + result = self.capture("import sys;print('bad');sys.exit(7)") + self.assertEqual(result['returncode'], 7) + self.assertEqual(result['stdout'], b'bad\n') + + def test_output_allowance_during_execution_and_after_exit(self): + for stream in (1, 2): + for after in ('', ';time.sleep(30)'): + with self.subTest(stream=stream, stays_alive=bool(after)): + result = self.capture( + f"import os,time;os.write({stream},b'x'*131072){after}", + max_output=4096, + ) + self.assertTrue(result['output_limit']) + self.assertFalse(result['hard_timeout']) + self.assertLess(result['external_seconds'], 1) + self.assertLessEqual(len(result['stdout']), 4096) + self.assertLessEqual(len(result['stderr']), 4096) + self.assertGreaterEqual( + result['stdout_bytes_observed'] + + result['stderr_bytes_observed'], + 131072, + ) + + def test_timeout_kills_leader_and_descendant(self): + result = self.capture(self.descendant_source(30), timeout=0.2) + self.assertTrue(result['hard_timeout']) + self.assertLess(result['external_seconds'], 1) + self.assert_fixture_gone() + + def test_successful_leader_does_not_leave_descendant(self): + result = self.capture(self.descendant_source(0)) + self.assertEqual(result['returncode'], 0) + self.assertFalse(result['hard_timeout']) + self.assert_fixture_gone() + + def interrupted_capture(self, failure): + real_popen = subprocess.Popen + launched = [] + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + launched.append(proc) + end = time.monotonic() + 0.5 + while not (self.directory / 'descendant.pid').exists(): + if time.monotonic() >= end: + os.killpg(proc.pid, signal.SIGKILL) + proc.wait(timeout=0.5) + self.fail('fixture did not register its descendant') + time.sleep(0.005) + proc.poll = mock.Mock(side_effect=failure) + return proc + + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start): + with self.assertRaises(type(failure)): + self.capture(self.descendant_source(30)) + self.assertIsNotNone(launched[0].returncode) + self.assert_fixture_gone() + + def test_keyboard_interrupt_cleans_process_group(self): + self.interrupted_capture(KeyboardInterrupt()) + + def test_unexpected_exception_cleans_process_group(self): + self.interrupted_capture(RuntimeError('injected poll failure')) + + def test_invalid_allowances_and_launch_failure(self): + for timeout in (0, -1, float('nan'), float('inf')): + with self.assertRaises(ValueError): + self.capture('pass', timeout=timeout) + for maximum in (0, -1, True, 1.5): + with self.assertRaises(ValueError): + self.capture('pass', max_output=maximum) + with self.assertRaises(FileNotFoundError): + BENCH.capture_command( + ['/definitely/not/a/program'], self.directory, os.environ.copy(), 0.1 + ) + + @unittest.skipUnless(sys.platform == 'darwin', 'Darwin zombie-only group behavior') + def test_unreaped_zombie_output_limit_reaps_and_retries_group(self): + real_popen, real_killpg = subprocess.Popen, os.killpg + launched, outcomes = [], [] + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + launched.append(proc) + # Observe process exit without wait/poll reaping it. The child gate + # makes NOTE_EXIT registration deterministic even on a fast host. + with closing(select.kqueue()) as queue: + event = select.kevent( + proc.pid, filter=select.KQ_FILTER_PROC, + flags=select.KQ_EV_ADD | select.KQ_EV_ONESHOT, + fflags=select.KQ_NOTE_EXIT, + ) + queue.control([event], 0, 0) + (self.directory / 'run').touch() + events = queue.control(None, 1, 0.5) + self.assertTrue(events and events[0].fflags & select.KQ_NOTE_EXIT) + self.assertIsNone(proc.returncode) + return proc + + def kill_group(pid, sig): + try: + real_killpg(pid, sig) + outcomes.append('success') + except OSError as error: + outcomes.append(type(error).__name__) + raise + + source = ( + 'import os,pathlib,time\n' + 'deadline=time.monotonic()+0.5\n' + "while not pathlib.Path('run').exists():\n" + ' if time.monotonic()>deadline: raise SystemExit(9)\n' + ' time.sleep(0.001)\n' + "os.write(1,b'x'*131072)\n" + ) + try: + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start), \ + mock.patch.object(BENCH.os, 'killpg', side_effect=kill_group): + result = self.capture(source, max_output=4096) + self.assertEqual(outcomes, ['PermissionError', 'ProcessLookupError']) + self.assertEqual(result['returncode'], 0) + self.assertTrue(result['output_limit']) + self.assertFalse(result['hard_timeout']) + self.assertEqual(result['stdout'], b'x'*4096) + finally: + for proc in launched: + proc.kill() + proc.wait(timeout=0.5) + + def test_permission_retry_still_kills_live_descendant(self): + real_popen, real_killpg = subprocess.Popen, os.killpg + launched, attempts = [], [] + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + launched.append(proc) + proc.wait(timeout=0.5) # The fixture's ordinary descendant stays live. + return proc + + def kill_group(pid, sig): + attempts.append((pid, sig)) + if len(attempts) == 1: + raise PermissionError(1, 'injected initial group denial') + real_killpg(pid, sig) + + try: + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start), \ + mock.patch.object(BENCH.os, 'killpg', side_effect=kill_group): + result = self.capture(self.descendant_source(0)) + self.assertEqual(result['returncode'], 0) + self.assertEqual(len(attempts), 2) + self.assertEqual(attempts[0], attempts[1]) + self.assert_fixture_gone() + finally: + for proc in launched: + try: + real_killpg(proc.pid, signal.SIGKILL) + except (ProcessLookupError, PermissionError): + # A killed, adopted descendant can briefly be a zombie. + pass + proc.wait(timeout=0.5) + + def test_persistent_permission_denial_is_not_swallowed_after_reap(self): + real_popen = subprocess.Popen + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + proc.wait(timeout=0.5) + return proc + + denial = PermissionError(1, 'injected persistent group denial') + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start), \ + mock.patch.object(BENCH.os, 'killpg', side_effect=denial) as kill_group: + with self.assertRaisesRegex(PermissionError, 'persistent group denial'): + self.capture('pass') + self.assertEqual(kill_group.call_count, 2) + + def test_reap_permission_denial_propagates_without_group_retry(self): + real_popen, real_killpg = subprocess.Popen, os.killpg + launched = [] + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + real_wait = proc.wait + launched.append((proc, real_wait)) + proc.wait = mock.Mock(side_effect=PermissionError(1, 'injected reap denial')) + return proc + + try: + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start), \ + mock.patch.object(BENCH.os, 'killpg', wraps=real_killpg) as kill_group: + with self.assertRaisesRegex(PermissionError, 'reap denial'): + self.capture('import time;time.sleep(30)', timeout=0.005) + self.assertEqual(kill_group.call_count, 1) + finally: + for proc, real_wait in launched: + proc.kill() + real_wait(timeout=0.5) + + def test_exit_transition_waits_once_then_retries_group(self): + real_killpg = os.killpg + attempts = [] + + def kill_group(pid, sig): + attempts.append((pid, sig)) + if len(attempts) == 1: + raise PermissionError(1, 'injected exit-transition denial') + real_killpg(pid, sig) + + with mock.patch.object(BENCH.os, 'killpg', side_effect=kill_group): + result = self.capture('import time;time.sleep(0.08)', timeout=0.005) + self.assertEqual(len(attempts), 2) + self.assertEqual(attempts[0], attempts[1]) + self.assertEqual(result['returncode'], 0) + self.assertTrue(result['hard_timeout']) + self.assertLess(result['external_seconds'], 1) + + def test_live_leader_permission_denial_exceeds_cleanup_allowance(self): + # The error path must stay bounded even when the group cannot be + # signalled. Remove the denial before the fixture's own final cleanup. + real_popen = subprocess.Popen + launched = [] + + def start(*args, **kwargs): + proc = real_popen(*args, **kwargs) + launched.append(proc) + return proc + + denial = PermissionError(1, 'injected live group denial') + started = time.monotonic() + try: + with mock.patch.object(BENCH.subprocess, 'Popen', side_effect=start), \ + mock.patch.object(BENCH.os, 'killpg', side_effect=denial) as kill_group: + with self.assertRaisesRegex(RuntimeError, 'cleanup deadline exceeded'): + self.capture('import time;time.sleep(30)', timeout=0.005) + self.assertEqual(kill_group.call_count, 1) + self.assertLess(time.monotonic()-started, 1) + self.assertIsNone(launched[0].poll()) + finally: + for proc in launched: + proc.kill() + proc.wait(timeout=0.5) + + +if __name__ == '__main__': + unittest.main() diff --git a/experiments/optimize/test_boundaries.py b/experiments/optimize/test_boundaries.py new file mode 100644 index 0000000000..1fc0b1f44e --- /dev/null +++ b/experiments/optimize/test_boundaries.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +"""Pure adaptive-runner conformance: no solver or subprocess execution.""" +import copy +import importlib.util +import json +from pathlib import Path +import sys +import tempfile +import time +import unittest +from unittest import mock + +sys.dont_write_bytecode = True +SPEC = importlib.util.spec_from_file_location('boundary_runner_test', Path(__file__).with_name('benchmark_boundaries.py')) +runner = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(runner) + + +def fixture(category='knapsack'): + size = 8 if category=='knapsack' else 4 + model = runner.generator.make(category, size, 'uncorrelated' if category=='knapsack' else 'single') + if category=='knapsack': + values = [0]*size + elif category=='native_tsp': + values = [1, 2, 3, 0] + else: + values = [1, 3, 0, 2] + check = runner.generator.validate_assignment(model, values) + assert check['valid'] + full = values[:] + if category=='weighted_queens': + full += [v for i, x in enumerate(values) for v in (x+i, x-i)] + if model['kind']!='binary': + full += [model['data'][i][x] for i, x in enumerate(values)] + raw = dict(schema_version=1, kind=model['kind'], route='native', backend='Gecode native', + backend_version='fixture', guarantee='exact', start_submitted=False, + model_id=1, revision=1, model_columns=model['model_variables'], + model_rows=model['dimensions']['rows'], model_globals=model['dimensions']['globals'], + status='optimal', has_solution=True, solution_validated=True, + assignment=values, full_values=full, objective=check['objective'], + best_bound=check['objective'], absolute_gap=0, relative_gap=0, + build_seconds=0.001, solve_seconds=0.1, driver_seconds=0.102, + nodes=None, expanded_nodes=None, budget_nodes=None, + peak_open_nodes=None, unresolved_regions=None) + return model, raw + + +class FakeSearch(runner.Search): + def __init__(self, surface): + self.surface = surface + self.records, self.decisions, self.models = [], [], {} + self.sources, self.runtime_sources, self.provenance = {}, {}, {} + self.expected = {c: {'libraries': []} for c in runner.COHORTS} + self.directories = {c: [] for c in runner.COHORTS} + self.binary = Path('fake-driver') + self.output = Path('unused') + self.started = time.monotonic() + self.complete = False + + def publish(self): + pass + + def execute(self, category, size, variant, cohort, repetition, probe=False): + self.records.append(dict(category=category, size=size, variant=variant, + cohort=cohort, repetition=repetition, probe=probe, + passed=self.surface(category, size, cohort, repetition))) + + +class BoundaryTests(unittest.TestCase): + def test_no_oracle_claim_even_for_plausible_backend_optimum(self): + model, raw = fixture() + # All-zero knapsack is feasible. Deliberately do not establish optimality. + checked = runner.validate(raw, model) + self.assertTrue(checked['passed']) + self.assertTrue(checked['primal_checked']) + self.assertTrue(checked['backend_reported_optimal']) + self.assertFalse(checked['independent_optimality_verified']) + self.assertNotIn('reference', model) + + def test_native_original_and_full_auxiliary_witnesses(self): + for category in ('native_tsp', 'weighted_queens'): + model, raw = fixture(category) + self.assertTrue(runner.validate(raw, model)['primal_checked']) + wrong = copy.deepcopy(raw) + wrong['full_values'][-1] += 1 + with self.assertRaises(ValueError): + runner.validate(wrong, model) + wrong = copy.deepcopy(raw) + wrong['assignment'][0] = wrong['assignment'][1] + with self.assertRaises(ValueError): + runner.validate(wrong, model) + wrong = copy.deepcopy(raw) + wrong['model_columns'] = model['n'] + with self.assertRaises(ValueError): + runner.validate(wrong, model) + + def test_protocol_nonfinite_objective_and_gap_faults(self): + model, raw = fixture() + for field, value in [('schema_version', True), ('guarantee', 'numerical'), + ('start_submitted', True), ('model_id', True), + ('objective', float('nan')), ('objective', 1), + ('best_bound', 1), ('relative_gap', 1), ('nodes', 0)]: + with self.subTest(field=field, value=value): + wrong = dict(raw, **{field: value}) + with self.assertRaises(ValueError): + runner.validate(wrong, model) + + def test_budget_boundary_and_limit_absent_point(self): + model, raw = fixture() + raw.update(solve_seconds=10, driver_seconds=10.01) + self.assertTrue(runner.validate(raw, model)['passed']) + raw['solve_seconds'] = 10.000001 + self.assertFalse(runner.validate(raw, model)['passed']) + raw.update(status='time_limit', has_solution=False, solution_validated=False, + assignment=[], full_values=[], objective=None, best_bound=None, + absolute_gap=None, relative_gap=None) + checked = runner.validate(raw, model) + self.assertFalse(checked['passed']) + self.assertFalse(checked['primal_checked']) + + def test_better_limited_witness_rejects_peer_reported_optimum(self): + model, raw = fixture() + raw['assignment'][0] = 1 + raw['full_values'][0] = 1 + checked = runner.generator.validate_assignment(model, raw['assignment']) + self.assertTrue(checked['valid']) + self.assertLess(checked['objective'], 0) + raw.update(status='time_limit', objective=checked['objective'], best_bound=None, + absolute_gap=None, relative_gap=None) + with tempfile.TemporaryDirectory() as directory: + search = FakeSearch(lambda *args: True) + search.output = Path(directory) + key = 'knapsack-8-uncorrelated' + search.records.append(dict(case=key, backend_reported_optimal=True, + objective=0, best_bound=0)) + search.model = lambda *args: (key, model) + outcome = dict(stdout=json.dumps(raw).encode(), stderr=b'', returncode=0, + hard_timeout=False, output_limit=False, external_seconds=0.01) + with mock.patch.object(runner, 'capture', return_value=outcome): + with self.assertRaisesRegex(ValueError, 'Feasible peer'): + runner.Search.execute(search, 'knapsack', 8, 'uncorrelated', 'after', 1) + self.assertEqual(search.records[-1]['status'], 'error') + self.assertFalse(search.records[-1]['passed']) + + def test_final_publication_expiry_clears_completion(self): + search = FakeSearch(lambda *args: True) + def publish(): + if search.complete: + search.started -= runner.WHOLE_SECONDS + search.publish = publish + with mock.patch.object(runner, 'LIMITS', {'assignment': (2, 4, 8)}), \ + mock.patch.object(runner, 'sha', return_value=runner.DRIVER_HASH), \ + mock.patch('builtins.print'): + with self.assertRaisesRegex(ValueError, 'during publication'): + search.run() + self.assertFalse(search.complete) + + def run_search(self, surface, category='assignment', limits=(2, 4, 16)): + search = FakeSearch(surface) + with mock.patch.object(runner, 'LIMITS', {category: limits}), \ + mock.patch.object(runner, 'sha', return_value=runner.DRIVER_HASH), \ + mock.patch('builtins.print'): + search.run() + return search + + def test_independent_cached_bisection_and_neighbor_confirmation(self): + search = self.run_search(lambda c, n, cohort, r: n <= (7 if cohort=='before' else 11)) + self.assertTrue(search.complete) + for cohort, maximum in [('before', 7), ('after', 11)]: + confirmed = [n for n in search.sizes('assignment') if search.passed('assignment', n, cohort, True)] + self.assertEqual(max(confirmed), maximum) + self.assertEqual(len(search.rows('assignment', maximum+1, cohort)), 2) + keys = [(r['category'], r['size'], r['variant'], r['cohort'], r['repetition']) for r in search.records] + self.assertEqual(len(keys), len(set(keys))) + for n in search.sizes('assignment'): + if n <= 8: + first = [x for x in search.records if x['size']==n and x['repetition']==1] + self.assertEqual({x['cohort'] for x in first}, set(runner.COHORTS)) + else: + self.assertEqual(search.rows('assignment', n, 'before'), []) + self.assertTrue(search.rows('assignment', n, 'after')) + self.assertEqual(max(x['size'] for x in search.records if x['cohort']=='before'), 8) + self.assertTrue(any(x['size']>8 and x['cohort']=='after' for x in search.records)) + for decision in search.decisions: + if decision['reason']=='shared timing point within smaller boundary': + self.assertLessEqual(decision['size'], 8) + self.assertEqual(decision['cohorts'], list(runner.COHORTS)) + + def test_unprobed_nonmonotonic_island_is_unknown_not_failure(self): + # A passing island above the first failure exists mathematically, but + # this heuristic is intentionally not authorized to explore it. + search = self.run_search(lambda c, n, cohort, r: n<=4 or n==16) + for cohort in runner.COHORTS: + self.assertTrue(search.passed('assignment', 4, cohort, True)) + self.assertEqual(search.rows('assignment', 16, cohort), []) + self.assertEqual(search.rows('assignment', 15, cohort), []) + self.assertFalse(search.passed('assignment', 16, cohort, True)) + self.assertNotIn(16, search.sizes('assignment')) + self.assertTrue(all(d['size']!=16 for d in search.decisions)) + self.assertEqual(max(search.sizes('assignment')), 8) + + def test_expansion_reaches_cap_only_for_passing_cohort(self): + search = self.run_search(lambda c, n, cohort, r: n<=5 if cohort=='before' else True) + self.assertTrue(search.passed('assignment', 5, 'before', True)) + self.assertTrue(search.passed('assignment', 16, 'after', True)) + self.assertEqual(search.rows('assignment', 16, 'before'), []) + self.assertEqual(max(r['size'] for r in search.records if r['cohort']=='before'), 8) + + def test_failed_confirmation_downgrades_without_retrying(self): + search = self.run_search(lambda c, n, cohort, r: n<=7 and not (n==7 and r==2)) + for cohort in runner.COHORTS: + self.assertFalse(search.passed('assignment', 7, cohort, True)) + self.assertTrue(search.passed('assignment', 6, cohort, True)) + self.assertEqual([r['passed'] for r in search.rows('assignment', 7, cohort)], [True, False]) + + def test_knapsack_confirmation_requires_both_variants_twice(self): + search = self.run_search(lambda c, n, cohort, r: n<=5, 'knapsack', (2, 4, 8)) + for cohort in runner.COHORTS: + rows = search.rows('knapsack', 5, cohort) + self.assertEqual({(r['variant'], r['repetition']) for r in rows}, + {(v, r) for v in ('uncorrelated', 'correlated') for r in (1, 2)}) + self.assertTrue(search.passed('knapsack', 5, cohort, True)) + rows[0]['passed'] = False + self.assertFalse(search.passed('knapsack', 5, cohort, True)) + + +if __name__=='__main__': + unittest.main() diff --git a/experiments/optimize/test_boundary_instances.py b/experiments/optimize/test_boundary_instances.py new file mode 100644 index 0000000000..a6335a1934 --- /dev/null +++ b/experiments/optimize/test_boundary_instances.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +"""Pure bounded generator/validator tests; no solver or large exact oracle.""" +import copy +import itertools +import unittest +from unittest.mock import patch + +import boundary_instances as instances + + +class BoundaryInstancesTests(unittest.TestCase): + def test_existing_semantics_and_encodings(self): + old = instances.category.generate_suite(with_references=False) + for model in old: + name, size = model["category"], model["tier_size"] + if name == "facility_location" and model["parameters"]["customers"] != 2 * size: + continue + if name == "bin_packing" and model["parameters"]["bins"] != (size + 2) // 3: + continue + new = instances.make(name, size, model["variant"]) + self.assertEqual(instances.semantic_hash(new), instances.category.semantic_hash(model)) + self.assertEqual(instances.encode_txt(new), instances.category.encode_txt(model)) + + def test_preserved_blocks_and_larger_prefixes(self): + old = instances.category.generate_suite(with_references=False) + for name in ("assignment", "facility_location", "production", "native_tsp", "weighted_queens"): + models = [m for m in old if m["category"] == name] + master = instances.make(name, instances.BOUNDS[name][1]) + for m in models: + p, q = m["parameters"], master["parameters"] + if name == "assignment": + self.assertEqual(p["costs"], [row[:p["size"]] for row in q["costs"][:p["size"]]]) + elif name == "facility_location": + self.assertEqual(p["opening_costs"], q["opening_costs"][:p["facilities"]]) + self.assertEqual(p["assignment_costs"], [row[:p["facilities"]] for row in q["assignment_costs"][:p["customers"]]]) + elif name == "production": + for key in ("demands", "production_costs"): + self.assertEqual(p[key], q[key][:p["periods"]]) + else: + self.assertEqual(m["data"], [row[:m["n"]] for row in master["data"][:m["n"]]]) + mid = instances.make(name, (sum(instances.BOUNDS[name]) // 2)) + self.assertEqual(mid, instances.make(name, mid["natural_size"])) + + def test_ranges_dimensions_and_no_reference_work(self): + with patch.object(instances.category, "_reference", side_effect=AssertionError("oracle")), \ + patch.object(instances.category.scaling, "_reference", side_effect=AssertionError("oracle")): + for name, (low, high) in instances.BOUNDS.items(): + variant = "uncorrelated" if name == "knapsack" else "single" + for size in (low, low + 1, high - 1, high): + m = instances.make(name, size, variant) + self.assertNotIn("reference", m) + multiplier = 2 if name == "native_tsp" else 4 if name == "weighted_queens" else 1 + self.assertEqual(m["model_variables"], multiplier * m["n"]) + self.assertEqual(len(instances.semantic_hash(m)), 64) + self.assertTrue(instances.encode_txt(m).endswith("\n")) + for invalid in (low - 1, high + 1, True, float(low), None): + with self.assertRaises(ValueError): + instances.make(name, invalid, variant) + with self.assertRaises(ValueError): + instances.make("knapsack", 8) + with self.assertRaises(ValueError): + instances.make("assignment", 3, "correlated") + + def test_large_original_witnesses_and_corruption(self): + cases = [] + m = instances.make("assignment", 32) + cases.append((m, [int(i == j) for i in range(32) for j in range(32)])) + m = instances.make("facility_location", 16) + cases.append((m, [1] + [0] * 15 + [int(j == 0) for _ in range(32) for j in range(16)])) + m = instances.make("production", 48) + cases.append((m, [int(q == d) for d in m["parameters"]["demands"] for q in range(8)])) + m = instances.make("native_tsp", 96) + cases.append((m, [(i + 1) % 96 for i in range(96)])) + m = instances.make("weighted_queens", 32) + queens = [v - 1 for v in list(range(2, 33, 2)) + [3, 1] + list(range(7, 32, 2)) + [5]] + self.assertTrue(all(queens[i] != queens[j] and abs(queens[i] - queens[j]) != abs(i - j) + for i in range(32) for j in range(i))) + cases.append((m, queens)) + m = instances.make("bin_packing", 32) + p, loads, choices = m["parameters"], [], [0] * 32 + for item in sorted(range(32), key=lambda i: -p["weights"][i]): + weight = p["weights"][item] + b = next((b for b, load in enumerate(loads) if load + weight <= p["capacity"]), len(loads)) + if b == len(loads): + loads.append(0) + loads[b] += weight + choices[item] = b + self.assertLessEqual(len(loads), p["bins"]) + cases.append((m, [int(b == choice) for choice in choices for b in range(p["bins"])] + + [int(b < len(loads)) for b in range(p["bins"])])) + m = instances.make("knapsack", 512, "correlated") + cases.append((m, [0] * 512)) + for m, witness in cases: + checked = instances.validate_assignment(m, witness) + self.assertTrue(checked["valid"], checked) + self.assertTrue(checked["domain_semantics_checked"]) + self.assertFalse(instances.validate_assignment(m, witness[:-1])["valid"]) + bad = copy.deepcopy(m) + bad["model_variables"] += 1 + self.assertFalse(instances.validate_assignment(bad, witness)["valid"]) + bad = copy.deepcopy(m) + if m["kind"] == "binary": + bad["c"][0] += 1 + else: + bad["data"][0][1] += 1 + with self.assertRaises(ValueError): + instances.encode_txt(bad) + with_hint = copy.deepcopy(m) + with_hint["reference"] = {"assignment": witness, "objective": -999} + self.assertEqual(instances.encode_txt(m), instances.encode_txt(with_hint)) + + def test_small_independent_truth_tables(self): + m = instances.make("knapsack", 8, "uncorrelated") + p = m["parameters"] + for x in itertools.product((0, 1), repeat=8): + expected = sum(w * v for w, v in zip(p["weights"][0], x)) <= p["capacity"] + checked = instances.validate_assignment(m, list(x)) + self.assertEqual(checked["valid"], expected) + if expected: + self.assertEqual(checked["objective"], -sum(v * c for v, c in zip(x, p["profits"]))) + m = instances.make("weighted_queens", 4) + for x in itertools.product(range(4), repeat=4): + expected = all(x[i] != x[j] and abs(x[i] - x[j]) != abs(i - j) + for i in range(4) for j in range(i)) + self.assertEqual(instances.validate_assignment(m, list(x))["valid"], expected) + + +if __name__ == "__main__": + unittest.main() diff --git a/experiments/optimize/test_capacity_scaling.py b/experiments/optimize/test_capacity_scaling.py new file mode 100644 index 0000000000..116faf8cd1 --- /dev/null +++ b/experiments/optimize/test_capacity_scaling.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +"""Small runner conformance checks; no subprocesses or solver timings.""" +import importlib.util +import json +from pathlib import Path +import shutil +import sys +import tempfile +import time +from types import SimpleNamespace +import unittest +from unittest import mock + +sys.dont_write_bytecode = True +PATH = Path(__file__).with_name('benchmark_capacity_scaling.py').resolve() +SPEC = importlib.util.spec_from_file_location('capacity_scaling', PATH) +runner = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(runner) + + +class ScalingRunnerTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.temporary = tempfile.TemporaryDirectory() + cls.root = Path(cls.temporary.name) + cls.frozen = cls.root/'frozen' + cls.pin = runner.freeze(cls.frozen)['manifest_sha256'] + cls.common, cls.generator = runner.modules() + cls.manifest, cls.models, _ = runner.read_frozen( + cls.frozen, cls.pin, cls.common, cls.generator) + + @classmethod + def tearDownClass(cls): + cls.temporary.cleanup() + + def test_freeze_has_exact_preregistered_shapes_and_ten_second_budget(self): + pairs = [(record['family'], record['variables']) for record in self.manifest['records']] + self.assertEqual(pairs, runner.PLANNED) + self.assertEqual(len(pairs), 13) + self.assertEqual(self.manifest['protocol']['solver_seconds'], 10) + self.assertEqual(self.manifest['protocol']['expected_measured_runs'], 52) + self.assertTrue(self.manifest['records'][-1]['stress']) + self.assertFalse(self.manifest['records'][-1]['parameters']['dp_eligible']) + with self.assertRaises(ValueError): + runner.freeze(self.frozen) + + def test_measured_preflight_never_recomputes_oracles(self): + with mock.patch.object(self.generator, 'capacity_reference', side_effect=AssertionError('oracle rerun')), \ + mock.patch.object(self.generator, 'assignment_reference', side_effect=AssertionError('oracle rerun')): + manifest, models, hashes = runner.read_frozen( + self.frozen, self.pin, self.common, self.generator) + self.assertEqual(len(models), 13) + self.assertEqual(len(hashes), 28) + self.assertEqual(manifest, self.manifest) + + def test_hash_pin_source_and_file_mutations_fail_closed(self): + with self.assertRaisesRegex(ValueError, 'manifest hash'): + runner.read_frozen(self.frozen, '0'*64, self.common, self.generator) + changed = self.root/'changed' + shutil.copytree(self.frozen, changed) + path = changed/self.manifest['records'][0]['txt'] + path.write_text(path.read_text()+'\n') + with self.assertRaisesRegex(ValueError, 'model bytes'): + runner.read_frozen(changed, self.pin, self.common, self.generator) + with mock.patch.object(runner, 'source_hashes', return_value={}): + with self.assertRaisesRegex(ValueError, 'source changed'): + runner.read_frozen(self.frozen, self.pin, self.common, self.generator) + + def observation_fixture(self): + unit = self.manifest['records'][0] + model = self.models[unit['id']] + assignment = model['reference']['assignment'][:] + raw = dict(schema_version=1, kind='binary', route='native', + backend='Gecode native', backend_version='fixture', guarantee='exact', + start_submitted=False, model_id=1, revision=1, model_columns=model['n'], + model_rows=len(model['rows']), model_globals=0, status='optimal', + has_solution=True, solution_validated=True, assignment=assignment, + full_values=assignment, objective=unit['objective'], best_bound=unit['objective'], + absolute_gap=0, relative_gap=0, build_seconds=0.001, solve_seconds=10, + driver_seconds=10.1, nodes=None, expanded_nodes=None, budget_nodes=None, + peak_open_nodes=None, unresolved_regions=None) + return unit, model, raw + + def test_original_witness_and_exact_limit_boundary(self): + unit, model, raw = self.observation_fixture() + checked = runner.checked_observation(raw, unit, model, self.common, self.generator) + self.assertTrue(checked['proved_within_limit']) + raw['solve_seconds'] = 10.000001 + checked = runner.checked_observation(raw, unit, model, self.common, self.generator) + self.assertTrue(checked['completed']) + self.assertFalse(checked['proved_within_limit']) + raw['objective'] += 1 + with self.assertRaises(ValueError): + runner.checked_observation(raw, unit, model, self.common, self.generator) + + def records(self): + records = [] + for repetition in (1, 2): + for unit in self.manifest['records']: + for cohort in ('before', 'after'): + records.append(dict(case=unit['id'], cohort=cohort, repetition=repetition, + proved_within_limit=True, status='optimal', solve_seconds=1, + external_seconds=1.01, objective=unit['objective'], + best_bound=unit['objective'])) + return records + + def test_largest_size_includes_stress_and_requires_both_repetitions(self): + records = self.records() + boundary = self.manifest['records'][-1]['id'] + for record in records: + if record['cohort']=='before' and record['case']==boundary and record['repetition']==2: + record.update(proved_within_limit=False, status='time_limit', solve_seconds=10) + summary = runner.summarize(records, self.manifest, {}, True, 1) + family = summary['families'][0] + self.assertEqual(family['tested_variables'], [8, 32, 128, 384, 512]) + self.assertEqual(family['before']['largest_tested_proved_variables'], 384) + self.assertEqual(family['after']['largest_tested_proved_variables'], 512) + self.assertEqual(family['before']['larger_tested_unproved_variables'], [512]) + stress = next(case for case in summary['cases'] if case['stress']) + self.assertIsNone(stress['median_paired_solve_seconds_ratio_after_before']) + self.assertEqual(stress['before']['internal_seconds'], [1, 10]) + + def test_capacity_ratio_is_sampled_size_and_integrity_failure_clears_it(self): + records = self.records() + ids = {unit['id']: unit for unit in self.manifest['records']} + for record in records: + unit = ids[record['case']] + if unit['family']=='capacity_uncorrelated' and ( + (record['cohort']=='before' and unit['variables']>8) or unit['stress'] + ): + record.update(proved_within_limit=False, status='time_limit', solve_seconds=10) + summary = runner.summarize(records, self.manifest, {}, True, 1) + self.assertEqual(summary['families'][0]['ratio_of_largest_tested_proved_variables'], 48) + invalid = runner.summarize(records, self.manifest, {}, False, 1) + self.assertIsNone(invalid['families'][0]['ratio_of_largest_tested_proved_variables']) + self.assertTrue(all(not case['before']['proved_all'] and not case['after']['proved_all'] + for case in invalid['cases'])) + + def test_unsafe_frozen_paths_are_rejected(self): + for path in ('../outside', str(self.frozen/'manifest.json')): + with self.assertRaises(ValueError): + runner.inside(self.frozen, path) + + def test_failed_second_loader_probe_preserves_both_outcomes(self): + work = self.root/'probe-test' + before, after = work/'before/lib', work/'after/lib' + before.mkdir(parents=True) + after.mkdir(parents=True) + for path, contents in ((before/'libgecodeoptimize.dylib', 'before'), + (after/'libgecodeoptimize.dylib', 'after')): + path.write_text(contents) + binary = work/'driver' + binary.write_text('not executed') + baseline = work/'before/manifest.json' + runner.write(baseline, dict( + source_head=self.common.BASELINE_SOURCE, compiled_product=self.common.BASELINE_COMPILED, + files=[dict(copy='lib/libgecodeoptimize.dylib', sha256=runner.sha(before/'libgecodeoptimize.dylib'))], + )) + _, _, raw = self.observation_fixture() + raw.update(solve_seconds=0.001, driver_seconds=0.003) + outcomes = [ + dict(returncode=0, hard_timeout=False, output_limit=False, external_seconds=0.01, + stdout=json.dumps(raw).encode(), stderr=(str(before/'libgecodeoptimize.dylib')+'\n').encode()), + dict(returncode=2, hard_timeout=False, output_limit=False, external_seconds=0.01, + stdout=b'', stderr=b'fixture loader rejection'), + ] + capture = mock.Mock(side_effect=outcomes) + real_load = runner.load_module + def load(name, path): + return SimpleNamespace(capture_command=capture) if name=='capacity_capture' else real_load(name, path) + args = SimpleNamespace(freeze_dir=self.frozen, manifest_sha256=self.pin, binary=binary, + before_libraries=[before], after_libraries=[after], + baseline_manifest=baseline, output_dir=work/'results') + with mock.patch.object(runner, 'load_module', side_effect=load), \ + mock.patch.object(runner.subprocess, 'check_output', return_value='fixture-head\n'): + self.assertEqual(runner.measure(args, time.monotonic()), 1) + self.assertEqual(capture.call_count, 2) + report = json.loads((args.output_dir/'report.json').read_text()) + self.assertFalse(report['comparison_valid']) + self.assertTrue(report['preflight_failure']) + self.assertEqual([probe['status'] for probe in report['loader_probes']], ['validated', 'failed']) + self.assertEqual(report['loader_probes'][1]['returncode'], 2) + self.assertEqual(report['records'], []) + self.assertEqual((args.output_dir/'provenance-after.stderr').read_bytes(), b'fixture loader rejection') + summary = json.loads((args.output_dir/'summary.json').read_text()) + self.assertFalse(summary['comparison_valid']) + self.assertEqual(summary['required_runs'], 52) + + +if __name__=='__main__': + unittest.main() diff --git a/experiments/optimize/test_category_instances.py b/experiments/optimize/test_category_instances.py new file mode 100644 index 0000000000..84727c94d1 --- /dev/null +++ b/experiments/optimize/test_category_instances.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +"""Independent small family oracles and frozen driver schema; no solver calls.""" +import copy +import itertools +import random +import unittest +from unittest.mock import patch + +import category_instances as instances + + +def brute_bins(weights, capacity): + """Enumerate unlabeled set partitions directly, without subset-DP states.""" + best = len(weights) + def visit(index, loads): + nonlocal best + if len(loads) >= best: + return + if index == len(weights): + best = len(loads) + return + for b in range(len(loads)): + if loads[b] + weights[index] <= capacity: + changed = loads[:] + changed[b] += weights[index] + visit(index + 1, changed) + visit(index + 1, loads + [weights[index]]) + visit(0, []) + return best + + +class CategoryInstancesTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.models = instances.generate_suite(with_references=False) + + def family(self, name): + return [m for m in self.models if m["family"] == name] + + def test_prespecified_counts_dimensions_and_determinism(self): + self.assertEqual(len(self.models), 33) + self.assertEqual(self.models, instances.generate_suite(with_references=False)) + self.assertEqual(set(m["category"] for m in self.models), set(instances.CATEGORIES)) + self.assertEqual([m["n"] for m in self.family("facility_location")], [8, 28, 104, 300]) + self.assertEqual([m["n"] for m in self.family("bin_packing")], [15, 36, 65, 102]) + self.assertEqual([m["n"] for m in self.family("production")], [24, 48, 96, 192]) + for family, inputs, modelled in (("native_tsp", [4, 8, 12, 16], [8, 16, 24, 32]), + ("weighted_queens", [4, 8, 10, 12], [16, 32, 40, 48])): + models = self.family(family) + self.assertEqual([m["n"] for m in models], inputs) + self.assertEqual([m["modelled_variables"] for m in models], modelled) + self.assertTrue(all(m["dimensions"]["input_variables"] == m["n"] for m in models)) + self.assertEqual([(m["family"], m["n"]) for m in self.models if m["stress"]], + [("capacity_uncorrelated", 512)]) + + def test_prior_capacity_assignment_semantics_preserved(self): + prior = instances.scaling.generate_suite(with_references=False) + keyed = {m["id"]: m for m in self.models} + for old in prior: + model = keyed[old["id"]] + self.assertEqual(instances.semantic_hash(model), instances.scaling.semantic_hash(old)) + self.assertEqual(instances.encode_txt(model), instances.scaling.encode_txt(old)) + self.assertEqual(model["parameters"], old["parameters"]) + main_knapsack = [m for m in self.models if m["category"] == "knapsack" and not m["stress"]] + for size in (8, 32, 128, 384): + self.assertEqual({m["variant"] for m in main_knapsack if m["n"] == size}, + {"uncorrelated", "correlated"}) + + def test_prefixes_and_native_placeholder_not_reference(self): + for family in ("native_tsp", "weighted_queens"): + models = self.family(family) + master = models[-1]["data"] + for model in models: + n = model["n"] + self.assertEqual(model["data"], [row[:n] for row in master[:n]]) + tokens = instances.encode_txt(model).split() + self.assertEqual(tokens[:4], [family, str(n), "0", str(n)]) + self.assertEqual(list(map(int, tokens[4:4 + n * n])), [c for row in model["data"] for c in row]) + self.assertEqual(tokens[4 + n * n:], ["0"] * n) + mutated = copy.deepcopy(model) + mutated["reference"] = {"assignment": list(range(n)), "objective": -999999} + self.assertEqual(instances.encode_txt(model), instances.encode_txt(mutated)) + bins = self.family("bin_packing") + for model in bins: + self.assertEqual(model["parameters"]["weights"], bins[-1]["parameters"]["weights"][:model["tier_size"]]) + production = self.family("production") + for model in production: + count = model["tier_size"] + self.assertEqual(model["parameters"]["demands"], production[-1]["parameters"]["demands"][:count]) + self.assertEqual(model["parameters"]["production_costs"], production[-1]["parameters"]["production_costs"][:count]) + + def test_binary_txt_roundtrip_and_zero_start(self): + for model in self.models: + if model["kind"] != "binary": + continue + tokens = iter(instances.encode_txt(model).split()) + n, count = int(next(tokens)), int(next(tokens)) + costs = [int(next(tokens)) for _ in range(n)] + rows = [] + for _ in range(count): + b, width = int(next(tokens)), int(next(tokens)) + rows.append({"b": b, "a": [[int(next(tokens)), int(next(tokens))] for _ in range(width)]}) + self.assertEqual((n, costs, rows), (model["n"], model["c"], model["rows"])) + self.assertEqual(list(tokens), ["incumbent", "0"]) + + def test_bin_reference_against_unlabeled_partition_enumeration(self): + rng = random.Random(9923) + for n in range(1, 9): + for _ in range(10): + capacity = rng.randint(4, 12) + weights = [rng.randint(1, capacity) for _ in range(n)] + result = instances.bin_reference(weights, capacity, n) + self.assertEqual(result["objective"], brute_bins(weights, capacity)) + x = result["assignment"] + self.assertTrue(all(sum(x[j * n:(j + 1) * n]) == 1 for j in range(n))) + self.assertTrue(all(sum(weights[j] * x[j * n + b] for j in range(n)) <= capacity * x[n * n + b] + for b in range(n))) + self.assertEqual(sum(x[n * n:]), result["objective"]) + for args in (([], 1, 1), ([2], 1, 1), ([True], 2, 1), ([1] * 17, 4, 17)): + with self.assertRaises(ValueError): + instances.bin_reference(*args) + + def test_small_facility_and_production_domain_oracles(self): + facility = self.family("facility_location")[0] + p = facility["parameters"] + f, customers = p["facilities"], p["customers"] + best = None + for opened in itertools.product((0, 1), repeat=f): + for locations in itertools.product(range(f), repeat=customers): + point = list(opened) + [int(locations[i] == j) for i in range(customers) for j in range(f)] + valid = all(opened[j] for j in locations) + self.assertEqual(instances.validate_assignment(facility, point)["valid"], valid) + if valid: + value = sum(c * x for c, x in zip(p["opening_costs"], opened)) + sum(p["assignment_costs"][i][j] for i, j in enumerate(locations)) + best = value if best is None else min(best, value) + self.assertEqual(instances._reference(facility)["objective"], best) + production = self.family("production")[0] + p = production["parameters"] + best = None + for quantities in itertools.product(range(p["options"]), repeat=p["periods"]): + inventory, physical, valid = 0, 0, True + for t, quantity in enumerate(quantities): + inventory += quantity - p["demands"][t] + valid = valid and 0 <= inventory <= p["storage"] + physical += p["production_costs"][t][quantity] + p["holding_cost"] * inventory + valid = valid and inventory == 0 + point = [int(quantities[t] == q) for t in range(p["periods"]) for q in range(p["options"])] + self.assertEqual(instances.validate_assignment(production, point)["valid"], valid) + if valid: + value = physical - p["objective_constant"] + best = value if best is None else min(best, value) + self.assertEqual(instances._reference(production)["objective"], best) + + def test_small_native_oracles_against_permutations(self): + for family in ("native_tsp", "weighted_queens"): + model = self.family(family)[0] + n, best = model["n"], None + for point in itertools.permutations(range(n)): + if family == "native_tsp": + seen, current = set(), 0 + for _ in range(n): + seen.add(current) + current = point[current] + valid = len(seen) == n and current == 0 + else: + valid = all(abs(point[i] - point[j]) != j - i for i in range(n) for j in range(i + 1, n)) + self.assertEqual(instances.validate_assignment(model, list(point))["valid"], valid) + if valid: + value = sum(model["data"][i][j] for i, j in enumerate(point)) + best = value if best is None else min(best, value) + self.assertEqual(instances._reference(model)["objective"], best) + + def test_reference_trust_and_metadata_mutation(self): + for family in ("facility_location", "bin_packing", "production", "native_tsp", "weighted_queens"): + model = copy.deepcopy(self.family(family)[0]) + model["reference"] = instances._reference(model) + self.assertTrue(instances.verify_reference(model, recompute=True)["valid"]) + with patch.object(instances, "_reference", side_effect=AssertionError("oracle called during read")): + checked = instances.verify_reference(model) + self.assertTrue(checked["valid"]) + self.assertFalse(checked["optimality_recomputed"]) + bad = copy.deepcopy(model) + bad["modelled_variables"] += 1 + self.assertFalse(instances.verify_reference(bad)["valid"]) + bad = copy.deepcopy(model) + bad["reference"]["input_sha256"] = "0" * 64 + self.assertFalse(instances.verify_reference(bad)["valid"]) + self.assertFalse(instances.validate_assignment(model, [False] * model["n"])["valid"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/experiments/optimize/test_category_scaling.py b/experiments/optimize/test_category_scaling.py new file mode 100644 index 0000000000..5b1a9472dc --- /dev/null +++ b/experiments/optimize/test_category_scaling.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +"""Pure runner checks with original reference witnesses; no solver subprocesses.""" +import copy +import importlib.util +import json +from pathlib import Path +import shutil +import sys +import tempfile +import time +from types import SimpleNamespace +import unittest +from unittest import mock + +sys.dont_write_bytecode = True +PATH = Path(__file__).with_name('benchmark_category_scaling.py').resolve() +SPEC = importlib.util.spec_from_file_location('category_scaling_runner', PATH) +runner = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(runner) + + +class CategoryRunnerTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.temporary = tempfile.TemporaryDirectory() + cls.root = Path(cls.temporary.name) + cls.frozen = cls.root/'frozen' + cls.pin = runner.freeze(cls.frozen)['manifest_sha256'] + cls.common, cls.generator = runner.modules() + cls.manifest, cls.models, _ = runner.read_frozen( + cls.frozen, cls.pin, cls.common, cls.generator) + + @classmethod + def tearDownClass(cls): + cls.temporary.cleanup() + + def test_fixed_categories_shapes_and_alternating_slots(self): + units = self.manifest['records'] + self.assertEqual([(u['category'], u['variant'], u['input_variables']) for u in units], runner.PLANNED) + self.assertEqual(len(units), 33) + self.assertEqual(len({u['category'] for u in units}), 7) + self.assertEqual(self.manifest['protocol']['solver_seconds'], 10) + self.assertEqual(self.manifest['protocol']['process_seconds'], 11) + self.assertEqual(self.manifest['protocol']['whole_seconds'], 1500) + self.assertEqual(self.manifest['protocol']['expected_measured_runs'], 132) + slots = list(runner.planned_slots(self.manifest)) + self.assertEqual(len(slots), 132) + self.assertEqual([(c, r) for _, c, r in slots[:2]], [('before', 1), ('after', 1)]) + self.assertEqual([(c, r) for _, c, r in slots[66:68]], [('after', 2), ('before', 2)]) + tsp = [u for u in units if u['category']=='native_tsp'] + queens = [u for u in units if u['category']=='weighted_queens'] + self.assertEqual([(u['input_variables'], u['model_variables']) for u in tsp], + [(4, 8), (8, 16), (12, 24), (16, 32)]) + self.assertEqual([(u['input_variables'], u['model_variables']) for u in queens], + [(4, 16), (8, 32), (10, 40), (12, 48)]) + + def test_measured_preflight_does_not_recompute_optima(self): + original = self.generator.verify_reference + def cheap(model, **kwargs): + self.assertFalse(kwargs.get('recompute', False)) + result = original(model, **kwargs) + self.assertFalse(result['optimality_recomputed']) + return result + with mock.patch.object(self.generator, 'verify_reference', side_effect=cheap) as checked: + _, models, hashes = runner.read_frozen(self.frozen, self.pin, self.common, self.generator) + self.assertEqual(checked.call_count, 33) + self.assertEqual(len(models), 33) + self.assertEqual(len(hashes), 68) + + def test_frozen_hash_source_and_dimensions_fail_closed(self): + with self.assertRaisesRegex(ValueError, 'manifest hash'): + runner.read_frozen(self.frozen, '0'*64, self.common, self.generator) + changed = self.root/'changed' + shutil.copytree(self.frozen, changed) + path = changed/self.manifest['records'][0]['txt'] + path.write_text(path.read_text()+'\n') + with self.assertRaisesRegex(ValueError, 'model bytes'): + runner.read_frozen(changed, self.pin, self.common, self.generator) + with mock.patch.object(runner, 'source_hashes', return_value={}): + with self.assertRaisesRegex(ValueError, 'source changed'): + runner.read_frozen(self.frozen, self.pin, self.common, self.generator) + models = copy.deepcopy(list(self.models.values())) + next(m for m in models if m['kind']=='native_tsp')['modelled_variables'] = 4 + with self.assertRaisesRegex(ValueError, 'variable counts'): + runner.ordered_models(models) + + def observation_fixture(self, kind='binary'): + unit = next(u for u in self.manifest['records'] if u['kind']==kind) + model = self.models[unit['id']] + assignment = model['reference']['assignment'][:] + full = assignment[:] + if kind=='weighted_queens': + full += [v for i, x in enumerate(assignment) for v in (x+i, x-i)] + if kind!='binary': + full += [model['data'][i][x] for i, x in enumerate(assignment)] + raw = dict(schema_version=1, kind=kind, route='native', backend='Gecode native', + backend_version='fixture', guarantee='exact', start_submitted=False, + model_id=1, revision=1, model_columns=unit['model_variables'], + model_rows=unit['dimensions']['rows'], model_globals=unit['dimensions']['globals'], + status='optimal', has_solution=True, solution_validated=True, + assignment=assignment, full_values=full, objective=unit['objective'], + best_bound=unit['objective'], absolute_gap=0, relative_gap=0, + build_seconds=0.001, solve_seconds=10, driver_seconds=10.1, + nodes=None, expanded_nodes=None, budget_nodes=None, + peak_open_nodes=None, unresolved_regions=None) + return unit, model, raw + + def test_binary_and_native_original_witnesses_and_auxiliaries(self): + for kind in ('binary', 'native_tsp', 'weighted_queens'): + with self.subTest(kind=kind): + unit, model, raw = self.observation_fixture(kind) + checked = runner.checked_observation(raw, unit, model, self.common, self.generator) + self.assertTrue(checked['proved_within_limit']) + wrong = copy.deepcopy(raw) + wrong['full_values'][-1] += 1 + with self.assertRaises(ValueError): + runner.checked_observation(wrong, unit, model, self.common, self.generator) + wrong = copy.deepcopy(raw) + wrong['model_columns'] -= 1 + with self.assertRaisesRegex(ValueError, 'dimensions'): + runner.checked_observation(wrong, unit, model, self.common, self.generator) + + def test_exact_ten_second_boundary_and_censored_no_solution(self): + unit, model, raw = self.observation_fixture() + raw['solve_seconds'] = 10.000001 + result = runner.checked_observation(raw, unit, model, self.common, self.generator) + self.assertTrue(result['completed']) + self.assertFalse(result['proved_within_limit']) + raw.update(status='time_limit', has_solution=False, solution_validated=False, + assignment=[], full_values=[], objective=None, best_bound=None, + absolute_gap=None, relative_gap=None, solve_seconds=10) + result = runner.checked_observation(raw, unit, model, self.common, self.generator) + self.assertFalse(result['completed']) + self.assertFalse(result['proved_within_limit']) + + def records(self): + return [dict(runner.pending_record(unit, cohort, repetition), attempted=True, + proved_within_limit=True, status='optimal', solve_seconds=1, + external_seconds=1.01, objective=unit['objective'], best_bound=unit['objective']) + for unit, cohort, repetition in runner.planned_slots(self.manifest)] + + def test_knapsack_requires_every_variant_repeat_and_keeps_stress_separate(self): + records = self.records() + units = {u['id']: u for u in self.manifest['records']} + for record in records: + unit = units[record['case']] + if (unit['category']=='knapsack' and unit['variant']=='correlated' and + unit['tier']=='large' and record['cohort']=='before' and record['repetition']==2): + record.update(proved_within_limit=False, status='time_limit', solve_seconds=10) + summary = runner.summarize(records, self.manifest, {}, True, 1) + knapsack = summary['categories'][0] + self.assertEqual(knapsack['before']['largest_main_group_proved_model_variables'], 128) + self.assertEqual(knapsack['after']['largest_main_group_proved_model_variables'], 384) + self.assertEqual(knapsack['ratio_of_largest_main_group_proved_model_variables'], 3) + large = knapsack['main_groups'][-1] + self.assertEqual(large['variant_count'], 2) + self.assertEqual(large['before']['required_runs'], 4) + self.assertEqual(large['before']['proved'], 3) + self.assertFalse(large['before']['proved_all']) + for cohort in ('before', 'after'): + self.assertEqual(knapsack[cohort]['largest_any_sampled_group_proved_model_variables'], 512) + self.assertEqual(knapsack[cohort]['largest_any_sampled_group_variant_count'], 1) + self.assertTrue(knapsack[cohort]['largest_any_sampled_group_stress']) + case = next(c for c in summary['cases'] if c['category']=='knapsack' and + c['variant']=='correlated' and c['tier']=='large') + self.assertIsNone(case['median_paired_solve_seconds_ratio_after_before']) + self.assertEqual(case['before']['internal_seconds'], [1, 10]) + + def test_duplicate_repetitions_or_failed_integrity_cannot_prove_capacity(self): + records = self.records() + target = self.manifest['records'][-2]['id'] + for r in records: + if r['case']==target and r['cohort']=='before': + r['repetition'] = 1 + summary = runner.summarize(records, self.manifest, {}, True, 1) + case = next(c for c in summary['cases'] if c['id']==target) + self.assertFalse(case['before']['proved_all']) + invalid = runner.summarize(records, self.manifest, {}, False, 1) + for category in invalid['categories']: + self.assertIsNone(category['ratio_of_largest_main_group_proved_model_variables']) + self.assertIsNone(category['after']['largest_any_sampled_group_proved_model_variables']) + + def probe_fixture(self, name): + work = self.root/name + before, after = work/'before/lib', work/'after/lib' + before.mkdir(parents=True) + after.mkdir(parents=True) + for path, contents in ((before/'libgecodeoptimize.dylib', 'before'), + (after/'libgecodeoptimize.dylib', 'after')): + path.write_text(contents) + binary = work/'driver' + binary.write_text('not executed') + baseline = work/'before/manifest.json' + runner.write(baseline, dict( + source_head=self.common.BASELINE_SOURCE, compiled_product=self.common.BASELINE_COMPILED, + files=[dict(copy='lib/libgecodeoptimize.dylib', sha256=runner.sha(before/'libgecodeoptimize.dylib'))])) + args = SimpleNamespace(freeze_dir=self.frozen, manifest_sha256=self.pin, binary=binary, + before_libraries=[before], after_libraries=[after], + baseline_manifest=baseline, output_dir=work/'results') + _, _, raw = self.observation_fixture() + raw.update(solve_seconds=0.001, driver_seconds=0.003) + def outcome(cohort): + path = before if cohort=='before' else after + return dict(returncode=0, hard_timeout=False, output_limit=False, external_seconds=0.01, + stdout=json.dumps(raw).encode(), stderr=(str(path/'libgecodeoptimize.dylib')+'\n').encode()) + return args, outcome + + def test_failed_probe_retains_all_required_unattempted_slots(self): + args, outcome = self.probe_fixture('probe-test') + capture = mock.Mock(side_effect=[outcome('before'), dict( + returncode=2, hard_timeout=False, output_limit=False, external_seconds=0.01, + stdout=b'', stderr=b'fixture loader rejection')]) + real_load = runner.load_module + def load(name, path): + return SimpleNamespace(capture_command=capture) if name=='category_capture' else real_load(name, path) + with mock.patch.object(runner, 'load_module', side_effect=load), \ + mock.patch.object(runner.subprocess, 'check_output', return_value='fixture-head\n'): + self.assertEqual(runner.measure(args, time.monotonic()), 1) + self.assertEqual(capture.call_count, 2) + report = json.loads((args.output_dir/'report.json').read_text()) + self.assertFalse(report['comparison_valid']) + self.assertEqual([p['status'] for p in report['loader_probes']], ['validated', 'failed']) + self.assertEqual(len(report['records']), 132) + self.assertTrue(all(r['status']=='not_run_preflight' and not r['attempted'] for r in report['records'])) + self.assertEqual((args.output_dir/'provenance-after.stderr').read_bytes(), b'fixture loader rejection') + summary = json.loads((args.output_dir/'summary.json').read_text()) + self.assertEqual(summary['required_runs'], 132) + self.assertEqual(summary['recorded_runs'], 132) + self.assertTrue(all(not c['after']['proved_all'] for c in summary['cases'])) + + def test_whole_deadline_keeps_all_cases_without_launching_them(self): + args, outcome = self.probe_fixture('deadline-test') + clock = [0.0] + count = [0] + def capture(*args, **kwargs): + count[0] += 1 + result = outcome('before' if count[0]==1 else 'after') + if count[0]==2: + clock[0] = 1501.0 + return result + real_load = runner.load_module + def load(name, path): + return SimpleNamespace(capture_command=capture) if name=='category_capture' else real_load(name, path) + with mock.patch.object(runner, 'load_module', side_effect=load), \ + mock.patch.object(runner.subprocess, 'check_output', return_value='fixture-head\n'), \ + mock.patch.object(runner.time, 'monotonic', side_effect=lambda: clock[0]), \ + mock.patch('builtins.print'): + self.assertEqual(runner.measure(args, 0), 1) + self.assertEqual(count[0], 2) + report = json.loads((args.output_dir/'report.json').read_text()) + self.assertEqual(len(report['records']), 132) + self.assertTrue(all(r['status']=='not_run_whole_limit' and not r['attempted'] for r in report['records'])) + self.assertFalse(report['comparison_valid']) + + +if __name__=='__main__': + unittest.main() diff --git a/experiments/optimize/test_configured.py b/experiments/optimize/test_configured.py new file mode 100644 index 0000000000..714414f5d6 --- /dev/null +++ b/experiments/optimize/test_configured.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +"""Untimed runner checks: reject incomplete evidence and keep searches independent.""" +import copy +import importlib.util +import itertools +from pathlib import Path +import unittest + +SPEC = importlib.util.spec_from_file_location('configured_runner_tested', + Path(__file__).with_name('benchmark_configured.py')) +runner = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(runner) + + +def zeros(names, **extra): + return dict.fromkeys(names.split(), 0) | extra + + +def native_result(model): + feasible = [list(p) for p in itertools.product((0, 1), repeat=model['n']) + if runner.generator.validate_assignment(model, list(p))['valid']] + values = min(feasible, key=lambda p: sum(a*b for a, b in zip(model['c'], p))) + objective = sum(a*b for a, b in zip(model['c'], values)) + return dict(schema_version=1, kind='binary', route='native', guarantee='exact', + start_submitted=False, backend='Gecode native', backend_version='test-fixture', model_id=1, revision=3, + solve_seconds=0.02, backend_solve_seconds=0.01, build_seconds=0.01, driver_seconds=0.04, + model_columns=model['n'], model_rows=len(model['rows']), model_globals=0, + status='optimal', has_solution=True, solution_validated=True, assignment=values, + full_values=values[:], objective=objective, best_bound=objective, absolute_gap=0, relative_gap=0, + nodes=None, expanded_nodes=None, budget_nodes=None, peak_open_nodes=None, unresolved_regions=None, + algorithm_configuration=dict(entry_point='solve_native', search_order='native_bab', + checked_lp=False, lp_frequency=None, bound_tightening=False, bound_change_interval=None, + root_cover_cuts=False, binary_reliability=False, neighborhoods=False, + knapsack_dp_eligible_route=True, presolve=False, max_open_nodes=None, + cover_settings=None, branching_settings=None, neighborhood_settings=None), + relaxation=zeros('lp_calls valid_bounds rejected_bounds numerical_infeasibility_reports ' + 'certificate_evaluations conditional_checks variable_fixings variable_bound_tightenings lp_seconds', + root_cover=zeros('rounds augmentations cuts nonzeros work projected_coordinates unsupported_rows ' + 'oversized_rows separated_cuts duplicate_cuts arithmetic_rejections lp_calls valid_bounds ' + 'rejected_bounds numerical_infeasibility_reports lp_seconds', requested=False, completion='NotRequested')), + branching=zeros('decisions manual_splits fallback_decisions probe_status_calls completed_pairs ' + 'published_pairs finite_samples zero_gain_samples failed_directions reliable_candidates ' + 'probe_propagations budget_nodes work history_entries probe_lp_calls probe_lp_seconds', requested=False), + neighborhood=zeros('attempts eligible_variables source_entries coordinator_work status_attempts ' + 'completed_status_calls failed_nodes feasible_candidates accepted_improvements peak_local_spaces ' + 'peak_total_spaces budget_nodes elapsed_seconds', requested=False, completion='NotStarted', stop_reason=None)) + + +class EvidenceValidationTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.model = runner.generator.make('knapsack', 8, 'uncorrelated') + cls.good = native_result(cls.model) + + def test_checked_original_witness_is_a_pass(self): + result = runner.validate(copy.deepcopy(self.good), self.model, 'native') + self.assertTrue(result['passed']) + self.assertTrue(result['primal_checked']) + self.assertFalse(result['independent_optimality_verified']) + + def test_no_partial_or_fabricated_protocol(self): + mutations = [ + ('schema_version', True), ('backend', 'Gecode native + invented'), + ('backend_version', ''), ('start_submitted', True), ('revision', True), + ('status', 'unsupported'), ('has_solution', 1), ('solution_validated', False), + ('assignment', [0]*8), ('full_values', []), ('best_bound', self.good['objective']+1), + ('relative_gap', 1), ('model_columns', True), ('solve_seconds', float('nan')), + ('backend_solve_seconds', 1), ('relaxation', {}), ('branching', {}), ('neighborhood', {}), + ] + for key, value in mutations: + with self.subTest(key=key): + raw = copy.deepcopy(self.good) + raw[key] = value + with self.assertRaises((ValueError, TypeError, KeyError)): + runner.validate(raw, self.model, 'native') + for key in self.good: + with self.subTest(missing=key): + raw = copy.deepcopy(self.good) + del raw[key] + with self.assertRaises((ValueError, TypeError, KeyError)): + runner.validate(raw, self.model, 'native') + + def test_flags_do_not_replace_mechanism_observations(self): + paths = [('relaxation', 'lp_calls'), ('branching', 'probe_status_calls'), + ('neighborhood', 'status_attempts')] + for group, counter in paths: + for value in (None, -1, 1.5, True, 1): + with self.subTest(group=group, value=value): + raw = copy.deepcopy(self.good) + raw[group][counter] = value + with self.assertRaises(ValueError): + runner.validate(raw, self.model, 'native') + for key, value in [('presolve', True), ('checked_lp', 0), ('entry_point', 'solve_native_lp')]: + with self.subTest(configuration=key): + raw = copy.deepcopy(self.good) + raw['algorithm_configuration'][key] = value + with self.assertRaises(ValueError): + runner.validate(raw, self.model, 'native') + + def test_timeout_and_late_optimum_remain_failures(self): + raw = copy.deepcopy(self.good) + raw.update(status='time_limit', solve_seconds=10, driver_seconds=10.02) + self.assertFalse(runner.validate(raw, self.model, 'native')['passed']) + raw.update(status='optimal', solve_seconds=10.001) + self.assertFalse(runner.validate(raw, self.model, 'native')['passed']) + + +class ObservationAndPolicyTest(unittest.TestCase): + def setUp(self): + self.search = runner.ConfiguredSearch.__new__(runner.ConfiguredSearch) + self.search.records = [] + self.search.pilot = False + self.search.policy = {'families': {family: {'route': 'native'} for family in runner.legacy.LIMITS}} + self.search.policy['families']['knapsack']['outside_dp_route'] = 'lp-cuts' + self.search.policy['families']['assignment']['route'] = 'lp-root' + + @staticmethod + def row(variant='uncorrelated', repetition=1, **updates): + return dict(category='knapsack', size=8, cohort='after', variant=variant, repetition=repetition, + probe=False, passed=True, status='optimal', primal_checked=True, + backend_reported_optimal=True, solve_seconds=0.1) | updates + + def test_variant_and_repetition_completeness(self): + rows = [self.row(v, r) for v in ('uncorrelated', 'correlated') for r in (1, 2)] + self.search.records = rows + self.assertTrue(self.search.passed('knapsack', 8, 'after', confirmed=True)) + for index in range(4): + self.search.records = rows[:index]+rows[index+1:] + self.assertFalse(self.search.passed('knapsack', 8, 'after', confirmed=True)) + self.search.records = [self.row(), self.row()] + self.assertFalse(self.search.passed('knapsack', 8, 'after')) + self.search.records = [self.row(v, 1) for v in ('uncorrelated', 'correlated')]*2 + self.assertFalse(self.search.passed('knapsack', 8, 'after', confirmed=True)) + self.search.records = [self.row(v, 2) for v in ('uncorrelated', 'correlated')] + self.assertFalse(self.search.passed('knapsack', 8, 'after')) + + def test_pending_partial_failed_and_other_cohort_do_not_count(self): + good = [self.row(v) for v in ('uncorrelated', 'correlated')] + self.search.records = good + self.assertTrue(self.search.passed('knapsack', 8, 'after')) + for updates in ({'status': 'pending'}, {'status': 'error'}, {'passed': False}, + {'primal_checked': None}, {'backend_reported_optimal': None}, + {'solve_seconds': None}, {'solve_seconds': 10.01}, {'cohort': 'before'}, {'probe': True}): + with self.subTest(updates=updates): + self.search.records = [good[0], good[1] | updates] + self.assertFalse(self.search.passed('knapsack', 8, 'after')) + self.search.records = good + [self.row('correlated', 2, passed=False, status='time_limit')] + self.assertFalse(self.search.passed('knapsack', 8, 'after')) + + def test_frozen_family_dispatch_and_dp_boundary(self): + eligible = runner.generator.make('knapsack', 407, 'uncorrelated') + outside = runner.generator.make('knapsack', 408, 'uncorrelated') + self.assertEqual(self.search.route('knapsack', eligible, 'after'), 'native') + self.assertEqual(self.search.route('knapsack', outside, 'after'), 'lp-cuts') + self.assertEqual(self.search.route('knapsack', outside, 'before'), 'native') + assignment = runner.generator.make('assignment', 3) + self.assertEqual(self.search.route('assignment', assignment, 'after'), 'lp-root') + self.assertEqual(self.search.route('assignment', assignment, 'before'), 'native') + self.search.pilot = True + self.assertEqual(self.search.route('assignment', assignment, 'after'), 'native') + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/experiments/optimize/test_configured_benchmark.py b/experiments/optimize/test_configured_benchmark.py new file mode 100644 index 0000000000..e0f87fac96 --- /dev/null +++ b/experiments/optimize/test_configured_benchmark.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Focused driver integration checks, not a timed performance comparison. + +Build first with build_configured_benchmark.py. Tiny cover/rank fixtures mirror +the existing native_lp/native_branching tests; the independent exhaustive +oracle below also checks every returned original witness and global optimum. +""" +import itertools +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[2] +BINARY = Path(os.environ.get('CONFIGURED_BENCHMARK_BINARY', + ROOT/'build/configured-bench/optimize-configured-benchmark')) +ROUTES = ('native', 'lp-root', 'lp-cuts', 'lp-updated', 'dfs-reliability', + 'lp-reliability', 'lp-reliability-neighborhood') + + +class ConfiguredBenchmarkTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + if not BINARY.is_file(): + raise RuntimeError('Build the configured benchmark driver first') + + def invoke(self, text, route, kind='binary', seconds='1', success=True): + with tempfile.TemporaryDirectory(prefix='configured-benchmark-test-') as tmp: + source = Path(tmp)/'input.txt' + source.write_text(text) + run = subprocess.run([str(BINARY), '--input', str(source), '--kind', kind, + '--route', route, '--seconds', seconds], + capture_output=True, text=True, timeout=3) + if not success: + self.assertEqual(run.returncode, 2, run.stderr) + self.assertEqual(run.stdout, '') + return + self.assertEqual(run.returncode, 0, run.stderr) + result = json.loads(run.stdout) + self.assertEqual(result['route'], route) + self.assertEqual(result['kind'], kind) + self.assertEqual(result['status'], 'optimal', result['message']) + self.assertTrue(result['has_solution']) + self.assertTrue(result['solution_validated']) + self.assertFalse(result['start_submitted']) + self.assertEqual(result['guarantee'], 'exact') + self.assertEqual(result['objective'], result['best_bound']) + self.assertEqual(result['absolute_gap'], 0) + self.assertEqual(result['relative_gap'], 0) + self.assertGreaterEqual(result['solve_seconds'], result['backend_solve_seconds']) + self.assertGreaterEqual(result['driver_seconds'], result['solve_seconds']) + config = result['algorithm_configuration'] + lp = route.startswith('lp-') + reliability = 'reliability' in route + covers = lp and route != 'lp-root' + neighborhood = route.endswith('-neighborhood') + self.assertEqual(config['checked_lp'], lp) + self.assertEqual(config['root_cover_cuts'], covers) + self.assertEqual(config['binary_reliability'], reliability) + self.assertEqual(config['neighborhoods'], neighborhood) + self.assertEqual(config['knapsack_dp_eligible_route'], not lp) + self.assertFalse(config['presolve']) + self.assertEqual(result['relaxation']['root_cover']['requested'], covers) + self.assertEqual(result['branching']['requested'], reliability) + self.assertEqual(result['neighborhood']['requested'], neighborhood) + expected_backend = 'Gecode native' + if reliability: + expected_backend += ' frontier' + if lp: + expected_backend += ' + checked LP' + self.assertEqual(config['bound_change_interval'], + 1 if route in ('lp-root', 'lp-cuts') else 4) + if neighborhood: + expected_backend += ' + BinaryHamming' + self.assertEqual(result['backend'], expected_backend) + if reliability: + self.assertEqual(result['budget_nodes'], result['nodes'] + + result['branching']['probe_status_calls'] + + result['neighborhood']['status_attempts']) + self.assertLessEqual(result['peak_open_nodes'], config['max_open_nodes']) + else: + self.assertIsNone(result['nodes']) + if neighborhood: + self.assertEqual(config['neighborhood_settings']['radius'], 4) + self.assertEqual(config['neighborhood_settings']['time_limit_seconds'], 0.05) + self.assertLessEqual(result['neighborhood']['attempts'], 1) + if not lp: + self.assertEqual(result['relaxation']['lp_calls'], 0) + self.assertLessEqual(result['branching']['probe_lp_calls'], result['relaxation']['lp_calls']) + self.assertLessEqual(result['relaxation']['root_cover']['lp_calls'], result['relaxation']['lp_calls']) + self.assertEqual(len(result['full_values']), result['model_columns']) + return result + + def test_cover_and_reliability_routes(self): + # Existing root-cover fixture: min -2x-2y subject to 3x+3y <= 5. + # Stored all-ones legacy start is deliberately infeasible and discarded. + cover = '2 1\n-2 -2\n-5 2 0 -3 1 -3\nincumbent 1\n1 1\n' + feasible = [p for p in itertools.product((0, 1), repeat=2) if 3*sum(p) <= 5] + optimum = min(-2*sum(p) for p in feasible) + # Existing unconstrained rank fixture provokes real reliability probes. + rank = '3 0\n1 4 2\nincumbent 1\n1 1 1\n' + for route in ROUTES: + with self.subTest(route=route, model='cover'): + result = self.invoke(cover, route) + self.assertIn(tuple(result['assignment']), feasible) + self.assertEqual(result['objective'], optimum) + self.assertEqual(result['objective'], -2*sum(result['assignment'])) + if route.startswith('lp-'): + self.assertGreater(result['relaxation']['lp_calls'], 0) + if route.startswith('lp-') and route != 'lp-root': + self.assertGreater(result['relaxation']['root_cover']['cuts'], 0) + with self.subTest(route=route, model='rank'): + result = self.invoke(rank, route) + self.assertEqual(result['assignment'], [0, 0, 0]) + self.assertEqual(result['objective'], 0) + if route == 'dfs-reliability': + self.assertGreater(result['branching']['probe_status_calls'], 0) + self.assertGreater(result['branching']['manual_splits'], 0) + + def test_global_witnesses(self): + for kind, n in (('native_tsp', 3), ('weighted_queens', 4)): + costs = [[(i*7+j*3+i*j) % 13 + 1 for j in range(n)] for i in range(n)] + text = f'{kind} {n} 0 {n}\n' + ' '.join(map(str, sum(costs, []))) + text += '\n' + ' '.join(['0']*n) + '\n' + feasible = [] + for p in itertools.permutations(range(n)): + if kind == 'native_tsp': + seen, node = set(), 0 + for _ in range(n): + seen.add(node) + node = p[node] + valid = len(seen) == n and node == 0 + else: + valid = len({p[i]+i for i in range(n)}) == n and len({p[i]-i for i in range(n)}) == n + if valid: + feasible.append(p) + cost = lambda p: sum(costs[i][int(p[i])] for i in range(n)) + optimum = min(map(cost, feasible)) + for route in ROUTES: + with self.subTest(kind=kind, route=route): + result = self.invoke(text, route, kind) + self.assertIn(tuple(result['assignment']), feasible) + self.assertEqual(result['objective'], optimum) + self.assertEqual(result['objective'], cost(result['assignment'])) + + def test_reject_invalid_options_and_inputs(self): + valid = '2 1\n-2 -2\n-5 2 0 -3 1 -3\nincumbent 0\n' + for seconds in ('0', '-1', '10.01', 'nan', 'inf', '1junk'): + with self.subTest(seconds=seconds): + self.invoke(valid, 'native', seconds=seconds, success=False) + self.invoke(valid, 'everything', success=False) + self.invoke(valid, 'native', kind='unsupported', success=False) + self.invoke(valid + 'trailing\n', 'native', success=False) + self.invoke(valid.replace('0 -3 1 -3', '1 -3 0 -3'), 'native', success=False) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/experiments/optimize/test_fast_regression.py b/experiments/optimize/test_fast_regression.py new file mode 100644 index 0000000000..7b97fd4de2 --- /dev/null +++ b/experiments/optimize/test_fast_regression.py @@ -0,0 +1,307 @@ +"""Runner correctness/failure-path tests; no solver timing claims.""" +import importlib.util +import json +import math +import os +from pathlib import Path +import signal +import subprocess +import sys +import tempfile +import time +from types import SimpleNamespace +import unittest +from unittest import mock + +SPEC = importlib.util.spec_from_file_location("fast_regression", Path(__file__).with_name("fast_regression.py")) +F = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(F) + + +def payload(**updates): + data = {"case": "lp_min_offset", "status": "optimal", "checks": 4, + "backend": "HiGHS", "backend_version": "1", "guarantee": "numerical", + "elapsed_seconds": 0.001, "objectives": [4]} + data.update(updates) + return {"returncode": 0, "stdout": json.dumps(data), "stderr": ""} + + +class ProtocolTests(unittest.TestCase): + def test_windows_gate_remains_explicitly_unsupported(self): + self.assertIsNone(F.platform_support_error("posix")) + self.assertIn("Unsupported", F.platform_support_error("nt")) + self.assertFalse(F.containment_module().WINDOWS_RUNTIME_VERIFIED) + self.assertIn("Unsupported", F.platform_support_error("unknown")) + + def test_watchdog_receives_windows_owner_before_creation(self): + budget = F.Budget(2) + calls = [] + class Process: + job, returncode = 1, 0 + def start(self, *args): + self_test.assertIs(budget.containment, self) + calls.append("start") + def poll(self): + return 0 + def cleanup(self, timeout): + self_test.assertGreaterEqual(timeout, 0) + self_test.assertLessEqual(timeout, .2) + calls.append("cleanup") + self.job = None + self_test = self + with tempfile.TemporaryDirectory() as directory: + with mock.patch.object(F, "os", SimpleNamespace(name="nt", fstat=os.fstat)), \ + mock.patch.object(F, "containment_module", return_value=SimpleNamespace(WindowsJobProcess=Process)): + result = F.run_command(["ignored"], budget, 1, directory) + self.assertNotIn("error", result) + self.assertEqual(calls, ["start", "cleanup"]) + self.assertIsNone(budget.containment) + + def test_failed_windows_cleanup_retains_watchdog_owner_and_blocks_next_launch(self): + budget = F.Budget(2) + class Process: + job, returncode = 1, 0 + def start(self, *args): + pass + def poll(self): + return 0 + def cleanup(self, timeout): + raise OSError("job handle could not close") + def terminate(self): + calls.append("terminate") + calls = [] + with tempfile.TemporaryDirectory() as directory: + with mock.patch.object(F, "os", SimpleNamespace(name="nt", fstat=os.fstat)), \ + mock.patch.object(F, "containment_module", return_value=SimpleNamespace(WindowsJobProcess=Process)): + result = F.run_command(["ignored"], budget, 1, directory) + self.assertIn("cleanup failed", result["error"]) + self.assertIsNotNone(budget.containment) + budget.kill_group() + with self.assertRaisesRegex(F.Failure, "refusing another launch"): + F.run_command(["ignored"], budget, 1, directory) + self.assertEqual(calls, ["terminate"]) + + def test_required_native_case_exact_and_positive(self): + name = F.NATIVE_CASES[0][1] + for text in ("", name, name+" -", name+" +\nother +", name+" +\n"+name+" +"): + with self.assertRaises(F.Failure): + F.validate_output("cp_distinct", {"returncode": 0, "stdout": text, "stderr": ""}, name) + self.assertEqual(F.validate_output("cp_distinct", {"returncode": 0, "stdout": name+" +\n", "stderr": ""}, name)["checks"], 1) + + def test_nonfinite_bad_status_missing_checks_and_wrong_oracle(self): + for changes in ({"objectives": [math.nan]}, {"objectives": [math.inf]}, {"elapsed_seconds": math.inf}, + {"objectives": []}, {"objectives": [5]}, {"case": "other"}, {"checks": 0}, + {"checks": True}, {"status": "time_limit"}, {"backend": ""}, {"backend": "Gecode native"}, + {"guarantee": "exact"}, {"elapsed_seconds": -1}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("lp_min_offset", payload(**changes)) + self.assertEqual(F.validate_output("lp_min_offset", payload())["objectives"], [4]) + + def test_required_new_cases_and_native_provenance(self): + self.assertIn("lp_evidence", F.REQUIRED) + evidence = dict(case="lp_evidence", status="evidence_checked", objectives=[]) + self.assertEqual(F.validate_output("lp_evidence", payload(**evidence))["status"], "evidence_checked") + for changes in ({"backend": "Gecode native"}, {"guarantee": "exact"}, + {"status": "optimal"}, {"objectives": [-2, 1]}, {"checks": 0}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("lp_evidence", payload(**(evidence | changes))) + regular = dict(case="native_regular", backend="Gecode native", guarantee="exact", objectives=[-3, 1]) + self.assertIn("native_regular", F.REQUIRED) + self.assertIn("scenario_batches", F.REQUIRED) + self.assertEqual(F.validate_output("native_regular", payload(**regular))["objectives"], [-3, 1]) + for changes in ({"backend": "HiGHS"}, {"guarantee": "numerical"}, {"objectives": [-3, 3]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("native_regular", payload(**(regular | changes))) + scenario = dict(case="scenario_batches", objectives=[5, 9, -11, 7]) + self.assertEqual(F.validate_output("scenario_batches", payload(**scenario))["objectives"], [5, 9, -11, 7]) + for changes in ({"objectives": [5, 9, -11]}, {"objectives": [5, 9, -7, 7]}, {"status": "time_limit"}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("scenario_batches", payload(**(scenario | changes))) + for case in ("lp_observations", "session_reoptimization", "diagnostics_groups", "native_exact_reified", + "native_globals", "c_api_ownership", "feasibility_repair", "native_checked_lp", "solution_pool", "integer_presolve", "native_frontier_bounds", "convex_quadratic", "native_root_covers", "native_binary_branching", "native_complete_start"): + self.assertIn(case, F.REQUIRED) + self.assertEqual(F.OPTIMIZE_CASES["native_exact_reified"][1], [-11, 12]) + observed = dict(case="lp_observations", backend="HiGHS", guarantee="numerical", objectives=[15, 19]) + self.assertEqual(F.validate_output("lp_observations", payload(**observed))["objectives"], [15, 19]) + for changes in ({"backend": "Gecode native"}, {"guarantee": "exact"}, {"objectives": [15, 18]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("lp_observations", payload(**(observed | changes))) + for name, backend, guarantee, values in ( + ("convex_quadratic", "HiGHS QP", "numerical", [3.5, 2.5]), + ("native_root_covers", "Gecode native + checked LP", "exact", [15, 19]), + ("native_binary_branching", "Gecode native frontier", "exact", [-17, 17]), + ("native_complete_start", "Gecode native", "exact", [-4, 7]), + ): + good = dict(case=name, backend=backend, guarantee=guarantee, objectives=values) + self.assertEqual(F.validate_output(name, payload(**good))["objectives"], values) + for changes in ({"backend": "HiGHS"}, {"guarantee": "certified"}, {"objectives": values[:-1]}): + with self.subTest(case=name, changes=changes), self.assertRaises(F.Failure): + F.validate_output(name, payload(**(good | changes))) + good = dict(case="native_exact_reified", backend="Gecode native", guarantee="exact", objectives=[-11, 12]) + self.assertEqual(F.validate_output("native_exact_reified", payload(**good))["backend"], "Gecode native") + for changes in ({"backend": "HiGHS"}, {"guarantee": "numerical"}, {"objectives": [-11+1e-8, 12]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("native_exact_reified", payload(**(good | changes))) + self.assertEqual(F.validate_output("diagnostics_groups", payload(case="diagnostics_groups", status="irreducible", objectives=[]))["status"], "irreducible") + globals_payload = dict(case="native_globals", backend="Gecode native", guarantee="exact", objectives=[7, 30]) + self.assertEqual(F.validate_output("native_globals", payload(**globals_payload))["objectives"], [7, 30]) + for changes in ({"backend": "HiGHS"}, {"objectives": [7+1e-8, 30]}, {"guarantee": "numerical"}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("native_globals", payload(**(globals_payload | changes))) + hybrid = dict(case="native_checked_lp", backend="Gecode native + checked LP", guarantee="exact", objectives=[13, 26]) + self.assertEqual(F.OPTIMIZE_CASES["native_checked_lp"][1], [13, 26]) + self.assertEqual(F.validate_output("native_checked_lp", payload(**hybrid))["objectives"], [13, 26]) + for changes in ({"backend": "HiGHS"}, {"backend": "Gecode native"}, {"guarantee": "numerical"}, {"objectives": [13+1e-8, 26]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("native_checked_lp", payload(**(hybrid | changes))) + self.assertEqual(F.validate_output("solution_pool", payload(case="solution_pool", objectives=[1, 2, 3]))["objectives"], [1, 2, 3]) + self.assertEqual(F.validate_output("integer_presolve", payload(case="integer_presolve", backend="Gecode native", guarantee="exact", objectives=[3, 7]))["objectives"], [3, 7]) + frontier = dict(case="native_frontier_bounds", backend="Gecode native frontier", guarantee="exact", objectives=[-17, -15, -17, 17, 15, 17]) + self.assertEqual(F.validate_output("native_frontier_bounds", payload(**frontier))["objectives"], frontier["objectives"]) + for changes in ({"backend": "Gecode native"}, {"guarantee": "numerical"}, {"objectives": [-17, -15, -15, 17, 15, 15]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("native_frontier_bounds", payload(**(frontier | changes))) + for changes in ({"backend": "HiGHS"}, {"guarantee": "numerical"}, {"objectives": [3+1e-8, 7]}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("integer_presolve", payload(**(dict(case="integer_presolve", backend="Gecode native", guarantee="exact", objectives=[3, 7]) | changes))) + for changes in ({"objectives": [1, 3, 2]}, {"objectives": [1, 2]}, {"status": "solution_limit"}): + with self.subTest(changes=changes), self.assertRaises(F.Failure): + F.validate_output("solution_pool", payload(**(dict(case="solution_pool", objectives=[1, 2, 3]) | changes))) + + def test_nonzero_exit_stderr_and_malformed_output_fail(self): + for patch in ({"returncode": 7}, {"stderr": "warning"}, {"stdout": "not JSON"}, + {"stdout": payload()["stdout"]+payload()["stdout"]}, {"error": "timeout"}): + result = payload(); result.update(patch) + with self.assertRaises(F.Failure): + F.validate_output("lp_min_offset", result) + + +@unittest.skipUnless(os.name == "posix", "POSIX process group runner") +class ProcessTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory(prefix="fast-runner-test-") + self.directory = Path(self.temp.name) + + def tearDown(self): + self.temp.cleanup() + + def command(self, source, seconds=1): + return F.run_command([sys.executable, "-c", source], F.Budget(2), seconds, self.directory) + + def test_deadline_and_stderr_are_captured(self): + started = time.monotonic() + result = self.command("import time; time.sleep(10)", 0.08) + self.assertIn("deadline", result["error"]) + self.assertLess(time.monotonic()-started, 1) + result = self.command("import sys; print('diagnostic', file=sys.stderr); sys.exit(3)") + self.assertEqual(result["returncode"], 3) + self.assertIn("diagnostic", result["stderr"]) + + def test_missing_executable_and_output_flood(self): + result = F.run_command([str(self.directory/"missing")], F.Budget(2), 1, self.directory) + self.assertIn("error", result) + result = self.command("import os; os.write(1,b'x'*200000)") + self.assertIn("output limit", result["error"]) + self.assertLessEqual(len(result["stdout"]), F.MAX_OUTPUT) + + def test_descendants_killed_even_after_parent_success(self): + marker = self.directory/"escaped" + child = "import time,pathlib; time.sleep(.3); pathlib.Path("+repr(str(marker))+").write_text('escaped')" + source = "import subprocess,sys; subprocess.Popen([sys.executable,'-c',"+repr(child)+"]); print('parent done')" + result = self.command(source) + self.assertEqual(result["returncode"], 0) + time.sleep(0.4) + self.assertFalse(marker.exists(), "descendant survived completed parent cleanup") + + def test_exhausted_outer_budget_does_not_launch(self): + marker = self.directory/"launched" + with self.assertRaises(F.Failure): + F.run_command([sys.executable, "-c", "open("+repr(str(marker))+",'w').close()"], F.Budget(1, time.monotonic()-2), 1, self.directory) + self.assertFalse(marker.exists()) + + def test_whole_command_missing_required_cases_fails(self): + source = Path(F.__file__) + result = subprocess.run([sys.executable, str(source), "--native-binary", "/usr/bin/true", + "--optimize-binary", "/usr/bin/true", "--budget-seconds", "3", "--case-seconds", "1"], + capture_output=True, text=True, timeout=4) + self.assertNotEqual(result.returncode, 0) + report = json.loads(result.stdout) + self.assertFalse(report["passed"]) + self.assertEqual([c["case"] for c in report["cases"]], F.REQUIRED) + self.assertTrue(all(c["correctness"] != "pass" for c in report["cases"])) + self.assertLess(report["elapsed_seconds"], 3) + + def test_whole_command_rejects_nonfinite_budget(self): + result = subprocess.run([sys.executable, F.__file__, "--native-binary", "/usr/bin/true", "--optimize-binary", "/usr/bin/true", + "--budget-seconds", "nan"], capture_output=True, text=True, timeout=2) + self.assertNotEqual(result.returncode, 0) + self.assertIn("finite", result.stderr) + + def test_whole_deadline_marks_remaining_cases_and_preserves_output(self): + sleeper = self.directory/"sleeper" + sleeper.write_text("#!"+sys.executable+"\nimport time\ntime.sleep(10)\n") + sleeper.chmod(0o700) + started = time.monotonic() + result = subprocess.run([sys.executable, F.__file__, "--native-binary", str(sleeper), "--optimize-binary", str(sleeper), + "--budget-seconds", "1", "--case-seconds", "1"], capture_output=True, text=True, timeout=2) + self.assertNotEqual(result.returncode, 0) + self.assertLess(time.monotonic()-started, 1.5) + report = json.loads(result.stdout) + self.assertFalse(report["passed"]) + self.assertEqual(len(report["cases"]), len(F.REQUIRED)) + self.assertTrue(any(case["correctness"] == "not_run" for case in report["cases"])) + target = self.directory/"old.json" + target.write_text("untouched") + result = subprocess.run([sys.executable, F.__file__, "--native-binary", "/usr/bin/true", "--optimize-binary", "/usr/bin/true", + "--output", str(target)], capture_output=True, text=True, timeout=2) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(target.read_text(), "untouched") + + +@unittest.skipUnless(os.name == "nt", "requires real Windows runner containment") +class WindowsRunnerTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory(prefix="windows-fast-runner-") + self.directory = Path(self.temp.name) + + def tearDown(self): + self.temp.cleanup() + + def command(self, source, seconds=2): + return F.run_command([sys.executable, "-c", source], F.Budget(3), seconds, self.directory) + + def test_deadline_stderr_exit_and_output_limit(self): + started = time.monotonic() + result = self.command("import time; time.sleep(10)", .15) + self.assertIn("deadline", result["error"]) + self.assertLess(time.monotonic()-started, 1.5) + result = self.command("import sys; print('diagnostic',file=sys.stderr); sys.exit(7)") + self.assertEqual(result["returncode"], 7) + self.assertIn("diagnostic", result["stderr"]) + result = self.command("import os; os.write(1,b'x'*200000)") + self.assertIn("output limit", result["error"]) + self.assertLessEqual(len(result["stdout"]), F.MAX_OUTPUT) + + def test_missing_binary_and_expired_budget_fail(self): + result = F.run_command([str(self.directory/"missing.exe")], F.Budget(2), 1, self.directory) + self.assertIn("error", result) + with self.assertRaisesRegex(F.Failure, "budget exhausted"): + F.run_command([sys.executable], F.Budget(1, time.monotonic()-2), 1, self.directory) + + def test_production_command_fails_closed_without_launch_or_overwrite(self): + target = self.directory/"report.json" + target.write_text("untouched") + result = subprocess.run([sys.executable, F.__file__, "--native-binary", sys.executable, + "--optimize-binary", sys.executable, "--output", str(target)], + capture_output=True, text=True, timeout=3) + self.assertEqual(result.returncode, 1, result.stderr) + report = json.loads(result.stdout) + self.assertFalse(report["passed"]) + self.assertIn("Unsupported", report["error"]) + self.assertEqual([case["case"] for case in report["cases"]], F.REQUIRED) + self.assertTrue(all(case["correctness"] == "not_run" for case in report["cases"])) + self.assertEqual(target.read_text(), "untouched") + + +if __name__ == "__main__": + unittest.main() diff --git a/experiments/optimize/test_final_instances.py b/experiments/optimize/test_final_instances.py new file mode 100644 index 0000000000..2e8452ab75 --- /dev/null +++ b/experiments/optimize/test_final_instances.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Compatibility/prefix checks and independent feasible witnesses; no solves.""" +import copy +import unittest +import final_instances as generator + + +class FinalInstances(unittest.TestCase): + def test_all_previous_inputs_unchanged(self): + for family, (low, high) in generator.legacy.BOUNDS.items(): + for variant in (('uncorrelated', 'correlated') if family == 'knapsack' else ('single',)): + for size in range(low, high + 1): + old = generator.legacy.make(family, size, variant) + new = generator.make(family, size, variant) + self.assertEqual(old, new) + self.assertEqual(generator.legacy.encode_txt(old), generator.encode_txt(new)) + + def test_extension_prefixes(self): + for family, (_, high) in generator.legacy.BOUNDS.items(): + for variant in (('uncorrelated', 'correlated') if family == 'knapsack' else ('single',)): + a, b, c = (generator.make(family, n, variant) for n in (high, high + 1, high + 2)) + for small, large in ((a, b), (b, c)): + p, q = small['parameters'], large['parameters'] + if family == 'knapsack': + self.assertEqual(p['weights'][0], q['weights'][0][:small['n']]) + self.assertEqual(p['profits'], q['profits'][:small['n']]) + elif family == 'assignment': + n = p['size']; self.assertEqual(p['costs'], [r[:n] for r in q['costs'][:n]]) + elif family == 'facility_location': + n = p['facilities']; self.assertEqual(p['opening_costs'], q['opening_costs'][:n]) + self.assertEqual(p['assignment_costs'], [r[:n] for r in q['assignment_costs'][:2*n]]) + elif family == 'bin_packing': + self.assertEqual(p['weights'], q['weights'][:p['items']]) + elif family == 'production': + n = p['periods']; self.assertEqual(p['demands'], q['demands'][:n]) + self.assertEqual(p['production_costs'], q['production_costs'][:n]) + self.assertEqual(p['storage'], q['storage']); self.assertEqual(p['holding_cost'], q['holding_cost']) + else: + n = p['size']; self.assertEqual(small['data'], [r[:n] for r in large['data'][:n]]) + self.assertEqual(c, generator.make(family, high + 2, variant)) + + def test_independent_larger_witnesses(self): + for family in ('knapsack', 'assignment', 'facility_location', 'bin_packing', 'production'): + high = generator.legacy.BOUNDS[family][1] + for variant in (('uncorrelated', 'correlated') if family == 'knapsack' else ('single',)): + model = generator.make(family, high + 3, variant) + p = model['parameters']; x = [0] * model['n'] + if family == 'assignment': + for i in range(p['size']): x[i*p['size'] + i] = 1 + elif family == 'facility_location': + x[:p['facilities']] = [1] * p['facilities'] + for i in range(p['customers']): x[p['facilities'] + i*p['facilities']] = 1 + elif family == 'bin_packing': + loads = [] + for i in sorted(range(p['items']), key=lambda i: -p['weights'][i]): + b = next((b for b, load in enumerate(loads) if load+p['weights'][i] <= p['capacity']), len(loads)) + if b == len(loads): loads.append(0) + loads[b] += p['weights'][i]; x[i*p['bins'] + b] = 1 + self.assertLessEqual(len(loads), p['bins']) + for b in range(len(loads)): x[p['items']*p['bins'] + b] = 1 + elif family == 'production': + for t, demand in enumerate(p['demands']): x[t*8 + demand] = 1 + expected = sum(a*b for a, b in zip(model['c'], x)) + self.assertTrue(all(sum(value*x[j] for j, value in row['a']) >= row['b'] for row in model['rows'])) + checked = generator.validate_assignment(model, x) + self.assertTrue(checked['valid'], checked) + self.assertEqual(checked['objective'], expected) + damaged = copy.deepcopy(model); damaged['c'][0] += 1 + self.assertFalse(generator.validate_assignment(damaged, x)['valid']) + + +if __name__ == '__main__': + unittest.main() diff --git a/experiments/optimize/test_native_algorithms.py b/experiments/optimize/test_native_algorithms.py new file mode 100644 index 0000000000..db0cc89995 --- /dev/null +++ b/experiments/optimize/test_native_algorithms.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +"""Pure trust-boundary checks; no solver, process or reference search is run.""" +import copy +import importlib.util +from pathlib import Path +import sys +import unittest + +sys.dont_write_bytecode = True +SOURCE = Path(__file__).with_name('benchmark_native_algorithms.py') +SPEC = importlib.util.spec_from_file_location('native_algorithms', SOURCE) +panel = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(panel) + + +class OriginalWitnessChecks(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.models, _, cls.binary, cls.native = panel.prepare_inputs() + + def fixture(self, index=0, route='native'): + unit = dict(panel.FROZEN_INPUTS[index], route=route) + model = self.models[unit['id']] + assignment = model['reference']['assignment'][:] + n = len(assignment) + full = assignment[:] + rows = len(model['rows']) if unit['kind']=='binary' else 0 + globals_count = 0 + if unit['kind']=='weighted_queens': + full += [value for row, col in enumerate(assignment) + for value in (col+row, col-row)] + rows = 2*n + if unit['kind']!='binary': + full += [model['data'][row][col] for row, col in enumerate(assignment)] + globals_count = n+(1 if unit['kind']=='native_tsp' else 3) + raw = dict( + schema_version=1, kind=unit['kind'], route=route, + backend='Gecode native' if route=='native' else 'Gecode native frontier', + backend_version='fixture', guarantee='exact', start_submitted=False, + model_id=1, revision=1, model_columns=len(full), model_rows=rows, + model_globals=globals_count, status='optimal', has_solution=True, + solution_validated=True, assignment=assignment, full_values=full, + objective=unit['objective'], best_bound=unit['objective'], + absolute_gap=0, relative_gap=0, build_seconds=0.001, + solve_seconds=0.002, driver_seconds=0.004, + ) + for key in ('nodes', 'expanded_nodes', 'budget_nodes', + 'peak_open_nodes', 'unresolved_regions'): + raw[key] = None if route=='native' else 0 + return unit, model, raw + + def check(self, fixture): + unit, model, raw = fixture + return panel.checked_result(raw, unit, model, self.binary, self.native) + + def test_stored_binary_and_global_witnesses(self): + for index in (0, 6, 7): + with self.subTest(index=index): + accepted = self.check(self.fixture(index)) + self.assertTrue(accepted['completed']) + self.assertTrue(accepted['witness_checked']) + self.assertTrue(self.check(self.fixture(route='dfs'))['completed']) + + def test_infeasible_source_assignment_is_rejected(self): + unit, model, raw = self.fixture() + raw['assignment'] = raw['full_values'] = [1]*model['n'] + # All items exceed the original knapsack's capacity. + self.assertFalse(self.binary.validate_assignment(model, raw['assignment'])['valid']) + raw['objective'] = sum(model['c']) + raw['best_bound'] = raw['objective'] + with self.assertRaises(ValueError): + self.check((unit, model, raw)) + + def test_wrong_objective_or_substituted_model_is_rejected(self): + for field, delta in (('objective', 1), ('model_columns', 1), + ('model_rows', 1), ('model_globals', 1)): + with self.subTest(field=field): + fixture = self.fixture() + fixture[2][field] += delta + with self.assertRaises(ValueError): + self.check(fixture) + + def test_feasible_suboptimal_point_cannot_claim_optimal(self): + unit, model, raw = self.fixture() + raw['assignment'] = raw['full_values'] = [0]*model['n'] + # Selecting no items is feasible but is strictly worse than -2464. + self.assertEqual(self.binary.validate_assignment(model, raw['assignment']), + dict(valid=True, objective=0, domain_semantics_checked=True)) + raw['objective'] = raw['best_bound'] = 0 + with self.assertRaises(ValueError): + self.check((unit, model, raw)) + raw.update(status='time_limit', best_bound=-2464, absolute_gap=2464, relative_gap=1) + result = self.check((unit, model, raw)) + self.assertFalse(result['completed']) + self.assertTrue(result['witness_checked']) + + def test_empty_limited_result_is_censored(self): + fixture = self.fixture() + fixture[2].update(status='time_limit', has_solution=False, + solution_validated=False, assignment=[], full_values=[], + objective=None, absolute_gap=None, relative_gap=None) + result = self.check(fixture) + self.assertFalse(result['completed']) + self.assertFalse(result['witness_checked']) + self.assertIsNone(result['objective']) + self.assertIsNone(result['absolute_primal_gap_to_oracle']) + + def test_global_semantics_and_auxiliary_values_are_checked(self): + for index in (6, 7): + unit, model, raw = self.fixture(index) + bad = copy.deepcopy(raw) + bad['assignment'][0] = bad['assignment'][1] + bad['full_values'][0] = bad['assignment'][0] + self.assertFalse(self.native.validate_assignment(model, bad['assignment'])['valid']) + with self.assertRaises(ValueError): + self.check((unit, model, bad)) + raw['full_values'][-1] += 1 + with self.assertRaises(ValueError): + self.check((unit, model, raw)) + + def test_malformed_protocol_and_impossible_claims_are_rejected(self): + for field, value in ( + ('objective', float('nan')), ('best_bound', float('inf')), + ('backend', 'HiGHS'), ('start_submitted', True), + ('status', 'infeasible'), ('status', 'invented'), + ('schema_version', True), ('solution_validated', False), + ('solve_seconds', 1), ('nodes', 1), + ): + with self.subTest(field=field, value=value): + fixture = self.fixture() + fixture[2][field] = value + with self.assertRaises(ValueError): + self.check(fixture) + for text in ('{"x":NaN}', '{"x":1,"x":2}'): + with self.assertRaises(ValueError): + panel.strict_json(text) + + +if __name__=='__main__': + unittest.main() diff --git a/experiments/optimize/test_process_containment.py b/experiments/optimize/test_process_containment.py new file mode 100644 index 0000000000..0bbe9c7586 --- /dev/null +++ b/experiments/optimize/test_process_containment.py @@ -0,0 +1,471 @@ +"""Windows ABI/failure mocks plus real Windows containment gates. + +Passing mocks on POSIX is NOT evidence that the Windows runtime port works. +RealWindowsTests must execute (not skip) on both Windows Python architectures. +""" +import ctypes as C +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import sys +import tempfile +import time +import unittest +from unittest import mock + +SPEC = importlib.util.spec_from_file_location("process_containment", Path(__file__).with_name("process_containment.py")) +P = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(P) + + +class FakeAPI: + """Track kernel ownership and inject BOOL/DWORD failures without launching.""" + def __init__(self, fail=None): + self.fail = fail or {} + self.calls = [] + self.counts = {} + self.live = set() + self.closed = [] + self.attributes = {} + self.error = 5 + self.next_handle = (1 << 40) if C.sizeof(P.HANDLE) == 8 else 100 + self.process = self.thread = self.job = None + self.member = True + self.exited = False + self.active = 0 + self.keep_active = False + self.exit_code = 259 # This is a valid exit value AFTER a signalled wait. + self.resume_result = 1 + self.wait_result = None + + def ok(self, name): + self.calls.append(name) + self.counts[name] = self.counts.get(name, 0) + 1 + return self.fail.get(name) != self.counts[name] + + def handle(self): + self.next_handle += 1 + self.live.add(self.next_handle) + return self.next_handle + + def last_error(self): + return self.error + + def GetCurrentProcess(self): + return -1 + + def CreateJobObjectW(self, security, name): + assert security is None and name is None + if not self.ok("create_job"): + return None + self.job = self.handle() + return self.job + + def SetInformationJobObject(self, job, kind, data, size): + assert job == self.job and kind == 9 + assert size == C.sizeof(P.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) + assert data._obj.BasicLimitInformation.LimitFlags == P.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + return self.ok("set_limits") + + def DuplicateHandle(self, source, handle, target, result, access, inherit, options): + assert source == target == -1 and access == 0 and inherit and options == 2 + if not self.ok("duplicate"): + return False + result._obj.value = self.handle() + return True + + def InitializeProcThreadAttributeList(self, storage, count, flags, size): + assert count == 2 and flags == 0 + if storage is None: + self.error = P.ERROR_INSUFFICIENT_BUFFER if self.ok("attribute_size") else 5 + size._obj.value = 128 + return False + self.error = 5 + return self.ok("attribute_init") + + def UpdateProcThreadAttribute(self, storage, flags, key, data, size, previous, returned): + assert flags == 0 and previous is None and returned is None + assert size == C.sizeof(data._obj) + self.attributes[key] = list(data._obj) + return self.ok("attribute_handles" if key == P.PROC_THREAD_ATTRIBUTE_HANDLE_LIST else "attribute_jobs") + + def DeleteProcThreadAttributeList(self, storage): + self.ok("attribute_delete") + + def CreateProcessW(self, application, command, ps, ts, inherit, flags, env, cwd, startup, result): + assert application == r"C:\python.exe" and command.value.startswith(r"C:\python.exe") + assert ps is None and ts is None and env is None and inherit + assert flags == P.CREATE_SUSPENDED | P.CREATE_NO_WINDOW | P.EXTENDED_STARTUPINFO_PRESENT + assert self.attributes[P.PROC_THREAD_ATTRIBUTE_JOB_LIST] == [self.job] + handles = self.attributes[P.PROC_THREAD_ATTRIBUTE_HANDLE_LIST] + assert len(handles) == 3 and self.job not in handles + si = startup._obj.StartupInfo + assert si.cb == C.sizeof(P.STARTUPINFOEXW) and si.dwFlags == P.STARTF_USESTDHANDLES + assert handles == [si.hStdInput, si.hStdOutput, si.hStdError] + if not self.ok("create_process"): + return False + self.process, self.thread = self.handle(), self.handle() + self.active = 1 + result._obj.hProcess, result._obj.hThread = self.process, self.thread + result._obj.dwProcessId, result._obj.dwThreadId = 73, 74 + return True + + def IsProcessInJob(self, process, job, result): + assert process == self.process and job == self.job + result._obj.value = self.member + return self.ok("membership") + + def ResumeThread(self, thread): + assert thread == self.thread + if not self.ok("resume"): + return P.WAIT_FAILED + self.exited = True + return self.resume_result + + def WaitForSingleObject(self, process, milliseconds): + assert process == self.process and 0 <= milliseconds < P.WAIT_FAILED + if not self.ok("wait"): + return P.WAIT_FAILED + if self.wait_result is not None: + return self.wait_result + return P.WAIT_OBJECT_0 if self.exited else P.WAIT_TIMEOUT + + def GetExitCodeProcess(self, process, result): + assert process == self.process + result._obj.value = self.exit_code + return self.ok("exit_code") + + def TerminateJobObject(self, job, code): + assert job == self.job and code == 124 + if not self.ok("terminate_job"): + return False + self.exited = True + if not self.keep_active: + self.active = 0 + return True + + def TerminateProcess(self, process, code): + assert process == self.process and code == 124 + if not self.ok("terminate_process"): + return False + self.exited = True + return True + + def QueryInformationJobObject(self, job, kind, data, size, returned): + assert job == self.job and kind == 1 and returned is None + assert size == C.sizeof(P.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION) + data._obj.ActiveProcesses = self.active + return self.ok("query") + + def CloseHandle(self, handle): + assert handle in self.live, "double close or borrowed-handle close" + if not self.ok("close"): + return False + self.live.remove(handle) + self.closed.append(handle) + if handle == self.job: + self.active = 0 # KILL_ON_JOB_CLOSE fallback. + self.exited = True + return True + + +class MockWindowsTests(unittest.TestCase): + def start(self, api): + process = P.WindowsJobProcess(api=api, fd_to_handle=lambda fd: fd + 1000) + with tempfile.TemporaryFile() as output: + process.start([r"C:\python.exe", "-c", "pass"], output, output, r"C:\work") + return process + + def test_native_width_structures(self): + wide = C.sizeof(P.HANDLE) == 8 + self.assertEqual(C.sizeof(P.DWORD), 4) + self.assertEqual(C.sizeof(P.BOOL), 4) + self.assertEqual(C.sizeof(P.STARTUPINFOW), 104 if wide else 68) + self.assertEqual(P.STARTUPINFOW.dwFlags.offset, 60 if wide else 44) + self.assertEqual(P.STARTUPINFOW.hStdInput.offset, 80 if wide else 56) + self.assertEqual(C.sizeof(P.STARTUPINFOEXW), 112 if wide else 72) + self.assertEqual(C.sizeof(P.PROCESS_INFORMATION), 24 if wide else 16) + self.assertEqual(C.sizeof(P.JOBOBJECT_BASIC_LIMIT_INFORMATION), 64 if wide else 48) + self.assertEqual(C.sizeof(P.JOBOBJECT_EXTENDED_LIMIT_INFORMATION), 144 if wide else 112) + self.assertEqual(C.sizeof(P.IO_COUNTERS), 48) + self.assertEqual(C.sizeof(P.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION), 48) + self.assertEqual(P.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION.ActiveProcesses.offset, 40) + + def test_atomic_assignment_precedes_resume_and_handles_are_owned(self): + api = FakeAPI() + process = self.start(api) + order = [api.calls.index(name) for name in ( + "set_limits", "attribute_handles", "attribute_jobs", "create_process", "membership", "resume")] + self.assertEqual(order, sorted(order)) + self.assertEqual(api.live, {api.job, api.process}) + self.assertEqual(process.poll(), 259) + process.cleanup(0.1) + self.assertFalse(api.live) + self.assertEqual(api.closed[-1], api.job) + with self.assertRaises(ValueError): + process.start([], None, None, r"C:\work") + + def test_setup_failures_do_not_run_or_leave_children(self): + scenarios = [(name, 1) for name in ("create_job", "set_limits", "attribute_size", "attribute_init", + "attribute_handles", "attribute_jobs", "create_process", "membership", "resume")] + scenarios += [("duplicate", number) for number in (1, 2, 3)] + scenarios += [("close", number) for number in (1, 2, 3, 4)] + for operation, count in scenarios: + with self.subTest(operation=operation, count=count): + api = FakeAPI({operation: count}) + with self.assertRaises(OSError): + self.start(api) + self.assertFalse(api.live, api.calls) + self.assertEqual(api.active, 0) + if operation not in ("resume", "close"): + self.assertNotIn("resume", api.calls) + if api.process is not None: + self.assertIn("terminate_job", api.calls) + + def test_failed_membership_or_suspend_count_kills_created_process(self): + for member, count in ((False, 1), (True, 0), (True, 2)): + with self.subTest(member=member, count=count): + api = FakeAPI() + api.member, api.resume_result = member, count + with self.assertRaises(OSError): + self.start(api) + if not member: + self.assertNotIn("resume", api.calls) + self.assertIn("terminate_process", api.calls) + self.assertFalse(api.live) + + def test_cleanup_failures_are_reported_and_all_handles_attempted(self): + for operation in ("terminate_job", "wait", "exit_code", "query", "close"): + with self.subTest(operation=operation): + api = FakeAPI() + process = self.start(api) + api.fail[operation] = api.counts.get(operation, 0) + 1 + with self.assertRaises(OSError): + process.cleanup(0.01) + self.assertIsNone(process.job) + self.assertEqual(api.active, 0) + if operation == "terminate_job": + self.assertIn("terminate_process", api.calls) + if operation == "close": + # Retain a handle whose close failed; retry is explicit. + self.assertEqual(api.live, {api.process}) + process.cleanup(0.01) + self.assertFalse(api.live) + + def test_job_termination_failure_still_uses_kill_on_close(self): + api = FakeAPI() + process = self.start(api) + api.fail.update(terminate_job=1, terminate_process=1) + with self.assertRaises(OSError) as error: + process.cleanup(0) + self.assertIn("TerminateJobObject", str(error.exception)) + self.assertIn("TerminateProcess", str(error.exception)) + self.assertFalse(api.live) + self.assertEqual(api.active, 0) + + def test_failed_job_close_is_retained_for_watchdog_retry(self): + api = FakeAPI() + process = self.start(api) + api.fail["close"] = api.counts["close"] + 2 # process closes; job close fails. + with self.assertRaisesRegex(OSError, "CloseHandle\\(job\\)"): + process.cleanup(.01) + self.assertEqual(process.job, api.job) + self.assertEqual(api.live, {api.job}) + process.terminate() + process.cleanup(.01) + self.assertFalse(api.live) + + def test_descendant_wait_is_bounded_and_closes_job_on_timeout(self): + api = FakeAPI() + process = self.start(api) + api.keep_active = True + with mock.patch.object(P.time, "monotonic", side_effect=[10, 10, 10.1]): + with self.assertRaisesRegex(OSError, "descendants"): + process.cleanup(0.01) + self.assertFalse(api.live) + + def test_waits_never_use_infinite_and_failed_wait_is_not_completion(self): + api = FakeAPI() + process = self.start(api) + api.wait_result = P.WAIT_TIMEOUT + self.assertIsNone(process.poll()) + for timeout in (0, 0.0001, 1e308): + with self.assertRaises(subprocess.TimeoutExpired): + process.wait(timeout) + api.wait_result = P.WAIT_FAILED + with self.assertRaises(OSError): + process.poll() + for timeout in (-1, float("inf"), float("nan")): + with self.assertRaises(ValueError): + process.wait(timeout) + api.wait_result = None + process.cleanup(0.01) + + def test_command_validation_prevents_shell_and_length_ambiguity(self): + bad = ([], ["python.exe"], [r"\python.exe"], [r"C:python.exe"], + [r"C:\python.exe", "x\0y"], [r"C:\python.exe", "😀" * 16384]) + for command in bad: + with self.subTest(command=repr(command)[:60]), self.assertRaises(ValueError): + P.checked_command(command, r"C:\work") + with self.assertRaises(ValueError): + P.checked_command([r"C:\python.exe"], "relative") + arguments = [r"C:\Program Files\python.exe", "", "x y", 'a"b', "unicode-λ"] + _, _, line = P.checked_command(arguments, r"C:\work") + self.assertEqual(line, subprocess.list2cmdline(arguments)) + + +@unittest.skipUnless(os.name == "nt", "requires actual Windows APIs; mocks do not establish runtime support") +class RealWindowsTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory(prefix="fast-containment-") + self.directory = Path(self.temp.name) + + def tearDown(self): + self.temp.cleanup() + + def launch(self, source, args=(), api=None): + output, error = tempfile.TemporaryFile(dir=self.directory), tempfile.TemporaryFile(dir=self.directory) + self.addCleanup(output.close) + self.addCleanup(error.close) + process = P.WindowsJobProcess(api=api) + self.addCleanup(process.cleanup, 1) + process.start([sys.executable, "-c", source, *args], output, error, self.directory) + return process, output, error + + def test_suspended_membership_before_resume_and_unicode_stdio(self): + marker = self.directory/"first-instruction" + api = P.WinAPI() + original = api.ResumeThread + observed = [] + def resume(thread): + self.assertFalse(marker.exists()) + observed.append(True) + return original(thread) + api.ResumeThread = resume + arguments = ("", "space here", 'a"b', "trailing\\", "λ😀") + source = ("import pathlib,sys,json; pathlib.Path(sys.argv[1]).write_text('ran'); " + "print(json.dumps(sys.argv[2:])); print('diagnostic',file=sys.stderr); sys.exit(3)") + process, output, error = self.launch(source, (str(marker), *arguments), api) + self.assertEqual(process.wait(5), 3) + process.cleanup(1) + output.seek(0); error.seek(0) + self.assertEqual(json.loads(output.read()), list(arguments)) + self.assertIn(b"diagnostic", error.read()) + self.assertEqual(observed, [True]) + self.assertTrue(marker.exists()) + + def test_postcreation_verification_failure_never_runs_child(self): + for failure in ("membership_false", "membership_api", "resume_api"): + with self.subTest(failure=failure): + marker = self.directory/failure + api = P.WinAPI() + if failure == "membership_false": + api.IsProcessInJob = lambda process, job, result: 1 + elif failure == "membership_api": + api.IsProcessInJob = lambda process, job, result: 0 + else: + api.ResumeThread = lambda thread: P.WAIT_FAILED + with self.assertRaises(OSError): + self.launch("import pathlib; pathlib.Path("+repr(str(marker))+").write_text('ran')", api=api) + self.assertFalse(marker.exists()) + + def test_successful_root_cleanup_kills_descendant(self): + marker = self.directory/"descendant" + ready = self.directory/"child-ready" + child = ("import pathlib,time; pathlib.Path("+repr(str(ready))+").write_text('ready'); " + "time.sleep(.6); pathlib.Path("+repr(str(marker))+").write_text('escaped')") + source = ("import subprocess,sys,pathlib,time; subprocess.Popen([sys.executable,'-c',"+repr(child)+"]); " + "p=pathlib.Path("+repr(str(ready))+"); " + "exec('while not p.exists(): time.sleep(.005)')") + process, _, _ = self.launch(source) + self.assertEqual(process.wait(5), 0) + process.cleanup(1) + self.assertTrue(ready.exists(), "the descendant must actually have run") + time.sleep(.8) + self.assertFalse(marker.exists()) + + def test_unlisted_inheritable_handle_is_not_inherited(self): + import msvcrt + with (self.directory/"unlisted").open("wb") as borrowed: + handle = msvcrt.get_osfhandle(borrowed.fileno()) + os.set_handle_inheritable(handle, True) + # BY_HANDLE_FILE_INFORMATION is thirteen DWORDs: its volume serial + # and high/low file index identify the underlying file. A numeric + # handle can legitimately be reused for another object in the child. + kernel = C.WinDLL("kernel32", use_last_error=True) + info_function = kernel.GetFileInformationByHandle + info_function.argtypes, info_function.restype = [C.c_void_p, C.c_void_p], C.c_int32 + info = (C.c_uint32 * 13)() + self.assertTrue(info_function(handle, C.byref(info))) + identity = [info[7], info[11], info[12]] + source = ("import ctypes as C,sys,json; k=C.WinDLL('kernel32',use_last_error=True); " + "k.GetFileInformationByHandle.argtypes=[C.c_void_p,C.c_void_p]; " + "k.GetFileInformationByHandle.restype=C.c_int32; info=(C.c_uint32*13)(); " + "ok=k.GetFileInformationByHandle(int(sys.argv[1]),C.byref(info)); " + "print(json.dumps([info[7],info[11],info[12]] if ok else None))") + process, output, _ = self.launch(source, (str(handle),)) + self.assertEqual(process.wait(5), 0) + process.cleanup(1) + output.seek(0) + self.assertNotEqual(json.loads(output.read()), identity, + "the unrelated inheritable file escaped the explicit handle allowlist") + + def test_nested_containment_and_breakaway_rejection(self): + module_dir = str(Path(__file__).resolve().parent) + inner = ("import sys,tempfile,subprocess; sys.path.insert(0,"+repr(module_dir)+"); " + "from process_containment import WindowsJobProcess; " + "p=WindowsJobProcess(); out=tempfile.TemporaryFile(); " + "p.start([sys.executable,'-c','print(42)'],out,out,"+repr(str(self.directory))+"); " + "assert p.wait(5)==0; p.cleanup(1)") + process, _, error = self.launch(inner) + self.assertEqual(process.wait(8), 0) + process.cleanup(1) + error.seek(0) + self.assertEqual(error.read(), b"") + breaker = """import subprocess,sys +try: + subprocess.Popen([sys.executable,'-c','pass'],creationflags=0x01000000) +except OSError: + sys.exit(0) +else: + sys.exit(9) +""" + process, _, _ = self.launch(breaker) + self.assertEqual(process.wait(5), 0, "a child was allowed to break away from the job") + process.cleanup(1) + + def test_owner_abrupt_exit_and_watchdog_leave_no_descendant(self): + # Outer test timeout bounds this test even if the implementation is bad. + module_dir = str(Path(__file__).resolve().parent) + for watchdog in (False, True): + with self.subTest(watchdog=watchdog): + marker = self.directory/str(watchdog) + ready = self.directory/(str(watchdog)+"-ready") + child = ("import pathlib,time; pathlib.Path("+repr(str(ready))+").write_text('ready'); " + "time.sleep(1.5); pathlib.Path("+repr(str(marker))+").write_text('escaped')") + source = ("import os,sys,time,tempfile,pathlib; sys.path.insert(0,"+repr(module_dir)+"); " + "from process_containment import WindowsJobProcess; from fast_regression import Budget; " + "p=WindowsJobProcess(); b=Budget(1,watchdog="+repr(watchdog)+"); b.containment=p; " + "out=tempfile.TemporaryFile(); p.start([sys.executable,'-c',"+repr(child)+"],out,out," + +repr(str(self.directory))+"); ready=pathlib.Path("+repr(str(ready))+"); " + "exec('while not ready.exists(): time.sleep(.005)'); " + +("time.sleep(10)" if watchdog else "os._exit(17)")) + result = subprocess.run([sys.executable, "-c", source], capture_output=True, timeout=4) + self.assertEqual(result.returncode, 124 if watchdog else 17, result.stderr) + self.assertTrue(ready.exists()) + time.sleep(1.7) + self.assertFalse(marker.exists(), "job outlived its final owner handle") + + +if __name__ == "__main__": + required = "--require-windows" in sys.argv + if required: + sys.argv.remove("--require-windows") + if os.name != "nt": + raise SystemExit("Windows verification requires actual Windows; skipped tests cannot pass") + if unittest.defaultTestLoader.loadTestsFromTestCase(RealWindowsTests).countTestCases() < 6: + raise SystemExit("Windows containment fixtures are missing") + outcome = unittest.main(exit=False).result + raise SystemExit(0 if outcome.wasSuccessful() and not (required and outcome.skipped) else 1) diff --git a/experiments/optimize/test_scaling_instances.py b/experiments/optimize/test_scaling_instances.py new file mode 100644 index 0000000000..67e0ab9fbf --- /dev/null +++ b/experiments/optimize/test_scaling_instances.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +"""Small exhaustive oracles and generator contracts; no solver execution.""" +import copy +import hashlib +import itertools +import json +import random +import unittest +from unittest.mock import patch + +import scaling_instances as instances + + +class CapacityOracleTests(unittest.TestCase): + def test_exact_reference_against_subsets(self): + rng = random.Random(19037) + for n in range(1, 9): + for _ in range(12): + weights = [rng.randint(1, 9) for _ in range(n)] + profits = [rng.randint(1, 11) for _ in range(n)] + capacity = rng.randint(0, sum(weights) + 1) + feasible = [(sum(p * x for p, x in zip(profits, point)), point) + for point in itertools.product((0, 1), repeat=n) + if sum(w * x for w, x in zip(weights, point)) <= capacity] + best = max(profit for profit, _ in feasible) + reference = instances.capacity_reference(weights, profits, capacity) + self.assertEqual(reference["objective"], -best) + self.assertIn((best, tuple(reference["assignment"])), feasible) + + def test_zero_capacity_ties_heavy_items_and_predecessors(self): + cases = [([2, 2, 2], [3, 3, 3], 2), ([4, 1, 3], [7, 3, 6], 0), + ([9, 2, 3], [40, 4, 5], 5), ([3, 4, 2], [7, 8, 5], 5), + ([1, 1, 1], [1, 1, 1], 3)] + for weights, profits, capacity in cases: + answer = instances.capacity_reference(weights, profits, capacity) + point = answer["assignment"] + self.assertLessEqual(sum(w * x for w, x in zip(weights, point)), capacity) + self.assertEqual(-sum(p * x for p, x in zip(profits, point)), answer["objective"]) + expected = min(-sum(p * bit for p, bit in zip(profits, point)) + for point in itertools.product((0, 1), repeat=len(weights)) + if sum(w * bit for w, bit in zip(weights, point)) <= capacity) + self.assertEqual(expected, answer["objective"]) + + def test_rejects_unsupported_or_unbounded_reference_work(self): + for args in (([], [], 0), ([0], [2], 3), ([1], [-1], 3), ([True], [1], 3), + ([1], [1], -1), ([1], [60000], 1), ([1] * 513, [1] * 513, 3)): + with self.assertRaises(ValueError): + instances.capacity_reference(*args) + + +class AssignmentOracleTests(unittest.TestCase): + def test_exact_reference_against_permutations(self): + rng = random.Random(90123) + for n in range(1, 7): + for _ in range(8): + costs = [[rng.randint(0, 30) for _ in range(n)] for _ in range(n)] + best = min(sum(costs[i][j] for i, j in enumerate(permutation)) + for permutation in itertools.permutations(range(n))) + reference = instances.assignment_reference(costs) + self.assertEqual(reference["objective"], best) + x = reference["assignment"] + self.assertTrue(all(sum(x[i * n:(i + 1) * n]) == 1 for i in range(n))) + self.assertTrue(all(sum(x[i * n + j] for i in range(n)) == 1 for j in range(n))) + self.assertEqual(sum(costs[i][j] * x[i * n + j] for i in range(n) for j in range(n)), best) + + def test_ties_and_admission(self): + self.assertEqual(instances.assignment_reference([[0] * 4 for _ in range(4)])["objective"], 0) + for costs in ([], [[1, 2]], [[True]], [[-1]], [[1] * 17 for _ in range(17)]): + with self.assertRaises(ValueError): + instances.assignment_reference(costs) + + +class GeneratorTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.models = instances.generate_suite(with_references=False) + + def test_frozen_counts_determinism_prefixes_and_caps(self): + self.assertEqual(len(self.models), 13) + self.assertEqual(self.models, instances.generate_suite(with_references=False)) + self.assertEqual(len({m["id"] for m in self.models}), 13) + for family, sizes in (("capacity_uncorrelated", [8, 32, 128, 384, 512]), + ("capacity_correlated", [8, 32, 128, 384])): + models = [m for m in self.models if m["family"] == family] + self.assertEqual([m["n"] for m in models], sizes) + full = models[-1]["parameters"] + for m in models: + p, n = m["parameters"], m["n"] + self.assertEqual(p["weights"][0], full["weights"][0][:n]) + self.assertEqual(p["profits"], full["profits"][:n]) + self.assertEqual(p["capacity"], 6 * n) + self.assertEqual(p["table_cells"], (n + 1) * (6 * n + 1)) + self.assertEqual(p["dp_eligible"], n != 512) + self.assertTrue(all(1 <= w <= 31 for w in p["weights"][0])) + if family == "capacity_correlated": + self.assertTrue(all(0 <= profit - weight <= 10 + for weight, profit in zip(p["weights"][0], p["profits"]))) + else: + self.assertTrue(all(1 <= profit <= 100 for profit in p["profits"])) + large = next(m for m in self.models if m["family"] == "capacity_uncorrelated" and m["n"] == 384) + overflow = next(m for m in self.models if m["n"] == 512) + self.assertEqual(large["parameters"]["table_cells"], 887425) + self.assertEqual(overflow["parameters"]["table_cells"], 1576449) + + def test_assignment_master_prefix_and_dimensions(self): + models = [m for m in self.models if m["family"] == "assignment"] + self.assertEqual([m["n"] for m in models], [9, 25, 81, 256]) + master = models[-1]["parameters"]["costs"] + for model in models: + size = model["parameters"]["size"] + self.assertEqual(model["parameters"]["costs"], [row[:size] for row in master[:size]]) + self.assertEqual(model["dimensions"], {"variables": size * size, "rows": 4 * size, + "nonzeros": 4 * size * size}) + self.assertFalse(model["parameters"]["dp_eligible"]) + + def test_txt_roundtrip_is_sparse_model_without_start(self): + for model in self.models: + text = instances.encode_txt(model) + tokens = iter(text.split()) + n, count = int(next(tokens)), int(next(tokens)) + costs = [int(next(tokens)) for _ in range(n)] + rows = [] + for _ in range(count): + bound, width = int(next(tokens)), int(next(tokens)) + terms = [[int(next(tokens)), int(next(tokens))] for _ in range(width)] + rows.append({"b": bound, "a": terms}) + self.assertEqual((n, costs, rows), (model["n"], model["c"], model["rows"])) + self.assertEqual(list(tokens), ["incumbent", "0"]) + self.assertNotIn("incumbent", model) + self.assertNotIn("reference", model) + data = {key: model[key] for key in ("n", "c", "rows")} + identity = hashlib.sha256(json.dumps(data, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + self.assertEqual(instances.semantic_hash(model), identity) + + def test_small_raw_truth_tables(self): + for model in (self.models[0], next(m for m in self.models if m["family"] == "assignment")): + p, n = model["parameters"], model["n"] + for point in itertools.product((0, 1), repeat=n): + if model["family"] == "assignment": + size = p["size"] + domain = all(sum(point[i * size:(i + 1) * size]) == 1 for i in range(size)) and \ + all(sum(point[i * size + j] for i in range(size)) == 1 for j in range(size)) + else: + domain = sum(w * x for w, x in zip(p["weights"][0], point)) <= p["capacity"] + checked = instances.validate_assignment(model, list(point)) + self.assertEqual(checked["valid"], domain) + if domain: + self.assertEqual(checked["objective"], sum(c * x for c, x in zip(model["c"], point))) + + def test_reference_identity_corruption_and_no_implicit_oracle(self): + model = copy.deepcopy(self.models[0]) + model["reference"] = instances._reference(model) + self.assertTrue(instances.verify_reference(model, recompute=True)["valid"]) + with patch.object(instances, "capacity_reference", side_effect=AssertionError("unexpected oracle")): + checked = instances.verify_reference(model) + self.assertTrue(checked["valid"]) + self.assertFalse(checked["optimality_recomputed"]) + mutations = [lambda m: m["reference"].update(input_sha256="0" * 64), + lambda m: m["reference"].update(objective=True), + lambda m: m["reference"].update(assignment=[True] * m["n"]), + lambda m: m["c"].__setitem__(0, m["c"][0] - 1), + lambda m: m["rows"][0]["a"].reverse(), + lambda m: m["parameters"].update(dp_eligible=False), + lambda m: m["dimensions"].update(nonzeros=0)] + for change in mutations: + bad = copy.deepcopy(model) + change(bad) + self.assertFalse(instances.verify_reference(bad)["valid"]) + # Consistent but suboptimal witness is only refuted by explicit reproof; + # measured runs must trust the previously frozen reference bytes. + bad = copy.deepcopy(model) + bad["reference"].update(assignment=[0] * model["n"], objective=0) + self.assertTrue(instances.verify_reference(bad)["valid"]) + self.assertFalse(instances.verify_reference(bad, recompute=True)["valid"]) + for point in ([0] * (model["n"] - 1), [0.0] * model["n"], [2] * model["n"]): + self.assertFalse(instances.validate_assignment(model, point)["valid"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/experiments/optimize/verify_miplib.py b/experiments/optimize/verify_miplib.py new file mode 100644 index 0000000000..8d3e708937 --- /dev/null +++ b/experiments/optimize/verify_miplib.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +"""Correctness-only differential check on the five existing MIPLIB3 inputs. + +Uses the existing suite's exact parser and assignment checker, without editing +the suite or seeding the solver from published reference solutions. Timing is +recorded for diagnosis only; this is not an authoritative performance trial. +""" +import argparse +from fractions import Fraction +import hashlib +import json +import math +from pathlib import Path +import platform +import subprocess +import sys +import time + +ROOT = Path(__file__).resolve().parents[2] +SUITE = ROOT / "experiments" / "solver-bench" +sys.dont_write_bytecode = True +sys.path.insert(0, str(SUITE)) +import miplib_import # noqa: E402 +import validate # noqa: E402 + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def reject_nonfinite(token): + raise ValueError("Nonfinite JSON number: " + token) + + +def finite_float(token): + value = float(token) + if not math.isfinite(value): + reject_nonfinite(token) + return value + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--binary", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--limit-seconds", type=float, default=30.0) + args = parser.parse_args() + if not math.isfinite(args.limit_seconds) or args.limit_seconds <= 0: + parser.error("limit must be positive and finite") + binary = args.binary.resolve(strict=True) + report = {"schema_version": 1, "purpose": "correctness_only_not_performance", + "platform": platform.platform(), "binary_sha256": sha(binary), + "source_head": subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=ROOT, text=True).strip(), + "source_dirty": bool(subprocess.check_output(["git", "status", "--porcelain"], cwd=ROOT, text=True)), + "limit_seconds": args.limit_seconds, "cases": []} + for name, (_, _, optimum, digest) in miplib_import.MODELS.items(): + path = SUITE / "miplib-cache" / (name + ".mps") + case = {"name": name, "input_sha256": sha(path), "expected_objective": optimum, "passed": False} + try: + if case["input_sha256"] != digest: + raise ValueError("Existing published input hash changed") + exact, metadata = miplib_import.parse_mps(path.read_text(encoding="ascii")) + started = time.perf_counter() + proc = subprocess.run([str(binary), str(path), "--time-limit", str(args.limit_seconds), + "--relative-gap", "0", "--absolute-gap", "0", "--seed", "0"], + text=True, capture_output=True, timeout=args.limit_seconds + 10) + case["process_wall_seconds"] = time.perf_counter() - started + if proc.stderr: + case["stderr"] = proc.stderr[-4000:] + result = json.loads(proc.stdout, parse_constant=reject_nonfinite, parse_float=finite_float) + case["result"] = result + if proc.returncode != 0 or result["termination"] != "optimal" or not result["solution_validated"]: + raise ValueError("No validated optimal result within the correctness-run limit") + for key in ("objective", "best_bound"): + if type(result[key]) not in (int, float) or not math.isfinite(result[key]): + raise ValueError("Missing or nonfinite numeric " + key) + names, values = result["variable_names"], result["values"] + if len(names) != len(values) or len(names) != len(set(names)): + raise ValueError("Missing or ambiguous witness column mapping") + mapped = dict(zip(names, values)) + if set(mapped) != set(metadata["column_names"]): + raise ValueError("Imported variable set differs from exact parser") + rounded = [] + for column in metadata["column_names"]: + value = mapped[column] + if not isinstance(value, (int, float)) or not math.isfinite(value) or abs(value-round(value)) > 1e-6: + raise ValueError("Witness is not numerically integral") + rounded.append(round(value)) + checked = validate.validate_assignment(exact, rounded) + if not checked["valid"]: + raise ValueError("Independent exact original-input witness check failed: " + str(checked)) + recovered = (metadata["sign"] * Fraction(checked["objective"], metadata["objective_scale"]) + + Fraction(metadata["original_objective_offset"])) + if recovered != optimum or abs(result["objective"]-float(recovered)) > 1e-6: + raise ValueError("Independent objective does not equal published optimum") + if result["best_bound"] is None or abs(result["best_bound"]-optimum) > 1e-6: + raise ValueError("Reported best bound does not close at the known optimum") + case["independent_exact_witness_objective"] = str(recovered) + case["passed"] = True + except (ValueError, KeyError, TypeError, OverflowError, subprocess.TimeoutExpired) as error: + case["error"] = str(error) + report["cases"].append(case) + print(name + ": " + ("PASS" if case["passed"] else "FAIL " + case.get("error", "")), flush=True) + report["passed"] = all(case["passed"] for case in report["cases"]) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(report, indent=2, allow_nan=False) + "\n") + return 0 if report["passed"] else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/gecode/flatzinc/capture-records.hh b/gecode/flatzinc/capture-records.hh new file mode 100644 index 0000000000..f050dc738f --- /dev/null +++ b/gecode/flatzinc/capture-records.hh @@ -0,0 +1,122 @@ +/* Owning FlatZinc records, independent of native parser configuration. */ +#ifndef GECODE_FLATZINC_CAPTURE_RECORDS_HH +#define GECODE_FLATZINC_CAPTURE_RECORDS_HH +#include +#include +#include +#include +#include + +namespace Gecode { namespace FlatZinc { namespace Capture { + +enum class Type { Integer, Boolean, Float, Set }; +struct Reference { + Type type = Type::Integer; + std::size_t index = 0; +}; +/** Line is the parser reduction/end line, not a claimed exact start span. */ +struct Location { std::string source; std::size_t line = 0, ordinal = 0; }; +struct SetLiteral { + bool interval = false; + std::int64_t lower = 0, upper = -1; + std::vector values; +}; +enum class ValueKind { Integer, Boolean, Float, Set, Reference, Array, Atom, String, Call }; +/** Value is an owning tagged tree. Only the member selected by kind is meaningful. + * Array elements are in source order. Call uses text for its identifier and + * elements for its positional arguments (one scalar argument remains one). + */ +struct Value { + ValueKind kind = ValueKind::Integer; + std::int64_t integer = 0; + bool boolean = false; + double floating = 0; + SetLiteral set; + Reference reference; + std::string text; + std::vector elements; +}; +struct Domain { + bool present = false; + SetLiteral integers; // Integer/Boolean domain or set upper bound. + double lower = 0, upper = 0; // Float domain, when present. +}; +struct Variable { + Reference reference; + std::string name; + bool alias = false; + Reference target; // meaningful only when alias; same namespace. + bool assigned = false; // meaningful only when !alias. + Value value; // assigned literal, meaningful only when !alias && assigned. + Domain domain; // meaningful only when !alias; alias restrictions are rows. + bool introduced = false, functionally_defined = false; +}; +struct Constraint { + std::string id; + std::vector arguments; + std::vector annotations; + Location location; + bool synthesized = false; +}; +struct DeclarationAnnotations { + std::string name; + std::vector annotations; + Location location; +}; +enum class CoverageKind { Retained, AliasEquality }; +struct Coverage { + CoverageKind kind = CoverageKind::Retained; + std::size_t raw_constraint = 0; +}; +enum class Method { Satisfy, Minimize, Maximize }; +struct SolveGoal { + Method method = Method::Satisfy; + bool has_objective = false; + Value objective; // original literal or typed variable reference, never dummy 0. + std::vector annotations; + Location location; +}; +/** The original output expression is a typed value or an Array layout containing + * String fragments and a typed value Array (legacy arrayNd representation). + * DeclarationAnnotations retains the original output_array dimensions as sets. + * No printer shrinking/renumbering has occurred. + */ +struct Output { std::string name; Value expression; }; +struct Records { + // Raw state after declarations, before constraint equality rewrites. + // Each namespace is indexed by Variable.reference.index, never by name. + std::vector raw_variables; + std::vector raw_domains; + std::vector raw_constraints; + // Normalized alias state and both complete pre-posting constraint vectors. + std::vector variables; + std::vector domains; + std::vector constraints; + std::vector coverage; + std::vector declaration_annotations; + SolveGoal solve; + std::vector output; + std::string source; +}; +enum class Status { Complete, InvalidInput, Unsupported, ResourceLimit }; +struct Diagnostic { Status status = Status::InvalidInput; Location location; std::string message; }; +struct Options { + std::size_t max_input_bytes = 16 * 1024 * 1024; + std::size_t max_variables = 1000000; + std::size_t max_array_elements = 1000000; + std::size_t max_constraints = 1000000; + std::size_t max_value_depth = 64; + std::string source = ""; +}; +struct Result { + Status status = Status::InvalidInput; + // Complete means parsing/capture completed, NOT that a solver supports it. + // Unknown ordinary predicates are retained and require compiler rejection. + // Non-Complete never publishes partial records. Shared immutable ownership + // survives parser/input destruction and is safe for independent readers. + std::shared_ptr records; + std::vector diagnostics; +}; + +}}} +#endif diff --git a/gecode/flatzinc/capture.cpp b/gecode/flatzinc/capture.cpp new file mode 100644 index 0000000000..9d71d671e7 --- /dev/null +++ b/gecode/flatzinc/capture.cpp @@ -0,0 +1,323 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int yyparse(void*); +int yylex_init(void**); +int yylex_destroy(void*); +int yyget_lineno(void*); +void yyset_extra(void*,void*); + +namespace Gecode { namespace FlatZinc { +namespace C=Capture; +namespace { +struct CaptureFailure { C::Status status; std::string message; }; +[[noreturn]] void bad(const std::string& text){throw CaptureFailure{C::Status::InvalidInput,text};} +[[noreturn]] void limit(const std::string& text){throw CaptureFailure{C::Status::ResourceLimit,text};} +C::Location location(ParserState& p,std::size_t ordinal=0){ + int line=p.yyscanner?yyget_lineno(p.yyscanner):0; + return {p.capture->options.source,static_cast(std::max(0,line)),ordinal}; +} +C::Reference ref(C::Type type,int index){if(index<0)bad("negative variable reference");return {type,static_cast(index)};} +C::SetLiteral set(AST::SetLit* s){ + C::SetLiteral out;out.interval=s->interval; + if(s->interval){out.lower=s->min;out.upper=s->max;} + else { + for(int v:s->s)out.values.push_back(v); + std::sort(out.values.begin(),out.values.end()); + out.values.erase(std::unique(out.values.begin(),out.values.end()),out.values.end()); + } + return out; +} +std::string string_value(const std::string& source){ + std::string out; + for(std::size_t i=0;ip.capture->options.max_value_depth)limit("capture expression nesting exceeds limit"); + C::Value out; + if(n->isInt()){out.kind=C::ValueKind::Integer;out.integer=n->getInt();} + else if(n->isBool()){out.kind=C::ValueKind::Boolean;out.boolean=n->getBool();} + else if(n->isFloat()){out.kind=C::ValueKind::Float;out.floating=n->getFloat();if(!std::isfinite(out.floating))bad("float literal must be finite");} + else if(n->isSet()){out.kind=C::ValueKind::Set;out.set=set(n->getSet());} + else if(n->isIntVar()){out.kind=C::ValueKind::Reference;out.reference=ref(C::Type::Integer,n->getIntVar());} + else if(n->isBoolVar()){out.kind=C::ValueKind::Reference;out.reference=ref(C::Type::Boolean,n->getBoolVar());} + else if(n->isFloatVar()){out.kind=C::ValueKind::Reference;out.reference=ref(C::Type::Float,n->getFloatVar());} + else if(n->isSetVar()){out.kind=C::ValueKind::Reference;out.reference=ref(C::Type::Set,n->getSetVar());} + else if(n->isString()){out.kind=C::ValueKind::String;out.text=string_value(n->getString());} + else if(n->isAtom()){out.kind=C::ValueKind::Atom;out.text=n->getAtom()->id;} + else if(auto* a=dynamic_cast(n)){ + out.kind=C::ValueKind::Array;if(a->a.size()>p.capture->options.max_array_elements)limit("expression array exceeds capture limit"); + for(auto* x:a->a)out.elements.push_back(value(p,x,depth+1)); + }else if(auto* call=dynamic_cast(n)){ + out.kind=C::ValueKind::Call;out.text=call->id; + if(auto* a=dynamic_cast(call->args)){ + if(a->a.size()>p.capture->options.max_array_elements)limit("call arity exceeds capture limit"); + for(auto* x:a->a)out.elements.push_back(value(p,x,depth+1)); + }else out.elements.push_back(value(p,call->args,depth+1)); + }else bad("unsupported AST expression in capture"); + return out; +} +std::vector values(ParserState& p,AST::Array* nodes){ + std::vector out;if(!nodes)return out; + if(nodes->a.size()>p.capture->options.max_array_elements)limit("argument count exceeds capture limit"); + for(auto* node:nodes->a)out.push_back(value(p,node));return out; +} +C::Constraint constraint(ParserState& p,const ConExpr& ce,bool synthesized){ + return {ce.id,values(p,ce.args),values(p,ce.ann),location(p),synthesized}; +} +std::vector variables(ParserState& p){ + if(p.intvars.size()+p.boolvars.size()+p.floatvars.size()+p.setvars.size()>p.capture->options.max_variables)limit("variable count exceeds capture limit"); + std::vector out; + const auto add=[&](const std::vector& source,C::Type type){ + for(std::size_t i=0;ialias;v.introduced=spec->introduced;v.functionally_defined=spec->funcDep; + if(v.alias){v.target=ref(type,spec->i);if(v.target.index>=i)bad("variable alias must name an earlier variable in its namespace");} + else { + v.assigned=spec->assigned; + if(type==C::Type::Integer||type==C::Type::Boolean){ + const auto domain=type==C::Type::Integer?static_cast(spec)->domain:static_cast(spec)->domain; + v.domain.present=domain();if(domain())v.domain.integers=set(domain.some()); + if(v.assigned){v.value.kind=type==C::Type::Integer?C::ValueKind::Integer:C::ValueKind::Boolean;v.value.integer=spec->i;v.value.boolean=spec->i!=0;} + }else if(type==C::Type::Float){ + auto domain=static_cast(spec)->domain;v.domain.present=domain(); + if(domain()){v.domain.lower=domain.some().first;v.domain.upper=domain.some().second; + if(!std::isfinite(v.domain.lower)||!std::isfinite(v.domain.upper))bad("float domain must be finite");} + if(v.assigned){v.value.kind=C::ValueKind::Float;v.value.floating=v.domain.lower;} + }else { + auto domain=static_cast(spec)->upperBound;v.domain.present=domain();if(domain())v.domain.integers=set(domain.some()); + if(v.assigned){v.value.kind=C::ValueKind::Set;v.value.set=v.domain.integers;} + } + } + out.push_back(std::move(v)); + } + }; + add(p.intvars,C::Type::Integer);add(p.boolvars,C::Type::Boolean);add(p.setvars,C::Type::Set);add(p.floatvars,C::Type::Float);return out; +} +template void guard(CaptureParser& c,ParserState& p,F&& f){ + if(p.hadError)return; + try{f();}catch(const CaptureFailure& e){c.fail(p,e.status,e.message);} + catch(const AST::TypeError& e){c.fail(p,C::Status::InvalidInput,e.what());} + catch(const std::out_of_range&){c.fail(p,C::Status::InvalidInput,"reference outside captured namespace");} +} +using Counts=std::array; +Counts counts(const std::vector& vars){ + Counts result{};for(const auto& v:vars)++result.at(static_cast(v.reference.type));return result; +} +void check_ref(const C::Value& v,const Counts& ns){ + if(v.kind==C::ValueKind::Reference && + v.reference.index>=ns.at(static_cast(v.reference.type))) + bad("expression references a missing variable"); + for(const auto& child:v.elements)check_ref(child,ns); +} +void validate_signature(const C::Constraint& c){ + const auto& a=c.arguments; + const auto is_int=[](const C::Value& v){return v.kind==C::ValueKind::Integer||(v.kind==C::ValueKind::Reference&&v.reference.type==C::Type::Integer);}; + const auto is_bool=[](const C::Value& v){return v.kind==C::ValueKind::Boolean||(v.kind==C::ValueKind::Reference&&v.reference.type==C::Type::Boolean);}; + const auto arity=[&](std::size_t n){if(a.size()!=n)bad("wrong argument count for "+c.id);}; + if(c.id=="int_eq"||c.id=="int_ne"||c.id=="int_le"||c.id=="int_lt"||c.id=="int_ge"||c.id=="int_gt"){ + arity(2);if(!is_int(a[0])||!is_int(a[1]))bad("integer comparison arguments have wrong types"); + }else if(c.id=="bool_eq"||c.id=="bool_le"||c.id=="bool_lt"||c.id=="bool_not"){ + arity(2);if(!is_bool(a[0])||!is_bool(a[1]))bad("Boolean comparison arguments have wrong types"); + }else if(c.id=="bool2int"){ + arity(2);if(!is_bool(a[0])||!is_int(a[1]))bad("bool2int arguments have wrong types"); + } +} +void normalize(C::Records& r){ + r.variables=r.raw_variables;r.domains=r.raw_domains; + std::array,4> indices; + for(std::size_t i=0;i(r.variables[i].reference.type)).push_back(i); + const auto index=[&](C::Reference ref){return indices.at(static_cast(ref.type)).at(ref.index);}; + std::vector parent(r.variables.size()); + for(std::size_t i=0;iparent.size())bad("cyclic variable alias"); + root=parent[root]; + } + while(parent[i]!=i){const auto next=parent[i];parent[i]=root;i=next;} + return root; + }; + for(std::size_t n=0;nj)std::swap(i,j); + if(i!=j){auto& old=r.variables[j]; + if(old.assigned||old.domain.present){C::Value variable;variable.kind=C::ValueKind::Reference;variable.reference=r.variables[i].reference; + C::Value domain;domain.kind=C::ValueKind::Set; + if(old.assigned){domain.set.interval=true;domain.set.lower=domain.set.upper=old.reference.type==C::Type::Boolean?old.value.boolean:old.value.integer;} + else domain.set=old.domain.integers; + r.domains.push_back({"int_in",{variable,domain},{},c.location,true}); + } + parent[j]=i;old.alias=true;old.target=r.variables[i].reference;old.assigned=false;old.domain={};old.value={}; + } + r.coverage.push_back({C::CoverageKind::AliasEquality,n}); + }else {r.constraints.push_back(c);r.coverage.push_back({C::CoverageKind::Retained,n});} + } + for(auto& v:r.variables)if(v.alias)v.target=r.variables[base(v.reference)].reference; +} +} +void CaptureParser::fail(ParserState& p,C::Status value,const std::string& message){ + if(status==C::Status::Complete){status=value;diagnostics.push_back({value,location(p),message});} + p.hadError=true; +} +bool CaptureParser::array_size(ParserState& p,int n){ + if(n<0||static_cast(n)>options.max_array_elements || + p.arrays.size()+p.floatvals.size()+p.setvals.size()+static_cast(std::max(0,n))+1>static_cast(std::numeric_limits::max()))fail(p,C::Status::ResourceLimit,"declared array length exceeds capture limit");return !p.hadError; +} +bool CaptureParser::variable_count(ParserState& p,int n,bool initialized_array){ + const auto current=p.intvars.size()+p.boolvars.size()+p.setvars.size()+p.floatvars.size(); + // Initialized arrays may reuse existing slots; the exact total is checked + // after declarations. The input limit already bounds their explicit list. + if(n<0 || current>options.max_variables || (!initialized_array && + static_cast(n)>options.max_variables-current)) + fail(p,C::Status::ResourceLimit,"variable count exceeds capture limit"); + return !p.hadError; +} +bool CaptureParser::annotations(ParserState& p,AST::Array* ann){ + guard(*this,p,[&]{for(const auto& v:values(p,ann))if(v.kind==C::ValueKind::Call&&v.text=="output_array"){ + if(v.elements.size()!=1 || v.elements[0].kind!=C::ValueKind::Array)bad("output_array requires one array of dimensions"); + for(const auto& dim:v.elements[0].elements)if(dim.kind!=C::ValueKind::Set)bad("output_array dimensions must be sets"); + }});return !p.hadError; +} +void CaptureParser::declaration(ParserState& p,const std::string& name,AST::Array* ann,int output_length){ + if(!annotations(p,ann))return; + guard(*this,p,[&]{ + auto captured=values(p,ann); + for(const auto& a:captured)if(a.kind==C::ValueKind::Call&&a.text=="output_array"){ + if(output_length<0)bad("output_array requires an array declaration"); + const auto& dims=a.elements[0].elements;if(dims.empty())bad("output_array requires at least one dimension"); + std::size_t total=1; + for(const auto& d:dims){ + const auto width=d.set.interval ? (d.set.upper(d.set.upper-d.set.lower+1)) : d.set.values.size(); + if(width && total>options.max_array_elements/width)limit("output dimensions exceed capture limit"); + total*=width; + } + if(total!=static_cast(output_length))bad("output_array dimensions do not match declaration length"); + } + records.declaration_annotations.push_back({name,std::move(captured),location(p,records.declaration_annotations.size())}); + }); +} +void CaptureParser::begin(ParserState& p){guard(*this,p,[&]{ + records.source=options.source;records.raw_variables=variables(p);namespace_counts=counts(records.raw_variables); + if(p.domainConstraints.size()>options.max_constraints)limit("declaration domain count exceeds capture limit"); + for(auto* c:p.domainConstraints)records.raw_domains.push_back(::Gecode::FlatZinc::constraint(p,*c,true)); + declarations_recorded=true; +});} +void CaptureParser::constraint(ParserState& p,const std::string& id,AST::Array* args,AST::Array* ann){guard(*this,p,[&]{ + if(records.raw_constraints.size()>=options.max_constraints-records.raw_domains.size())limit("constraint count exceeds capture limit"); + if(id.compare(0,18,"gecode_on_restart_")==0)throw CaptureFailure{C::Status::Unsupported,"native restart-state predicates are unsupported by capture"}; + C::Constraint out{id,values(p,args),values(p,ann),location(p,records.raw_constraints.size()),false}; + validate_signature(out);for(const auto& v:out.arguments)check_ref(v,namespace_counts); + records.raw_constraints.push_back(std::move(out)); +});} +void CaptureParser::objective(ParserState& p,AST::Node* n){guard(*this,p,[&]{records.solve.objective=value(p,n);records.solve.has_objective=true;});} +void CaptureParser::solve(ParserState& p,C::Method method,AST::Array* ann){guard(*this,p,[&]{ + records.solve.method=method;records.solve.annotations=values(p,ann);records.solve.location=location(p); + if(method==C::Method::Satisfy){records.solve.has_objective=false;records.solve.objective={};} + else {if(!records.solve.has_objective)bad("missing original objective");check_ref(records.solve.objective,namespace_counts);} + solve_recorded=true; +});} +void CaptureParser::finish(ParserState& p){guard(*this,p,[&]{ + if(!declarations_recorded||!solve_recorded)bad("incomplete captured model"); + normalize(records); + for(const auto& out:p._output){auto expression=value(p,out.second);check_ref(expression,namespace_counts);records.output.push_back({out.first,std::move(expression)});} + std::sort(records.output.begin(),records.output.end(),[](const C::Output& a,const C::Output& b){return a.namestatic_cast(std::numeric_limits::max())|| + options.max_variables>static_cast(std::numeric_limits::max())|| + options.max_array_elements>static_cast(std::numeric_limits::max())|| + options.max_value_depth>1024)return failure(Status::InvalidInput,options,"capture limits exceed parser address/index range"); + if(input.size()>options.max_input_bytes)return failure(Status::ResourceLimit,options,"input exceeds capture byte limit"); + if(input.find('\0')!=std::string::npos)return failure(Status::InvalidInput,options,"embedded NUL in FlatZinc input"); + for(std::size_t i=0;i(input[i++]);if(lead<128)continue; + unsigned n=lead>=0xc2&&lead<=0xdf?1:lead>=0xe0&&lead<=0xef?2:lead>=0xf0&&lead<=0xf4?3:0; + if(!n || n>input.size()-i)return failure(Status::InvalidInput,options,"input is not valid UTF-8"); + std::uint32_t code=lead&((1u<<(6-n))-1u); + for(unsigned k=0;k(input[i++]);if((c&0xc0)!=0x80)return failure(Status::InvalidInput,options,"input is not valid UTF-8");code=(code<<6)|(c&0x3f);} + if((n==1&&code<0x80)||(n==2&&code<0x800)||(n==3&&code<0x10000)||code>0x10ffff||(code>=0xd800&&code<=0xdfff))return failure(Status::InvalidInput,options,"input is not valid UTF-8"); + } + + std::size_t depth=0;bool comment=false,quoted=false,escaped=false; + for(char c:input){ + if(comment){if(c=='\n')comment=false;continue;} + if(quoted){ + if(c=='\n' || c=='\r')return failure(Status::InvalidInput,options,"newline in string literal"); + if(escaped){ + escaped=false;continue; + } + if(c=='\\'){escaped=true;continue;} + if(c=='"')quoted=false; + continue; + } + if(c=='%'){comment=true;continue;} + if(c=='"'){quoted=true;continue;} + if(c=='('||c=='['||c=='{'){ + if(++depth>options.max_value_depth)return failure(Status::ResourceLimit,options,"source nesting exceeds capture limit"); + }else if((c==')'||c==']'||c=='}')&&depth) --depth; + } + if(quoted)return failure(Status::InvalidInput,options,"unterminated string literal"); + std::ostringstream errors;CaptureParser capture(options);ParserState p(input,errors,nullptr);p.capture=&capture; + struct Cleanup{ParserState& p;~Cleanup(){if(p.yyscanner)yylex_destroy(p.yyscanner);CaptureParser::cleanup(p);}} cleanup{p}; + if(yylex_init(&p.yyscanner))throw std::bad_alloc();yyset_extra(&p,p.yyscanner); + try{ + const int code=yyparse(&p); + if(code==2)capture.fail(p,Status::ResourceLimit,"generated parser exhausted its storage"); + else if(code||p.hadError){if(capture.status==Status::Complete)capture.fail(p,Status::InvalidInput,errors.str().empty()?"invalid FlatZinc input":errors.str());} + else capture.finish(p); + }catch(const AST::TypeError& e){capture.fail(p,Status::InvalidInput,e.what());} + catch(const std::out_of_range&){capture.fail(p,Status::InvalidInput,"invalid parser reference");} + if(capture.status!=Status::Complete)return {capture.status,nullptr,std::move(capture.diagnostics)}; + return {Status::Complete,std::make_shared(std::move(capture.records)),{}}; +} +Result parse(std::istream& input,const Options& options){ + if(options.max_input_bytes>static_cast(std::numeric_limits::max()))return failure(Status::InvalidInput,options,"capture input limit exceeds parser index range"); + std::string text;char block[4096]; + while(input){ + const auto room=options.max_input_bytes-text.size(); + const auto n=static_cast(std::min(sizeof(block),room+1)); + bool failed=false; + try { input.read(block,n); } catch(const std::bad_alloc&) { throw; } catch(...) { failed=true; } + const auto got=input.gcount(); + if(got<0 || static_cast(got)>room)return failure(Status::ResourceLimit,options,"input exceeds capture byte limit"); + text.append(block,static_cast(got)); + if(input.bad() || (failed&&!input.eof()))return failure(Status::InvalidInput,options,"input read failed"); + } + if(input.bad() || (!input.eof()&&input.fail()))return failure(Status::InvalidInput,options,"input read failed"); + return parse_string(text,options); +} +} +}} diff --git a/gecode/flatzinc/capture.hh b/gecode/flatzinc/capture.hh new file mode 100644 index 0000000000..c9900302c1 --- /dev/null +++ b/gecode/flatzinc/capture.hh @@ -0,0 +1,36 @@ +/* Owning FlatZinc parser records. No Optimize or solver-state dependencies. */ +#ifndef GECODE_FLATZINC_CAPTURE_HH +#define GECODE_FLATZINC_CAPTURE_HH + +#include +#include +#include + +// Same shared-library boundary as the native FlatZinc entry points, without +// including native Space/AST implementation headers in this record API. +#if !defined(GECODE_STATIC_LIBS) && (defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER)) +# ifdef GECODE_BUILD_FLATZINC +# define GECODE_CAPTURE_EXPORT __declspec(dllexport) +# else +# define GECODE_CAPTURE_EXPORT __declspec(dllimport) +# endif +#elif defined(GECODE_GCC_HAS_CLASS_VISIBILITY) +# define GECODE_CAPTURE_EXPORT __attribute__((visibility("default"))) +#else +# define GECODE_CAPTURE_EXPORT +#endif + +namespace Gecode { namespace FlatZinc { namespace Capture { + +/** Capture without constructing a native Space or invoking any registry poster. + * Input size and nesting are bounded before parsing; declared bulk allocation + * and captured record counts have explicit limits. No solver is called. + * Allocation failure may throw std::bad_alloc. All other input failures have + * a typed Result and never publish partial records. + */ +GECODE_CAPTURE_EXPORT Result parse(std::istream& input, const Options& options = {}); +GECODE_CAPTURE_EXPORT Result parse_string(const std::string& input, const Options& options = {}); + +}}} +#undef GECODE_CAPTURE_EXPORT +#endif diff --git a/gecode/flatzinc/lexer.lxx b/gecode/flatzinc/lexer.lxx index 564744382d..4a9a1af33e 100755 --- a/gecode/flatzinc/lexer.lxx +++ b/gecode/flatzinc/lexer.lxx @@ -50,6 +50,8 @@ void yyerror(void*, const char*); #include #include +#include +#include #include @@ -67,6 +69,34 @@ bool parseInt(const char* text, int& value) { return true; } +bool parseCaptureInt(const char* text, int& value) { + bool negative=*text=='-';if(negative)++text; + unsigned radix=10; + if(text[0]=='0'&&text[1]=='x'){radix=16;text+=2;} + else if(text[0]=='0'&&text[1]=='o'){radix=8;text+=2;} + const std::uint64_t maximum=negative?static_cast(-static_cast(Gecode::Int::Limits::min)): + static_cast(Gecode::Int::Limits::max); + std::uint64_t result=0;if(!*text)return false; + for(;*text;++text){ + const unsigned char c=static_cast(*text); + unsigned digit=c>='0'&&c<='9'?c-'0':c>='a'&&c<='f'?c-'a'+10:c>='A'&&c<='F'?c-'A'+10:99; + if(digit>=radix||result>(maximum-digit)/radix)return false; + result=result*radix+digit; + } + value=static_cast(negative?-static_cast(result):static_cast(result));return true; +} + +bool parseCaptureFloat(const char* text,double& value) { + std::istringstream input(text);input.imbue(std::locale::classic()); + input >> std::noskipws >> value; + if(input.fail() || !input.eof() || !std::isfinite(value)) return false; + if(value==0) { + for(const char* p=text;*p && *p!='e' && *p!='E';++p) + if(*p>='1' && *p<='9')return false; // nonzero literal underflowed to zero + } + return true; +} + int yy_input_proc(char* buf, int size, yyscan_t yyscanner); #define YY_INPUT(buf, result, max_size) \ result = yy_input_proc(buf, max_size, yyscanner); @@ -80,7 +110,7 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner); "true" { yylval->iValue = 1; return FZ_BOOL_LIT; } "false" { yylval->iValue = 0; return FZ_BOOL_LIT; } --?[0-9]+ { if (parseInt(yytext,yylval->iValue)) +-?[0-9]+ { if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -89,7 +119,7 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner); + ".." + std::to_string(Gecode::Int::Limits::max) + ")").c_str()); } --?0x[0-9A-Fa-f]+ { if (parseInt(yytext,yylval->iValue)) +-?0x[0-9A-Fa-f]+ { if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -98,7 +128,7 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner); + ".." + std::to_string(Gecode::Int::Limits::max) + ")").c_str()); } --?0o[0-7]+ { if (parseInt(yytext,yylval->iValue)) +-?0o[0-7]+ { if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -107,11 +137,17 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner); + ".." + std::to_string(Gecode::Int::Limits::max) + ")").c_str()); } --?[0-9]+\.[0-9]+ { yylval->dValue = strtod(yytext,NULL); +-?[0-9]+\.[0-9]+ { if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } --?[0-9]+\.[0-9]+[Ee][+-]?[0-9]+ { yylval->dValue = strtod(yytext,NULL); +-?[0-9]+\.[0-9]+[Ee][+-]?[0-9]+ { if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } --?[0-9]+[Ee][+-]?[0-9]+ { yylval->dValue = strtod(yytext,NULL); +-?[0-9]+[Ee][+-]?[0-9]+ { if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } [=:;{}(),\[\]\.] { return *yytext; } \.\. { return FZ_DOTDOT; } @@ -155,6 +191,15 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner); "where" { return FZ_WHERE; } [A-Za-z][A-Za-z0-9_]* { yylval->sValue = strdup(yytext); return FZ_ID; } _[_]*[A-Za-z][A-Za-z0-9_]* { yylval->sValue = strdup(yytext); return FZ_U_ID; } +\"([^"\\\n]|\\[^\n])*\" { + if(!static_cast(yyextra)->capture) { + // Preserve the legacy scanner's first-quote behavior. + const char* close=strchr(yytext+1,'"'); + yyless(static_cast(close-yytext+1)); + } + yylval->sValue = strdup(yytext+1); + yylval->sValue[strlen(yytext)-2] = 0; + return FZ_STRING_LIT; } \"[^"\n]*\" { yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; diff --git a/gecode/flatzinc/lexer.yy.cpp b/gecode/flatzinc/lexer.yy.cpp index 38024f7ece..fe3e94b807 100644 --- a/gecode/flatzinc/lexer.yy.cpp +++ b/gecode/flatzinc/lexer.yy.cpp @@ -46,7 +46,7 @@ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. + * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 @@ -59,11 +59,12 @@ typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; +typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; @@ -187,7 +188,7 @@ typedef size_t yy_size_t; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. @@ -197,7 +198,7 @@ typedef size_t yy_size_t; */ #define YY_LESS_LINENO(n) \ do { \ - int yyl;\ + yy_size_t yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ @@ -209,7 +210,7 @@ typedef size_t yy_size_t; if ( *p == '\n' )\ --yylineno;\ }while(0) - + /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ @@ -242,7 +243,7 @@ struct yy_buffer_state /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - int yy_n_chars; + yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to @@ -319,7 +320,7 @@ static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); void *yyalloc ( yy_size_t , yyscan_t yyscanner ); void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); @@ -366,12 +367,12 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ + yyleng = (yy_size_t) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 56 -#define YY_END_OF_BUFFER 57 +#define YY_NUM_RULES 57 +#define YY_END_OF_BUFFER 58 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -379,32 +380,33 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[221] = +static const flex_int16_t yy_accept[226] = { 0, - 0, 0, 57, 55, 2, 1, 55, 3, 12, 55, - 12, 6, 6, 12, 52, 55, 52, 52, 52, 52, + 0, 0, 58, 56, 2, 1, 56, 3, 12, 56, + 12, 6, 6, 12, 52, 56, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 0, 54, 0, 3, 6, 6, 13, 0, + 0, 0, 0, 14, 52, 53, 0, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 28, 52, + 52, 52, 52, 34, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 0, 54, 3, 6, 6, 13, 0, 0, - 0, 0, 14, 52, 53, 0, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 28, 52, 52, - 52, 52, 34, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 9, - 0, 11, 8, 7, 53, 52, 16, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 30, - - 31, 52, 52, 52, 37, 52, 52, 52, 40, 52, - 52, 52, 52, 52, 52, 52, 52, 49, 52, 0, - 52, 52, 18, 19, 52, 52, 22, 52, 25, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 42, - 52, 52, 45, 46, 4, 52, 48, 52, 52, 0, - 10, 52, 17, 52, 52, 52, 24, 5, 26, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 43, 52, - 47, 52, 51, 52, 52, 52, 23, 52, 52, 52, - 52, 36, 52, 39, 52, 52, 44, 52, 52, 52, - 21, 52, 29, 52, 52, 52, 35, 52, 52, 52, - - 52, 27, 32, 33, 52, 52, 52, 52, 52, 38, - 41, 52, 15, 20, 52, 52, 52, 52, 50, 0 + 55, 9, 0, 11, 8, 7, 53, 52, 16, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + + 52, 30, 31, 52, 52, 52, 37, 52, 52, 52, + 40, 52, 52, 52, 52, 52, 52, 52, 52, 49, + 52, 0, 54, 0, 0, 52, 52, 18, 19, 52, + 52, 22, 52, 25, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 42, 52, 52, 45, 46, 4, + 52, 48, 52, 52, 0, 10, 52, 17, 52, 52, + 52, 24, 5, 26, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 43, 52, 47, 52, 51, 52, 52, + 52, 23, 52, 52, 52, 52, 36, 52, 39, 52, + 52, 44, 52, 52, 52, 21, 52, 29, 52, 52, + + 52, 35, 52, 52, 52, 52, 27, 32, 33, 52, + 52, 52, 52, 52, 38, 41, 52, 15, 20, 52, + 52, 52, 52, 50, 0 } ; static const YY_CHAR yy_ec[256] = @@ -418,11 +420,11 @@ static const YY_CHAR yy_ec[256] = 6, 1, 1, 1, 14, 14, 14, 14, 15, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 1, 6, 1, 17, 1, 18, 19, 20, 21, + 6, 17, 6, 1, 18, 1, 19, 20, 21, 22, - 22, 23, 24, 25, 26, 16, 16, 27, 28, 29, - 30, 31, 16, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 6, 1, 6, 1, 1, 1, 1, 1, + 23, 24, 25, 26, 27, 16, 16, 28, 29, 30, + 31, 32, 16, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 6, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -439,156 +441,163 @@ static const YY_CHAR yy_ec[256] = 1, 1, 1, 1, 1 } ; -static const YY_CHAR yy_meta[41] = +static const YY_CHAR yy_meta[42] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 1, 4, 4, 5, 5, 4, 4, 4, - 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 + 3, 3, 1, 4, 4, 5, 1, 5, 4, 4, + 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5 } ; -static const flex_int16_t yy_base[227] = +static const flex_int16_t yy_base[233] = { 0, - 0, 0, 276, 277, 277, 277, 271, 0, 277, 31, - 265, 35, 18, 260, 0, 255, 20, 241, 33, 248, - 26, 40, 31, 247, 43, 36, 44, 246, 52, 56, - 249, 241, 261, 277, 0, 0, 0, 277, 73, 82, - 69, 0, 277, 0, 0, 247, 58, 231, 232, 228, - 231, 236, 225, 75, 230, 226, 226, 0, 78, 220, - 215, 223, 0, 217, 218, 227, 228, 213, 212, 215, - 217, 211, 209, 219, 205, 208, 207, 205, 214, 89, - 95, 103, 92, 0, 0, 205, 0, 216, 206, 210, - 198, 212, 207, 202, 199, 193, 207, 204, 196, 0, - - 0, 196, 195, 189, 0, 198, 188, 191, 0, 179, - 179, 188, 179, 183, 189, 183, 187, 182, 175, 109, - 172, 166, 0, 0, 170, 168, 176, 178, 0, 178, - 165, 164, 162, 168, 167, 159, 167, 160, 158, 173, - 167, 159, 0, 0, 0, 165, 0, 168, 163, 112, - 115, 166, 0, 151, 155, 158, 0, 0, 0, 154, - 158, 152, 151, 142, 155, 153, 150, 152, 0, 147, - 0, 141, 0, 135, 150, 133, 0, 136, 143, 124, - 123, 0, 144, 0, 122, 130, 0, 125, 132, 131, - 0, 127, 0, 133, 132, 119, 0, 123, 134, 120, - - 120, 0, 0, 0, 126, 113, 97, 89, 75, 0, - 0, 86, 0, 0, 52, 38, 34, 43, 0, 277, - 127, 132, 135, 137, 140, 142 + 0, 0, 298, 299, 299, 299, 38, 0, 299, 33, + 288, 47, 37, 283, 0, 277, 20, 263, 32, 270, + 36, 46, 37, 269, 49, 45, 52, 268, 61, 65, + 271, 263, 73, 299, 284, 0, 0, 97, 299, 83, + 92, 62, 0, 299, 0, 0, 269, 49, 253, 254, + 250, 253, 258, 247, 61, 252, 248, 248, 0, 89, + 242, 237, 245, 0, 239, 240, 249, 250, 235, 234, + 237, 239, 233, 231, 241, 227, 230, 229, 227, 236, + 109, 104, 111, 118, 107, 0, 0, 227, 0, 238, + 228, 232, 220, 234, 229, 224, 221, 215, 229, 226, + + 218, 0, 0, 218, 217, 211, 0, 220, 210, 213, + 0, 201, 201, 210, 201, 205, 211, 205, 209, 204, + 197, 121, 299, 0, 124, 194, 188, 0, 0, 192, + 190, 198, 200, 0, 200, 187, 186, 184, 190, 189, + 181, 189, 182, 180, 195, 189, 181, 0, 0, 0, + 187, 0, 190, 185, 129, 132, 188, 0, 173, 177, + 180, 0, 0, 0, 176, 180, 174, 173, 164, 177, + 175, 172, 174, 0, 169, 0, 163, 0, 157, 172, + 155, 0, 158, 165, 146, 145, 0, 166, 0, 144, + 152, 0, 147, 154, 153, 0, 149, 0, 155, 154, + + 141, 0, 145, 156, 142, 142, 0, 0, 0, 148, + 148, 133, 121, 111, 0, 0, 114, 0, 0, 112, + 80, 42, 32, 0, 299, 144, 149, 152, 154, 157, + 159, 164 } ; -static const flex_int16_t yy_def[227] = +static const flex_int16_t yy_def[233] = { 0, - 220, 1, 220, 220, 220, 220, 221, 222, 220, 220, - 220, 220, 12, 220, 223, 224, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 221, 220, 222, 12, 13, 220, 220, 220, - 220, 225, 220, 223, 226, 224, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 220, - 220, 220, 220, 225, 226, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 220, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 220, - 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 0, - 220, 220, 220, 220, 220, 220 + 225, 1, 225, 225, 225, 225, 226, 227, 225, 225, + 225, 225, 225, 225, 228, 229, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 226, 225, 226, 227, 12, 225, 225, 225, + 225, 225, 230, 225, 228, 231, 229, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 232, 225, 225, 225, 225, 230, 231, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 232, 225, 232, 225, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 225, 225, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 0, 225, 225, 225, 225, 225, + 225, 225 } ; -static const flex_int16_t yy_nxt[318] = +static const flex_int16_t yy_nxt[341] = { 0, 4, 5, 6, 7, 8, 9, 4, 10, 11, 12, - 13, 13, 14, 15, 15, 15, 16, 17, 18, 19, - 20, 21, 22, 15, 15, 23, 24, 25, 15, 26, - 27, 28, 29, 30, 15, 31, 32, 15, 15, 15, - 36, 37, 37, 39, 37, 37, 37, 220, 47, 40, - 50, 48, 53, 58, 54, 220, 40, 55, 63, 59, - 61, 65, 51, 219, 41, 218, 56, 217, 62, 68, - 64, 216, 42, 69, 57, 66, 70, 73, 83, 83, - 74, 71, 80, 80, 80, 72, 86, 75, 81, 81, - 76, 82, 82, 82, 77, 94, 87, 99, 80, 80, - - 80, 83, 83, 120, 82, 82, 82, 215, 214, 95, - 120, 100, 82, 82, 82, 150, 150, 213, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 33, 212, 33, - 33, 33, 35, 211, 35, 35, 35, 44, 44, 44, - 45, 45, 84, 84, 85, 85, 85, 210, 209, 208, - 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, - 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, - 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, - 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, - 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, - - 157, 156, 155, 154, 153, 152, 149, 148, 147, 146, - 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, - 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, - 125, 124, 123, 122, 121, 119, 118, 117, 116, 115, - 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, - 104, 103, 102, 101, 98, 97, 96, 93, 92, 91, - 90, 89, 88, 46, 34, 79, 78, 67, 60, 52, - 49, 46, 43, 38, 34, 220, 3, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220 + 13, 13, 14, 15, 15, 15, 4, 16, 17, 18, + 19, 20, 21, 22, 15, 15, 23, 24, 25, 15, + 26, 27, 28, 29, 30, 15, 31, 32, 15, 15, + 15, 34, 37, 38, 38, 40, 38, 38, 38, 48, + 51, 41, 49, 224, 35, 40, 38, 38, 38, 41, + 59, 41, 52, 54, 56, 55, 60, 62, 64, 41, + 66, 85, 85, 57, 223, 63, 34, 42, 88, 69, + 65, 58, 96, 70, 67, 43, 71, 74, 89, 35, + 75, 72, 82, 82, 82, 73, 97, 76, 83, 83, + + 77, 84, 84, 84, 78, 40, 38, 38, 38, 101, + 222, 41, 123, 82, 82, 82, 85, 85, 125, 41, + 84, 84, 84, 102, 123, 124, 125, 84, 84, 84, + 155, 155, 221, 156, 156, 156, 220, 124, 156, 156, + 156, 156, 156, 156, 33, 219, 33, 33, 33, 36, + 218, 36, 36, 36, 45, 45, 45, 46, 46, 86, + 86, 87, 87, 87, 122, 217, 122, 122, 122, 216, + 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, + 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, + 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, + + 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, + 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, + 165, 164, 163, 162, 161, 160, 159, 158, 157, 154, + 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, + 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, + 133, 132, 131, 130, 129, 128, 127, 126, 121, 120, + 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, + 109, 108, 107, 106, 105, 104, 103, 100, 99, 98, + 95, 94, 93, 92, 91, 90, 47, 81, 80, 79, + 68, 61, 53, 50, 47, 44, 39, 225, 3, 225, + + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225 } ; -static const flex_int16_t yy_chk[318] = +static const flex_int16_t yy_chk[341] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 10, 10, 10, 12, 12, 12, 12, 13, 17, 12, - 19, 17, 21, 23, 21, 13, 12, 22, 26, 23, - 25, 27, 19, 218, 12, 217, 22, 216, 25, 29, - 26, 215, 12, 29, 22, 27, 29, 30, 41, 41, - 30, 29, 39, 39, 39, 29, 47, 30, 40, 40, - 30, 40, 40, 40, 30, 54, 47, 59, 80, 80, - - 80, 83, 83, 80, 81, 81, 81, 212, 209, 54, - 80, 59, 82, 82, 82, 120, 120, 208, 120, 120, - 120, 150, 150, 150, 151, 151, 151, 221, 207, 221, - 221, 221, 222, 206, 222, 222, 222, 223, 223, 223, - 224, 224, 225, 225, 226, 226, 226, 205, 201, 200, - 199, 198, 196, 195, 194, 192, 190, 189, 188, 186, - 185, 183, 181, 180, 179, 178, 176, 175, 174, 172, - 170, 168, 167, 166, 165, 164, 163, 162, 161, 160, - 156, 155, 154, 152, 149, 148, 146, 142, 141, 140, - 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, - - 128, 127, 126, 125, 122, 121, 119, 118, 117, 116, - 115, 114, 113, 112, 111, 110, 108, 107, 106, 104, - 103, 102, 99, 98, 97, 96, 95, 94, 93, 92, - 91, 90, 89, 88, 86, 79, 78, 77, 76, 75, - 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, - 64, 62, 61, 60, 57, 56, 55, 53, 52, 51, - 50, 49, 48, 46, 33, 32, 31, 28, 24, 20, - 18, 16, 14, 11, 7, 3, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220 + 1, 7, 10, 10, 10, 13, 13, 13, 13, 17, + 19, 13, 17, 223, 7, 12, 12, 12, 12, 13, + 23, 12, 19, 21, 22, 21, 23, 25, 26, 12, + 27, 42, 42, 22, 222, 25, 33, 12, 48, 29, + 26, 22, 55, 29, 27, 12, 29, 30, 48, 33, + 30, 29, 40, 40, 40, 29, 55, 30, 41, 41, + + 30, 41, 41, 41, 30, 38, 38, 38, 38, 60, + 221, 38, 81, 82, 82, 82, 85, 85, 82, 38, + 83, 83, 83, 60, 122, 81, 82, 84, 84, 84, + 125, 125, 220, 125, 125, 125, 217, 122, 155, 155, + 155, 156, 156, 156, 226, 214, 226, 226, 226, 227, + 213, 227, 227, 227, 228, 228, 228, 229, 229, 230, + 230, 231, 231, 231, 232, 212, 232, 232, 232, 211, + 210, 206, 205, 204, 203, 201, 200, 199, 197, 195, + 194, 193, 191, 190, 188, 186, 185, 184, 183, 181, + 180, 179, 177, 175, 173, 172, 171, 170, 169, 168, + + 167, 166, 165, 161, 160, 159, 157, 154, 153, 151, + 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, + 137, 136, 135, 133, 132, 131, 130, 127, 126, 121, + 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, + 109, 108, 106, 105, 104, 101, 100, 99, 98, 97, + 96, 95, 94, 93, 92, 91, 90, 88, 80, 79, + 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, + 68, 67, 66, 65, 63, 62, 61, 58, 57, 56, + 54, 53, 52, 51, 50, 49, 47, 35, 32, 31, + 28, 24, 20, 18, 16, 14, 11, 3, 225, 225, + + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225 } ; /* Table of booleans, true if rule could match eol. */ -static const flex_int32_t yy_rule_can_match_eol[57] = +static const flex_int32_t yy_rule_can_match_eol[58] = { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -597,7 +606,7 @@ static const flex_int32_t yy_rule_can_match_eol[57] = #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET -#line 1 "./gecode/flatzinc/lexer.lxx" +#line 1 "gecode/flatzinc/lexer.lxx" /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* * Main authors: @@ -630,7 +639,7 @@ static const flex_int32_t yy_rule_can_match_eol[57] = * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ -#line 40 "./gecode/flatzinc/lexer.lxx" +#line 40 "gecode/flatzinc/lexer.lxx" #if defined __GNUC__ #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -644,6 +653,8 @@ void yyerror(void*, const char*); #include #include +#include +#include #include @@ -661,11 +672,39 @@ bool parseInt(const char* text, int& value) { return true; } +bool parseCaptureInt(const char* text, int& value) { + bool negative=*text=='-';if(negative)++text; + unsigned radix=10; + if(text[0]=='0'&&text[1]=='x'){radix=16;text+=2;} + else if(text[0]=='0'&&text[1]=='o'){radix=8;text+=2;} + const std::uint64_t maximum=negative?static_cast(-static_cast(Gecode::Int::Limits::min)): + static_cast(Gecode::Int::Limits::max); + std::uint64_t result=0;if(!*text)return false; + for(;*text;++text){ + const unsigned char c=static_cast(*text); + unsigned digit=c>='0'&&c<='9'?c-'0':c>='a'&&c<='f'?c-'a'+10:c>='A'&&c<='F'?c-'A'+10:99; + if(digit>=radix||result>(maximum-digit)/radix)return false; + result=result*radix+digit; + } + value=static_cast(negative?-static_cast(result):static_cast(result));return true; +} + +bool parseCaptureFloat(const char* text,double& value) { + std::istringstream input(text);input.imbue(std::locale::classic()); + input >> std::noskipws >> value; + if(input.fail() || !input.eof() || !std::isfinite(value)) return false; + if(value==0) { + for(const char* p=text;*p && *p!='e' && *p!='E';++p) + if(*p>='1' && *p<='9')return false; // nonzero literal underflowed to zero + } + return true; +} + int yy_input_proc(char* buf, int size, yyscan_t yyscanner); #define YY_INPUT(buf, result, max_size) \ result = yy_input_proc(buf, max_size, yyscanner); -#line 667 "gecode/flatzinc/lexer.yy.cpp" -#line 668 "gecode/flatzinc/lexer.yy.cpp" +#line 706 "gecode/flatzinc/lexer.yy.cpp" +#line 707 "gecode/flatzinc/lexer.yy.cpp" #define INITIAL 0 @@ -694,8 +733,8 @@ struct yyguts_t size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; - int yy_n_chars; - int yyleng_r; + yy_size_t yy_n_chars; + yy_size_t yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; @@ -722,7 +761,7 @@ static int yy_init_globals ( yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ # define yylval yyg->yylval_r - + int yylex_init (yyscan_t* scanner); int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); @@ -748,7 +787,7 @@ FILE *yyget_out ( yyscan_t yyscanner ); void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); - int yyget_leng ( yyscan_t yyscanner ); + yy_size_t yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); @@ -777,9 +816,9 @@ extern int yywrap ( yyscan_t yyscanner ); #endif #ifndef YY_NO_UNPUT - + static void yyunput ( int c, char *buf_ptr , yyscan_t yyscanner); - + #endif #ifndef yytext_ptr @@ -825,7 +864,7 @@ static int input ( yyscan_t yyscanner ); if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - int n; \ + yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -939,10 +978,10 @@ YY_DECL } { -#line 75 "./gecode/flatzinc/lexer.lxx" +#line 105 "gecode/flatzinc/lexer.lxx" -#line 945 "gecode/flatzinc/lexer.yy.cpp" +#line 984 "gecode/flatzinc/lexer.yy.cpp" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -969,13 +1008,13 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 221 ) + if ( yy_current_state >= 226 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 277 ); + while ( yy_base[yy_current_state] != 299 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -990,10 +1029,10 @@ YY_DECL if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { - int yyl; + yy_size_t yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) - + do{ yylineno++; yycolumn=0; }while(0) @@ -1014,33 +1053,33 @@ YY_DECL case 1: /* rule 1 can match eol */ YY_RULE_SETUP -#line 77 "./gecode/flatzinc/lexer.lxx" +#line 107 "gecode/flatzinc/lexer.lxx" { /*yylineno++;*/ /* ignore EOL */ } YY_BREAK case 2: YY_RULE_SETUP -#line 78 "./gecode/flatzinc/lexer.lxx" +#line 108 "gecode/flatzinc/lexer.lxx" { /* ignore whitespace */ } YY_BREAK case 3: YY_RULE_SETUP -#line 79 "./gecode/flatzinc/lexer.lxx" +#line 109 "gecode/flatzinc/lexer.lxx" { /* ignore comments */ } YY_BREAK case 4: YY_RULE_SETUP -#line 81 "./gecode/flatzinc/lexer.lxx" +#line 111 "gecode/flatzinc/lexer.lxx" { yylval->iValue = 1; return FZ_BOOL_LIT; } YY_BREAK case 5: YY_RULE_SETUP -#line 82 "./gecode/flatzinc/lexer.lxx" +#line 112 "gecode/flatzinc/lexer.lxx" { yylval->iValue = 0; return FZ_BOOL_LIT; } YY_BREAK case 6: YY_RULE_SETUP -#line 83 "./gecode/flatzinc/lexer.lxx" -{ if (parseInt(yytext,yylval->iValue)) +#line 113 "gecode/flatzinc/lexer.lxx" +{ if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -1052,8 +1091,8 @@ YY_RULE_SETUP YY_BREAK case 7: YY_RULE_SETUP -#line 92 "./gecode/flatzinc/lexer.lxx" -{ if (parseInt(yytext,yylval->iValue)) +#line 122 "gecode/flatzinc/lexer.lxx" +{ if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -1065,8 +1104,8 @@ YY_RULE_SETUP YY_BREAK case 8: YY_RULE_SETUP -#line 101 "./gecode/flatzinc/lexer.lxx" -{ if (parseInt(yytext,yylval->iValue)) +#line 131 "gecode/flatzinc/lexer.lxx" +{ if (static_cast(yyextra)->capture ? parseCaptureInt(yytext,yylval->iValue) : parseInt(yytext,yylval->iValue)) return FZ_INT_LIT; else yyerror(("The literal '" + std::string(yytext) @@ -1078,251 +1117,270 @@ YY_RULE_SETUP YY_BREAK case 9: YY_RULE_SETUP -#line 110 "./gecode/flatzinc/lexer.lxx" -{ yylval->dValue = strtod(yytext,NULL); +#line 140 "gecode/flatzinc/lexer.lxx" +{ if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } YY_BREAK case 10: YY_RULE_SETUP -#line 112 "./gecode/flatzinc/lexer.lxx" -{ yylval->dValue = strtod(yytext,NULL); +#line 144 "gecode/flatzinc/lexer.lxx" +{ if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } YY_BREAK case 11: YY_RULE_SETUP -#line 114 "./gecode/flatzinc/lexer.lxx" -{ yylval->dValue = strtod(yytext,NULL); +#line 148 "gecode/flatzinc/lexer.lxx" +{ if(static_cast(yyextra)->capture) { + if(!parseCaptureFloat(yytext,yylval->dValue)) yyerror("Float literal is nonfinite or outside representable range"); + } else yylval->dValue = strtod(yytext,NULL); return FZ_FLOAT_LIT; } YY_BREAK case 12: YY_RULE_SETUP -#line 116 "./gecode/flatzinc/lexer.lxx" +#line 152 "gecode/flatzinc/lexer.lxx" { return *yytext; } YY_BREAK case 13: YY_RULE_SETUP -#line 117 "./gecode/flatzinc/lexer.lxx" +#line 153 "gecode/flatzinc/lexer.lxx" { return FZ_DOTDOT; } YY_BREAK case 14: YY_RULE_SETUP -#line 118 "./gecode/flatzinc/lexer.lxx" +#line 154 "gecode/flatzinc/lexer.lxx" { return FZ_COLONCOLON; } YY_BREAK case 15: YY_RULE_SETUP -#line 119 "./gecode/flatzinc/lexer.lxx" +#line 155 "gecode/flatzinc/lexer.lxx" { return FZ_ANNOTATION; } YY_BREAK case 16: YY_RULE_SETUP -#line 120 "./gecode/flatzinc/lexer.lxx" +#line 156 "gecode/flatzinc/lexer.lxx" { return FZ_ANY; } YY_BREAK case 17: YY_RULE_SETUP -#line 121 "./gecode/flatzinc/lexer.lxx" +#line 157 "gecode/flatzinc/lexer.lxx" { return FZ_ARRAY; } YY_BREAK case 18: YY_RULE_SETUP -#line 122 "./gecode/flatzinc/lexer.lxx" +#line 158 "gecode/flatzinc/lexer.lxx" { return FZ_BOOL; } YY_BREAK case 19: YY_RULE_SETUP -#line 123 "./gecode/flatzinc/lexer.lxx" +#line 159 "gecode/flatzinc/lexer.lxx" { return FZ_CASE; } YY_BREAK case 20: YY_RULE_SETUP -#line 124 "./gecode/flatzinc/lexer.lxx" +#line 160 "gecode/flatzinc/lexer.lxx" { return FZ_CONSTRAINT; } YY_BREAK case 21: YY_RULE_SETUP -#line 125 "./gecode/flatzinc/lexer.lxx" +#line 161 "gecode/flatzinc/lexer.lxx" { return FZ_DEFAULT; } YY_BREAK case 22: YY_RULE_SETUP -#line 126 "./gecode/flatzinc/lexer.lxx" +#line 162 "gecode/flatzinc/lexer.lxx" { return FZ_ELSE; } YY_BREAK case 23: YY_RULE_SETUP -#line 127 "./gecode/flatzinc/lexer.lxx" +#line 163 "gecode/flatzinc/lexer.lxx" { return FZ_ELSEIF; } YY_BREAK case 24: YY_RULE_SETUP -#line 128 "./gecode/flatzinc/lexer.lxx" +#line 164 "gecode/flatzinc/lexer.lxx" { return FZ_ENDIF; } YY_BREAK case 25: YY_RULE_SETUP -#line 129 "./gecode/flatzinc/lexer.lxx" +#line 165 "gecode/flatzinc/lexer.lxx" { return FZ_ENUM; } YY_BREAK case 26: YY_RULE_SETUP -#line 130 "./gecode/flatzinc/lexer.lxx" +#line 166 "gecode/flatzinc/lexer.lxx" { return FZ_FLOAT; } YY_BREAK case 27: YY_RULE_SETUP -#line 131 "./gecode/flatzinc/lexer.lxx" +#line 167 "gecode/flatzinc/lexer.lxx" { return FZ_FUNCTION; } YY_BREAK case 28: YY_RULE_SETUP -#line 132 "./gecode/flatzinc/lexer.lxx" +#line 168 "gecode/flatzinc/lexer.lxx" { return FZ_IF; } YY_BREAK case 29: YY_RULE_SETUP -#line 133 "./gecode/flatzinc/lexer.lxx" +#line 169 "gecode/flatzinc/lexer.lxx" { return FZ_INCLUDE; } YY_BREAK case 30: YY_RULE_SETUP -#line 134 "./gecode/flatzinc/lexer.lxx" +#line 170 "gecode/flatzinc/lexer.lxx" { return FZ_INT; } YY_BREAK case 31: YY_RULE_SETUP -#line 135 "./gecode/flatzinc/lexer.lxx" +#line 171 "gecode/flatzinc/lexer.lxx" { return FZ_LET; } YY_BREAK case 32: YY_RULE_SETUP -#line 136 "./gecode/flatzinc/lexer.lxx" +#line 172 "gecode/flatzinc/lexer.lxx" { yylval->bValue = false; return FZ_MAXIMIZE; } YY_BREAK case 33: YY_RULE_SETUP -#line 137 "./gecode/flatzinc/lexer.lxx" +#line 173 "gecode/flatzinc/lexer.lxx" { yylval->bValue = true; return FZ_MINIMIZE; } YY_BREAK case 34: YY_RULE_SETUP -#line 138 "./gecode/flatzinc/lexer.lxx" +#line 174 "gecode/flatzinc/lexer.lxx" { return FZ_OF; } YY_BREAK case 35: YY_RULE_SETUP -#line 139 "./gecode/flatzinc/lexer.lxx" +#line 175 "gecode/flatzinc/lexer.lxx" { return FZ_SATISFY; } YY_BREAK case 36: YY_RULE_SETUP -#line 140 "./gecode/flatzinc/lexer.lxx" +#line 176 "gecode/flatzinc/lexer.lxx" { return FZ_OUTPUT; } YY_BREAK case 37: YY_RULE_SETUP -#line 141 "./gecode/flatzinc/lexer.lxx" +#line 177 "gecode/flatzinc/lexer.lxx" { yylval->bValue = false; return FZ_PAR; } YY_BREAK case 38: YY_RULE_SETUP -#line 142 "./gecode/flatzinc/lexer.lxx" +#line 178 "gecode/flatzinc/lexer.lxx" { return FZ_PREDICATE; } YY_BREAK case 39: YY_RULE_SETUP -#line 143 "./gecode/flatzinc/lexer.lxx" +#line 179 "gecode/flatzinc/lexer.lxx" { return FZ_RECORD; } YY_BREAK case 40: YY_RULE_SETUP -#line 144 "./gecode/flatzinc/lexer.lxx" +#line 180 "gecode/flatzinc/lexer.lxx" { return FZ_SET; } YY_BREAK case 41: YY_RULE_SETUP -#line 145 "./gecode/flatzinc/lexer.lxx" +#line 181 "gecode/flatzinc/lexer.lxx" { return FZ_SHOWCOND; } YY_BREAK case 42: YY_RULE_SETUP -#line 146 "./gecode/flatzinc/lexer.lxx" +#line 182 "gecode/flatzinc/lexer.lxx" { return FZ_SHOW; } YY_BREAK case 43: YY_RULE_SETUP -#line 147 "./gecode/flatzinc/lexer.lxx" +#line 183 "gecode/flatzinc/lexer.lxx" { return FZ_SOLVE; } YY_BREAK case 44: YY_RULE_SETUP -#line 148 "./gecode/flatzinc/lexer.lxx" +#line 184 "gecode/flatzinc/lexer.lxx" { return FZ_STRING; } YY_BREAK case 45: YY_RULE_SETUP -#line 149 "./gecode/flatzinc/lexer.lxx" +#line 185 "gecode/flatzinc/lexer.lxx" { return FZ_TEST; } YY_BREAK case 46: YY_RULE_SETUP -#line 150 "./gecode/flatzinc/lexer.lxx" +#line 186 "gecode/flatzinc/lexer.lxx" { return FZ_THEN; } YY_BREAK case 47: YY_RULE_SETUP -#line 151 "./gecode/flatzinc/lexer.lxx" +#line 187 "gecode/flatzinc/lexer.lxx" { return FZ_TUPLE; } YY_BREAK case 48: YY_RULE_SETUP -#line 152 "./gecode/flatzinc/lexer.lxx" +#line 188 "gecode/flatzinc/lexer.lxx" { return FZ_TYPE; } YY_BREAK case 49: YY_RULE_SETUP -#line 153 "./gecode/flatzinc/lexer.lxx" +#line 189 "gecode/flatzinc/lexer.lxx" { yylval->bValue = true; return FZ_VAR; } YY_BREAK case 50: YY_RULE_SETUP -#line 154 "./gecode/flatzinc/lexer.lxx" +#line 190 "gecode/flatzinc/lexer.lxx" { return FZ_VARIANT_RECORD; } YY_BREAK case 51: YY_RULE_SETUP -#line 155 "./gecode/flatzinc/lexer.lxx" +#line 191 "gecode/flatzinc/lexer.lxx" { return FZ_WHERE; } YY_BREAK case 52: YY_RULE_SETUP -#line 156 "./gecode/flatzinc/lexer.lxx" +#line 192 "gecode/flatzinc/lexer.lxx" { yylval->sValue = strdup(yytext); return FZ_ID; } YY_BREAK case 53: YY_RULE_SETUP -#line 157 "./gecode/flatzinc/lexer.lxx" +#line 193 "gecode/flatzinc/lexer.lxx" { yylval->sValue = strdup(yytext); return FZ_U_ID; } YY_BREAK case 54: YY_RULE_SETUP -#line 158 "./gecode/flatzinc/lexer.lxx" +#line 194 "gecode/flatzinc/lexer.lxx" { + if(!static_cast(yyextra)->capture) { + // Preserve the legacy scanner's first-quote behavior. + const char* close=strchr(yytext+1,'"'); + yyless(static_cast(close-yytext+1)); + } yylval->sValue = strdup(yytext+1); yylval->sValue[strlen(yytext)-2] = 0; return FZ_STRING_LIT; } YY_BREAK case 55: YY_RULE_SETUP -#line 162 "./gecode/flatzinc/lexer.lxx" -{ yyerror("Unknown character"); } +#line 203 "gecode/flatzinc/lexer.lxx" +{ + yylval->sValue = strdup(yytext+1); + yylval->sValue[strlen(yytext)-2] = 0; + return FZ_STRING_LIT; } YY_BREAK case 56: YY_RULE_SETUP -#line 163 "./gecode/flatzinc/lexer.lxx" +#line 207 "gecode/flatzinc/lexer.lxx" +{ yyerror("Unknown character"); } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 208 "gecode/flatzinc/lexer.lxx" ECHO; YY_BREAK -#line 1325 "gecode/flatzinc/lexer.yy.cpp" +#line 1383 "gecode/flatzinc/lexer.yy.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1510,7 +1568,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else { - int num_to_read = + yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) @@ -1524,7 +1582,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) if ( b->yy_is_our_buffer ) { - int new_size = b->yy_buf_size * 2; + yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -1582,7 +1640,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ - int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) @@ -1621,7 +1679,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 221 ) + if ( yy_current_state >= 226 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1650,11 +1708,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 221 ) + if ( yy_current_state >= 226 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 220); + yy_is_jam = (yy_current_state == 225); (void)yyg; return yy_is_jam ? 0 : yy_current_state; @@ -1675,7 +1733,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - int number_to_move = yyg->yy_n_chars + 2; + yy_size_t number_to_move = yyg->yy_n_chars + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = @@ -1731,7 +1789,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else { /* need more input */ - int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); + yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr; ++yyg->yy_c_buf_p; switch ( yy_get_next_buffer( yyscanner ) ) @@ -1778,7 +1836,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) yyg->yy_hold_char = *++yyg->yy_c_buf_p; if ( c == '\n' ) - + do{ yylineno++; yycolumn=0; }while(0) @@ -1861,7 +1919,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; - + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -1927,7 +1985,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - + errno = oerrno; } @@ -2069,7 +2127,7 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; - + if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) @@ -2105,7 +2163,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann */ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) { - + return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); } @@ -2116,13 +2174,13 @@ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; yy_size_t n; - int i; - + yy_size_t i; + /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n , yyscanner ); @@ -2165,7 +2223,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) do \ { \ /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ + yy_size_t yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ @@ -2195,7 +2253,7 @@ int yyget_lineno (yyscan_t yyscanner) if (! YY_CURRENT_BUFFER) return 0; - + return yylineno; } @@ -2208,7 +2266,7 @@ int yyget_column (yyscan_t yyscanner) if (! YY_CURRENT_BUFFER) return 0; - + return yycolumn; } @@ -2233,7 +2291,7 @@ FILE *yyget_out (yyscan_t yyscanner) /** Get the length of the current token. * @param yyscanner The scanner object. */ -int yyget_leng (yyscan_t yyscanner) +yy_size_t yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; @@ -2270,7 +2328,7 @@ void yyset_lineno (int _line_number , yyscan_t yyscanner) /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); - + yylineno = _line_number; } @@ -2285,7 +2343,7 @@ void yyset_column (int _column_no , yyscan_t yyscanner) /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_column called with no buffer" ); - + yycolumn = _column_no; } @@ -2514,7 +2572,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 163 "./gecode/flatzinc/lexer.lxx" +#line 208 "gecode/flatzinc/lexer.lxx" int yy_input_proc(char* buf, int size, yyscan_t yyscanner) { Gecode::FlatZinc::ParserState* parm = @@ -2523,4 +2581,3 @@ int yy_input_proc(char* buf, int size, yyscan_t yyscanner) { // work around warning that yyunput is unused yyunput (0,buf,yyscanner); } - diff --git a/gecode/flatzinc/parser.hh b/gecode/flatzinc/parser.hh index ab8b6b0881..44260e1751 100644 --- a/gecode/flatzinc/parser.hh +++ b/gecode/flatzinc/parser.hh @@ -35,6 +35,7 @@ #define FLATZINC_PARSER_HH #include +#include // This is a workaround for a bug in flex that only shows up // with the Microsoft C++ compiler @@ -181,19 +182,45 @@ namespace Gecode { namespace FlatZinc { return SymbolEntry(ST_FLOATVALARRAY, i); } + class ParserState; + /** Private parser bridge; absent for every legacy parse entry point. */ + class CaptureParser { + public: + Capture::Options options; + Capture::Records records; + Capture::Status status = Capture::Status::Complete; + std::vector diagnostics; + std::array namespace_counts{}; + bool declarations_recorded = false; + bool solve_recorded = false; + explicit CaptureParser(const Capture::Options& value) : options(value) {} + void fail(ParserState&, Capture::Status, const std::string&); + bool array_size(ParserState&, int); + bool variable_count(ParserState&, int, bool initialized_array=false); + bool annotations(ParserState&, AST::Array*); + void declaration(ParserState&, const std::string&, AST::Array*, int output_length=-1); + void begin(ParserState&); + void constraint(ParserState&, const std::string&, AST::Array*, AST::Array*); + void objective(ParserState&, AST::Node*); + void solve(ParserState&, Capture::Method, AST::Array*); + void finish(ParserState&); + static void cleanup(ParserState&) noexcept; + }; + /// %State of the %FlatZinc parser class ParserState { public: ParserState(const std::string& b, std::ostream& err0, Gecode::FlatZinc::FlatZincSpace* fg0) - : buf(b.c_str()), pos(0), length(b.size()), fg(fg0), + : yyscanner(nullptr), buf(b.c_str()), pos(0), length(b.size()), fg(fg0), hadError(false), err(err0) {} ParserState(char* buf0, int length0, std::ostream& err0, Gecode::FlatZinc::FlatZincSpace* fg0) - : buf(buf0), pos(0), length(length0), fg(fg0), + : yyscanner(nullptr), buf(buf0), pos(0), length(length0), fg(fg0), hadError(false), err(err0) {} + CaptureParser* capture = nullptr; // nonowning; lifetime is the capture call void* yyscanner; const char* buf; unsigned int pos, length; diff --git a/gecode/flatzinc/parser.tab.cpp b/gecode/flatzinc/parser.tab.cpp index e2e818290b..b72ac91b18 100644 --- a/gecode/flatzinc/parser.tab.cpp +++ b/gecode/flatzinc/parser.tab.cpp @@ -67,7 +67,7 @@ /* First part of user prologue. */ -#line 37 "./gecode/flatzinc/parser.yxx" +#line 37 "gecode/flatzinc/parser.yxx" #define YYPARSE_PARAM parm #define YYLEX_PARAM static_cast(parm)->yyscanner @@ -183,6 +183,10 @@ AST::Node* getArrayElement(ParserState* pp, string id, int offset, } return new AST::FloatVar(pp->arrays[e.i+offset],n); } + case ST_BOOLVALARRAY: + if(!pp->capture) break; + if(offset>pp->arrays[e.i]) goto error; + return new AST::BoolLit(pp->arrays[e.i+offset]); case ST_INTVALARRAY: if (offset > pp->arrays[e.i]) goto error; @@ -233,18 +237,32 @@ AST::Node* getVarRefArg(ParserState* pp, string id, bool annotation = false) { void addDomainConstraint(ParserState* pp, std::string id, AST::Node* var, Option& dom) { - if (!dom()) + if (!dom()) { + if(pp->capture) delete var; return; + } + if(pp->capture && pp->domainConstraints.size()>=pp->capture->options.max_constraints) { + pp->capture->fail(*pp,Capture::Status::ResourceLimit,"declaration domain count exceeds capture limit"); + delete var;delete dom.some();dom=Option::none();return; + } AST::Array* args = new AST::Array(2); args->a[0] = var; args->a[1] = dom.some(); pp->domainConstraints.push_back(new ConExpr(id, args, NULL)); + if(pp->capture) dom=Option::none(); } void addDomainConstraint(ParserState* pp, AST::Node* var, Option* > dom) { - if (!dom()) + if (!dom()) { + if(pp->capture) delete var; return; + } + if(pp->capture && (pp->capture->options.max_constraints<2 || + pp->domainConstraints.size()>pp->capture->options.max_constraints-2)) { + pp->capture->fail(*pp,Capture::Status::ResourceLimit,"declaration domain count exceeds capture limit"); + delete var;delete dom.some();dom=Option*>::none();return; + } { AST::Array* args = new AST::Array(2); args->a[0] = new AST::FloatLit(dom.some()->first); @@ -259,6 +277,7 @@ void addDomainConstraint(ParserState* pp, AST::Node* var, pp->domainConstraints.push_back(new ConExpr("float_le", args, NULL)); } delete dom.some(); + if(pp->capture) dom=Option*>::none(); } int getBaseIntVar(ParserState* pp, int i) { @@ -304,6 +323,7 @@ int getBaseSetVar(ParserState* pp, int i) { */ void initfg(ParserState* pp) { + if (pp->capture) return; // capture never creates native variables/actors if (!pp->hadError) pp->fg->init(pp->intvars.size(), pp->boolvars.size(), @@ -528,13 +548,14 @@ void fillPrinter(ParserState& pp, Gecode::FlatZinc::Printer& p) { #endif } -AST::Node* arrayOutput(AST::Call* ann) { +AST::Node* arrayOutput(AST::Call* ann, bool capture=false) { + AST::Node* dimensions=capture ? ann->args->getArray()->a.at(0) : ann->args; AST::Array* a = NULL; - if (ann->args->isArray()) { - a = ann->args->getArray(); + if (dimensions->isArray()) { + a = dimensions->getArray(); } else { - a = new AST::Array(ann->args); + a = new AST::Array(dimensions); } std::ostringstream oss; @@ -557,7 +578,7 @@ AST::Node* arrayOutput(AST::Call* ann) { } } - if (!ann->args->isArray()) { + if (!dimensions->isArray()) { a->a[0] = NULL; delete a; } @@ -644,7 +665,7 @@ namespace Gecode { namespace FlatZinc { }} -#line 648 "gecode/flatzinc/parser.tab.cpp" +#line 669 "gecode/flatzinc/parser.tab.cpp" # ifndef YY_CAST # ifdef __cplusplus @@ -732,72 +753,73 @@ enum yysymbol_kind_t YYSYMBOL_57_ = 57, /* '}' */ YYSYMBOL_YYACCEPT = 58, /* $accept */ YYSYMBOL_model = 59, /* model */ - YYSYMBOL_preddecl_items = 60, /* preddecl_items */ - YYSYMBOL_preddecl_items_head = 61, /* preddecl_items_head */ - YYSYMBOL_vardecl_items = 62, /* vardecl_items */ - YYSYMBOL_vardecl_items_head = 63, /* vardecl_items_head */ - YYSYMBOL_constraint_items = 64, /* constraint_items */ - YYSYMBOL_constraint_items_head = 65, /* constraint_items_head */ - YYSYMBOL_preddecl_item = 66, /* preddecl_item */ - YYSYMBOL_pred_arg_list = 67, /* pred_arg_list */ - YYSYMBOL_pred_arg_list_head = 68, /* pred_arg_list_head */ - YYSYMBOL_pred_arg = 69, /* pred_arg */ - YYSYMBOL_pred_arg_type = 70, /* pred_arg_type */ - YYSYMBOL_pred_arg_simple_type = 71, /* pred_arg_simple_type */ - YYSYMBOL_pred_array_init = 72, /* pred_array_init */ - YYSYMBOL_pred_array_init_arg = 73, /* pred_array_init_arg */ - YYSYMBOL_var_par_id = 74, /* var_par_id */ - YYSYMBOL_vardecl_item = 75, /* vardecl_item */ - YYSYMBOL_int_init = 76, /* int_init */ - YYSYMBOL_int_init_list = 77, /* int_init_list */ - YYSYMBOL_int_init_list_head = 78, /* int_init_list_head */ - YYSYMBOL_list_tail = 79, /* list_tail */ - YYSYMBOL_int_var_array_literal = 80, /* int_var_array_literal */ - YYSYMBOL_float_init = 81, /* float_init */ - YYSYMBOL_float_init_list = 82, /* float_init_list */ - YYSYMBOL_float_init_list_head = 83, /* float_init_list_head */ - YYSYMBOL_float_var_array_literal = 84, /* float_var_array_literal */ - YYSYMBOL_bool_init = 85, /* bool_init */ - YYSYMBOL_bool_init_list = 86, /* bool_init_list */ - YYSYMBOL_bool_init_list_head = 87, /* bool_init_list_head */ - YYSYMBOL_bool_var_array_literal = 88, /* bool_var_array_literal */ - YYSYMBOL_set_init = 89, /* set_init */ - YYSYMBOL_set_init_list = 90, /* set_init_list */ - YYSYMBOL_set_init_list_head = 91, /* set_init_list_head */ - YYSYMBOL_set_var_array_literal = 92, /* set_var_array_literal */ - YYSYMBOL_vardecl_int_var_array_init = 93, /* vardecl_int_var_array_init */ - YYSYMBOL_vardecl_bool_var_array_init = 94, /* vardecl_bool_var_array_init */ - YYSYMBOL_vardecl_float_var_array_init = 95, /* vardecl_float_var_array_init */ - YYSYMBOL_vardecl_set_var_array_init = 96, /* vardecl_set_var_array_init */ - YYSYMBOL_constraint_item = 97, /* constraint_item */ - YYSYMBOL_solve_item = 98, /* solve_item */ - YYSYMBOL_int_ti_expr_tail = 99, /* int_ti_expr_tail */ - YYSYMBOL_bool_ti_expr_tail = 100, /* bool_ti_expr_tail */ - YYSYMBOL_float_ti_expr_tail = 101, /* float_ti_expr_tail */ - YYSYMBOL_set_literal = 102, /* set_literal */ - YYSYMBOL_int_list = 103, /* int_list */ - YYSYMBOL_int_list_head = 104, /* int_list_head */ - YYSYMBOL_bool_list = 105, /* bool_list */ - YYSYMBOL_bool_list_head = 106, /* bool_list_head */ - YYSYMBOL_float_list = 107, /* float_list */ - YYSYMBOL_float_list_head = 108, /* float_list_head */ - YYSYMBOL_set_literal_list = 109, /* set_literal_list */ - YYSYMBOL_set_literal_list_head = 110, /* set_literal_list_head */ - YYSYMBOL_flat_expr_list = 111, /* flat_expr_list */ - YYSYMBOL_flat_expr = 112, /* flat_expr */ - YYSYMBOL_non_array_expr_opt = 113, /* non_array_expr_opt */ - YYSYMBOL_non_array_expr = 114, /* non_array_expr */ - YYSYMBOL_non_array_expr_list = 115, /* non_array_expr_list */ - YYSYMBOL_non_array_expr_list_head = 116, /* non_array_expr_list_head */ - YYSYMBOL_solve_expr = 117, /* solve_expr */ - YYSYMBOL_minmax = 118, /* minmax */ - YYSYMBOL_annotations = 119, /* annotations */ - YYSYMBOL_annotations_head = 120, /* annotations_head */ - YYSYMBOL_annotation = 121, /* annotation */ - YYSYMBOL_annotation_list = 122, /* annotation_list */ - YYSYMBOL_annotation_expr = 123, /* annotation_expr */ - YYSYMBOL_annotation_list_tail = 124, /* annotation_list_tail */ - YYSYMBOL_ann_non_array_expr = 125 /* ann_non_array_expr */ + YYSYMBOL_60_1 = 60, /* $@1 */ + YYSYMBOL_preddecl_items = 61, /* preddecl_items */ + YYSYMBOL_preddecl_items_head = 62, /* preddecl_items_head */ + YYSYMBOL_vardecl_items = 63, /* vardecl_items */ + YYSYMBOL_vardecl_items_head = 64, /* vardecl_items_head */ + YYSYMBOL_constraint_items = 65, /* constraint_items */ + YYSYMBOL_constraint_items_head = 66, /* constraint_items_head */ + YYSYMBOL_preddecl_item = 67, /* preddecl_item */ + YYSYMBOL_pred_arg_list = 68, /* pred_arg_list */ + YYSYMBOL_pred_arg_list_head = 69, /* pred_arg_list_head */ + YYSYMBOL_pred_arg = 70, /* pred_arg */ + YYSYMBOL_pred_arg_type = 71, /* pred_arg_type */ + YYSYMBOL_pred_arg_simple_type = 72, /* pred_arg_simple_type */ + YYSYMBOL_pred_array_init = 73, /* pred_array_init */ + YYSYMBOL_pred_array_init_arg = 74, /* pred_array_init_arg */ + YYSYMBOL_var_par_id = 75, /* var_par_id */ + YYSYMBOL_vardecl_item = 76, /* vardecl_item */ + YYSYMBOL_int_init = 77, /* int_init */ + YYSYMBOL_int_init_list = 78, /* int_init_list */ + YYSYMBOL_int_init_list_head = 79, /* int_init_list_head */ + YYSYMBOL_list_tail = 80, /* list_tail */ + YYSYMBOL_int_var_array_literal = 81, /* int_var_array_literal */ + YYSYMBOL_float_init = 82, /* float_init */ + YYSYMBOL_float_init_list = 83, /* float_init_list */ + YYSYMBOL_float_init_list_head = 84, /* float_init_list_head */ + YYSYMBOL_float_var_array_literal = 85, /* float_var_array_literal */ + YYSYMBOL_bool_init = 86, /* bool_init */ + YYSYMBOL_bool_init_list = 87, /* bool_init_list */ + YYSYMBOL_bool_init_list_head = 88, /* bool_init_list_head */ + YYSYMBOL_bool_var_array_literal = 89, /* bool_var_array_literal */ + YYSYMBOL_set_init = 90, /* set_init */ + YYSYMBOL_set_init_list = 91, /* set_init_list */ + YYSYMBOL_set_init_list_head = 92, /* set_init_list_head */ + YYSYMBOL_set_var_array_literal = 93, /* set_var_array_literal */ + YYSYMBOL_vardecl_int_var_array_init = 94, /* vardecl_int_var_array_init */ + YYSYMBOL_vardecl_bool_var_array_init = 95, /* vardecl_bool_var_array_init */ + YYSYMBOL_vardecl_float_var_array_init = 96, /* vardecl_float_var_array_init */ + YYSYMBOL_vardecl_set_var_array_init = 97, /* vardecl_set_var_array_init */ + YYSYMBOL_constraint_item = 98, /* constraint_item */ + YYSYMBOL_solve_item = 99, /* solve_item */ + YYSYMBOL_int_ti_expr_tail = 100, /* int_ti_expr_tail */ + YYSYMBOL_bool_ti_expr_tail = 101, /* bool_ti_expr_tail */ + YYSYMBOL_float_ti_expr_tail = 102, /* float_ti_expr_tail */ + YYSYMBOL_set_literal = 103, /* set_literal */ + YYSYMBOL_int_list = 104, /* int_list */ + YYSYMBOL_int_list_head = 105, /* int_list_head */ + YYSYMBOL_bool_list = 106, /* bool_list */ + YYSYMBOL_bool_list_head = 107, /* bool_list_head */ + YYSYMBOL_float_list = 108, /* float_list */ + YYSYMBOL_float_list_head = 109, /* float_list_head */ + YYSYMBOL_set_literal_list = 110, /* set_literal_list */ + YYSYMBOL_set_literal_list_head = 111, /* set_literal_list_head */ + YYSYMBOL_flat_expr_list = 112, /* flat_expr_list */ + YYSYMBOL_flat_expr = 113, /* flat_expr */ + YYSYMBOL_non_array_expr_opt = 114, /* non_array_expr_opt */ + YYSYMBOL_non_array_expr = 115, /* non_array_expr */ + YYSYMBOL_non_array_expr_list = 116, /* non_array_expr_list */ + YYSYMBOL_non_array_expr_list_head = 117, /* non_array_expr_list_head */ + YYSYMBOL_solve_expr = 118, /* solve_expr */ + YYSYMBOL_minmax = 119, /* minmax */ + YYSYMBOL_annotations = 120, /* annotations */ + YYSYMBOL_annotations_head = 121, /* annotations_head */ + YYSYMBOL_annotation = 122, /* annotation */ + YYSYMBOL_annotation_list = 123, /* annotation_list */ + YYSYMBOL_annotation_expr = 124, /* annotation_expr */ + YYSYMBOL_annotation_list_tail = 125, /* annotation_list_tail */ + YYSYMBOL_ann_non_array_expr = 126 /* ann_non_array_expr */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -1125,16 +1147,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 7 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 360 +#define YYLAST 367 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 58 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 68 +#define YYNNTS 69 /* YYNRULES -- Number of rules. */ -#define YYNRULES 162 +#define YYNRULES 163 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 347 +#define YYNSTATES 348 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 302 @@ -1188,23 +1210,23 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 716, 716, 718, 720, 723, 724, 726, 728, 731, - 732, 734, 736, 739, 740, 747, 750, 752, 755, 756, - 759, 763, 764, 765, 766, 769, 771, 773, 774, 777, - 778, 781, 782, 788, 788, 791, 823, 855, 894, 927, - 936, 946, 955, 967, 1037, 1103, 1174, 1242, 1263, 1283, - 1303, 1326, 1330, 1345, 1369, 1370, 1374, 1376, 1379, 1379, - 1381, 1385, 1387, 1402, 1425, 1426, 1430, 1432, 1436, 1440, - 1442, 1457, 1480, 1481, 1485, 1487, 1490, 1493, 1495, 1510, - 1533, 1534, 1538, 1540, 1543, 1548, 1549, 1554, 1555, 1560, - 1561, 1566, 1567, 1571, 1737, 1751, 1776, 1778, 1780, 1786, - 1788, 1801, 1803, 1812, 1814, 1821, 1822, 1826, 1828, 1833, - 1834, 1838, 1840, 1845, 1846, 1850, 1852, 1857, 1858, 1862, - 1864, 1872, 1874, 1878, 1880, 1885, 1886, 1890, 1892, 1894, - 1896, 1898, 1994, 2009, 2010, 2014, 2016, 2024, 2058, 2065, - 2072, 2098, 2099, 2107, 2108, 2112, 2114, 2118, 2122, 2126, - 2128, 2132, 2134, 2136, 2139, 2139, 2142, 2144, 2146, 2148, - 2150, 2256, 2267 + 0, 745, 745, 744, 749, 751, 754, 755, 757, 759, + 762, 764, 767, 769, 772, 774, 782, 785, 787, 790, + 791, 794, 798, 799, 800, 801, 804, 806, 808, 809, + 812, 813, 816, 817, 823, 823, 826, 861, 896, 939, + 975, 988, 1002, 1015, 1030, 1112, 1190, 1273, 1353, 1376, + 1398, 1420, 1445, 1449, 1466, 1490, 1491, 1495, 1497, 1500, + 1500, 1502, 1506, 1508, 1525, 1548, 1549, 1553, 1555, 1559, + 1563, 1565, 1582, 1605, 1606, 1610, 1612, 1615, 1618, 1620, + 1637, 1660, 1661, 1665, 1667, 1670, 1675, 1676, 1681, 1682, + 1687, 1688, 1693, 1694, 1698, 1867, 1884, 1912, 1914, 1916, + 1922, 1924, 1937, 1939, 1948, 1950, 1957, 1958, 1962, 1964, + 1969, 1970, 1974, 1976, 1981, 1982, 1986, 1988, 1993, 1994, + 1998, 2000, 2008, 2010, 2014, 2016, 2021, 2022, 2026, 2028, + 2030, 2032, 2034, 2130, 2145, 2146, 2150, 2152, 2160, 2201, + 2208, 2215, 2250, 2251, 2259, 2260, 2264, 2266, 2270, 2274, + 2278, 2280, 2284, 2286, 2288, 2291, 2291, 2294, 2296, 2298, + 2300, 2302, 2408, 2420 }; #endif @@ -1230,7 +1252,7 @@ static const char *const yytname[] = "FZ_SET", "FZ_SHOW", "FZ_SHOWCOND", "FZ_SOLVE", "FZ_STRING", "FZ_TEST", "FZ_THEN", "FZ_TUPLE", "FZ_TYPE", "FZ_VARIANT_RECORD", "FZ_WHERE", "';'", "'('", "')'", "','", "':'", "'['", "']'", "'='", "'{'", "'}'", "$accept", - "model", "preddecl_items", "preddecl_items_head", "vardecl_items", + "model", "$@1", "preddecl_items", "preddecl_items_head", "vardecl_items", "vardecl_items_head", "constraint_items", "constraint_items_head", "preddecl_item", "pred_arg_list", "pred_arg_list_head", "pred_arg", "pred_arg_type", "pred_arg_simple_type", "pred_array_init", @@ -1260,7 +1282,7 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-123) +#define YYPACT_NINF (-118) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -1274,41 +1296,41 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -25, 13, 30, 253, -25, -20, -13, -123, 102, -7, - 6, 18, 38, 87, 108, 253, 79, 81, -123, 84, - 116, 118, -123, -123, -123, 113, 111, 91, 95, 101, - 161, 126, 126, 126, 149, 173, 140, 108, 137, 138, - -123, -123, 217, 134, -123, -123, 157, 185, 142, 139, - -123, 146, -123, -123, 188, 194, 78, -123, -123, 147, - 152, 154, 126, 126, 126, 189, -123, -123, 191, 191, - 191, 158, 160, 191, 163, 170, -123, -123, -123, 56, - 78, -123, 84, -123, 211, -123, -123, 171, -123, 218, - -123, 220, 172, 191, 191, 191, 223, 35, 179, 216, - 181, 187, 126, 169, 119, -123, -123, 208, -123, 28, - -123, -123, -123, -123, 126, -123, -123, -123, 192, 192, - 192, 186, 224, -123, -123, 197, -123, 46, 185, 196, - -123, -123, -123, -123, 57, 35, 57, 57, 191, 224, - -123, -123, 57, 200, -123, 106, -123, -123, -123, -123, - -123, 156, 255, 56, 227, 191, 57, -123, -123, -123, - 228, 258, 35, -123, -123, 212, 214, 19, -123, -123, - -123, -123, 210, -123, 221, 231, 57, 191, 169, -123, - -123, 225, -123, -123, -123, 114, 192, -123, 20, -123, - 117, 35, 229, -123, 232, 57, -123, 57, -123, 233, - -123, -123, 271, 217, -123, -123, 141, 236, 237, 239, - 247, -123, 35, -123, -123, -123, -123, -123, -123, 238, - -123, 261, 242, 243, 244, 126, 126, 126, 257, -123, - 78, 126, 126, 126, 191, 191, 191, 245, 246, 191, - 191, 191, 248, 249, 250, 126, 126, 251, 254, 256, - 259, 260, 262, 191, 191, 263, -123, 264, -123, 265, - -123, 295, 296, 185, 266, 267, 62, -123, 88, -123, - 177, -123, 269, 154, -123, 270, 268, 272, 274, 275, - -123, -123, 276, -123, 277, 279, -123, 280, -123, 278, - 283, -123, 282, -123, 284, 285, -123, -123, -123, 297, - -123, -123, 17, 11, -123, 305, -123, 62, -123, 307, - -123, 88, -123, 311, -123, 177, -123, -123, 224, -123, - 286, 288, 289, -123, 287, 292, -123, 290, -123, 291, - -123, 293, -123, -123, 17, -123, 317, -123, 11, -123, - -123, -123, -123, -123, 294, -123, -123 + -10, 39, 27, 215, -10, -12, -2, -118, 104, -4, + 7, 18, 20, 44, -118, 215, 54, 60, -118, 102, + 59, 91, -118, -118, -118, 81, 28, 65, 73, 75, + 126, 85, 85, 85, 112, 128, 100, -118, -118, 207, + 97, -118, -118, 139, 171, 140, 138, -118, 143, -118, + -118, 193, 198, 9, -118, -118, 147, 155, 156, 85, + 85, 85, 189, -118, -118, 195, 195, 195, 157, 206, + 173, 128, 166, -118, -118, 23, 9, -118, 102, -118, + 216, -118, -118, 174, -118, 222, -118, 226, 177, 195, + 195, 195, 230, 15, 190, 231, 196, 199, 85, 201, + 195, 200, 209, -118, 236, -118, -11, -118, -118, -118, + -118, 85, -118, -118, -118, 203, 203, 203, 205, 242, + -118, -118, 213, -118, 50, 171, 211, -118, -118, -118, + -118, 163, 15, 163, 163, 195, 78, 30, -118, -118, + 262, 23, 234, 195, 163, -118, -118, -118, 235, 267, + 15, -118, -118, 220, 217, 149, 242, -118, -118, 223, + -118, -118, -118, -118, -118, 224, 163, 111, -118, -118, + -118, -118, -118, 83, -118, -118, 135, 203, -118, 232, + -118, 137, 15, 221, -118, 228, 163, 163, -118, 229, + 227, 195, 78, -118, -118, 233, -118, 207, -118, -118, + 109, 237, 238, 239, 248, -118, 15, -118, -118, -118, + 240, -118, -118, 163, -118, -118, -118, 281, -118, 255, + 241, 243, 244, 85, 85, 85, 260, -118, -118, 245, + 9, 85, 85, 85, 195, 195, 195, 246, -118, 249, + 195, 195, 195, 247, 250, 251, 85, 85, 252, 254, + 256, 257, 259, 261, 195, 195, 263, -118, 264, -118, + 265, -118, 288, 292, 171, 258, 266, 170, -118, 93, + -118, 176, -118, 268, 156, -118, 269, 253, 270, 272, + 273, -118, -118, 274, -118, 275, 277, -118, 278, -118, + 276, 282, -118, 279, -118, 280, 284, -118, -118, -118, + 295, -118, -118, 21, 10, -118, 300, -118, 170, -118, + 312, -118, 93, -118, 316, -118, 176, -118, -118, 242, + -118, 283, 285, 286, -118, 287, 289, -118, 290, -118, + 291, -118, 293, -118, -118, 21, -118, 317, -118, 10, + -118, -118, -118, -118, -118, 294, -118, -118 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1316,65 +1338,65 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 3, 0, 0, 7, 4, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 11, 8, 0, 0, 5, 16, - 0, 0, 99, 101, 96, 0, 105, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, - 9, 6, 0, 0, 27, 28, 0, 105, 0, 58, - 18, 0, 24, 25, 0, 0, 0, 107, 111, 0, - 58, 58, 0, 0, 0, 0, 33, 34, 143, 143, - 143, 0, 0, 143, 0, 0, 13, 10, 23, 0, - 0, 15, 59, 17, 0, 98, 102, 0, 97, 59, - 106, 59, 0, 143, 143, 143, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 2, 14, 0, 31, 0, - 29, 26, 19, 20, 0, 108, 112, 100, 125, 125, - 125, 0, 157, 156, 158, 33, 162, 0, 105, 160, - 159, 145, 148, 151, 0, 0, 0, 0, 143, 128, - 127, 129, 133, 131, 130, 0, 121, 123, 142, 141, - 94, 0, 0, 0, 0, 143, 0, 35, 36, 37, - 0, 0, 0, 152, 149, 154, 0, 0, 41, 146, - 40, 39, 0, 135, 0, 58, 0, 143, 0, 138, - 139, 137, 95, 32, 30, 0, 125, 126, 0, 104, - 0, 155, 0, 103, 0, 0, 124, 59, 134, 0, - 93, 122, 0, 0, 21, 38, 0, 0, 0, 0, - 0, 147, 0, 150, 153, 161, 42, 136, 132, 0, - 22, 0, 0, 0, 0, 0, 0, 0, 0, 140, - 0, 0, 0, 0, 143, 143, 143, 0, 0, 143, - 143, 143, 0, 0, 0, 0, 0, 85, 87, 89, - 0, 0, 0, 143, 143, 0, 43, 0, 44, 0, - 45, 109, 113, 105, 0, 91, 54, 86, 72, 88, - 64, 90, 0, 58, 115, 0, 58, 0, 0, 0, - 46, 51, 52, 56, 0, 58, 69, 70, 74, 0, - 58, 61, 62, 66, 0, 58, 48, 110, 49, 59, - 114, 47, 117, 80, 92, 0, 60, 59, 55, 0, - 76, 59, 73, 0, 68, 59, 65, 116, 0, 119, - 0, 58, 78, 82, 0, 58, 77, 0, 57, 0, - 75, 0, 67, 50, 59, 118, 0, 84, 59, 81, - 53, 71, 63, 120, 0, 83, 79 + 4, 0, 0, 8, 5, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 2, 9, 0, 0, 6, 17, + 0, 0, 100, 102, 97, 0, 106, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 10, 7, 0, + 0, 28, 29, 0, 106, 0, 59, 19, 0, 25, + 26, 0, 0, 0, 108, 112, 0, 59, 59, 0, + 0, 0, 0, 34, 35, 144, 144, 144, 0, 0, + 0, 13, 0, 11, 24, 0, 0, 16, 60, 18, + 0, 99, 103, 0, 98, 60, 107, 60, 0, 144, + 144, 144, 0, 0, 0, 145, 0, 0, 0, 0, + 144, 0, 0, 14, 0, 32, 0, 30, 27, 20, + 21, 0, 109, 113, 101, 126, 126, 126, 0, 158, + 157, 159, 34, 163, 0, 106, 161, 160, 146, 149, + 152, 0, 0, 0, 0, 144, 0, 0, 3, 15, + 0, 0, 0, 144, 0, 36, 37, 38, 0, 0, + 0, 153, 150, 155, 0, 0, 129, 128, 130, 132, + 131, 42, 147, 41, 40, 0, 134, 0, 122, 124, + 143, 142, 95, 0, 33, 31, 0, 126, 127, 0, + 105, 0, 156, 0, 104, 0, 0, 0, 136, 0, + 59, 144, 0, 139, 140, 138, 96, 0, 22, 39, + 0, 0, 0, 0, 0, 148, 0, 151, 154, 162, + 0, 43, 125, 60, 135, 94, 123, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 133, 137, 0, + 0, 0, 0, 0, 144, 144, 144, 0, 141, 0, + 144, 144, 144, 0, 0, 0, 0, 0, 86, 88, + 90, 0, 0, 0, 144, 144, 0, 44, 0, 45, + 0, 46, 110, 114, 106, 0, 92, 55, 87, 73, + 89, 65, 91, 0, 59, 116, 0, 59, 0, 0, + 0, 47, 52, 53, 57, 0, 59, 70, 71, 75, + 0, 59, 62, 63, 67, 0, 59, 49, 111, 50, + 60, 115, 48, 118, 81, 93, 0, 61, 60, 56, + 0, 77, 60, 74, 0, 69, 60, 66, 117, 0, + 120, 0, 59, 79, 83, 0, 59, 78, 0, 58, + 0, 76, 0, 68, 51, 60, 119, 0, 85, 60, + 82, 54, 72, 64, 121, 0, 84, 80 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -123, -123, -123, -123, -123, -123, -123, -123, 321, -123, - -123, 273, -123, -37, -123, 184, -31, 331, 42, -123, - -123, -57, -123, -15, -123, -123, -123, 39, -123, -123, - -123, 14, -123, -123, -123, -123, -123, -123, -123, 314, - -123, 0, 148, 150, -90, -122, -123, -123, 92, -123, - -123, -123, -123, -123, 180, -108, -121, -123, -123, -123, - -123, 16, -123, -88, 195, -123, -123, 193 + -118, -118, -118, -118, -118, -118, -118, -118, -118, 334, + -118, -118, 271, -118, -33, -118, 202, -31, 327, 38, + -118, -118, -54, -118, 34, -118, -118, -118, 40, -118, + -118, -118, 12, -118, -118, -118, -118, -118, -118, -118, + 296, -118, -3, 153, 154, -86, -117, -118, -118, 94, + -118, -118, -118, -118, -118, 165, -102, -92, -118, -118, + -118, -118, -56, -118, -84, 208, -118, -118, 204 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 2, 3, 4, 14, 15, 36, 37, 5, 48, - 49, 50, 51, 52, 109, 110, 143, 16, 283, 284, - 285, 83, 267, 293, 294, 295, 271, 288, 289, 290, - 269, 323, 324, 325, 304, 256, 258, 260, 280, 38, - 74, 53, 28, 29, 144, 59, 60, 272, 61, 275, - 276, 320, 321, 145, 146, 157, 147, 174, 175, 182, - 151, 98, 99, 164, 165, 132, 192, 133 + 0, 2, 35, 3, 4, 14, 15, 70, 71, 5, + 45, 46, 47, 48, 49, 106, 107, 159, 16, 284, + 285, 286, 79, 268, 294, 295, 296, 272, 289, 290, + 291, 270, 324, 325, 326, 305, 257, 259, 261, 281, + 72, 101, 50, 28, 29, 160, 56, 57, 273, 58, + 276, 277, 321, 322, 167, 168, 145, 169, 189, 190, + 196, 173, 94, 95, 152, 153, 129, 183, 130 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1382,169 +1404,169 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 68, 69, 70, 90, 92, 78, 166, 130, 27, 131, - 1, 158, 159, 168, 318, 170, 171, 66, 67, 6, - 318, 173, 122, 123, 124, 66, 67, 126, 18, 206, - 7, 93, 94, 95, 207, 187, 19, 130, 122, 123, - 124, 125, 67, 126, 208, 130, 30, 169, 209, 122, - 123, 124, 125, 67, 126, 199, 87, 210, 31, 107, - 139, 140, 141, 66, 67, 281, 129, 128, 66, 67, - 32, 138, 130, 128, 216, 128, 217, 130, 205, 153, - 111, 20, 154, 155, 108, 100, 101, 20, 127, 104, - 33, 128, 286, 42, 66, 67, 129, 43, 44, 127, - 163, 130, 128, 213, 129, 20, 24, 21, 45, 118, - 119, 120, 24, 128, 57, 58, 22, 20, 198, 34, - 181, 46, 130, 203, 213, 35, 23, 40, 44, 41, - 24, 129, 66, 67, 47, 54, 129, 55, 45, 25, - 47, 277, 24, 62, 20, 56, 21, 63, 204, 148, - 149, 46, 150, 64, 172, 22, 177, 178, 26, 179, - 129, 180, 66, 67, 65, 23, 220, 211, 212, 24, - 47, 186, 139, 140, 141, 66, 67, 71, 221, 72, - 73, 129, 291, 66, 67, 76, 77, 79, 57, 80, - 82, 85, 81, 200, 234, 235, 236, 26, 84, 86, - 239, 240, 241, 89, 88, 91, 222, 97, 96, 103, - 102, 105, 319, 326, 253, 254, 297, 113, 106, 300, - 20, 115, 142, 114, 116, 128, 121, 152, 308, 117, - 238, 44, 135, 312, 134, 282, 136, 287, 316, 292, - 160, 45, 137, 161, 343, 24, 162, 156, 326, 167, - 242, 243, 244, 176, 46, 247, 248, 249, 183, 185, - 188, 189, 8, 191, 335, 195, 9, 10, 339, 264, - 265, 193, 322, 47, 219, 196, 282, 11, 202, 228, - 287, 12, 197, 214, 292, 237, 215, 218, 225, 226, - 13, 227, 229, 230, 231, 232, 233, 245, 246, 58, - 332, 274, 317, 250, 251, 252, 255, 322, 327, 257, - 329, 259, 261, 262, 331, 263, 266, 268, 270, 299, - 344, 278, 279, 296, 298, 17, 301, 302, 303, 305, - 307, 306, 310, 309, 311, 313, 315, 184, 314, 334, - 333, 337, 336, 338, 340, 341, 39, 342, 346, 328, - 330, 75, 345, 273, 223, 112, 224, 190, 201, 0, - 194 + 65, 66, 67, 86, 88, 27, 74, 127, 154, 128, + 96, 97, 20, 319, 146, 147, 63, 64, 119, 120, + 121, 122, 64, 123, 319, 1, 104, 7, 89, 90, + 91, 54, 55, 115, 116, 117, 18, 24, 127, 161, + 141, 163, 164, 142, 137, 6, 127, 19, 162, 30, + 83, 105, 178, 119, 120, 121, 122, 64, 123, 31, + 170, 171, 126, 172, 127, 44, 125, 135, 124, 127, + 32, 125, 33, 108, 188, 199, 34, 125, 51, 165, + 143, 156, 157, 158, 63, 64, 193, 177, 194, 63, + 64, 63, 64, 126, 210, 211, 127, 287, 207, 63, + 64, 126, 37, 124, 151, 20, 125, 20, 38, 21, + 52, 39, 20, 53, 21, 40, 41, 59, 22, 126, + 127, 228, 207, 22, 126, 60, 42, 61, 23, 62, + 24, 166, 24, 23, 125, 215, 214, 24, 20, 43, + 68, 25, 195, 198, 197, 69, 219, 278, 73, 41, + 75, 126, 119, 120, 121, 63, 64, 123, 44, 42, + 26, 191, 192, 24, 218, 26, 156, 157, 158, 63, + 64, 76, 43, 282, 54, 126, 63, 64, 243, 244, + 245, 292, 63, 64, 248, 249, 250, 205, 206, 78, + 77, 44, 234, 235, 236, 80, 81, 220, 265, 266, + 240, 241, 242, 82, 84, 125, 85, 87, 92, 98, + 20, 93, 99, 100, 103, 254, 255, 320, 327, 125, + 298, 41, 110, 301, 8, 112, 111, 239, 9, 10, + 113, 42, 309, 118, 114, 24, 283, 313, 288, 11, + 293, 200, 317, 12, 43, 131, 201, 132, 138, 344, + 136, 133, 13, 327, 134, 140, 202, 139, 144, 148, + 203, 149, 150, 44, 155, 174, 176, 179, 336, 204, + 180, 182, 340, 323, 184, 208, 186, 283, 213, 187, + 226, 288, 209, 212, 229, 293, 217, 230, 237, 223, + 224, 225, 55, 231, 227, 232, 233, 275, 246, 238, + 318, 247, 251, 328, 300, 252, 253, 256, 323, 258, + 262, 260, 263, 279, 264, 330, 267, 269, 271, 332, + 345, 280, 297, 299, 302, 303, 304, 306, 308, 307, + 311, 310, 314, 312, 315, 316, 335, 334, 17, 337, + 339, 338, 36, 175, 341, 342, 329, 343, 347, 109, + 333, 346, 331, 221, 222, 0, 274, 216, 181, 185, + 0, 0, 0, 0, 0, 0, 0, 102 }; static const yytype_int16 yycheck[] = { - 31, 32, 33, 60, 61, 42, 128, 97, 8, 97, - 35, 119, 120, 134, 3, 136, 137, 6, 7, 6, - 3, 142, 3, 4, 5, 6, 7, 8, 48, 9, - 0, 62, 63, 64, 14, 156, 49, 127, 3, 4, - 5, 6, 7, 8, 24, 135, 53, 135, 28, 3, - 4, 5, 6, 7, 8, 176, 56, 37, 52, 3, - 3, 4, 5, 6, 7, 3, 97, 56, 6, 7, - 52, 102, 162, 56, 195, 56, 197, 167, 186, 51, - 80, 3, 54, 114, 28, 69, 70, 3, 53, 73, - 52, 56, 4, 9, 6, 7, 127, 13, 14, 53, - 54, 191, 56, 191, 135, 3, 28, 5, 24, 93, - 94, 95, 28, 56, 3, 4, 14, 3, 175, 32, - 151, 37, 212, 9, 212, 17, 24, 48, 14, 48, - 28, 162, 6, 7, 56, 19, 167, 19, 24, 37, - 56, 263, 28, 52, 3, 32, 5, 52, 185, 30, - 31, 37, 33, 52, 138, 14, 50, 51, 56, 3, - 191, 5, 6, 7, 3, 24, 203, 50, 51, 28, - 56, 155, 3, 4, 5, 6, 7, 28, 37, 6, - 40, 212, 5, 6, 7, 48, 48, 53, 3, 32, - 51, 3, 50, 177, 225, 226, 227, 56, 52, 5, - 231, 232, 233, 51, 57, 51, 206, 16, 19, 49, - 52, 48, 302, 303, 245, 246, 273, 6, 48, 276, - 3, 3, 53, 52, 4, 56, 3, 19, 285, 57, - 230, 14, 16, 290, 55, 266, 55, 268, 295, 270, - 54, 24, 55, 19, 334, 28, 49, 55, 338, 53, - 234, 235, 236, 53, 37, 239, 240, 241, 3, 32, - 32, 3, 9, 51, 321, 55, 13, 14, 325, 253, - 254, 57, 303, 56, 3, 54, 307, 24, 53, 32, - 311, 28, 51, 54, 315, 28, 54, 54, 52, 52, - 37, 52, 54, 32, 52, 52, 52, 52, 52, 4, - 315, 5, 5, 55, 55, 55, 55, 338, 3, 55, - 3, 55, 53, 53, 3, 53, 53, 53, 53, 51, - 3, 55, 55, 54, 54, 4, 54, 53, 53, 53, - 51, 54, 54, 53, 51, 53, 51, 153, 54, 51, - 54, 54, 53, 51, 54, 54, 15, 54, 54, 307, - 311, 37, 338, 261, 206, 82, 206, 162, 178, -1, - 167 + 31, 32, 33, 57, 58, 8, 39, 93, 125, 93, + 66, 67, 3, 3, 116, 117, 6, 7, 3, 4, + 5, 6, 7, 8, 3, 35, 3, 0, 59, 60, + 61, 3, 4, 89, 90, 91, 48, 28, 124, 131, + 51, 133, 134, 54, 100, 6, 132, 49, 132, 53, + 53, 28, 144, 3, 4, 5, 6, 7, 8, 52, + 30, 31, 93, 33, 150, 56, 56, 98, 53, 155, + 52, 56, 52, 76, 166, 177, 32, 56, 19, 135, + 111, 3, 4, 5, 6, 7, 3, 143, 5, 6, + 7, 6, 7, 124, 186, 187, 182, 4, 182, 6, + 7, 132, 48, 53, 54, 3, 56, 3, 48, 5, + 19, 9, 3, 32, 5, 13, 14, 52, 14, 150, + 206, 213, 206, 14, 155, 52, 24, 52, 24, 3, + 28, 53, 28, 24, 56, 191, 190, 28, 3, 37, + 28, 37, 173, 176, 9, 17, 37, 264, 48, 14, + 53, 182, 3, 4, 5, 6, 7, 8, 56, 24, + 56, 50, 51, 28, 197, 56, 3, 4, 5, 6, + 7, 32, 37, 3, 3, 206, 6, 7, 234, 235, + 236, 5, 6, 7, 240, 241, 242, 50, 51, 51, + 50, 56, 223, 224, 225, 52, 3, 200, 254, 255, + 231, 232, 233, 5, 57, 56, 51, 51, 19, 52, + 3, 16, 6, 40, 48, 246, 247, 303, 304, 56, + 274, 14, 6, 277, 9, 3, 52, 230, 13, 14, + 4, 24, 286, 3, 57, 28, 267, 291, 269, 24, + 271, 9, 296, 28, 37, 55, 14, 16, 48, 335, + 49, 55, 37, 339, 55, 19, 24, 48, 55, 54, + 28, 19, 49, 56, 53, 3, 32, 32, 322, 37, + 3, 51, 326, 304, 57, 54, 53, 308, 51, 55, + 32, 312, 54, 54, 3, 316, 53, 32, 28, 52, + 52, 52, 4, 52, 54, 52, 52, 5, 52, 54, + 5, 52, 55, 3, 51, 55, 55, 55, 339, 55, + 53, 55, 53, 55, 53, 3, 53, 53, 53, 3, + 3, 55, 54, 54, 54, 53, 53, 53, 51, 54, + 54, 53, 53, 51, 54, 51, 51, 54, 4, 53, + 51, 54, 15, 141, 54, 54, 308, 54, 54, 78, + 316, 339, 312, 200, 200, -1, 262, 192, 150, 155, + -1, -1, -1, -1, -1, -1, -1, 71 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { - 0, 35, 59, 60, 61, 66, 6, 0, 9, 13, - 14, 24, 28, 37, 62, 63, 75, 66, 48, 49, - 3, 5, 14, 24, 28, 37, 56, 99, 100, 101, - 53, 52, 52, 52, 32, 17, 64, 65, 97, 75, - 48, 48, 9, 13, 14, 24, 37, 56, 67, 68, - 69, 70, 71, 99, 19, 19, 32, 3, 4, 103, - 104, 106, 52, 52, 52, 3, 6, 7, 74, 74, - 74, 28, 6, 40, 98, 97, 48, 48, 71, 53, - 32, 50, 51, 79, 52, 3, 5, 99, 57, 51, - 79, 51, 79, 74, 74, 74, 19, 16, 119, 120, - 119, 119, 52, 49, 119, 48, 48, 3, 28, 72, - 73, 99, 69, 6, 52, 3, 4, 57, 119, 119, - 119, 3, 3, 4, 5, 6, 8, 53, 56, 74, - 102, 121, 123, 125, 55, 16, 55, 55, 74, 3, - 4, 5, 53, 74, 102, 111, 112, 114, 30, 31, - 33, 118, 19, 51, 54, 74, 55, 113, 113, 113, - 54, 19, 49, 54, 121, 122, 103, 53, 114, 121, - 114, 114, 119, 114, 115, 116, 53, 50, 51, 3, - 5, 74, 117, 3, 73, 32, 119, 114, 32, 3, - 122, 51, 124, 57, 125, 55, 54, 51, 79, 114, - 119, 112, 53, 9, 71, 113, 9, 14, 24, 28, - 37, 50, 51, 121, 54, 54, 114, 114, 54, 3, - 71, 37, 99, 100, 101, 52, 52, 52, 32, 54, - 32, 52, 52, 52, 74, 74, 74, 28, 99, 74, - 74, 74, 119, 119, 119, 52, 52, 119, 119, 119, - 55, 55, 55, 74, 74, 55, 93, 55, 94, 55, - 95, 53, 53, 53, 119, 119, 53, 80, 53, 88, - 53, 84, 105, 106, 5, 107, 108, 103, 55, 55, - 96, 3, 74, 76, 77, 78, 4, 74, 85, 86, - 87, 5, 74, 81, 82, 83, 54, 79, 54, 51, - 79, 54, 53, 53, 92, 53, 54, 51, 79, 53, - 54, 51, 79, 53, 54, 51, 79, 5, 3, 102, - 109, 110, 74, 89, 90, 91, 102, 3, 76, 3, - 85, 3, 81, 54, 51, 79, 53, 54, 51, 79, - 54, 54, 54, 102, 3, 89, 54 + 0, 35, 59, 61, 62, 67, 6, 0, 9, 13, + 14, 24, 28, 37, 63, 64, 76, 67, 48, 49, + 3, 5, 14, 24, 28, 37, 56, 100, 101, 102, + 53, 52, 52, 52, 32, 60, 76, 48, 48, 9, + 13, 14, 24, 37, 56, 68, 69, 70, 71, 72, + 100, 19, 19, 32, 3, 4, 104, 105, 107, 52, + 52, 52, 3, 6, 7, 75, 75, 75, 28, 17, + 65, 66, 98, 48, 72, 53, 32, 50, 51, 80, + 52, 3, 5, 100, 57, 51, 80, 51, 80, 75, + 75, 75, 19, 16, 120, 121, 120, 120, 52, 6, + 40, 99, 98, 48, 3, 28, 73, 74, 100, 70, + 6, 52, 3, 4, 57, 120, 120, 120, 3, 3, + 4, 5, 6, 8, 53, 56, 75, 103, 122, 124, + 126, 55, 16, 55, 55, 75, 49, 120, 48, 48, + 19, 51, 54, 75, 55, 114, 114, 114, 54, 19, + 49, 54, 122, 123, 104, 53, 3, 4, 5, 75, + 103, 115, 122, 115, 115, 120, 53, 112, 113, 115, + 30, 31, 33, 119, 3, 74, 32, 120, 115, 32, + 3, 123, 51, 125, 57, 126, 53, 55, 115, 116, + 117, 50, 51, 3, 5, 75, 118, 9, 72, 114, + 9, 14, 24, 28, 37, 50, 51, 122, 54, 54, + 115, 115, 54, 51, 80, 120, 113, 53, 72, 37, + 100, 101, 102, 52, 52, 52, 32, 54, 115, 3, + 32, 52, 52, 52, 75, 75, 75, 28, 54, 100, + 75, 75, 75, 120, 120, 120, 52, 52, 120, 120, + 120, 55, 55, 55, 75, 75, 55, 94, 55, 95, + 55, 96, 53, 53, 53, 120, 120, 53, 81, 53, + 89, 53, 85, 106, 107, 5, 108, 109, 104, 55, + 55, 97, 3, 75, 77, 78, 79, 4, 75, 86, + 87, 88, 5, 75, 82, 83, 84, 54, 80, 54, + 51, 80, 54, 53, 53, 93, 53, 54, 51, 80, + 53, 54, 51, 80, 53, 54, 51, 80, 5, 3, + 103, 110, 111, 75, 90, 91, 92, 103, 3, 77, + 3, 86, 3, 82, 54, 51, 80, 53, 54, 51, + 80, 54, 54, 54, 103, 3, 90, 54 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { - 0, 58, 59, 60, 60, 61, 61, 62, 62, 63, - 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, - 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, - 72, 73, 73, 74, 74, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 76, 76, 76, 77, 77, 78, 78, 79, 79, - 80, 81, 81, 81, 82, 82, 83, 83, 84, 85, - 85, 85, 86, 86, 87, 87, 88, 89, 89, 89, - 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, - 95, 96, 96, 97, 98, 98, 99, 99, 99, 100, - 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, - 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, - 110, 111, 111, 112, 112, 113, 113, 114, 114, 114, - 114, 114, 114, 115, 115, 116, 116, 117, 117, 117, - 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, - 122, 123, 123, 123, 124, 124, 125, 125, 125, 125, - 125, 125, 125 + 0, 58, 60, 59, 61, 61, 62, 62, 63, 63, + 64, 64, 65, 65, 66, 66, 67, 68, 68, 69, + 69, 70, 71, 71, 71, 71, 72, 72, 72, 72, + 73, 73, 74, 74, 75, 75, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, + 80, 81, 82, 82, 82, 83, 83, 84, 84, 85, + 86, 86, 86, 87, 87, 88, 88, 89, 90, 90, + 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, + 96, 96, 97, 97, 98, 99, 99, 100, 100, 100, + 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, + 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, + 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, + 115, 115, 115, 115, 116, 116, 117, 117, 118, 118, + 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, + 123, 123, 124, 124, 124, 125, 125, 126, 126, 126, + 126, 126, 126, 126 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { - 0, 2, 5, 0, 1, 2, 3, 0, 1, 2, - 3, 0, 1, 2, 3, 5, 0, 2, 1, 3, - 3, 6, 7, 2, 1, 1, 3, 1, 1, 1, - 3, 1, 3, 1, 1, 6, 6, 6, 8, 6, - 6, 6, 8, 13, 13, 13, 15, 15, 15, 15, - 17, 1, 1, 4, 0, 2, 1, 3, 0, 1, - 3, 1, 1, 4, 0, 2, 1, 3, 3, 1, - 1, 4, 0, 2, 1, 3, 3, 1, 1, 4, - 0, 2, 1, 3, 3, 0, 2, 0, 2, 0, - 2, 0, 2, 6, 3, 4, 1, 3, 3, 1, - 4, 1, 3, 3, 3, 0, 2, 1, 3, 0, - 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, - 3, 1, 3, 1, 3, 0, 2, 1, 1, 1, - 1, 1, 4, 0, 2, 1, 3, 1, 1, 1, - 4, 1, 1, 0, 1, 2, 3, 4, 1, 1, - 3, 1, 2, 4, 0, 1, 1, 1, 1, 1, - 1, 4, 1 + 0, 2, 0, 6, 0, 1, 2, 3, 0, 1, + 2, 3, 0, 1, 2, 3, 5, 0, 2, 1, + 3, 3, 6, 7, 2, 1, 1, 3, 1, 1, + 1, 3, 1, 3, 1, 1, 6, 6, 6, 8, + 6, 6, 6, 8, 13, 13, 13, 15, 15, 15, + 15, 17, 1, 1, 4, 0, 2, 1, 3, 0, + 1, 3, 1, 1, 4, 0, 2, 1, 3, 3, + 1, 1, 4, 0, 2, 1, 3, 3, 1, 1, + 4, 0, 2, 1, 3, 3, 0, 2, 0, 2, + 0, 2, 0, 2, 6, 3, 4, 1, 3, 3, + 1, 4, 1, 3, 3, 3, 0, 2, 1, 3, + 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, + 1, 3, 1, 3, 1, 3, 0, 2, 1, 1, + 1, 1, 1, 4, 0, 2, 1, 3, 1, 1, + 1, 4, 1, 1, 0, 1, 2, 3, 4, 1, + 1, 3, 1, 2, 4, 0, 1, 1, 1, 1, + 1, 1, 4, 1 }; @@ -2014,7 +2036,299 @@ yydestruct (const char *yymsg, YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YY_USE (yykind); + switch (yykind) + { + case YYSYMBOL_FZ_ID: /* FZ_ID */ +#line 732 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) free(((*yyvaluep).sValue)); } +#line 2045 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_FZ_U_ID: /* FZ_U_ID */ +#line 732 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) free(((*yyvaluep).sValue)); } +#line 2051 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_FZ_STRING_LIT: /* FZ_STRING_LIT */ +#line 732 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) free(((*yyvaluep).sValue)); } +#line 2057 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_var_par_id: /* var_par_id */ +#line 732 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) free(((*yyvaluep).sValue)); } +#line 2063 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_init: /* int_init */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).varSpec); } +#line 2069 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_init_list: /* int_init_list */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2075 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_init_list_head: /* int_init_list_head */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2081 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_var_array_literal: /* int_var_array_literal */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2087 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_init: /* float_init */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).varSpec); } +#line 2093 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_init_list: /* float_init_list */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2099 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_init_list_head: /* float_init_list_head */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2105 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_var_array_literal: /* float_var_array_literal */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2111 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_init: /* bool_init */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).varSpec); } +#line 2117 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_init_list: /* bool_init_list */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2123 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_init_list_head: /* bool_init_list_head */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2129 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_var_array_literal: /* bool_var_array_literal */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2135 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_init: /* set_init */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).varSpec); } +#line 2141 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_init_list: /* set_init_list */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2147 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_init_list_head: /* set_init_list_head */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2153 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_var_array_literal: /* set_var_array_literal */ +#line 735 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) { for(auto* p:*((*yyvaluep).varSpecVec)) delete p; delete ((*yyvaluep).varSpecVec); } } +#line 2159 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_vardecl_int_var_array_init: /* vardecl_int_var_array_init */ +#line 736 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oVarSpecVec)()) { for(auto* p:*((*yyvaluep).oVarSpecVec).some()) delete p; delete ((*yyvaluep).oVarSpecVec).some(); } } +#line 2165 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_vardecl_bool_var_array_init: /* vardecl_bool_var_array_init */ +#line 736 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oVarSpecVec)()) { for(auto* p:*((*yyvaluep).oVarSpecVec).some()) delete p; delete ((*yyvaluep).oVarSpecVec).some(); } } +#line 2171 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_vardecl_float_var_array_init: /* vardecl_float_var_array_init */ +#line 736 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oVarSpecVec)()) { for(auto* p:*((*yyvaluep).oVarSpecVec).some()) delete p; delete ((*yyvaluep).oVarSpecVec).some(); } } +#line 2177 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_vardecl_set_var_array_init: /* vardecl_set_var_array_init */ +#line 736 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oVarSpecVec)()) { for(auto* p:*((*yyvaluep).oVarSpecVec).some()) delete p; delete ((*yyvaluep).oVarSpecVec).some(); } } +#line 2183 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_ti_expr_tail: /* int_ti_expr_tail */ +#line 734 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oSet)()) delete ((*yyvaluep).oSet).some(); } +#line 2189 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_ti_expr_tail: /* bool_ti_expr_tail */ +#line 734 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oSet)()) delete ((*yyvaluep).oSet).some(); } +#line 2195 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_ti_expr_tail: /* float_ti_expr_tail */ +#line 734 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oPFloat)()) delete ((*yyvaluep).oPFloat).some(); } +#line 2201 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_literal: /* set_literal */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setLit); } +#line 2207 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_list: /* int_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValue); } +#line 2213 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_int_list_head: /* int_list_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValue); } +#line 2219 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_list: /* bool_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValue); } +#line 2225 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_bool_list_head: /* bool_list_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValue); } +#line 2231 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_list: /* float_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).floatSetValue); } +#line 2237 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_float_list_head: /* float_list_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).floatSetValue); } +#line 2243 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_literal_list: /* set_literal_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValueList); } +#line 2249 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_set_literal_list_head: /* set_literal_list_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).setValueList); } +#line 2255 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_flat_expr_list: /* flat_expr_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).argVec); } +#line 2261 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_flat_expr: /* flat_expr */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2267 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_non_array_expr_opt: /* non_array_expr_opt */ +#line 734 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && ((*yyvaluep).oArg)()) delete ((*yyvaluep).oArg).some(); } +#line 2273 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_non_array_expr: /* non_array_expr */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2279 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_non_array_expr_list: /* non_array_expr_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).argVec); } +#line 2285 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_non_array_expr_list_head: /* non_array_expr_list_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).argVec); } +#line 2291 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_annotations: /* annotations */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).argVec); } +#line 2297 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_annotations_head: /* annotations_head */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).argVec); } +#line 2303 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_annotation: /* annotation */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2309 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_annotation_list: /* annotation_list */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2315 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_annotation_expr: /* annotation_expr */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2321 "gecode/flatzinc/parser.tab.cpp" + break; + + case YYSYMBOL_ann_non_array_expr: /* ann_non_array_expr */ +#line 733 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture) delete ((*yyvaluep).arg); } +#line 2327 "gecode/flatzinc/parser.tab.cpp" + break; + + default: + break; + } YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -2285,35 +2599,68 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YY_REDUCE_PRINT (yyn); switch (yyn) { - case 15: /* preddecl_item: FZ_PREDICATE FZ_ID '(' pred_arg_list ')' */ -#line 748 "./gecode/flatzinc/parser.yxx" + case 2: /* $@1: %empty */ +#line 745 "gecode/flatzinc/parser.yxx" + { ParserState* pp=static_cast(parm); + if(pp->capture && !pp->hadError) pp->capture->begin(*pp); } +#line 2607 "gecode/flatzinc/parser.tab.cpp" + break; + + case 10: /* vardecl_items_head: vardecl_item ';' */ +#line 763 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } +#line 2613 "gecode/flatzinc/parser.tab.cpp" + break; + + case 11: /* vardecl_items_head: vardecl_items_head vardecl_item ';' */ +#line 765 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } +#line 2619 "gecode/flatzinc/parser.tab.cpp" + break; + + case 14: /* constraint_items_head: constraint_item ';' */ +#line 773 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } +#line 2625 "gecode/flatzinc/parser.tab.cpp" + break; + + case 15: /* constraint_items_head: constraint_items_head constraint_item ';' */ +#line 775 "gecode/flatzinc/parser.yxx" + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } +#line 2631 "gecode/flatzinc/parser.tab.cpp" + break; + + case 16: /* preddecl_item: FZ_PREDICATE FZ_ID '(' pred_arg_list ')' */ +#line 783 "gecode/flatzinc/parser.yxx" { free((yyvsp[-3].sValue)); } -#line 2292 "gecode/flatzinc/parser.tab.cpp" +#line 2637 "gecode/flatzinc/parser.tab.cpp" break; - case 20: /* pred_arg: pred_arg_type ':' FZ_ID */ -#line 760 "./gecode/flatzinc/parser.yxx" + case 21: /* pred_arg: pred_arg_type ':' FZ_ID */ +#line 795 "gecode/flatzinc/parser.yxx" { free((yyvsp[0].sValue)); } -#line 2298 "gecode/flatzinc/parser.tab.cpp" +#line 2643 "gecode/flatzinc/parser.tab.cpp" break; - case 25: /* pred_arg_simple_type: int_ti_expr_tail */ -#line 770 "./gecode/flatzinc/parser.yxx" + case 26: /* pred_arg_simple_type: int_ti_expr_tail */ +#line 805 "gecode/flatzinc/parser.yxx" { if ((yyvsp[0].oSet)()) delete (yyvsp[0].oSet).some(); } -#line 2304 "gecode/flatzinc/parser.tab.cpp" +#line 2649 "gecode/flatzinc/parser.tab.cpp" break; - case 26: /* pred_arg_simple_type: FZ_SET FZ_OF int_ti_expr_tail */ -#line 772 "./gecode/flatzinc/parser.yxx" + case 27: /* pred_arg_simple_type: FZ_SET FZ_OF int_ti_expr_tail */ +#line 807 "gecode/flatzinc/parser.yxx" { if ((yyvsp[0].oSet)()) delete (yyvsp[0].oSet).some(); } -#line 2310 "gecode/flatzinc/parser.tab.cpp" +#line 2655 "gecode/flatzinc/parser.tab.cpp" break; - case 35: /* vardecl_item: FZ_VAR int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ -#line 792 "./gecode/flatzinc/parser.yxx" + case 36: /* vardecl_item: FZ_VAR int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ +#line 827 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec)); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); bool funcDep = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put((yyvsp[-2].sValue), se_iv(pp->intvars.size())), @@ -2340,16 +2687,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->intvars.push_back(varspec((yyvsp[-2].sValue), new IntVarSpec((yyvsp[-4].oSet),!print,funcDep))); } + if(pp->capture && pp->hadError && (yyvsp[0].oArg)() && (yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2346 "gecode/flatzinc/parser.tab.cpp" +#line 2694 "gecode/flatzinc/parser.tab.cpp" break; - case 36: /* vardecl_item: FZ_VAR bool_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ -#line 824 "./gecode/flatzinc/parser.yxx" + case 37: /* vardecl_item: FZ_VAR bool_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ +#line 862 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec)); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); bool funcDep = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put((yyvsp[-2].sValue), se_bv(pp->boolvars.size())), @@ -2376,16 +2726,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->boolvars.push_back(varspec((yyvsp[-2].sValue), new BoolVarSpec((yyvsp[-4].oSet),!print,funcDep))); } + if(pp->capture && pp->hadError && (yyvsp[0].oArg)() && (yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2382 "gecode/flatzinc/parser.tab.cpp" +#line 2733 "gecode/flatzinc/parser.tab.cpp" break; - case 37: /* vardecl_item: FZ_VAR float_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ -#line 856 "./gecode/flatzinc/parser.yxx" + case 38: /* vardecl_item: FZ_VAR float_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ +#line 897 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec)); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); bool funcDep = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put((yyvsp[-2].sValue), se_fv(pp->floatvars.size())), @@ -2409,6 +2762,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!pp->hadError && (yyvsp[-4].oPFloat)()) { AST::FloatVar* fv = new AST::FloatVar(pp->floatvars.size()-1); addDomainConstraint(pp, fv, (yyvsp[-4].oPFloat)); + if(pp->capture) (yyvsp[-4].oPFloat)=Option*>::none(); } delete arg; } else { @@ -2419,16 +2773,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->floatvars.push_back(varspec((yyvsp[-2].sValue), new FloatVarSpec(dom,!print,funcDep))); } + if(pp->capture && pp->hadError && (yyvsp[0].oArg)() && (yyvsp[-4].oPFloat)()) delete (yyvsp[-4].oPFloat).some(); delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2425 "gecode/flatzinc/parser.tab.cpp" +#line 2780 "gecode/flatzinc/parser.tab.cpp" break; - case 38: /* vardecl_item: FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ -#line 895 "./gecode/flatzinc/parser.yxx" + case 39: /* vardecl_item: FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt */ +#line 940 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec)); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("output_var"); bool funcDep = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put((yyvsp[-2].sValue), se_sv(pp->setvars.size())), @@ -2456,74 +2813,94 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->setvars.push_back(varspec((yyvsp[-2].sValue), new SetVarSpec((yyvsp[-4].oSet),!print,funcDep))); } + if(pp->capture && pp->hadError && (yyvsp[0].oArg)() && (yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2462 "gecode/flatzinc/parser.tab.cpp" +#line 2820 "gecode/flatzinc/parser.tab.cpp" break; - case 39: /* vardecl_item: FZ_INT ':' var_par_id annotations '=' non_array_expr */ -#line 928 "./gecode/flatzinc/parser.yxx" + case 40: /* vardecl_item: FZ_INT ':' var_par_id annotations '=' non_array_expr */ +#line 976 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-2].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[0].arg)->isInt(), "Invalid int initializer"); + if (!pp->capture || !pp->hadError) { yyassert(pp, pp->symbols.put((yyvsp[-3].sValue), se_i((yyvsp[0].arg)->getInt())), "Duplicate symbol"); + } + if(pp->capture) delete (yyvsp[0].arg); delete (yyvsp[-2].argVec); free((yyvsp[-3].sValue)); } -#line 2475 "gecode/flatzinc/parser.tab.cpp" +#line 2837 "gecode/flatzinc/parser.tab.cpp" break; - case 40: /* vardecl_item: FZ_FLOAT ':' var_par_id annotations '=' non_array_expr */ -#line 937 "./gecode/flatzinc/parser.yxx" + case 41: /* vardecl_item: FZ_FLOAT ':' var_par_id annotations '=' non_array_expr */ +#line 989 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-2].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[0].arg)->isFloat(), "Invalid float initializer"); + if (!pp->capture || !pp->hadError) { pp->floatvals.push_back((yyvsp[0].arg)->getFloat()); yyassert(pp, pp->symbols.put((yyvsp[-3].sValue), se_f(pp->floatvals.size()-1)), "Duplicate symbol"); + } + if(pp->capture) delete (yyvsp[0].arg); delete (yyvsp[-2].argVec); free((yyvsp[-3].sValue)); } -#line 2489 "gecode/flatzinc/parser.tab.cpp" +#line 2855 "gecode/flatzinc/parser.tab.cpp" break; - case 41: /* vardecl_item: FZ_BOOL ':' var_par_id annotations '=' non_array_expr */ -#line 947 "./gecode/flatzinc/parser.yxx" + case 42: /* vardecl_item: FZ_BOOL ':' var_par_id annotations '=' non_array_expr */ +#line 1003 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-2].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[0].arg)->isBool(), "Invalid bool initializer"); + if (!pp->capture || !pp->hadError) { yyassert(pp, pp->symbols.put((yyvsp[-3].sValue), se_b((yyvsp[0].arg)->getBool())), "Duplicate symbol"); + } + if(pp->capture) delete (yyvsp[0].arg); delete (yyvsp[-2].argVec); free((yyvsp[-3].sValue)); } -#line 2502 "gecode/flatzinc/parser.tab.cpp" +#line 2872 "gecode/flatzinc/parser.tab.cpp" break; - case 42: /* vardecl_item: FZ_SET FZ_OF FZ_INT ':' var_par_id annotations '=' non_array_expr */ -#line 956 "./gecode/flatzinc/parser.yxx" + case 43: /* vardecl_item: FZ_SET FZ_OF FZ_INT ':' var_par_id annotations '=' non_array_expr */ +#line 1016 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-2].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[0].arg)->isSet(), "Invalid set initializer"); + if (!pp->capture || !pp->hadError) { AST::SetLit* set = (yyvsp[0].arg)->getSet(); pp->setvals.push_back(*set); yyassert(pp, pp->symbols.put((yyvsp[-3].sValue), se_s(pp->setvals.size()-1)), "Duplicate symbol"); delete set; + } else delete (yyvsp[0].arg); delete (yyvsp[-2].argVec); free((yyvsp[-3].sValue)); } -#line 2518 "gecode/flatzinc/parser.tab.cpp" +#line 2891 "gecode/flatzinc/parser.tab.cpp" break; - case 43: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR int_ti_expr_tail ':' var_par_id annotations vardecl_int_var_array_init */ -#line 969 "./gecode/flatzinc/parser.yxx" + case 44: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR int_ti_expr_tail ':' var_par_id annotations vardecl_int_var_array_init */ +#line 1032 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); yyassert(pp, (yyvsp[-10].iValue)==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,(yyvsp[-8].iValue)); + pp->capture->variable_count(*pp,(yyvsp[-8].iValue),(yyvsp[0].oVarSpecVec)()); + } if (!pp->hadError) { - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec),(yyvsp[-8].iValue)); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); vector vars((yyvsp[-8].iValue)); if (!pp->hadError) { if ((yyvsp[0].oVarSpecVec)()) { @@ -2532,6 +2909,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; IntVarSpec* ivsv = static_cast((*vsv)[i]); if (ivsv->alias) { if (print) @@ -2542,6 +2920,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); ivsv->introduced = false; vars[i] = pp->intvars.size(); pp->intvars.push_back(varspec((yyvsp[-2].sValue), ivsv)); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && (yyvsp[-4].oSet)()) { Option opt = @@ -2552,10 +2931,12 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } + if(pp->capture) { for(auto* child:*vsv) delete child; (yyvsp[0].oVarSpecVec)=Option*>::none(); } delete vsv; } else { if ((yyvsp[-8].iValue)>0) { for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; Option dom = (yyvsp[-4].oSet)() ? Option::some(new AST::SetLit((yyvsp[-4].oSet).some())) : Option::none(); @@ -2564,12 +2945,12 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->intvars.push_back(varspec((yyvsp[-2].sValue), ispec)); } } - if ((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + if ((yyvsp[-4].oSet)()) { delete (yyvsp[-4].oSet).some(); if(pp->capture) (yyvsp[-4].oSet)=Option::none(); } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"))); + a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<(yyvsp[-8].iValue); i++) output->a.push_back(new AST::IntVar(vars[i])); @@ -2585,17 +2966,25 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->symbols.put((yyvsp[-2].sValue), se_iva(iva)), "Duplicate symbol"); } + if(pp->capture) { + if((yyvsp[0].oVarSpecVec)()) { for(auto* child:*(yyvsp[0].oVarSpecVec).some()) delete child; delete (yyvsp[0].oVarSpecVec).some(); } + if((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + } delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2591 "gecode/flatzinc/parser.tab.cpp" +#line 2976 "gecode/flatzinc/parser.tab.cpp" break; - case 44: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR bool_ti_expr_tail ':' var_par_id annotations vardecl_bool_var_array_init */ -#line 1039 "./gecode/flatzinc/parser.yxx" + case 45: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR bool_ti_expr_tail ':' var_par_id annotations vardecl_bool_var_array_init */ +#line 1114 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec),(yyvsp[-8].iValue)); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); yyassert(pp, (yyvsp[-10].iValue)==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,(yyvsp[-8].iValue)); + pp->capture->variable_count(*pp,(yyvsp[-8].iValue),(yyvsp[0].oVarSpecVec)()); + } if (!pp->hadError) { vector vars((yyvsp[-8].iValue)); if ((yyvsp[0].oVarSpecVec)()) { @@ -2604,6 +2993,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; BoolVarSpec* bvsv = static_cast((*vsv)[i]); if (bvsv->alias) { if (print) @@ -2614,6 +3004,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); bvsv->introduced = false; vars[i] = pp->boolvars.size(); pp->boolvars.push_back(varspec((yyvsp[-2].sValue), (*vsv)[i])); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && (yyvsp[-4].oSet)()) { Option opt = @@ -2624,9 +3015,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } - delete vsv; + if(pp->capture) { for(auto* child:*vsv) delete child; (yyvsp[0].oVarSpecVec)=Option*>::none(); } + delete vsv; } else { for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; Option dom = (yyvsp[-4].oSet)() ? Option::some(new AST::SetLit((yyvsp[-4].oSet).some())) : Option::none(); @@ -2634,11 +3027,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->boolvars.push_back(varspec((yyvsp[-2].sValue), new BoolVarSpec(dom,!print,false))); } - if ((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + if ((yyvsp[-4].oSet)()) { delete (yyvsp[-4].oSet).some(); if(pp->capture) (yyvsp[-4].oSet)=Option::none(); } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"))); + a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<(yyvsp[-8].iValue); i++) output->a.push_back(new AST::BoolVar(vars[i])); @@ -2654,18 +3047,26 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->symbols.put((yyvsp[-2].sValue), se_bva(bva)), "Duplicate symbol"); } + if(pp->capture) { + if((yyvsp[0].oVarSpecVec)()) { for(auto* child:*(yyvsp[0].oVarSpecVec).some()) delete child; delete (yyvsp[0].oVarSpecVec).some(); } + if((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + } delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2660 "gecode/flatzinc/parser.tab.cpp" +#line 3057 "gecode/flatzinc/parser.tab.cpp" break; - case 45: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR float_ti_expr_tail ':' var_par_id annotations vardecl_float_var_array_init */ -#line 1106 "./gecode/flatzinc/parser.yxx" + case 46: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR float_ti_expr_tail ':' var_par_id annotations vardecl_float_var_array_init */ +#line 1193 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); yyassert(pp, (yyvsp[-10].iValue)==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,(yyvsp[-8].iValue)); + pp->capture->variable_count(*pp,(yyvsp[-8].iValue),(yyvsp[0].oVarSpecVec)()); + } if (!pp->hadError) { - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec),(yyvsp[-8].iValue)); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); vector vars((yyvsp[-8].iValue)); if (!pp->hadError) { if ((yyvsp[0].oVarSpecVec)()) { @@ -2674,6 +3075,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; FloatVarSpec* ivsv = static_cast((*vsv)[i]); if (ivsv->alias) { if (print) @@ -2684,6 +3086,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); ivsv->introduced = false; vars[i] = pp->floatvars.size(); pp->floatvars.push_back(varspec((yyvsp[-2].sValue), ivsv)); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && (yyvsp[-4].oPFloat)()) { Option*> opt = @@ -2694,6 +3097,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } + if(pp->capture) { for(auto* child:*vsv) delete child; (yyvsp[0].oVarSpecVec)=Option*>::none(); } delete vsv; } else { if ((yyvsp[-8].iValue)>0) { @@ -2701,6 +3105,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-4].oPFloat)() ? Option >::some(*(yyvsp[-4].oPFloat).some()) : Option >::none(); for (int i=0; i<(yyvsp[-8].iValue); i++) { + if(pp->capture && pp->hadError) break; FloatVarSpec* ispec = new FloatVarSpec(dom,!print,false); vars[i] = pp->floatvars.size(); pp->floatvars.push_back(varspec((yyvsp[-2].sValue), ispec)); @@ -2708,9 +3113,9 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"))); + a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<(yyvsp[-8].iValue); i++) output->a.push_back(new AST::FloatVar(vars[i])); @@ -2726,18 +3131,26 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->symbols.put((yyvsp[-2].sValue), se_fva(fva)), "Duplicate symbol"); } - if ((yyvsp[-4].oPFloat)()) delete (yyvsp[-4].oPFloat).some(); + if ((yyvsp[-4].oPFloat)()) { delete (yyvsp[-4].oPFloat).some(); if(pp->capture) (yyvsp[-4].oPFloat)=Option*>::none(); } + if(pp->capture) { + if((yyvsp[0].oVarSpecVec)()) { for(auto* child:*(yyvsp[0].oVarSpecVec).some()) delete child; delete (yyvsp[0].oVarSpecVec).some(); } + if((yyvsp[-4].oPFloat)()) delete (yyvsp[-4].oPFloat).some(); + } delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2733 "gecode/flatzinc/parser.tab.cpp" +#line 3142 "gecode/flatzinc/parser.tab.cpp" break; - case 46: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations vardecl_set_var_array_init */ -#line 1176 "./gecode/flatzinc/parser.yxx" + case 47: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations vardecl_set_var_array_init */ +#line 1275 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); - bool print = (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,(yyvsp[-2].sValue),(yyvsp[-1].argVec),(yyvsp[-10].iValue)); + bool print = (!pp->capture || !pp->hadError) && (yyvsp[-1].argVec) != NULL && (yyvsp[-1].argVec)->hasCall("output_array"); yyassert(pp, (yyvsp[-12].iValue)==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,(yyvsp[-10].iValue)); + pp->capture->variable_count(*pp,(yyvsp[-10].iValue),(yyvsp[0].oVarSpecVec)()); + } if (!pp->hadError) { vector vars((yyvsp[-10].iValue)); if ((yyvsp[0].oVarSpecVec)()) { @@ -2746,6 +3159,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<(yyvsp[-10].iValue); i++) { + if(pp->capture && pp->hadError) break; SetVarSpec* svsv = static_cast((*vsv)[i]); if (svsv->alias) { if (print) @@ -2756,6 +3170,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); svsv->introduced = false; vars[i] = pp->setvars.size(); pp->setvars.push_back(varspec((yyvsp[-2].sValue), (*vsv)[i])); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && (yyvsp[-4].oSet)()) { Option opt = @@ -2766,10 +3181,12 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } - delete vsv; + if(pp->capture) { for(auto* child:*vsv) delete child; (yyvsp[0].oVarSpecVec)=Option*>::none(); } + delete vsv; } else { if ((yyvsp[-10].iValue)>0) { for (int i=0; i<(yyvsp[-10].iValue); i++) { + if(pp->capture && pp->hadError) break; Option dom = (yyvsp[-4].oSet)() ? Option::some(new AST::SetLit((yyvsp[-4].oSet).some())) : Option::none(); @@ -2777,12 +3194,12 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); vars[i] = pp->setvars.size(); pp->setvars.push_back(varspec((yyvsp[-2].sValue), ispec)); } - if ((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + if ((yyvsp[-4].oSet)()) { delete (yyvsp[-4].oSet).some(); if(pp->capture) (yyvsp[-4].oSet)=Option::none(); } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"))); + a->a.push_back(arrayOutput((yyvsp[-1].argVec)->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<(yyvsp[-10].iValue); i++) output->a.push_back(new AST::SetVar(vars[i])); @@ -2798,16 +3215,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); pp->symbols.put((yyvsp[-2].sValue), se_sva(sva)), "Duplicate symbol"); } + if(pp->capture) { + if((yyvsp[0].oVarSpecVec)()) { for(auto* child:*(yyvsp[0].oVarSpecVec).some()) delete child; delete (yyvsp[0].oVarSpecVec).some(); } + if((yyvsp[-4].oSet)()) delete (yyvsp[-4].oSet).some(); + } delete (yyvsp[-1].argVec); free((yyvsp[-2].sValue)); } -#line 2804 "gecode/flatzinc/parser.tab.cpp" +#line 3225 "gecode/flatzinc/parser.tab.cpp" break; - case 47: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_INT ':' var_par_id annotations '=' '[' int_list ']' */ -#line 1244 "./gecode/flatzinc/parser.yxx" + case 48: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_INT ':' var_par_id annotations '=' '[' int_list ']' */ +#line 1355 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-4].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[-12].iValue)==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,(yyvsp[-10].iValue)); yyassert(pp, (yyvsp[-1].setValue)->size() == static_cast((yyvsp[-10].iValue)), "Initializer size does not match array dimension"); @@ -2824,14 +3247,16 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); free((yyvsp[-5].sValue)); delete (yyvsp[-4].argVec); } -#line 2828 "gecode/flatzinc/parser.tab.cpp" +#line 3251 "gecode/flatzinc/parser.tab.cpp" break; - case 48: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_BOOL ':' var_par_id annotations '=' '[' bool_list ']' */ -#line 1265 "./gecode/flatzinc/parser.yxx" + case 49: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_BOOL ':' var_par_id annotations '=' '[' bool_list ']' */ +#line 1378 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-4].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[-12].iValue)==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,(yyvsp[-10].iValue)); yyassert(pp, (yyvsp[-1].setValue)->size() == static_cast((yyvsp[-10].iValue)), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -2847,14 +3272,16 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); free((yyvsp[-5].sValue)); delete (yyvsp[-4].argVec); } -#line 2851 "gecode/flatzinc/parser.tab.cpp" +#line 3276 "gecode/flatzinc/parser.tab.cpp" break; - case 49: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_FLOAT ':' var_par_id annotations '=' '[' float_list ']' */ -#line 1285 "./gecode/flatzinc/parser.yxx" + case 50: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_FLOAT ':' var_par_id annotations '=' '[' float_list ']' */ +#line 1400 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-4].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[-12].iValue)==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,(yyvsp[-10].iValue)); yyassert(pp, (yyvsp[-1].floatSetValue)->size() == static_cast((yyvsp[-10].iValue)), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -2870,14 +3297,16 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); delete (yyvsp[-1].floatSetValue); delete (yyvsp[-4].argVec); free((yyvsp[-5].sValue)); } -#line 2874 "gecode/flatzinc/parser.tab.cpp" +#line 3301 "gecode/flatzinc/parser.tab.cpp" break; - case 50: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_SET FZ_OF FZ_INT ':' var_par_id annotations '=' '[' set_literal_list ']' */ -#line 1305 "./gecode/flatzinc/parser.yxx" + case 51: /* vardecl_item: FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_SET FZ_OF FZ_INT ':' var_par_id annotations '=' '[' set_literal_list ']' */ +#line 1422 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); + if(pp->capture && (yyvsp[-4].argVec)) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, (yyvsp[-14].iValue)==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,(yyvsp[-12].iValue)); yyassert(pp, (yyvsp[-1].setValueList)->size() == static_cast((yyvsp[-12].iValue)), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -2894,24 +3323,26 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); delete (yyvsp[-1].setValueList); delete (yyvsp[-4].argVec); free((yyvsp[-5].sValue)); } -#line 2898 "gecode/flatzinc/parser.tab.cpp" +#line 3327 "gecode/flatzinc/parser.tab.cpp" break; - case 51: /* int_init: FZ_INT_LIT */ -#line 1327 "./gecode/flatzinc/parser.yxx" + case 52: /* int_init: FZ_INT_LIT */ +#line 1446 "gecode/flatzinc/parser.yxx" { (yyval.varSpec) = new IntVarSpec((yyvsp[0].iValue),false,false); } -#line 2906 "gecode/flatzinc/parser.tab.cpp" +#line 3335 "gecode/flatzinc/parser.tab.cpp" break; - case 52: /* int_init: var_par_id */ -#line 1331 "./gecode/flatzinc/parser.yxx" + case 53: /* int_init: var_par_id */ +#line 1450 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_INTVAR || e.t == ST_INT)) - (yyval.varSpec) = new IntVarSpec(Alias(e.i),false,false); + if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_INTVAR || e.t == ST_INT)) { + if(pp->capture && e.t == ST_INT) (yyval.varSpec) = new IntVarSpec(e.i,false,false); + else (yyval.varSpec) = new IntVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type int " << (yyvsp[0].sValue) << " in line no. " @@ -2921,11 +3352,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[0].sValue)); } -#line 2925 "gecode/flatzinc/parser.tab.cpp" +#line 3356 "gecode/flatzinc/parser.tab.cpp" break; - case 53: /* int_init: var_par_id '[' FZ_INT_LIT ']' */ -#line 1346 "./gecode/flatzinc/parser.yxx" + case 54: /* int_init: var_par_id '[' FZ_INT_LIT ']' */ +#line 1467 "gecode/flatzinc/parser.yxx" { vector v; SymbolEntry e; @@ -2946,52 +3377,54 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-3].sValue)); } -#line 2950 "gecode/flatzinc/parser.tab.cpp" +#line 3381 "gecode/flatzinc/parser.tab.cpp" break; - case 54: /* int_init_list: %empty */ -#line 1369 "./gecode/flatzinc/parser.yxx" + case 55: /* int_init_list: %empty */ +#line 1490 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(0); } -#line 2956 "gecode/flatzinc/parser.tab.cpp" +#line 3387 "gecode/flatzinc/parser.tab.cpp" break; - case 55: /* int_init_list: int_init_list_head list_tail */ -#line 1371 "./gecode/flatzinc/parser.yxx" + case 56: /* int_init_list: int_init_list_head list_tail */ +#line 1492 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 2962 "gecode/flatzinc/parser.tab.cpp" +#line 3393 "gecode/flatzinc/parser.tab.cpp" break; - case 56: /* int_init_list_head: int_init */ -#line 1375 "./gecode/flatzinc/parser.yxx" + case 57: /* int_init_list_head: int_init */ +#line 1496 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(1); (*(yyval.varSpecVec))[0] = (yyvsp[0].varSpec); } -#line 2968 "gecode/flatzinc/parser.tab.cpp" +#line 3399 "gecode/flatzinc/parser.tab.cpp" break; - case 57: /* int_init_list_head: int_init_list_head ',' int_init */ -#line 1377 "./gecode/flatzinc/parser.yxx" + case 58: /* int_init_list_head: int_init_list_head ',' int_init */ +#line 1498 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-2].varSpecVec); (yyval.varSpecVec)->push_back((yyvsp[0].varSpec)); } -#line 2974 "gecode/flatzinc/parser.tab.cpp" +#line 3405 "gecode/flatzinc/parser.tab.cpp" break; - case 60: /* int_var_array_literal: '[' int_init_list ']' */ -#line 1382 "./gecode/flatzinc/parser.yxx" + case 61: /* int_var_array_literal: '[' int_init_list ']' */ +#line 1503 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 2980 "gecode/flatzinc/parser.tab.cpp" +#line 3411 "gecode/flatzinc/parser.tab.cpp" break; - case 61: /* float_init: FZ_FLOAT_LIT */ -#line 1386 "./gecode/flatzinc/parser.yxx" + case 62: /* float_init: FZ_FLOAT_LIT */ +#line 1507 "gecode/flatzinc/parser.yxx" { (yyval.varSpec) = new FloatVarSpec((yyvsp[0].dValue),false,false); } -#line 2986 "gecode/flatzinc/parser.tab.cpp" +#line 3417 "gecode/flatzinc/parser.tab.cpp" break; - case 62: /* float_init: var_par_id */ -#line 1388 "./gecode/flatzinc/parser.yxx" + case 63: /* float_init: var_par_id */ +#line 1509 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT)) - (yyval.varSpec) = new FloatVarSpec(Alias(e.i),false,false); + if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT)) { + if(pp->capture && e.t == ST_FLOAT) (yyval.varSpec) = new FloatVarSpec(pp->floatvals.at(e.i),false,false); + else (yyval.varSpec) = new FloatVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type float " << (yyvsp[0].sValue) << " in line no. " @@ -3001,11 +3434,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[0].sValue)); } -#line 3005 "gecode/flatzinc/parser.tab.cpp" +#line 3438 "gecode/flatzinc/parser.tab.cpp" break; - case 63: /* float_init: var_par_id '[' FZ_INT_LIT ']' */ -#line 1403 "./gecode/flatzinc/parser.yxx" + case 64: /* float_init: var_par_id '[' FZ_INT_LIT ']' */ +#line 1526 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); @@ -3025,52 +3458,54 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-3].sValue)); } -#line 3029 "gecode/flatzinc/parser.tab.cpp" +#line 3462 "gecode/flatzinc/parser.tab.cpp" break; - case 64: /* float_init_list: %empty */ -#line 1425 "./gecode/flatzinc/parser.yxx" + case 65: /* float_init_list: %empty */ +#line 1548 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(0); } -#line 3035 "gecode/flatzinc/parser.tab.cpp" +#line 3468 "gecode/flatzinc/parser.tab.cpp" break; - case 65: /* float_init_list: float_init_list_head list_tail */ -#line 1427 "./gecode/flatzinc/parser.yxx" + case 66: /* float_init_list: float_init_list_head list_tail */ +#line 1550 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3041 "gecode/flatzinc/parser.tab.cpp" +#line 3474 "gecode/flatzinc/parser.tab.cpp" break; - case 66: /* float_init_list_head: float_init */ -#line 1431 "./gecode/flatzinc/parser.yxx" + case 67: /* float_init_list_head: float_init */ +#line 1554 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(1); (*(yyval.varSpecVec))[0] = (yyvsp[0].varSpec); } -#line 3047 "gecode/flatzinc/parser.tab.cpp" +#line 3480 "gecode/flatzinc/parser.tab.cpp" break; - case 67: /* float_init_list_head: float_init_list_head ',' float_init */ -#line 1433 "./gecode/flatzinc/parser.yxx" + case 68: /* float_init_list_head: float_init_list_head ',' float_init */ +#line 1556 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-2].varSpecVec); (yyval.varSpecVec)->push_back((yyvsp[0].varSpec)); } -#line 3053 "gecode/flatzinc/parser.tab.cpp" +#line 3486 "gecode/flatzinc/parser.tab.cpp" break; - case 68: /* float_var_array_literal: '[' float_init_list ']' */ -#line 1437 "./gecode/flatzinc/parser.yxx" + case 69: /* float_var_array_literal: '[' float_init_list ']' */ +#line 1560 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3059 "gecode/flatzinc/parser.tab.cpp" +#line 3492 "gecode/flatzinc/parser.tab.cpp" break; - case 69: /* bool_init: FZ_BOOL_LIT */ -#line 1441 "./gecode/flatzinc/parser.yxx" + case 70: /* bool_init: FZ_BOOL_LIT */ +#line 1564 "gecode/flatzinc/parser.yxx" { (yyval.varSpec) = new BoolVarSpec((yyvsp[0].iValue),false,false); } -#line 3065 "gecode/flatzinc/parser.tab.cpp" +#line 3498 "gecode/flatzinc/parser.tab.cpp" break; - case 70: /* bool_init: var_par_id */ -#line 1443 "./gecode/flatzinc/parser.yxx" + case 71: /* bool_init: var_par_id */ +#line 1566 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL)) - (yyval.varSpec) = new BoolVarSpec(Alias(e.i),false,false); + if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL)) { + if(pp->capture && e.t == ST_BOOL) (yyval.varSpec) = new BoolVarSpec(e.i != 0,false,false); + else (yyval.varSpec) = new BoolVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type bool " << (yyvsp[0].sValue) << " in line no. " @@ -3080,11 +3515,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[0].sValue)); } -#line 3084 "gecode/flatzinc/parser.tab.cpp" +#line 3519 "gecode/flatzinc/parser.tab.cpp" break; - case 71: /* bool_init: var_par_id '[' FZ_INT_LIT ']' */ -#line 1458 "./gecode/flatzinc/parser.yxx" + case 72: /* bool_init: var_par_id '[' FZ_INT_LIT ']' */ +#line 1583 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); @@ -3104,52 +3539,54 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-3].sValue)); } -#line 3108 "gecode/flatzinc/parser.tab.cpp" +#line 3543 "gecode/flatzinc/parser.tab.cpp" break; - case 72: /* bool_init_list: %empty */ -#line 1480 "./gecode/flatzinc/parser.yxx" + case 73: /* bool_init_list: %empty */ +#line 1605 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(0); } -#line 3114 "gecode/flatzinc/parser.tab.cpp" +#line 3549 "gecode/flatzinc/parser.tab.cpp" break; - case 73: /* bool_init_list: bool_init_list_head list_tail */ -#line 1482 "./gecode/flatzinc/parser.yxx" + case 74: /* bool_init_list: bool_init_list_head list_tail */ +#line 1607 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3120 "gecode/flatzinc/parser.tab.cpp" +#line 3555 "gecode/flatzinc/parser.tab.cpp" break; - case 74: /* bool_init_list_head: bool_init */ -#line 1486 "./gecode/flatzinc/parser.yxx" + case 75: /* bool_init_list_head: bool_init */ +#line 1611 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(1); (*(yyval.varSpecVec))[0] = (yyvsp[0].varSpec); } -#line 3126 "gecode/flatzinc/parser.tab.cpp" +#line 3561 "gecode/flatzinc/parser.tab.cpp" break; - case 75: /* bool_init_list_head: bool_init_list_head ',' bool_init */ -#line 1488 "./gecode/flatzinc/parser.yxx" + case 76: /* bool_init_list_head: bool_init_list_head ',' bool_init */ +#line 1613 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-2].varSpecVec); (yyval.varSpecVec)->push_back((yyvsp[0].varSpec)); } -#line 3132 "gecode/flatzinc/parser.tab.cpp" +#line 3567 "gecode/flatzinc/parser.tab.cpp" break; - case 76: /* bool_var_array_literal: '[' bool_init_list ']' */ -#line 1490 "./gecode/flatzinc/parser.yxx" + case 77: /* bool_var_array_literal: '[' bool_init_list ']' */ +#line 1615 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3138 "gecode/flatzinc/parser.tab.cpp" +#line 3573 "gecode/flatzinc/parser.tab.cpp" break; - case 77: /* set_init: set_literal */ -#line 1494 "./gecode/flatzinc/parser.yxx" + case 78: /* set_init: set_literal */ +#line 1619 "gecode/flatzinc/parser.yxx" { (yyval.varSpec) = new SetVarSpec((yyvsp[0].setLit),false,false); } -#line 3144 "gecode/flatzinc/parser.tab.cpp" +#line 3579 "gecode/flatzinc/parser.tab.cpp" break; - case 78: /* set_init: var_par_id */ -#line 1496 "./gecode/flatzinc/parser.yxx" + case 79: /* set_init: var_par_id */ +#line 1621 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); SymbolEntry e; - if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_SETVAR || e.t == ST_SET)) - (yyval.varSpec) = new SetVarSpec(Alias(e.i),false,false); + if (pp->symbols.get((yyvsp[0].sValue), e) && (e.t == ST_SETVAR || e.t == ST_SET)) { + if(pp->capture && e.t == ST_SET) (yyval.varSpec) = new SetVarSpec(new AST::SetLit(pp->setvals.at(e.i)),false,false); + else (yyval.varSpec) = new SetVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type set " << (yyvsp[0].sValue) << " in line no. " @@ -3159,11 +3596,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[0].sValue)); } -#line 3163 "gecode/flatzinc/parser.tab.cpp" +#line 3600 "gecode/flatzinc/parser.tab.cpp" break; - case 79: /* set_init: var_par_id '[' FZ_INT_LIT ']' */ -#line 1511 "./gecode/flatzinc/parser.yxx" + case 80: /* set_init: var_par_id '[' FZ_INT_LIT ']' */ +#line 1638 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState* pp = static_cast(parm); @@ -3183,92 +3620,95 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-3].sValue)); } -#line 3187 "gecode/flatzinc/parser.tab.cpp" +#line 3624 "gecode/flatzinc/parser.tab.cpp" break; - case 80: /* set_init_list: %empty */ -#line 1533 "./gecode/flatzinc/parser.yxx" + case 81: /* set_init_list: %empty */ +#line 1660 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(0); } -#line 3193 "gecode/flatzinc/parser.tab.cpp" +#line 3630 "gecode/flatzinc/parser.tab.cpp" break; - case 81: /* set_init_list: set_init_list_head list_tail */ -#line 1535 "./gecode/flatzinc/parser.yxx" + case 82: /* set_init_list: set_init_list_head list_tail */ +#line 1662 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3199 "gecode/flatzinc/parser.tab.cpp" +#line 3636 "gecode/flatzinc/parser.tab.cpp" break; - case 82: /* set_init_list_head: set_init */ -#line 1539 "./gecode/flatzinc/parser.yxx" + case 83: /* set_init_list_head: set_init */ +#line 1666 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = new vector(1); (*(yyval.varSpecVec))[0] = (yyvsp[0].varSpec); } -#line 3205 "gecode/flatzinc/parser.tab.cpp" +#line 3642 "gecode/flatzinc/parser.tab.cpp" break; - case 83: /* set_init_list_head: set_init_list_head ',' set_init */ -#line 1541 "./gecode/flatzinc/parser.yxx" + case 84: /* set_init_list_head: set_init_list_head ',' set_init */ +#line 1668 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-2].varSpecVec); (yyval.varSpecVec)->push_back((yyvsp[0].varSpec)); } -#line 3211 "gecode/flatzinc/parser.tab.cpp" +#line 3648 "gecode/flatzinc/parser.tab.cpp" break; - case 84: /* set_var_array_literal: '[' set_init_list ']' */ -#line 1544 "./gecode/flatzinc/parser.yxx" + case 85: /* set_var_array_literal: '[' set_init_list ']' */ +#line 1671 "gecode/flatzinc/parser.yxx" { (yyval.varSpecVec) = (yyvsp[-1].varSpecVec); } -#line 3217 "gecode/flatzinc/parser.tab.cpp" +#line 3654 "gecode/flatzinc/parser.tab.cpp" break; - case 85: /* vardecl_int_var_array_init: %empty */ -#line 1548 "./gecode/flatzinc/parser.yxx" + case 86: /* vardecl_int_var_array_init: %empty */ +#line 1675 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::none(); } -#line 3223 "gecode/flatzinc/parser.tab.cpp" +#line 3660 "gecode/flatzinc/parser.tab.cpp" break; - case 86: /* vardecl_int_var_array_init: '=' int_var_array_literal */ -#line 1550 "./gecode/flatzinc/parser.yxx" + case 87: /* vardecl_int_var_array_init: '=' int_var_array_literal */ +#line 1677 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::some((yyvsp[0].varSpecVec)); } -#line 3229 "gecode/flatzinc/parser.tab.cpp" +#line 3666 "gecode/flatzinc/parser.tab.cpp" break; - case 87: /* vardecl_bool_var_array_init: %empty */ -#line 1554 "./gecode/flatzinc/parser.yxx" + case 88: /* vardecl_bool_var_array_init: %empty */ +#line 1681 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::none(); } -#line 3235 "gecode/flatzinc/parser.tab.cpp" +#line 3672 "gecode/flatzinc/parser.tab.cpp" break; - case 88: /* vardecl_bool_var_array_init: '=' bool_var_array_literal */ -#line 1556 "./gecode/flatzinc/parser.yxx" + case 89: /* vardecl_bool_var_array_init: '=' bool_var_array_literal */ +#line 1683 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::some((yyvsp[0].varSpecVec)); } -#line 3241 "gecode/flatzinc/parser.tab.cpp" +#line 3678 "gecode/flatzinc/parser.tab.cpp" break; - case 89: /* vardecl_float_var_array_init: %empty */ -#line 1560 "./gecode/flatzinc/parser.yxx" + case 90: /* vardecl_float_var_array_init: %empty */ +#line 1687 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::none(); } -#line 3247 "gecode/flatzinc/parser.tab.cpp" +#line 3684 "gecode/flatzinc/parser.tab.cpp" break; - case 90: /* vardecl_float_var_array_init: '=' float_var_array_literal */ -#line 1562 "./gecode/flatzinc/parser.yxx" + case 91: /* vardecl_float_var_array_init: '=' float_var_array_literal */ +#line 1689 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::some((yyvsp[0].varSpecVec)); } -#line 3253 "gecode/flatzinc/parser.tab.cpp" +#line 3690 "gecode/flatzinc/parser.tab.cpp" break; - case 91: /* vardecl_set_var_array_init: %empty */ -#line 1566 "./gecode/flatzinc/parser.yxx" + case 92: /* vardecl_set_var_array_init: %empty */ +#line 1693 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::none(); } -#line 3259 "gecode/flatzinc/parser.tab.cpp" +#line 3696 "gecode/flatzinc/parser.tab.cpp" break; - case 92: /* vardecl_set_var_array_init: '=' set_var_array_literal */ -#line 1568 "./gecode/flatzinc/parser.yxx" + case 93: /* vardecl_set_var_array_init: '=' set_var_array_literal */ +#line 1695 "gecode/flatzinc/parser.yxx" { (yyval.oVarSpecVec) = Option* >::some((yyvsp[0].varSpecVec)); } -#line 3265 "gecode/flatzinc/parser.tab.cpp" +#line 3702 "gecode/flatzinc/parser.tab.cpp" break; - case 93: /* constraint_item: FZ_CONSTRAINT FZ_ID '(' flat_expr_list ')' annotations */ -#line 1572 "./gecode/flatzinc/parser.yxx" + case 94: /* constraint_item: FZ_CONSTRAINT FZ_ID '(' flat_expr_list ')' annotations */ +#line 1699 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->constraint(*pp,(yyvsp[-4].sValue),(yyvsp[-2].argVec),(yyvsp[0].argVec)); + delete (yyvsp[-2].argVec); delete (yyvsp[0].argVec); + } else if (!pp->hadError) { std::string cid((yyvsp[-4].sValue)); if (cid=="gecode_on_restart_status" && (yyvsp[-2].argVec)->a[0]->isIntVar()) { pp->status_idx = getBaseIntVar(pp,(yyvsp[-2].argVec)->a[0]->getIntVar()); @@ -3430,15 +3870,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-4].sValue)); } -#line 3434 "gecode/flatzinc/parser.tab.cpp" +#line 3874 "gecode/flatzinc/parser.tab.cpp" break; - case 94: /* solve_item: FZ_SOLVE annotations FZ_SATISFY */ -#line 1738 "./gecode/flatzinc/parser.yxx" + case 95: /* solve_item: FZ_SOLVE annotations FZ_SATISFY */ +#line 1868 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); initfg(pp); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->solve(*pp,Capture::Method::Satisfy,(yyvsp[-1].argVec)); + delete (yyvsp[-1].argVec); + } else if (!pp->hadError) { try { pp->fg->solve((yyvsp[-1].argVec)); } catch (Gecode::FlatZinc::Error& e) { @@ -3448,15 +3891,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); delete (yyvsp[-1].argVec); } } -#line 3452 "gecode/flatzinc/parser.tab.cpp" +#line 3895 "gecode/flatzinc/parser.tab.cpp" break; - case 95: /* solve_item: FZ_SOLVE annotations minmax solve_expr */ -#line 1752 "./gecode/flatzinc/parser.yxx" + case 96: /* solve_item: FZ_SOLVE annotations minmax solve_expr */ +#line 1885 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); initfg(pp); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->solve(*pp,(yyvsp[-1].bValue)?Capture::Method::Minimize:Capture::Method::Maximize,(yyvsp[-2].argVec)); + delete (yyvsp[-2].argVec); + } else if (!pp->hadError) { try { int v = (yyvsp[0].iValue) < 0 ? (-(yyvsp[0].iValue)-1) : (yyvsp[0].iValue); bool vi = (yyvsp[0].iValue) >= 0; @@ -3471,37 +3917,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); delete (yyvsp[-2].argVec); } } -#line 3475 "gecode/flatzinc/parser.tab.cpp" +#line 3921 "gecode/flatzinc/parser.tab.cpp" break; - case 96: /* int_ti_expr_tail: FZ_INT */ -#line 1777 "./gecode/flatzinc/parser.yxx" + case 97: /* int_ti_expr_tail: FZ_INT */ +#line 1913 "gecode/flatzinc/parser.yxx" { (yyval.oSet) = Option::none(); } -#line 3481 "gecode/flatzinc/parser.tab.cpp" +#line 3927 "gecode/flatzinc/parser.tab.cpp" break; - case 97: /* int_ti_expr_tail: '{' int_list '}' */ -#line 1779 "./gecode/flatzinc/parser.yxx" - { (yyval.oSet) = Option::some(new AST::SetLit(*(yyvsp[-1].setValue))); } -#line 3487 "gecode/flatzinc/parser.tab.cpp" + case 98: /* int_ti_expr_tail: '{' int_list '}' */ +#line 1915 "gecode/flatzinc/parser.yxx" + { (yyval.oSet) = Option::some(new AST::SetLit(*(yyvsp[-1].setValue))); if(static_cast(parm)->capture) delete (yyvsp[-1].setValue); } +#line 3933 "gecode/flatzinc/parser.tab.cpp" break; - case 98: /* int_ti_expr_tail: FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT */ -#line 1781 "./gecode/flatzinc/parser.yxx" + case 99: /* int_ti_expr_tail: FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT */ +#line 1917 "gecode/flatzinc/parser.yxx" { (yyval.oSet) = Option::some(new AST::SetLit((yyvsp[-2].iValue), (yyvsp[0].iValue))); } -#line 3495 "gecode/flatzinc/parser.tab.cpp" +#line 3941 "gecode/flatzinc/parser.tab.cpp" break; - case 99: /* bool_ti_expr_tail: FZ_BOOL */ -#line 1787 "./gecode/flatzinc/parser.yxx" + case 100: /* bool_ti_expr_tail: FZ_BOOL */ +#line 1923 "gecode/flatzinc/parser.yxx" { (yyval.oSet) = Option::none(); } -#line 3501 "gecode/flatzinc/parser.tab.cpp" +#line 3947 "gecode/flatzinc/parser.tab.cpp" break; - case 100: /* bool_ti_expr_tail: '{' bool_list_head list_tail '}' */ -#line 1789 "./gecode/flatzinc/parser.yxx" + case 101: /* bool_ti_expr_tail: '{' bool_list_head list_tail '}' */ +#line 1925 "gecode/flatzinc/parser.yxx" { bool haveTrue = false; bool haveFalse = false; for (int i=(yyvsp[-2].setValue)->size(); i--;) { @@ -3512,192 +3958,192 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.oSet) = Option::some( new AST::SetLit(!haveFalse,haveTrue)); } -#line 3516 "gecode/flatzinc/parser.tab.cpp" +#line 3962 "gecode/flatzinc/parser.tab.cpp" break; - case 101: /* float_ti_expr_tail: FZ_FLOAT */ -#line 1802 "./gecode/flatzinc/parser.yxx" + case 102: /* float_ti_expr_tail: FZ_FLOAT */ +#line 1938 "gecode/flatzinc/parser.yxx" { (yyval.oPFloat) = Option* >::none(); } -#line 3522 "gecode/flatzinc/parser.tab.cpp" +#line 3968 "gecode/flatzinc/parser.tab.cpp" break; - case 102: /* float_ti_expr_tail: FZ_FLOAT_LIT FZ_DOTDOT FZ_FLOAT_LIT */ -#line 1804 "./gecode/flatzinc/parser.yxx" + case 103: /* float_ti_expr_tail: FZ_FLOAT_LIT FZ_DOTDOT FZ_FLOAT_LIT */ +#line 1940 "gecode/flatzinc/parser.yxx" { std::pair* dom = new std::pair((yyvsp[-2].dValue),(yyvsp[0].dValue)); (yyval.oPFloat) = Option* >::some(dom); } -#line 3529 "gecode/flatzinc/parser.tab.cpp" +#line 3975 "gecode/flatzinc/parser.tab.cpp" break; - case 103: /* set_literal: '{' int_list '}' */ -#line 1813 "./gecode/flatzinc/parser.yxx" - { (yyval.setLit) = new AST::SetLit(*(yyvsp[-1].setValue)); } -#line 3535 "gecode/flatzinc/parser.tab.cpp" + case 104: /* set_literal: '{' int_list '}' */ +#line 1949 "gecode/flatzinc/parser.yxx" + { (yyval.setLit) = new AST::SetLit(*(yyvsp[-1].setValue)); if(static_cast(parm)->capture) delete (yyvsp[-1].setValue); } +#line 3981 "gecode/flatzinc/parser.tab.cpp" break; - case 104: /* set_literal: FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT */ -#line 1815 "./gecode/flatzinc/parser.yxx" + case 105: /* set_literal: FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT */ +#line 1951 "gecode/flatzinc/parser.yxx" { (yyval.setLit) = new AST::SetLit((yyvsp[-2].iValue), (yyvsp[0].iValue)); } -#line 3541 "gecode/flatzinc/parser.tab.cpp" +#line 3987 "gecode/flatzinc/parser.tab.cpp" break; - case 105: /* int_list: %empty */ -#line 1821 "./gecode/flatzinc/parser.yxx" + case 106: /* int_list: %empty */ +#line 1957 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = new vector(0); } -#line 3547 "gecode/flatzinc/parser.tab.cpp" +#line 3993 "gecode/flatzinc/parser.tab.cpp" break; - case 106: /* int_list: int_list_head list_tail */ -#line 1823 "./gecode/flatzinc/parser.yxx" + case 107: /* int_list: int_list_head list_tail */ +#line 1959 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = (yyvsp[-1].setValue); } -#line 3553 "gecode/flatzinc/parser.tab.cpp" +#line 3999 "gecode/flatzinc/parser.tab.cpp" break; - case 107: /* int_list_head: FZ_INT_LIT */ -#line 1827 "./gecode/flatzinc/parser.yxx" + case 108: /* int_list_head: FZ_INT_LIT */ +#line 1963 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = new vector(1); (*(yyval.setValue))[0] = (yyvsp[0].iValue); } -#line 3559 "gecode/flatzinc/parser.tab.cpp" +#line 4005 "gecode/flatzinc/parser.tab.cpp" break; - case 108: /* int_list_head: int_list_head ',' FZ_INT_LIT */ -#line 1829 "./gecode/flatzinc/parser.yxx" + case 109: /* int_list_head: int_list_head ',' FZ_INT_LIT */ +#line 1965 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = (yyvsp[-2].setValue); (yyval.setValue)->push_back((yyvsp[0].iValue)); } -#line 3565 "gecode/flatzinc/parser.tab.cpp" +#line 4011 "gecode/flatzinc/parser.tab.cpp" break; - case 109: /* bool_list: %empty */ -#line 1833 "./gecode/flatzinc/parser.yxx" + case 110: /* bool_list: %empty */ +#line 1969 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = new vector(0); } -#line 3571 "gecode/flatzinc/parser.tab.cpp" +#line 4017 "gecode/flatzinc/parser.tab.cpp" break; - case 110: /* bool_list: bool_list_head list_tail */ -#line 1835 "./gecode/flatzinc/parser.yxx" + case 111: /* bool_list: bool_list_head list_tail */ +#line 1971 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = (yyvsp[-1].setValue); } -#line 3577 "gecode/flatzinc/parser.tab.cpp" +#line 4023 "gecode/flatzinc/parser.tab.cpp" break; - case 111: /* bool_list_head: FZ_BOOL_LIT */ -#line 1839 "./gecode/flatzinc/parser.yxx" + case 112: /* bool_list_head: FZ_BOOL_LIT */ +#line 1975 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = new vector(1); (*(yyval.setValue))[0] = (yyvsp[0].iValue); } -#line 3583 "gecode/flatzinc/parser.tab.cpp" +#line 4029 "gecode/flatzinc/parser.tab.cpp" break; - case 112: /* bool_list_head: bool_list_head ',' FZ_BOOL_LIT */ -#line 1841 "./gecode/flatzinc/parser.yxx" + case 113: /* bool_list_head: bool_list_head ',' FZ_BOOL_LIT */ +#line 1977 "gecode/flatzinc/parser.yxx" { (yyval.setValue) = (yyvsp[-2].setValue); (yyval.setValue)->push_back((yyvsp[0].iValue)); } -#line 3589 "gecode/flatzinc/parser.tab.cpp" +#line 4035 "gecode/flatzinc/parser.tab.cpp" break; - case 113: /* float_list: %empty */ -#line 1845 "./gecode/flatzinc/parser.yxx" + case 114: /* float_list: %empty */ +#line 1981 "gecode/flatzinc/parser.yxx" { (yyval.floatSetValue) = new vector(0); } -#line 3595 "gecode/flatzinc/parser.tab.cpp" +#line 4041 "gecode/flatzinc/parser.tab.cpp" break; - case 114: /* float_list: float_list_head list_tail */ -#line 1847 "./gecode/flatzinc/parser.yxx" + case 115: /* float_list: float_list_head list_tail */ +#line 1983 "gecode/flatzinc/parser.yxx" { (yyval.floatSetValue) = (yyvsp[-1].floatSetValue); } -#line 3601 "gecode/flatzinc/parser.tab.cpp" +#line 4047 "gecode/flatzinc/parser.tab.cpp" break; - case 115: /* float_list_head: FZ_FLOAT_LIT */ -#line 1851 "./gecode/flatzinc/parser.yxx" + case 116: /* float_list_head: FZ_FLOAT_LIT */ +#line 1987 "gecode/flatzinc/parser.yxx" { (yyval.floatSetValue) = new vector(1); (*(yyval.floatSetValue))[0] = (yyvsp[0].dValue); } -#line 3607 "gecode/flatzinc/parser.tab.cpp" +#line 4053 "gecode/flatzinc/parser.tab.cpp" break; - case 116: /* float_list_head: float_list_head ',' FZ_FLOAT_LIT */ -#line 1853 "./gecode/flatzinc/parser.yxx" + case 117: /* float_list_head: float_list_head ',' FZ_FLOAT_LIT */ +#line 1989 "gecode/flatzinc/parser.yxx" { (yyval.floatSetValue) = (yyvsp[-2].floatSetValue); (yyval.floatSetValue)->push_back((yyvsp[0].dValue)); } -#line 3613 "gecode/flatzinc/parser.tab.cpp" +#line 4059 "gecode/flatzinc/parser.tab.cpp" break; - case 117: /* set_literal_list: %empty */ -#line 1857 "./gecode/flatzinc/parser.yxx" + case 118: /* set_literal_list: %empty */ +#line 1993 "gecode/flatzinc/parser.yxx" { (yyval.setValueList) = new vector(0); } -#line 3619 "gecode/flatzinc/parser.tab.cpp" +#line 4065 "gecode/flatzinc/parser.tab.cpp" break; - case 118: /* set_literal_list: set_literal_list_head list_tail */ -#line 1859 "./gecode/flatzinc/parser.yxx" + case 119: /* set_literal_list: set_literal_list_head list_tail */ +#line 1995 "gecode/flatzinc/parser.yxx" { (yyval.setValueList) = (yyvsp[-1].setValueList); } -#line 3625 "gecode/flatzinc/parser.tab.cpp" +#line 4071 "gecode/flatzinc/parser.tab.cpp" break; - case 119: /* set_literal_list_head: set_literal */ -#line 1863 "./gecode/flatzinc/parser.yxx" + case 120: /* set_literal_list_head: set_literal */ +#line 1999 "gecode/flatzinc/parser.yxx" { (yyval.setValueList) = new vector(1); (*(yyval.setValueList))[0] = *(yyvsp[0].setLit); delete (yyvsp[0].setLit); } -#line 3631 "gecode/flatzinc/parser.tab.cpp" +#line 4077 "gecode/flatzinc/parser.tab.cpp" break; - case 120: /* set_literal_list_head: set_literal_list_head ',' set_literal */ -#line 1865 "./gecode/flatzinc/parser.yxx" + case 121: /* set_literal_list_head: set_literal_list_head ',' set_literal */ +#line 2001 "gecode/flatzinc/parser.yxx" { (yyval.setValueList) = (yyvsp[-2].setValueList); (yyval.setValueList)->push_back(*(yyvsp[0].setLit)); delete (yyvsp[0].setLit); } -#line 3637 "gecode/flatzinc/parser.tab.cpp" +#line 4083 "gecode/flatzinc/parser.tab.cpp" break; - case 121: /* flat_expr_list: flat_expr */ -#line 1873 "./gecode/flatzinc/parser.yxx" + case 122: /* flat_expr_list: flat_expr */ +#line 2009 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = new AST::Array((yyvsp[0].arg)); } -#line 3643 "gecode/flatzinc/parser.tab.cpp" +#line 4089 "gecode/flatzinc/parser.tab.cpp" break; - case 122: /* flat_expr_list: flat_expr_list ',' flat_expr */ -#line 1875 "./gecode/flatzinc/parser.yxx" + case 123: /* flat_expr_list: flat_expr_list ',' flat_expr */ +#line 2011 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = (yyvsp[-2].argVec); (yyval.argVec)->append((yyvsp[0].arg)); } -#line 3649 "gecode/flatzinc/parser.tab.cpp" +#line 4095 "gecode/flatzinc/parser.tab.cpp" break; - case 123: /* flat_expr: non_array_expr */ -#line 1879 "./gecode/flatzinc/parser.yxx" + case 124: /* flat_expr: non_array_expr */ +#line 2015 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[0].arg); } -#line 3655 "gecode/flatzinc/parser.tab.cpp" +#line 4101 "gecode/flatzinc/parser.tab.cpp" break; - case 124: /* flat_expr: '[' non_array_expr_list ']' */ -#line 1881 "./gecode/flatzinc/parser.yxx" + case 125: /* flat_expr: '[' non_array_expr_list ']' */ +#line 2017 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[-1].argVec); } -#line 3661 "gecode/flatzinc/parser.tab.cpp" +#line 4107 "gecode/flatzinc/parser.tab.cpp" break; - case 125: /* non_array_expr_opt: %empty */ -#line 1885 "./gecode/flatzinc/parser.yxx" + case 126: /* non_array_expr_opt: %empty */ +#line 2021 "gecode/flatzinc/parser.yxx" { (yyval.oArg) = Option::none(); } -#line 3667 "gecode/flatzinc/parser.tab.cpp" +#line 4113 "gecode/flatzinc/parser.tab.cpp" break; - case 126: /* non_array_expr_opt: '=' non_array_expr */ -#line 1887 "./gecode/flatzinc/parser.yxx" + case 127: /* non_array_expr_opt: '=' non_array_expr */ +#line 2023 "gecode/flatzinc/parser.yxx" { (yyval.oArg) = Option::some((yyvsp[0].arg)); } -#line 3673 "gecode/flatzinc/parser.tab.cpp" +#line 4119 "gecode/flatzinc/parser.tab.cpp" break; - case 127: /* non_array_expr: FZ_BOOL_LIT */ -#line 1891 "./gecode/flatzinc/parser.yxx" + case 128: /* non_array_expr: FZ_BOOL_LIT */ +#line 2027 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::BoolLit((yyvsp[0].iValue)); } -#line 3679 "gecode/flatzinc/parser.tab.cpp" +#line 4125 "gecode/flatzinc/parser.tab.cpp" break; - case 128: /* non_array_expr: FZ_INT_LIT */ -#line 1893 "./gecode/flatzinc/parser.yxx" + case 129: /* non_array_expr: FZ_INT_LIT */ +#line 2029 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::IntLit((yyvsp[0].iValue)); } -#line 3685 "gecode/flatzinc/parser.tab.cpp" +#line 4131 "gecode/flatzinc/parser.tab.cpp" break; - case 129: /* non_array_expr: FZ_FLOAT_LIT */ -#line 1895 "./gecode/flatzinc/parser.yxx" + case 130: /* non_array_expr: FZ_FLOAT_LIT */ +#line 2031 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::FloatLit((yyvsp[0].dValue)); } -#line 3691 "gecode/flatzinc/parser.tab.cpp" +#line 4137 "gecode/flatzinc/parser.tab.cpp" break; - case 130: /* non_array_expr: set_literal */ -#line 1897 "./gecode/flatzinc/parser.yxx" + case 131: /* non_array_expr: set_literal */ +#line 2033 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[0].setLit); } -#line 3697 "gecode/flatzinc/parser.tab.cpp" +#line 4143 "gecode/flatzinc/parser.tab.cpp" break; - case 131: /* non_array_expr: var_par_id */ -#line 1899 "./gecode/flatzinc/parser.yxx" + case 132: /* non_array_expr: var_par_id */ +#line 2035 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); SymbolEntry e; @@ -3789,15 +4235,15 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; - (yyval.arg) = NULL; + (yyval.arg) = pp->capture ? new AST::IntLit(0) : NULL; } free((yyvsp[0].sValue)); } -#line 3797 "gecode/flatzinc/parser.tab.cpp" +#line 4243 "gecode/flatzinc/parser.tab.cpp" break; - case 132: /* non_array_expr: var_par_id '[' non_array_expr ']' */ -#line 1995 "./gecode/flatzinc/parser.yxx" + case 133: /* non_array_expr: var_par_id '[' non_array_expr ']' */ +#line 2131 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); int i = -1; @@ -3809,35 +4255,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); delete (yyvsp[-1].arg); free((yyvsp[-3].sValue)); } -#line 3813 "gecode/flatzinc/parser.tab.cpp" +#line 4259 "gecode/flatzinc/parser.tab.cpp" break; - case 133: /* non_array_expr_list: %empty */ -#line 2009 "./gecode/flatzinc/parser.yxx" + case 134: /* non_array_expr_list: %empty */ +#line 2145 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = new AST::Array(0); } -#line 3819 "gecode/flatzinc/parser.tab.cpp" +#line 4265 "gecode/flatzinc/parser.tab.cpp" break; - case 134: /* non_array_expr_list: non_array_expr_list_head list_tail */ -#line 2011 "./gecode/flatzinc/parser.yxx" + case 135: /* non_array_expr_list: non_array_expr_list_head list_tail */ +#line 2147 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = (yyvsp[-1].argVec); } -#line 3825 "gecode/flatzinc/parser.tab.cpp" +#line 4271 "gecode/flatzinc/parser.tab.cpp" break; - case 135: /* non_array_expr_list_head: non_array_expr */ -#line 2015 "./gecode/flatzinc/parser.yxx" + case 136: /* non_array_expr_list_head: non_array_expr */ +#line 2151 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = new AST::Array((yyvsp[0].arg)); } -#line 3831 "gecode/flatzinc/parser.tab.cpp" +#line 4277 "gecode/flatzinc/parser.tab.cpp" break; - case 136: /* non_array_expr_list_head: non_array_expr_list_head ',' non_array_expr */ -#line 2017 "./gecode/flatzinc/parser.yxx" + case 137: /* non_array_expr_list_head: non_array_expr_list_head ',' non_array_expr */ +#line 2153 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = (yyvsp[-2].argVec); (yyval.argVec)->append((yyvsp[0].arg)); } -#line 3837 "gecode/flatzinc/parser.tab.cpp" +#line 4283 "gecode/flatzinc/parser.tab.cpp" break; - case 137: /* solve_expr: var_par_id */ -#line 2025 "./gecode/flatzinc/parser.yxx" + case 138: /* solve_expr: var_par_id */ +#line 2161 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); SymbolEntry e; @@ -3845,13 +4291,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (haveSym) { switch (e.t) { case ST_INTVAR: + if(pp->capture){AST::IntVar value(e.i);pp->capture->objective(*pp,&value);} (yyval.iValue) = e.i; break; case ST_FLOATVAR: + if(pp->capture){AST::FloatVar value(e.i);pp->capture->objective(*pp,&value);} (yyval.iValue) = -e.i-1; break; case ST_INT: case ST_FLOAT: + if(pp->capture){ + if(e.t==ST_INT){AST::IntLit value(e.i);pp->capture->objective(*pp,&value);} + else {AST::FloatLit value(pp->floatvals.at(e.i));pp->capture->objective(*pp,&value);} + (yyval.iValue)=0;break; + } pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", new IntVarSpec(0,true,false))); (yyval.iValue) = pp->intvars.size()-1; @@ -3871,49 +4324,58 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[0].sValue)); } -#line 3875 "gecode/flatzinc/parser.tab.cpp" +#line 4328 "gecode/flatzinc/parser.tab.cpp" break; - case 138: /* solve_expr: FZ_INT_LIT */ -#line 2059 "./gecode/flatzinc/parser.yxx" + case 139: /* solve_expr: FZ_INT_LIT */ +#line 2202 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); - pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", - new IntVarSpec(0,true,false))); - (yyval.iValue) = pp->intvars.size()-1; + if(pp->capture){AST::IntLit value((yyvsp[0].iValue));pp->capture->objective(*pp,&value);(yyval.iValue)=0;} + else {pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", + new IntVarSpec(0,true,false)));(yyval.iValue) = pp->intvars.size()-1;} } -#line 3886 "gecode/flatzinc/parser.tab.cpp" +#line 4339 "gecode/flatzinc/parser.tab.cpp" break; - case 139: /* solve_expr: FZ_FLOAT_LIT */ -#line 2066 "./gecode/flatzinc/parser.yxx" + case 140: /* solve_expr: FZ_FLOAT_LIT */ +#line 2209 "gecode/flatzinc/parser.yxx" { ParserState *pp = static_cast(parm); - pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", - new IntVarSpec(0,true,false))); - (yyval.iValue) = pp->intvars.size()-1; + if(pp->capture){AST::FloatLit value((yyvsp[0].dValue));pp->capture->objective(*pp,&value);(yyval.iValue)=0;} + else {pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", + new IntVarSpec(0,true,false)));(yyval.iValue) = pp->intvars.size()-1;} } -#line 3897 "gecode/flatzinc/parser.tab.cpp" +#line 4350 "gecode/flatzinc/parser.tab.cpp" break; - case 140: /* solve_expr: var_par_id '[' FZ_INT_LIT ']' */ -#line 2073 "./gecode/flatzinc/parser.yxx" + case 141: /* solve_expr: var_par_id '[' FZ_INT_LIT ']' */ +#line 2216 "gecode/flatzinc/parser.yxx" { SymbolEntry e; ParserState *pp = static_cast(parm); - if ( (!pp->symbols.get((yyvsp[-3].sValue), e)) || + if(pp->capture){ + if(!pp->symbols.get((yyvsp[-3].sValue),e)||(e.t!=ST_INTVARARRAY&&e.t!=ST_FLOATVARARRAY)|| + e.i<0||static_cast(e.i)>=pp->arrays.size()||(yyvsp[-1].iValue)<1||(yyvsp[-1].iValue)>pp->arrays[e.i]) { + pp->capture->fail(*pp,Capture::Status::InvalidInput,"invalid objective array reference");(yyval.iValue)=0; + } else { + const int slot=pp->arrays.at(static_cast(e.i)+(yyvsp[-1].iValue)); + if(e.t==ST_INTVARARRAY){AST::IntVar value(slot);pp->capture->objective(*pp,&value);(yyval.iValue)=slot;} + else{AST::FloatVar value(slot);pp->capture->objective(*pp,&value);(yyval.iValue)=-slot-1;} + } + } else if ( (!pp->symbols.get((yyvsp[-3].sValue), e)) || (e.t != ST_INTVARARRAY && e.t != ST_FLOATVARARRAY)) { pp->err << "Error: unknown int or float variable array " << (yyvsp[-3].sValue) << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; } - if ((yyvsp[-1].iValue) == 0 || (yyvsp[-1].iValue) > pp->arrays[e.i]) { + if (!pp->capture && ((yyvsp[-1].iValue) == 0 || (yyvsp[-1].iValue) > pp->arrays[e.i])) { pp->err << "Error: array index out of bounds for array " << (yyvsp[-3].sValue) << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; - } else { + } else if (!pp->capture) { if (e.t == ST_INTVARARRAY) (yyval.iValue) = pp->arrays[e.i+(yyvsp[-1].iValue)]; else @@ -3921,103 +4383,103 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } free((yyvsp[-3].sValue)); } -#line 3925 "gecode/flatzinc/parser.tab.cpp" +#line 4387 "gecode/flatzinc/parser.tab.cpp" break; - case 143: /* annotations: %empty */ -#line 2107 "./gecode/flatzinc/parser.yxx" + case 144: /* annotations: %empty */ +#line 2259 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = NULL; } -#line 3931 "gecode/flatzinc/parser.tab.cpp" +#line 4393 "gecode/flatzinc/parser.tab.cpp" break; - case 144: /* annotations: annotations_head */ -#line 2109 "./gecode/flatzinc/parser.yxx" + case 145: /* annotations: annotations_head */ +#line 2261 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = (yyvsp[0].argVec); } -#line 3937 "gecode/flatzinc/parser.tab.cpp" +#line 4399 "gecode/flatzinc/parser.tab.cpp" break; - case 145: /* annotations_head: FZ_COLONCOLON annotation */ -#line 2113 "./gecode/flatzinc/parser.yxx" + case 146: /* annotations_head: FZ_COLONCOLON annotation */ +#line 2265 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = new AST::Array((yyvsp[0].arg)); } -#line 3943 "gecode/flatzinc/parser.tab.cpp" +#line 4405 "gecode/flatzinc/parser.tab.cpp" break; - case 146: /* annotations_head: annotations_head FZ_COLONCOLON annotation */ -#line 2115 "./gecode/flatzinc/parser.yxx" + case 147: /* annotations_head: annotations_head FZ_COLONCOLON annotation */ +#line 2267 "gecode/flatzinc/parser.yxx" { (yyval.argVec) = (yyvsp[-2].argVec); (yyval.argVec)->append((yyvsp[0].arg)); } -#line 3949 "gecode/flatzinc/parser.tab.cpp" +#line 4411 "gecode/flatzinc/parser.tab.cpp" break; - case 147: /* annotation: FZ_ID '(' annotation_list ')' */ -#line 2119 "./gecode/flatzinc/parser.yxx" + case 148: /* annotation: FZ_ID '(' annotation_list ')' */ +#line 2271 "gecode/flatzinc/parser.yxx" { - (yyval.arg) = new AST::Call((yyvsp[-3].sValue), AST::extractSingleton((yyvsp[-1].arg))); free((yyvsp[-3].sValue)); + (yyval.arg) = new AST::Call((yyvsp[-3].sValue), static_cast(parm)->capture ? (yyvsp[-1].arg) : AST::extractSingleton((yyvsp[-1].arg))); free((yyvsp[-3].sValue)); } -#line 3957 "gecode/flatzinc/parser.tab.cpp" +#line 4419 "gecode/flatzinc/parser.tab.cpp" break; - case 148: /* annotation: annotation_expr */ -#line 2123 "./gecode/flatzinc/parser.yxx" + case 149: /* annotation: annotation_expr */ +#line 2275 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[0].arg); } -#line 3963 "gecode/flatzinc/parser.tab.cpp" +#line 4425 "gecode/flatzinc/parser.tab.cpp" break; - case 149: /* annotation_list: annotation */ -#line 2127 "./gecode/flatzinc/parser.yxx" + case 150: /* annotation_list: annotation */ +#line 2279 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::Array((yyvsp[0].arg)); } -#line 3969 "gecode/flatzinc/parser.tab.cpp" +#line 4431 "gecode/flatzinc/parser.tab.cpp" break; - case 150: /* annotation_list: annotation_list ',' annotation */ -#line 2129 "./gecode/flatzinc/parser.yxx" + case 151: /* annotation_list: annotation_list ',' annotation */ +#line 2281 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[-2].arg); (yyval.arg)->append((yyvsp[0].arg)); } -#line 3975 "gecode/flatzinc/parser.tab.cpp" +#line 4437 "gecode/flatzinc/parser.tab.cpp" break; - case 151: /* annotation_expr: ann_non_array_expr */ -#line 2133 "./gecode/flatzinc/parser.yxx" + case 152: /* annotation_expr: ann_non_array_expr */ +#line 2285 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[0].arg); } -#line 3981 "gecode/flatzinc/parser.tab.cpp" +#line 4443 "gecode/flatzinc/parser.tab.cpp" break; - case 152: /* annotation_expr: '[' ']' */ -#line 2135 "./gecode/flatzinc/parser.yxx" + case 153: /* annotation_expr: '[' ']' */ +#line 2287 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::Array(); } -#line 3987 "gecode/flatzinc/parser.tab.cpp" +#line 4449 "gecode/flatzinc/parser.tab.cpp" break; - case 153: /* annotation_expr: '[' annotation_list annotation_list_tail ']' */ -#line 2137 "./gecode/flatzinc/parser.yxx" + case 154: /* annotation_expr: '[' annotation_list annotation_list_tail ']' */ +#line 2289 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[-2].arg); } -#line 3993 "gecode/flatzinc/parser.tab.cpp" +#line 4455 "gecode/flatzinc/parser.tab.cpp" break; - case 156: /* ann_non_array_expr: FZ_BOOL_LIT */ -#line 2143 "./gecode/flatzinc/parser.yxx" + case 157: /* ann_non_array_expr: FZ_BOOL_LIT */ +#line 2295 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::BoolLit((yyvsp[0].iValue)); } -#line 3999 "gecode/flatzinc/parser.tab.cpp" +#line 4461 "gecode/flatzinc/parser.tab.cpp" break; - case 157: /* ann_non_array_expr: FZ_INT_LIT */ -#line 2145 "./gecode/flatzinc/parser.yxx" + case 158: /* ann_non_array_expr: FZ_INT_LIT */ +#line 2297 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::IntLit((yyvsp[0].iValue)); } -#line 4005 "gecode/flatzinc/parser.tab.cpp" +#line 4467 "gecode/flatzinc/parser.tab.cpp" break; - case 158: /* ann_non_array_expr: FZ_FLOAT_LIT */ -#line 2147 "./gecode/flatzinc/parser.yxx" + case 159: /* ann_non_array_expr: FZ_FLOAT_LIT */ +#line 2299 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::FloatLit((yyvsp[0].dValue)); } -#line 4011 "gecode/flatzinc/parser.tab.cpp" +#line 4473 "gecode/flatzinc/parser.tab.cpp" break; - case 159: /* ann_non_array_expr: set_literal */ -#line 2149 "./gecode/flatzinc/parser.yxx" + case 160: /* ann_non_array_expr: set_literal */ +#line 2301 "gecode/flatzinc/parser.yxx" { (yyval.arg) = (yyvsp[0].setLit); } -#line 4017 "gecode/flatzinc/parser.tab.cpp" +#line 4479 "gecode/flatzinc/parser.tab.cpp" break; - case 160: /* ann_non_array_expr: var_par_id */ -#line 2151 "./gecode/flatzinc/parser.yxx" + case 161: /* ann_non_array_expr: var_par_id */ +#line 2303 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); SymbolEntry e; @@ -4123,11 +4585,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.arg) = getVarRefArg(pp,(yyvsp[0].sValue),true); free((yyvsp[0].sValue)); } -#line 4127 "gecode/flatzinc/parser.tab.cpp" +#line 4589 "gecode/flatzinc/parser.tab.cpp" break; - case 161: /* ann_non_array_expr: var_par_id '[' ann_non_array_expr ']' */ -#line 2257 "./gecode/flatzinc/parser.yxx" + case 162: /* ann_non_array_expr: var_par_id '[' ann_non_array_expr ']' */ +#line 2409 "gecode/flatzinc/parser.yxx" { ParserState* pp = static_cast(parm); int i = -1; @@ -4136,22 +4598,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.arg) = getArrayElement(static_cast(parm),(yyvsp[-3].sValue),i,true); else (yyval.arg) = new AST::IntLit(0); // keep things consistent + if(pp->capture) delete (yyvsp[-1].arg); free((yyvsp[-3].sValue)); } -#line 4142 "gecode/flatzinc/parser.tab.cpp" +#line 4605 "gecode/flatzinc/parser.tab.cpp" break; - case 162: /* ann_non_array_expr: FZ_STRING_LIT */ -#line 2268 "./gecode/flatzinc/parser.yxx" + case 163: /* ann_non_array_expr: FZ_STRING_LIT */ +#line 2421 "gecode/flatzinc/parser.yxx" { (yyval.arg) = new AST::String((yyvsp[0].sValue)); free((yyvsp[0].sValue)); } -#line 4151 "gecode/flatzinc/parser.tab.cpp" +#line 4614 "gecode/flatzinc/parser.tab.cpp" break; -#line 4155 "gecode/flatzinc/parser.tab.cpp" +#line 4618 "gecode/flatzinc/parser.tab.cpp" default: break; } diff --git a/gecode/flatzinc/parser.tab.hpp b/gecode/flatzinc/parser.tab.hpp index 094a72380a..6d8fdbf211 100644 --- a/gecode/flatzinc/parser.tab.hpp +++ b/gecode/flatzinc/parser.tab.hpp @@ -107,7 +107,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 614 "./gecode/flatzinc/parser.yxx" +#line 635 "gecode/flatzinc/parser.yxx" int iValue; char* sValue; bool bValue; double dValue; std::vector* setValue; Gecode::FlatZinc::AST::SetLit* setLit; @@ -122,8 +122,7 @@ union YYSTYPE Gecode::FlatZinc::AST::Node* arg; Gecode::FlatZinc::AST::Array* argVec; - -#line 127 "gecode/flatzinc/parser.tab.hpp" +#line 126 "gecode/flatzinc/parser.tab.hpp" }; typedef union YYSTYPE YYSTYPE; diff --git a/gecode/flatzinc/parser.yxx b/gecode/flatzinc/parser.yxx index 40d0aa2312..e5bda309df 100755 --- a/gecode/flatzinc/parser.yxx +++ b/gecode/flatzinc/parser.yxx @@ -149,6 +149,10 @@ AST::Node* getArrayElement(ParserState* pp, string id, int offset, } return new AST::FloatVar(pp->arrays[e.i+offset],n); } + case ST_BOOLVALARRAY: + if(!pp->capture) break; + if(offset>pp->arrays[e.i]) goto error; + return new AST::BoolLit(pp->arrays[e.i+offset]); case ST_INTVALARRAY: if (offset > pp->arrays[e.i]) goto error; @@ -199,18 +203,32 @@ AST::Node* getVarRefArg(ParserState* pp, string id, bool annotation = false) { void addDomainConstraint(ParserState* pp, std::string id, AST::Node* var, Option& dom) { - if (!dom()) + if (!dom()) { + if(pp->capture) delete var; return; + } + if(pp->capture && pp->domainConstraints.size()>=pp->capture->options.max_constraints) { + pp->capture->fail(*pp,Capture::Status::ResourceLimit,"declaration domain count exceeds capture limit"); + delete var;delete dom.some();dom=Option::none();return; + } AST::Array* args = new AST::Array(2); args->a[0] = var; args->a[1] = dom.some(); pp->domainConstraints.push_back(new ConExpr(id, args, NULL)); + if(pp->capture) dom=Option::none(); } void addDomainConstraint(ParserState* pp, AST::Node* var, Option* > dom) { - if (!dom()) + if (!dom()) { + if(pp->capture) delete var; return; + } + if(pp->capture && (pp->capture->options.max_constraints<2 || + pp->domainConstraints.size()>pp->capture->options.max_constraints-2)) { + pp->capture->fail(*pp,Capture::Status::ResourceLimit,"declaration domain count exceeds capture limit"); + delete var;delete dom.some();dom=Option*>::none();return; + } { AST::Array* args = new AST::Array(2); args->a[0] = new AST::FloatLit(dom.some()->first); @@ -225,6 +243,7 @@ void addDomainConstraint(ParserState* pp, AST::Node* var, pp->domainConstraints.push_back(new ConExpr("float_le", args, NULL)); } delete dom.some(); + if(pp->capture) dom=Option*>::none(); } int getBaseIntVar(ParserState* pp, int i) { @@ -270,6 +289,7 @@ int getBaseSetVar(ParserState* pp, int i) { */ void initfg(ParserState* pp) { + if (pp->capture) return; // capture never creates native variables/actors if (!pp->hadError) pp->fg->init(pp->intvars.size(), pp->boolvars.size(), @@ -494,13 +514,14 @@ void fillPrinter(ParserState& pp, Gecode::FlatZinc::Printer& p) { #endif } -AST::Node* arrayOutput(AST::Call* ann) { +AST::Node* arrayOutput(AST::Call* ann, bool capture=false) { + AST::Node* dimensions=capture ? ann->args->getArray()->a.at(0) : ann->args; AST::Array* a = NULL; - if (ann->args->isArray()) { - a = ann->args->getArray(); + if (dimensions->isArray()) { + a = dimensions->getArray(); } else { - a = new AST::Array(ann->args); + a = new AST::Array(dimensions); } std::ostringstream oss; @@ -523,7 +544,7 @@ AST::Node* arrayOutput(AST::Call* ann) { } } - if (!ann->args->isArray()) { + if (!dimensions->isArray()) { a->a[0] = NULL; delete a; } @@ -624,7 +645,7 @@ namespace Gecode { namespace FlatZinc { Gecode::FlatZinc::Option* > oVarSpecVec; Gecode::FlatZinc::AST::Node* arg; Gecode::FlatZinc::AST::Array* argVec; - } +} %define parse.error verbose @@ -707,13 +728,23 @@ namespace Gecode { namespace FlatZinc { %type annotations annotations_head %type annotation annotation_list +/* Only the new capture entry enables error-path semantic-value ownership. */ +%destructor { if(static_cast(parm)->capture) free($$); } +%destructor { if(static_cast(parm)->capture) delete $$; } +%destructor { if(static_cast(parm)->capture && $$()) delete $$.some(); } +%destructor { if(static_cast(parm)->capture) { for(auto* p:*$$) delete p; delete $$; } } +%destructor { if(static_cast(parm)->capture && $$()) { for(auto* p:*$$.some()) delete p; delete $$.some(); } } + %% /********************************/ /* main goal and item lists */ /********************************/ -model : preddecl_items vardecl_items constraint_items solve_item ';' +model : preddecl_items vardecl_items + { ParserState* pp=static_cast(parm); + if(pp->capture && !pp->hadError) pp->capture->begin(*pp); } + constraint_items solve_item ';' preddecl_items: /* empty */ @@ -729,7 +760,9 @@ vardecl_items: vardecl_items_head: vardecl_item ';' + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } | vardecl_items_head vardecl_item ';' + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } constraint_items: /* emtpy */ @@ -737,7 +770,9 @@ constraint_items: constraint_items_head: constraint_item ';' + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } | constraint_items_head constraint_item ';' + { if(static_cast(parm)->capture && static_cast(parm)->hadError) YYABORT; } /********************************/ /* predicate declarations */ @@ -791,7 +826,9 @@ vardecl_item: FZ_VAR int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt { ParserState* pp = static_cast(parm); - bool print = $5 != NULL && $5->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,$4,$5); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && $5 != NULL && $5->hasAtom("output_var"); bool funcDep = $5 != NULL && $5->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put($4, se_iv(pp->intvars.size())), @@ -818,12 +855,15 @@ vardecl_item: pp->intvars.push_back(varspec($4, new IntVarSpec($2,!print,funcDep))); } + if(pp->capture && pp->hadError && $6() && $2()) delete $2.some(); delete $5; free($4); } | FZ_VAR bool_ti_expr_tail ':' var_par_id annotations non_array_expr_opt { ParserState* pp = static_cast(parm); - bool print = $5 != NULL && $5->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,$4,$5); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && $5 != NULL && $5->hasAtom("output_var"); bool funcDep = $5 != NULL && $5->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put($4, se_bv(pp->boolvars.size())), @@ -850,12 +890,15 @@ vardecl_item: pp->boolvars.push_back(varspec($4, new BoolVarSpec($2,!print,funcDep))); } + if(pp->capture && pp->hadError && $6() && $2()) delete $2.some(); delete $5; free($4); } | FZ_VAR float_ti_expr_tail ':' var_par_id annotations non_array_expr_opt { ParserState* pp = static_cast(parm); - bool print = $5 != NULL && $5->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,$4,$5); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && $5 != NULL && $5->hasAtom("output_var"); bool funcDep = $5 != NULL && $5->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put($4, se_fv(pp->floatvars.size())), @@ -879,6 +922,7 @@ vardecl_item: if (!pp->hadError && $2()) { AST::FloatVar* fv = new AST::FloatVar(pp->floatvars.size()-1); addDomainConstraint(pp, fv, $2); + if(pp->capture) $2=Option*>::none(); } delete arg; } else { @@ -889,12 +933,15 @@ vardecl_item: pp->floatvars.push_back(varspec($4, new FloatVarSpec(dom,!print,funcDep))); } + if(pp->capture && pp->hadError && $6() && $2()) delete $2.some(); delete $5; free($4); } | FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations non_array_expr_opt { ParserState* pp = static_cast(parm); - bool print = $7 != NULL && $7->hasAtom("output_var"); + if(pp->capture) pp->capture->declaration(*pp,$6,$7); + if(pp->capture) pp->capture->variable_count(*pp,1); + bool print = (!pp->capture || !pp->hadError) && $7 != NULL && $7->hasAtom("output_var"); bool funcDep = $7 != NULL && $7->hasAtom("is_defined_var"); yyassert(pp, pp->symbols.put($6, se_sv(pp->setvars.size())), @@ -922,46 +969,62 @@ vardecl_item: pp->setvars.push_back(varspec($6, new SetVarSpec($4,!print,funcDep))); } + if(pp->capture && pp->hadError && $8() && $4()) delete $4.some(); delete $7; free($6); } | FZ_INT ':' var_par_id annotations '=' non_array_expr { ParserState* pp = static_cast(parm); + if(pp->capture && $4) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $6->isInt(), "Invalid int initializer"); + if (!pp->capture || !pp->hadError) { yyassert(pp, pp->symbols.put($3, se_i($6->getInt())), "Duplicate symbol"); + } + if(pp->capture) delete $6; delete $4; free($3); } | FZ_FLOAT ':' var_par_id annotations '=' non_array_expr { ParserState* pp = static_cast(parm); + if(pp->capture && $4) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $6->isFloat(), "Invalid float initializer"); + if (!pp->capture || !pp->hadError) { pp->floatvals.push_back($6->getFloat()); yyassert(pp, pp->symbols.put($3, se_f(pp->floatvals.size()-1)), "Duplicate symbol"); + } + if(pp->capture) delete $6; delete $4; free($3); } | FZ_BOOL ':' var_par_id annotations '=' non_array_expr { ParserState* pp = static_cast(parm); + if(pp->capture && $4) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $6->isBool(), "Invalid bool initializer"); + if (!pp->capture || !pp->hadError) { yyassert(pp, pp->symbols.put($3, se_b($6->getBool())), "Duplicate symbol"); + } + if(pp->capture) delete $6; delete $4; free($3); } | FZ_SET FZ_OF FZ_INT ':' var_par_id annotations '=' non_array_expr { ParserState* pp = static_cast(parm); + if(pp->capture && $6) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $8->isSet(), "Invalid set initializer"); + if (!pp->capture || !pp->hadError) { AST::SetLit* set = $8->getSet(); pp->setvals.push_back(*set); yyassert(pp, pp->symbols.put($5, se_s(pp->setvals.size()-1)), "Duplicate symbol"); delete set; + } else delete $8; delete $6; free($5); } | FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR int_ti_expr_tail ':' @@ -969,8 +1032,12 @@ vardecl_item: { ParserState* pp = static_cast(parm); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,$5); + pp->capture->variable_count(*pp,$5,$13()); + } if (!pp->hadError) { - bool print = $12 != NULL && $12->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,$11,$12,$5); + bool print = (!pp->capture || !pp->hadError) && $12 != NULL && $12->hasCall("output_array"); vector vars($5); if (!pp->hadError) { if ($13()) { @@ -979,6 +1046,7 @@ vardecl_item: "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; IntVarSpec* ivsv = static_cast((*vsv)[i]); if (ivsv->alias) { if (print) @@ -989,6 +1057,7 @@ vardecl_item: ivsv->introduced = false; vars[i] = pp->intvars.size(); pp->intvars.push_back(varspec($11, ivsv)); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && $9()) { Option opt = @@ -999,10 +1068,12 @@ vardecl_item: } } } + if(pp->capture) { for(auto* child:*vsv) delete child; $13=Option*>::none(); } delete vsv; } else { if ($5>0) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; Option dom = $9() ? Option::some(new AST::SetLit($9.some())) : Option::none(); @@ -1011,12 +1082,12 @@ vardecl_item: pp->intvars.push_back(varspec($11, ispec)); } } - if ($9()) delete $9.some(); + if ($9()) { delete $9.some(); if(pp->capture) $9=Option::none(); } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput($12->getCall("output_array"))); + a->a.push_back(arrayOutput($12->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<$5; i++) output->a.push_back(new AST::IntVar(vars[i])); @@ -1032,14 +1103,22 @@ vardecl_item: pp->symbols.put($11, se_iva(iva)), "Duplicate symbol"); } + if(pp->capture) { + if($13()) { for(auto* child:*$13.some()) delete child; delete $13.some(); } + if($9()) delete $9.some(); + } delete $12; free($11); } | FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR bool_ti_expr_tail ':' var_par_id annotations vardecl_bool_var_array_init { ParserState* pp = static_cast(parm); - bool print = $12 != NULL && $12->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,$11,$12,$5); + bool print = (!pp->capture || !pp->hadError) && $12 != NULL && $12->hasCall("output_array"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,$5); + pp->capture->variable_count(*pp,$5,$13()); + } if (!pp->hadError) { vector vars($5); if ($13()) { @@ -1048,6 +1127,7 @@ vardecl_item: "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; BoolVarSpec* bvsv = static_cast((*vsv)[i]); if (bvsv->alias) { if (print) @@ -1058,6 +1138,7 @@ vardecl_item: bvsv->introduced = false; vars[i] = pp->boolvars.size(); pp->boolvars.push_back(varspec($11, (*vsv)[i])); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && $9()) { Option opt = @@ -1068,9 +1149,11 @@ vardecl_item: } } } - delete vsv; + if(pp->capture) { for(auto* child:*vsv) delete child; $13=Option*>::none(); } + delete vsv; } else { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; Option dom = $9() ? Option::some(new AST::SetLit($9.some())) : Option::none(); @@ -1078,11 +1161,11 @@ vardecl_item: pp->boolvars.push_back(varspec($11, new BoolVarSpec(dom,!print,false))); } - if ($9()) delete $9.some(); + if ($9()) { delete $9.some(); if(pp->capture) $9=Option::none(); } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput($12->getCall("output_array"))); + a->a.push_back(arrayOutput($12->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<$5; i++) output->a.push_back(new AST::BoolVar(vars[i])); @@ -1098,6 +1181,10 @@ vardecl_item: pp->symbols.put($11, se_bva(bva)), "Duplicate symbol"); } + if(pp->capture) { + if($13()) { for(auto* child:*$13.some()) delete child; delete $13.some(); } + if($9()) delete $9.some(); + } delete $12; free($11); } | FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR @@ -1106,8 +1193,12 @@ vardecl_item: { ParserState* pp = static_cast(parm); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,$5); + pp->capture->variable_count(*pp,$5,$13()); + } if (!pp->hadError) { - bool print = $12 != NULL && $12->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,$11,$12,$5); + bool print = (!pp->capture || !pp->hadError) && $12 != NULL && $12->hasCall("output_array"); vector vars($5); if (!pp->hadError) { if ($13()) { @@ -1116,6 +1207,7 @@ vardecl_item: "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; FloatVarSpec* ivsv = static_cast((*vsv)[i]); if (ivsv->alias) { if (print) @@ -1126,6 +1218,7 @@ vardecl_item: ivsv->introduced = false; vars[i] = pp->floatvars.size(); pp->floatvars.push_back(varspec($11, ivsv)); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && $9()) { Option*> opt = @@ -1136,6 +1229,7 @@ vardecl_item: } } } + if(pp->capture) { for(auto* child:*vsv) delete child; $13=Option*>::none(); } delete vsv; } else { if ($5>0) { @@ -1143,6 +1237,7 @@ vardecl_item: $9() ? Option >::some(*$9.some()) : Option >::none(); for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; FloatVarSpec* ispec = new FloatVarSpec(dom,!print,false); vars[i] = pp->floatvars.size(); pp->floatvars.push_back(varspec($11, ispec)); @@ -1150,9 +1245,9 @@ vardecl_item: } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput($12->getCall("output_array"))); + a->a.push_back(arrayOutput($12->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<$5; i++) output->a.push_back(new AST::FloatVar(vars[i])); @@ -1168,15 +1263,23 @@ vardecl_item: pp->symbols.put($11, se_fva(fva)), "Duplicate symbol"); } - if ($9()) delete $9.some(); + if ($9()) { delete $9.some(); if(pp->capture) $9=Option*>::none(); } + if(pp->capture) { + if($13()) { for(auto* child:*$13.some()) delete child; delete $13.some(); } + if($9()) delete $9.some(); + } delete $12; free($11); } | FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_VAR FZ_SET FZ_OF int_ti_expr_tail ':' var_par_id annotations vardecl_set_var_array_init { ParserState* pp = static_cast(parm); - bool print = $14 != NULL && $14->hasCall("output_array"); + if(pp->capture) pp->capture->declaration(*pp,$13,$14,$5); + bool print = (!pp->capture || !pp->hadError) && $14 != NULL && $14->hasCall("output_array"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) { pp->capture->array_size(*pp,$5); + pp->capture->variable_count(*pp,$5,$15()); + } if (!pp->hadError) { vector vars($5); if ($15()) { @@ -1185,6 +1288,7 @@ vardecl_item: "Initializer size does not match array dimension"); if (!pp->hadError) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; SetVarSpec* svsv = static_cast((*vsv)[i]); if (svsv->alias) { if (print) @@ -1195,6 +1299,7 @@ vardecl_item: svsv->introduced = false; vars[i] = pp->setvars.size(); pp->setvars.push_back(varspec($13, (*vsv)[i])); + if(pp->capture) (*vsv)[i]=nullptr; } if (!pp->hadError && $11()) { Option opt = @@ -1205,10 +1310,12 @@ vardecl_item: } } } - delete vsv; + if(pp->capture) { for(auto* child:*vsv) delete child; $15=Option*>::none(); } + delete vsv; } else { if ($5>0) { for (int i=0; i<$5; i++) { + if(pp->capture && pp->hadError) break; Option dom = $11() ? Option::some(new AST::SetLit($11.some())) : Option::none(); @@ -1216,12 +1323,12 @@ vardecl_item: vars[i] = pp->setvars.size(); pp->setvars.push_back(varspec($13, ispec)); } - if ($11()) delete $11.some(); + if ($11()) { delete $11.some(); if(pp->capture) $11=Option::none(); } } } - if (print) { + if (print && (!pp->capture || !pp->hadError)) { AST::Array* a = new AST::Array(); - a->a.push_back(arrayOutput($14->getCall("output_array"))); + a->a.push_back(arrayOutput($14->getCall("output_array"),pp->capture!=nullptr)); AST::Array* output = new AST::Array(); for (int i=0; i<$5; i++) output->a.push_back(new AST::SetVar(vars[i])); @@ -1237,13 +1344,19 @@ vardecl_item: pp->symbols.put($13, se_sva(sva)), "Duplicate symbol"); } + if(pp->capture) { + if($15()) { for(auto* child:*$15.some()) delete child; delete $15.some(); } + if($11()) delete $11.some(); + } delete $14; free($13); } | FZ_ARRAY '[' FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT ']' FZ_OF FZ_INT ':' var_par_id annotations '=' '[' int_list ']' { ParserState* pp = static_cast(parm); + if(pp->capture && $11) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,$5); yyassert(pp, $14->size() == static_cast($5), "Initializer size does not match array dimension"); @@ -1264,7 +1377,9 @@ vardecl_item: var_par_id annotations '=' '[' bool_list ']' { ParserState* pp = static_cast(parm); + if(pp->capture && $11) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,$5); yyassert(pp, $14->size() == static_cast($5), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -1284,7 +1399,9 @@ vardecl_item: var_par_id annotations '=' '[' float_list ']' { ParserState* pp = static_cast(parm); + if(pp->capture && $11) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,$5); yyassert(pp, $14->size() == static_cast($5), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -1304,7 +1421,9 @@ vardecl_item: var_par_id annotations '=' '[' set_literal_list ']' { ParserState* pp = static_cast(parm); + if(pp->capture && $13) pp->capture->fail(*pp,Capture::Status::InvalidInput,"parameter declarations cannot have annotations"); yyassert(pp, $3==1, "Arrays must start at 1"); + if(pp->capture) pp->capture->array_size(*pp,$5); yyassert(pp, $16->size() == static_cast($5), "Initializer size does not match array dimension"); if (!pp->hadError) { @@ -1331,8 +1450,10 @@ int_init : { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get($1, e) && (e.t == ST_INTVAR || e.t == ST_INT)) - $$ = new IntVarSpec(Alias(e.i),false,false); + if (pp->symbols.get($1, e) && (e.t == ST_INTVAR || e.t == ST_INT)) { + if(pp->capture && e.t == ST_INT) $$ = new IntVarSpec(e.i,false,false); + else $$ = new IntVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type int " << $1 << " in line no. " @@ -1388,8 +1509,10 @@ float_init : { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get($1, e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT)) - $$ = new FloatVarSpec(Alias(e.i),false,false); + if (pp->symbols.get($1, e) && (e.t == ST_FLOATVAR || e.t == ST_FLOAT)) { + if(pp->capture && e.t == ST_FLOAT) $$ = new FloatVarSpec(pp->floatvals.at(e.i),false,false); + else $$ = new FloatVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type float " << $1 << " in line no. " @@ -1443,8 +1566,10 @@ bool_init : { SymbolEntry e; ParserState* pp = static_cast(parm); - if (pp->symbols.get($1, e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL)) - $$ = new BoolVarSpec(Alias(e.i),false,false); + if (pp->symbols.get($1, e) && (e.t == ST_BOOLVAR || e.t == ST_BOOL)) { + if(pp->capture && e.t == ST_BOOL) $$ = new BoolVarSpec(e.i != 0,false,false); + else $$ = new BoolVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type bool " << $1 << " in line no. " @@ -1496,8 +1621,10 @@ set_init : { ParserState* pp = static_cast(parm); SymbolEntry e; - if (pp->symbols.get($1, e) && (e.t == ST_SETVAR || e.t == ST_SET)) - $$ = new SetVarSpec(Alias(e.i),false,false); + if (pp->symbols.get($1, e) && (e.t == ST_SETVAR || e.t == ST_SET)) { + if(pp->capture && e.t == ST_SET) $$ = new SetVarSpec(new AST::SetLit(pp->setvals.at(e.i)),false,false); + else $$ = new SetVarSpec(Alias(e.i),false,false); + } else { pp->err << "Error: undefined identifier for type set " << $1 << " in line no. " @@ -1571,7 +1698,10 @@ constraint_item : FZ_CONSTRAINT FZ_ID '(' flat_expr_list ')' annotations { ParserState *pp = static_cast(parm); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->constraint(*pp,$2,$4,$6); + delete $4; delete $6; + } else if (!pp->hadError) { std::string cid($2); if (cid=="gecode_on_restart_status" && $4->a[0]->isIntVar()) { pp->status_idx = getBaseIntVar(pp,$4->a[0]->getIntVar()); @@ -1738,7 +1868,10 @@ solve_item : { ParserState *pp = static_cast(parm); initfg(pp); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->solve(*pp,Capture::Method::Satisfy,$2); + delete $2; + } else if (!pp->hadError) { try { pp->fg->solve($2); } catch (Gecode::FlatZinc::Error& e) { @@ -1752,7 +1885,10 @@ solve_item : { ParserState *pp = static_cast(parm); initfg(pp); - if (!pp->hadError) { + if (pp->capture) { + if (!pp->hadError) pp->capture->solve(*pp,$3?Capture::Method::Minimize:Capture::Method::Maximize,$2); + delete $2; + } else if (!pp->hadError) { try { int v = $4 < 0 ? (-$4-1) : $4; bool vi = $4 >= 0; @@ -1776,7 +1912,7 @@ int_ti_expr_tail : FZ_INT { $$ = Option::none(); } | '{' int_list '}' - { $$ = Option::some(new AST::SetLit(*$2)); } + { $$ = Option::some(new AST::SetLit(*$2)); if(static_cast(parm)->capture) delete $2; } | FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT { $$ = Option::some(new AST::SetLit($1, $3)); @@ -1810,7 +1946,7 @@ float_ti_expr_tail : set_literal : '{' int_list '}' - { $$ = new AST::SetLit(*$2); } + { $$ = new AST::SetLit(*$2); if(static_cast(parm)->capture) delete $2; } | FZ_INT_LIT FZ_DOTDOT FZ_INT_LIT { $$ = new AST::SetLit($1, $3); } @@ -1987,7 +2123,7 @@ non_array_expr : << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; - $$ = NULL; + $$ = pp->capture ? new AST::IntLit(0) : NULL; } free($1); } @@ -2029,13 +2165,20 @@ solve_expr: if (haveSym) { switch (e.t) { case ST_INTVAR: + if(pp->capture){AST::IntVar value(e.i);pp->capture->objective(*pp,&value);} $$ = e.i; break; case ST_FLOATVAR: + if(pp->capture){AST::FloatVar value(e.i);pp->capture->objective(*pp,&value);} $$ = -e.i-1; break; case ST_INT: case ST_FLOAT: + if(pp->capture){ + if(e.t==ST_INT){AST::IntLit value(e.i);pp->capture->objective(*pp,&value);} + else {AST::FloatLit value(pp->floatvals.at(e.i));pp->capture->objective(*pp,&value);} + $$=0;break; + } pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", new IntVarSpec(0,true,false))); $$ = pp->intvars.size()-1; @@ -2058,34 +2201,43 @@ solve_expr: | FZ_INT_LIT { ParserState *pp = static_cast(parm); - pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", - new IntVarSpec(0,true,false))); - $$ = pp->intvars.size()-1; + if(pp->capture){AST::IntLit value($1);pp->capture->objective(*pp,&value);$$=0;} + else {pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", + new IntVarSpec(0,true,false)));$$ = pp->intvars.size()-1;} } | FZ_FLOAT_LIT { ParserState *pp = static_cast(parm); - pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", - new IntVarSpec(0,true,false))); - $$ = pp->intvars.size()-1; + if(pp->capture){AST::FloatLit value($1);pp->capture->objective(*pp,&value);$$=0;} + else {pp->intvars.push_back(varspec("OBJ_CONST_INTRODUCED", + new IntVarSpec(0,true,false)));$$ = pp->intvars.size()-1;} } | var_par_id '[' FZ_INT_LIT ']' { SymbolEntry e; ParserState *pp = static_cast(parm); - if ( (!pp->symbols.get($1, e)) || + if(pp->capture){ + if(!pp->symbols.get($1,e)||(e.t!=ST_INTVARARRAY&&e.t!=ST_FLOATVARARRAY)|| + e.i<0||static_cast(e.i)>=pp->arrays.size()||$3<1||$3>pp->arrays[e.i]) { + pp->capture->fail(*pp,Capture::Status::InvalidInput,"invalid objective array reference");$$=0; + } else { + const int slot=pp->arrays.at(static_cast(e.i)+$3); + if(e.t==ST_INTVARARRAY){AST::IntVar value(slot);pp->capture->objective(*pp,&value);$$=slot;} + else{AST::FloatVar value(slot);pp->capture->objective(*pp,&value);$$=-slot-1;} + } + } else if ( (!pp->symbols.get($1, e)) || (e.t != ST_INTVARARRAY && e.t != ST_FLOATVARARRAY)) { pp->err << "Error: unknown int or float variable array " << $1 << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; } - if ($3 == 0 || $3 > pp->arrays[e.i]) { + if (!pp->capture && ($3 == 0 || $3 > pp->arrays[e.i])) { pp->err << "Error: array index out of bounds for array " << $1 << " in line no. " << yyget_lineno(pp->yyscanner) << std::endl; pp->hadError = true; - } else { + } else if (!pp->capture) { if (e.t == ST_INTVARARRAY) $$ = pp->arrays[e.i+$3]; else @@ -2117,7 +2269,7 @@ annotations_head : annotation : FZ_ID '(' annotation_list ')' { - $$ = new AST::Call($1, AST::extractSingleton($3)); free($1); + $$ = new AST::Call($1, static_cast(parm)->capture ? $3 : AST::extractSingleton($3)); free($1); } | annotation_expr { $$ = $1; } @@ -2262,6 +2414,7 @@ ann_non_array_expr : $$ = getArrayElement(static_cast(parm),$1,i,true); else $$ = new AST::IntLit(0); // keep things consistent + if(pp->capture) delete $3; free($1); } | FZ_STRING_LIT diff --git a/gecode/kernel/core.cpp b/gecode/kernel/core.cpp index 4293cfe6a8..1f94ec0415 100644 --- a/gecode/kernel/core.cpp +++ b/gecode/kernel/core.cpp @@ -129,7 +129,7 @@ namespace Gecode { // Initialize propagator and brancher links pl.init(); bl.init(); - b_status = b_commit = Brancher::cast(&bl); + b_status = b_commit = &bl; // Initialize array for forced deletion to be empty d_fst = d_cur = d_lst = nullptr; // Initialize space as stable but not failed @@ -526,13 +526,13 @@ namespace Gecode { * can be used for commit an exhausted brancher can actually be deleted. * This becomes known when choice is called. */ - while (b_status != Brancher::cast(&bl)) - if (b_status->status(*this)) { + while (b_status != &bl) + if (Brancher::cast(b_status)->status(*this)) { // Brancher still has choices to generate return SS_BRANCH; } else { // Brancher is exhausted - b_status = Brancher::cast(b_status->next()); + b_status = b_status->next(); } // No brancher with alternatives left, space is solved return SS_SOLVED; @@ -568,43 +568,44 @@ namespace Gecode { Space::choice(void) { if (!stable()) throw SpaceNotStable("Space::choice"); - if (failed() || (b_status == Brancher::cast(&bl))) { + if (failed() || (b_status == &bl)) { // There are no more choices to be generated // Delete all branchers - Brancher* b = Brancher::cast(bl.next()); - while (b != Brancher::cast(&bl)) { - Brancher* d = b; - b = Brancher::cast(b->next()); + ActorLink* b = bl.next(); + while (b != &bl) { + Brancher* d = Brancher::cast(b); + b = b->next(); rfree(d,d->dispose(*this)); } bl.init(); - b_status = b_commit = Brancher::cast(&bl); + b_status = b_commit = &bl; return nullptr; } /* * The call to choice() says that no older choices * can be used. Hence, all branchers that are exhausted can be deleted. */ - Brancher* b = Brancher::cast(bl.next()); + ActorLink* b = bl.next(); while (b != b_status) { - Brancher* d = b; - b = Brancher::cast(b->next()); + Brancher* d = Brancher::cast(b); + b = b->next(); d->unlink(); rfree(d,d->dispose(*this)); } // Make sure that b_commit does not point to a deleted brancher! b_commit = b_status; - return b_status->choice(*this); + return Brancher::cast(b_status)->choice(*this); } const Choice* Space::choice(Archive& e) const { unsigned int id; e >> id; - Brancher* b_cur = Brancher::cast(bl.next()); - while (b_cur != Brancher::cast(&bl)) { - if (id == b_cur->id()) - return b_cur->choice(*this,e); - b_cur = Brancher::cast(b_cur->next()); + ActorLink* b_cur = bl.next(); + while (b_cur != &bl) { + Brancher* b = Brancher::cast(b_cur); + if (id == b->id()) + return b->choice(*this,e); + b_cur = b_cur->next(); } throw SpaceNoBrancher("Space::choice"); } @@ -701,12 +702,13 @@ namespace Gecode { Space::kill_brancher(unsigned int id) { if (failed()) return; - for (Brancher* b = Brancher::cast(bl.next()); - b != Brancher::cast(&bl); b = Brancher::cast(b->next())) + for (ActorLink* link = bl.next(); link != &bl; link = link->next()) { + Brancher* b = Brancher::cast(link); if (b->id() == id) { kill(*b); return; } + } } @@ -740,7 +742,7 @@ namespace Gecode { pc.c.source = &s; pl.init(); bl.init(); - b_status = b_commit = Brancher::cast(&bl); + b_status = b_commit = &bl; // Copy all propagators { ActorLink* p = &pl; @@ -773,14 +775,14 @@ namespace Gecode { } // Setup brancher pointers if (s.b_status == &s.bl) { - b_status = Brancher::cast(&bl); + b_status = &bl; } else { - b_status = Brancher::cast(s.b_status->prev()); + b_status = s.b_status->prev(); } if (s.b_commit == &s.bl) { - b_commit = Brancher::cast(&bl); + b_commit = &bl; } else { - b_commit = Brancher::cast(s.b_commit->prev()); + b_commit = s.b_commit->prev(); } } catch (...) { recover(s); diff --git a/gecode/kernel/core.hpp b/gecode/kernel/core.hpp index 169aab6599..14deee686c 100755 --- a/gecode/kernel/core.hpp +++ b/gecode/kernel/core.hpp @@ -1808,7 +1808,7 @@ namespace Gecode { * * If equal to &bl, no brancher does exist. */ - Brancher* b_status; + ActorLink* b_status; /** * \brief Points to the first brancher to be used for commit * @@ -1820,7 +1820,7 @@ namespace Gecode { * * If equal to &bl, no brancher does exist. */ - Brancher* b_commit; + ActorLink* b_commit; /// Find brancher with identity \a id Brancher* brancher(unsigned int id); @@ -3755,9 +3755,9 @@ namespace Gecode { assert(!failed()); // Make sure that neither b_status nor b_commit does not point to b! if (b_commit == &b) - b_commit = Brancher::cast(b.next()); + b_commit = b.next(); if (b_status == &b) - b_status = Brancher::cast(b.next()); + b_status = b.next(); b.unlink(); rfree(&b,b.dispose(*this)); } @@ -3797,21 +3797,21 @@ namespace Gecode { * recomputation does not generate new choices during recomputation * and hence b_commit is moved from newer to older branchers. */ - Brancher* b_old = b_commit; + ActorLink* b_old = b_commit; // Try whether we are lucky - while (b_commit != Brancher::cast(&bl)) - if (id != b_commit->id()) - b_commit = Brancher::cast(b_commit->next()); + while (b_commit != &bl) + if (id != Brancher::cast(b_commit)->id()) + b_commit = b_commit->next(); else - return b_commit; - if (b_commit == Brancher::cast(&bl)) { + return Brancher::cast(b_commit); + if (b_commit == &bl) { // We did not find the brancher, start at the beginning - b_commit = Brancher::cast(bl.next()); + b_commit = bl.next(); while (b_commit != b_old) - if (id != b_commit->id()) - b_commit = Brancher::cast(b_commit->next()); + if (id != Brancher::cast(b_commit)->id()) + b_commit = b_commit->next(); else - return b_commit; + return Brancher::cast(b_commit); } return nullptr; } @@ -5006,8 +5006,8 @@ namespace Gecode { } q = nullptr; if (!home.pl.empty()) { - c = Propagator::cast(home.pl.next()); - e = Propagator::cast(&home.pl); + c = home.pl.next(); + e = &home.pl; } else { c = e = nullptr; } @@ -5032,8 +5032,8 @@ namespace Gecode { } q = nullptr; if (!home.pl.empty()) { - c = Propagator::cast(home.pl.next()); - e = Propagator::cast(&home.pl); + c = home.pl.next(); + e = &home.pl; } else { c = nullptr; } @@ -5088,8 +5088,8 @@ namespace Gecode { forceinline Space::IdlePropagators::IdlePropagators(Space& home) { - c = Propagator::cast(home.pl.next()); - e = Propagator::cast(&home.pl); + c = home.pl.next(); + e = &home.pl; } forceinline bool Space::IdlePropagators::operator ()(void) const { @@ -5107,7 +5107,7 @@ namespace Gecode { forceinline Space::Branchers::Branchers(Space& home) - : c(Brancher::cast(home.bl.next())), e(&home.bl) {} + : c(home.bl.next()), e(&home.bl) {} forceinline bool Space::Branchers::operator ()(void) const { return c != e; diff --git a/gecode/minimodel/lp-backend.hpp b/gecode/minimodel/lp-backend.hpp index 24692a0134..2585a67760 100644 --- a/gecode/minimodel/lp-backend.hpp +++ b/gecode/minimodel/lp-backend.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -30,8 +31,11 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { std::int64_t lower_bound = 0; /// Diagnostic only: never rounded or used to prune the CP search. double lp_objective = std::numeric_limits::quiet_NaN(); - /// Optional exact residual data for conditional binary bounds. + /// Optional exact residual data for binary or explicit integer interval bounds. std::shared_ptr certificate; + /// Copied numerical selection hint only; never an integer feasible witness. + /// Absent unless explicitly requested and HiGHS supplies finite valid values. + std::optional> primal_suggestion; }; struct Stats { @@ -44,6 +48,8 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { std::uint64_t certificate_evaluations = 0; std::uint64_t conditional_checks = 0; std::uint64_t variable_fixings = 0; + /// Integer variables whose interval was tightened, including assignments. + std::uint64_t variable_bound_tightenings = 0; }; /** @@ -54,9 +60,12 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { * a hot start, and is never treated as a certificate for another node. * This object is deliberately not copied with Gecode spaces. */ - class Backend { - public: - const LinearModel model; + namespace Detail { + class LpWorkspace { + // Borrowed from the owning, nonmovable backend. Never shared independently. + const SparseLinearModel& model; + const std::vector original_lower_,original_upper_; + const bool binary_; private: mutable std::mutex mutex_; @@ -74,9 +83,9 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { const std::size_t limit = static_cast(std::numeric_limits::max()); if ((n > limit) || (m > limit) || - ((m != 0) && (n > std::numeric_limits::max()/m)) || - (model.a.size() != m*n) || (model.a.size() > limit)) - throw std::invalid_argument("LP backend: invalid dense dimensions"); + (model.a.size() > limit) || + !LpCertificate::valid_sparse(model.matrix(),m,n)) + throw std::invalid_argument("LP backend: invalid canonical CSR dimensions/indices"); // These integers are represented exactly as doubles in the LP. // Restrict the prototype's numerical range; the certificate still // checks every arithmetic operation independently. @@ -87,8 +96,17 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { } public: - explicit Backend(LinearModel input) : model(std::move(input)) { + LpWorkspace(const SparseLinearModel& input, + std::vector lower,std::vector upper,bool binary) + : model(input),original_lower_(std::move(lower)),original_upper_(std::move(upper)),binary_(binary) { validate_model(); + if (original_lower_.size()!=model.c.size() || original_upper_.size()!=model.c.size()) + throw std::invalid_argument("LP backend: initial bound dimensions"); + for (std::size_t j=0;joriginal_upper_[j] || + original_lower_[j]Int::Limits::max || + (binary_ && (original_lower_[j]<0 || original_upper_[j]>1))) + throw std::invalid_argument("LP backend: unsupported initial integer bounds"); require_ok(highs_.setOptionValue("output_flag", false), "output option"); require_ok(highs_.setOptionValue("threads", 1), "threads option"); require_ok(highs_.setOptionValue("parallel", "off"), "parallel option"); @@ -99,10 +117,10 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { "iteration limit"); const std::size_t n = model.c.size(), m = model.b.size(); - lower_.assign(n, 0.0); - upper_.assign(n, 1.0); - if ((n == 0) || (m == 0)) - return; // Empty boxes/row sets are certified without an LP call. + lower_.assign(original_lower_.begin(),original_lower_.end()); + upper_.assign(original_upper_.begin(),original_upper_.end()); + if ((n == 0) || (m == 0) || model.a.empty()) + return; // Zero matrices use the checked box bound; native rows enforce feasibility. HighsLp lp; lp.num_col_ = static_cast(n); @@ -116,31 +134,21 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { lp.a_matrix_.format_ = MatrixFormat::kRowwise; lp.a_matrix_.num_col_ = lp.num_col_; lp.a_matrix_.num_row_ = lp.num_row_; - lp.a_matrix_.start_.reserve(m+1); - // HiGHS already initializes start_ with a zero; replace it rather - // than appending another empty first row. - lp.a_matrix_.start_.assign(1, 0); - for (std::size_t i=0; i(j)); - lp.a_matrix_.value_.push_back(static_cast(value)); - } - } - lp.a_matrix_.start_.push_back( - static_cast(lp.a_matrix_.value_.size())); - } + // Copy CSR directly: O(rows+nnz), never a rows*columns scan. + // Replace HiGHS' initial zero offset instead of appending another one. + lp.a_matrix_.start_.assign(model.row_start.begin(),model.row_start.end()); + lp.a_matrix_.index_.assign(model.column.begin(),model.column.end()); + lp.a_matrix_.value_.assign(model.a.begin(),model.a.end()); // integrality_ remains empty: HiGHS only solves continuous LPs. require_ok(highs_.passModel(std::move(lp)), "model construction"); } - Backend(const Backend&) = delete; - Backend& operator=(const Backend&) = delete; + LpWorkspace(const LpWorkspace&) = delete; + LpWorkspace& operator=(const LpWorkspace&) = delete; BoundResult bound(const std::vector& lower, const std::vector& upper, - bool retain_certificate=false) { + bool retain_certificate=false,bool retain_primal=false) { std::lock_guard lock(mutex_); BoundResult result; const std::size_t n = model.c.size(), m = model.b.size(); @@ -149,7 +157,7 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { return result; } for (std::size_t j=0; j 1) || (lower[j] > upper[j])) { + if (lower[j]original_upper_[j] || lower[j]>upper[j]) { ++stats_.rejected; return result; } @@ -158,7 +166,7 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { } std::vector duals(m, 0.0); - if ((n != 0) && (m != 0)) { + if ((n != 0) && (m != 0) && !model.a.empty()) { using Clock = std::chrono::steady_clock; const auto start = Clock::now(); // HiGHS accumulates run time across reoptimizations. Add this @@ -179,6 +187,11 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { if (ran && (highs_.getModelStatus() == HighsModelStatus::kInfeasible)) ++stats_.infeasible_status; const HighsSolution& solution = highs_.getSolution(); + if (retain_primal && ran && status != HighsStatus::kError && + solution.value_valid && solution.col_value.size()==n && + std::all_of(solution.col_value.begin(),solution.col_value.end(), + [](double value){return std::isfinite(value);})) + result.primal_suggestion=solution.col_value; if (!ran || (status == HighsStatus::kError) || !solution.dual_valid || (solution.row_dual.size() != m)) { ++stats_.rejected; @@ -197,14 +210,17 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { if (retain_certificate) { auto certificate=std::make_shared(); - result.valid=LpCertificate::prepare(model.a,model.b,model.c,duals,*certificate) && - certificate->lower_bound(lower,upper,result.lower_bound); + result.valid=LpCertificate::prepare(model.matrix(),model.b,model.c,duals,*certificate) && + (binary_ ? certificate->lower_bound(lower,upper,result.lower_bound) + : certificate->lower_bound_integer(lower,upper,result.lower_bound)); if (result.valid) result.certificate=std::move(certificate); } else { // Preserve the original bound-only path unless explicitly requested. - result.valid = LpCertificate::lower_bound( - model.a, model.b, model.c, lower, upper, duals, result.lower_bound); + result.valid = binary_ ? LpCertificate::lower_bound( + model.matrix(), model.b, model.c, lower, upper, duals, result.lower_bound) + : LpCertificate::integer_lower_bound( + model.matrix(), model.b, model.c, lower, upper, duals, result.lower_bound); } if (result.valid) ++stats_.valid_bounds; @@ -221,12 +237,92 @@ namespace Gecode { namespace Experimental { namespace LpRelaxation { stats_.variable_fixings+=variable_fixings; } + void record_integer_filtering(std::uint64_t checks,std::uint64_t tightened,std::uint64_t fixed) { + std::lock_guard lock(mutex_); + ++stats_.certificate_evaluations; + stats_.conditional_checks+=checks; + stats_.variable_bound_tightenings+=tightened; + stats_.variable_fixings+=fixed; + } + Stats statistics() const { std::lock_guard lock(mutex_); return stats_; } }; + } // namespace Detail + + /// Existing strict binary workspace; public sparse model remains immutable. + class SparseBackend { + public: + const SparseLinearModel model; + private: + Detail::LpWorkspace workspace_; + public: + explicit SparseBackend(SparseLinearModel input) + : model(std::move(input)),workspace_(model, + std::vector(model.c.size(),0),std::vector(model.c.size(),1),true) {} + virtual ~SparseBackend() = default; + SparseBackend(const SparseBackend&) = delete; + SparseBackend& operator=(const SparseBackend&) = delete; + BoundResult bound(const std::vector& lower,const std::vector& upper, + bool retain_certificate=false) { + return workspace_.bound(lower,upper,retain_certificate); + } + BoundResult bound(const std::vector& lower,const std::vector& upper, + bool retain_certificate,bool retain_primal) { + return workspace_.bound(lower,upper,retain_certificate,retain_primal); + } + void record_filtering(std::uint64_t checks,std::uint64_t fixings) {workspace_.record_filtering(checks,fixings);} + Stats statistics() const {return workspace_.statistics();} + }; + + /** Explicit integer backend, deliberately unrelated to SparseBackend so an + * integer model cannot accidentally enter binary posting through an upcast. + * Each bound call must stay within the immutable original integer domains. + */ + class BoundedIntegerBackend { + public: + const BoundedIntegerModel model; + private: + static const SparseLinearModel& checked(const BoundedIntegerModel& input) { + validate_integer_model(input);return input.linear; + } + Detail::LpWorkspace workspace_; + public: + explicit BoundedIntegerBackend(BoundedIntegerModel input) + : model(std::move(input)),workspace_(checked(model),model.lower,model.upper,false) {} + BoundedIntegerBackend(const BoundedIntegerBackend&) = delete; + BoundedIntegerBackend& operator=(const BoundedIntegerBackend&) = delete; + BoundResult bound(const std::vector& lower,const std::vector& upper, + bool retain_certificate=false) { + return workspace_.bound(lower,upper,retain_certificate); + } + BoundResult bound(const std::vector& lower,const std::vector& upper, + bool retain_certificate,bool retain_primal) { + return workspace_.bound(lower,upper,retain_certificate,retain_primal); + } + void record_filtering(std::uint64_t checks,std::uint64_t tightened,std::uint64_t fixings) { + workspace_.record_integer_filtering(checks,tightened,fixings); + } + Stats statistics() const {return workspace_.statistics();} + }; + + /** Dense-compatible adapter. The public immutable dense model is preserved. + * Its current constructor input is copied into CSR once; repeated bounds and + * propagation use the base's immutable sparse model. Use SparseBackend to + * avoid retaining dense storage altogether. + */ + class Backend : public SparseBackend { + public: + const LinearModel model; + explicit Backend(LinearModel input) + : SparseBackend(sparse_model(input)), model(std::move(input)) {} + Backend(const Backend&) = delete; + Backend& operator=(const Backend&) = delete; + }; + }}} #endif diff --git a/gecode/minimodel/lp-certificate.hpp b/gecode/minimodel/lp-certificate.hpp index 6d7d833161..b162ce86d9 100644 --- a/gecode/minimodel/lp-certificate.hpp +++ b/gecode/minimodel/lp-certificate.hpp @@ -1,4 +1,4 @@ -/* Certified lower bounds for binary linear minimization. +/* Certified lower bounds for integer linear minimization. * * Experimental, opt-in support for LP-guided Gecode propagation. */ @@ -24,6 +24,40 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { constexpr bool supported = false; #endif + /** Borrowed CSR view; arrays are only read during a checker call. + * Row offsets include the terminal nnz offset. Each row has strictly + * increasing column indices and nonzero values (no duplicate ambiguity). + */ + struct SparseMatrixView { + const std::vector& row_start; + const std::vector& column; + const std::vector& value; + std::size_t columns; + }; + + inline bool valid_sparse(const SparseMatrixView& matrix, std::size_t rows, + std::size_t columns) { + if (matrix.columns!=columns || rows==std::numeric_limits::max() || + matrix.row_start.size()!=rows+1 || matrix.column.size()!=matrix.value.size() || + matrix.row_start.front()!=0 || matrix.row_start.back()!=matrix.value.size()) + return false; + for (std::size_t i=0; ilast || last>matrix.value.size()) return false; + for (std::size_t k=first; k=columns || matrix.value[k]==0 || + (k!=first && matrix.column[k]<=matrix.column[k-1])) return false; + } + return true; + } + + /// Deterministic work counts; no clocks or backend timings are involved. + struct PreparationStats { + std::size_t rows_visited=0; + std::size_t nonzero_products=0; + std::size_t residuals_initialized=0; + }; + /** * Convert finite candidate multipliers to nonnegative rationals q/scale. * @@ -54,8 +88,15 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { return true; } + /// Exact integer interval cuts, all derived from the same original box. + struct IntegerFilterResult { + std::int64_t lower_bound=0; + std::vector lower,upper; + bool infeasible=false; + }; + /** - * An exact affine lower bound valid for every binary box of one model. + * An exact affine lower bound valid for every integer box of one model. * * Its constant is q*b and its residual coefficients are scale*c-A^T*q. * A prepared certificate is independent of the box used to obtain its @@ -71,13 +112,13 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { bool numerator(const std::vector& lower, const std::vector& upper, - Wide& out) const { + Wide& out, bool binary=true) const { if (!valid_ || lower.size()!=residual_.size() || upper.size()!=residual_.size()) return false; Wide value=constant_; for (std::size_t j=0; j1 || lower[j]>upper[j]) + if (lower[j]>upper[j] || (binary && (lower[j]<0 || upper[j]>1))) return false; const std::int64_t endpoint=residual_[j]>=0 ? lower[j] : upper[j]; Wide term; @@ -101,13 +142,13 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { return true; } #endif - friend bool prepare(const std::vector&, + friend bool prepare(const SparseMatrixView&, const std::vector&, const std::vector&, - const std::vector&, Certificate&); + const std::vector&, Certificate&, PreparationStats*); public: - /// Evaluate the ordinary integer lower bound; failure leaves out intact. + /// Evaluate the legacy binary-box integer bound; failure leaves out intact. bool lower_bound(const std::vector& lower, const std::vector& upper, std::int64_t& out) const { @@ -120,6 +161,67 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { #endif } + /// Explicit bounded-integer evaluation; the legacy lower_bound stays binary. + bool lower_bound_integer(const std::vector& lower, + const std::vector& upper, + std::int64_t& out) const { +#if defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) + Wide value; + return numerator(lower,upper,value,false) && ceiling(value,out); +#else + (void) lower; (void) upper; (void) out; + return false; +#endif + } + + /** Intersect a finite integer box with exact residual interval cuts. + * For each j, remove its original box-minimum contribution, then solve + * residual[j]*x[j] <= scale*objective_upper - remainder with directed + * integer division. Every cut uses the unchanged original box. All + * arithmetic and quotient narrowing are checked; false leaves out intact. + * An infeasible result has no meaningful tightened-domain interpretation. + */ + bool filter_integer(const std::vector& lower, + const std::vector& upper, + std::int64_t objective_upper, IntegerFilterResult& out) const { +#if defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) + Wide base,threshold; + IntegerFilterResult candidate; + if (!numerator(lower,upper,base,false) || !ceiling(base,candidate.lower_bound) || + __builtin_mul_overflow(static_cast(scale), + static_cast(objective_upper),&threshold)) return false; + candidate.lower=lower; candidate.upper=upper; + candidate.infeasible=base>threshold; + for (std::size_t j=0; !candidate.infeasible && j0 ? lower[j] : upper[j]; + if (__builtin_mul_overflow(residual,static_cast(endpoint),&minimum) || + __builtin_sub_overflow(base,minimum,&remainder) || + __builtin_sub_overflow(threshold,remainder,&right)) return false; + // Signed minimum / -1 is the only nonzero-divisor division overflow. + if (right==std::numeric_limits::min() && residual==-1) return false; + Wide quotient=right/residual; + const Wide fraction=right%residual; + if (residual>0) { + if (fraction<0 && __builtin_sub_overflow(quotient,static_cast(1),"ient)) return false; + if (quotient(lower[j])) candidate.infeasible=true; + else if (quotient(upper[j])) candidate.upper[j]=static_cast(quotient); + } else { + if (fraction<0 && __builtin_add_overflow(quotient,static_cast(1),"ient)) return false; + if (quotient>static_cast(upper[j])) candidate.infeasible=true; + else if (quotient>static_cast(lower[j])) candidate.lower[j]=static_cast(quotient); + } + } + out=std::move(candidate); + return true; +#else + (void) lower; (void) upper; (void) objective_upper; (void) out; + return false; +#endif + } + /** * Evaluate the bound and both conditional bounds for each unfixed bit. * @@ -168,146 +270,134 @@ namespace Gecode { namespace Experimental { namespace LpCertificate { } }; - /// Prepare immutable residual data. Failure leaves out unchanged. + /** Prepare an immutable affine bound from canonical sparse rows. + * Validation is O(rows+nnz), arithmetic is O(rows+columns+active-dual nnz). + * No rows*columns allocation or scan occurs. Failure preserves both outputs. + */ inline bool - prepare(const std::vector& A, + prepare(const SparseMatrixView& A, const std::vector& b, const std::vector& c, - const std::vector& duals, Certificate& out) { + const std::vector& duals, Certificate& out, + PreparationStats* work=nullptr) { #if defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) using Wide = __int128; const std::size_t rows=b.size(),columns=c.size(); - if (duals.size()!=rows || - (rows && columns>std::numeric_limits::max()/rows) || - A.size()!=rows*columns) - return false; + if (duals.size()!=rows || !valid_sparse(A,rows,columns)) return false; std::vector q; - if (!quantize(duals,q)) - return false; + if (!quantize(duals,q)) return false; Certificate candidate; + PreparationStats measured; candidate.residual_.resize(columns); - for (std::size_t j=0; j(scale),static_cast(c[j]), - &candidate.residual_[j])) - return false; + &candidate.residual_[j])) return false; + } for (std::size_t i=0; i(q[i]),static_cast(b[i]),&product) || - __builtin_add_overflow(candidate.constant_,product,&candidate.constant_)) - return false; - for (std::size_t j=0; j(q[i]), - static_cast(A[i*columns+j]),&product) || - __builtin_sub_overflow(candidate.residual_[j],product,&candidate.residual_[j])) - return false; + __builtin_add_overflow(candidate.constant_,product,&candidate.constant_)) return false; + for (std::size_t k=A.row_start[i]; k(q[i]),static_cast(A.value[k]),&product) || + __builtin_sub_overflow(candidate.residual_[j],product,&candidate.residual_[j])) return false; + } } candidate.valid_=true; out=std::move(candidate); + if (work) *work=measured; return true; #else - (void) A; (void) b; (void) c; (void) duals; (void) out; + (void) A; (void) b; (void) c; (void) duals; (void) out; (void) work; return false; #endif } + /** Legacy dense row-major adapter; existing source calls remain valid. + * Dense input is scanned once to create canonical sparse rows. Callers that + * retain sparse storage should use the sparse overload directly. + */ + inline bool + prepare(const std::vector& A, + const std::vector& b, + const std::vector& c, + const std::vector& duals, Certificate& out) { + if (!supported) return false; + const auto rows=b.size(),columns=c.size(); + if (rows==std::numeric_limits::max() || duals.size()!=rows || + (rows && columns>std::numeric_limits::max()/rows) || + A.size()!=rows*columns) return false; + std::vector start,indices; + std::vector values; + start.reserve(rows+1); start.push_back(0); + for (std::size_t i=0; i=b, lower<=x<=upper. - * - * A is row-major with b.size() rows and c.size() columns. Bounds must - * describe a nonempty binary box: 0<=lower[j]<=upper[j]<=1. - * Rows and objective have exact integer coefficients. - * - * For any nonnegative rational y=q/scale, feasibility implies + * Certify min c*x, Ax>=b, over a nonempty binary box using weak duality: * - * c*x >= y*b + sum_j min((c-A^T*y)[j]*lower[j], - * (c-A^T*y)[j]*upper[j]). + * c*x >= (q*b + sum_j min((scale*c-A^T*q)[j]*lower[j], + * (scale*c-A^T*q)[j]*upper[j])) / scale. * - * We compute this expression with checked signed 128-bit integer - * arithmetic and round its value upward, since c*x is integral. - * No floating-point objective or numerical feasibility tolerance enters - * the certificate. A true return does not assert that the model itself - * is feasible. False means no bound was produced, and leaves out intact. - * Compilers without the required checked arithmetic safely return false. + * Any nonnegative quantized q is valid. Checked signed 128-bit arithmetic + * and mathematical ceiling are the only source of pruning bounds. Floating + * LP objectives and infeasibility claims never certify a bound. False means + * no bound was produced and leaves out intact; it does not mean infeasible. */ inline bool - lower_bound(const std::vector& A, + lower_bound(const SparseMatrixView& A, const std::vector& b, const std::vector& c, const std::vector& lower, const std::vector& upper, const std::vector& duals, std::int64_t& out) { -#if defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) - using Wide = __int128; - const std::size_t rows = b.size(); - const std::size_t columns = c.size(); - if ((lower.size() != columns) || (upper.size() != columns) || - (duals.size() != rows)) - return false; - if ((rows != 0) && - (columns > std::numeric_limits::max()/rows)) - return false; - if (A.size() != rows*columns) - return false; - for (std::size_t j=0; j 1) || - (lower[j] > upper[j])) - return false; - - std::vector q; - if (!quantize(duals,q)) - return false; - std::vector reduced(columns); - for (std::size_t j=0; j(scale), - static_cast(c[j]), &reduced[j])) - return false; + Certificate certificate; + return prepare(A,b,c,duals,certificate) && certificate.lower_bound(lower,upper,out); + } - Wide numerator = 0; - for (std::size_t i=0; i(q[i]), - static_cast(b[i]), &product) || - __builtin_add_overflow(numerator,product,&numerator)) - return false; - for (std::size_t j=0; j(q[i]), - static_cast(A[i*columns+j]), - &product) || - __builtin_sub_overflow(reduced[j],product,&reduced[j])) - return false; - } - } - for (std::size_t j=0; j= 0 ? lower[j] : upper[j]; - if (__builtin_mul_overflow(reduced[j],static_cast(endpoint), - &term) || - __builtin_add_overflow(numerator,term,&numerator)) - return false; - } + /// Legacy dense adapter; identical binary box and failure semantics. + inline bool + lower_bound(const std::vector& A, + const std::vector& b, + const std::vector& c, + const std::vector& lower, + const std::vector& upper, + const std::vector& duals, + std::int64_t& out) { + Certificate certificate; + return prepare(A,b,c,duals,certificate) && certificate.lower_bound(lower,upper,out); + } - // C++ division truncates toward zero. Only a positive remainder needs - // an increment to obtain the mathematical ceiling, including for N<0. - Wide rounded = numerator/static_cast(scale); - if (numerator % static_cast(scale) > 0) - if (__builtin_add_overflow(rounded,static_cast(1),&rounded)) - return false; - if ((rounded < static_cast(std::numeric_limits::min())) || - (rounded > static_cast(std::numeric_limits::max()))) - return false; - out = static_cast(rounded); - return true; -#else - (void) A; (void) b; (void) c; (void) lower; (void) upper; - (void) duals; (void) out; - return false; -#endif + /// Finite integer boxes with integer objective coefficients; never continuous. + inline bool + integer_lower_bound(const SparseMatrixView& A, + const std::vector& b, + const std::vector& c, + const std::vector& lower, + const std::vector& upper, + const std::vector& duals, std::int64_t& out) { + Certificate certificate; + return prepare(A,b,c,duals,certificate) && certificate.lower_bound_integer(lower,upper,out); + } + inline bool + integer_lower_bound(const std::vector& A, + const std::vector& b, + const std::vector& c, + const std::vector& lower, + const std::vector& upper, + const std::vector& duals, std::int64_t& out) { + Certificate certificate; + return prepare(A,b,c,duals,certificate) && certificate.lower_bound_integer(lower,upper,out); } }}} diff --git a/gecode/minimodel/lp-cut-loop.hpp b/gecode/minimodel/lp-cut-loop.hpp new file mode 100644 index 0000000000..99bf89aef8 --- /dev/null +++ b/gecode/minimodel/lp-cut-loop.hpp @@ -0,0 +1,315 @@ +/* Explicit root LP / verified global-cover loop. SPDX-License-Identifier: MIT */ +#ifndef GECODE_MINIMODEL_LP_CUT_LOOP_HPP +#define GECODE_MINIMODEL_LP_CUT_LOOP_HPP + +#include +#include +#include + +namespace Gecode { namespace Experimental { namespace LpRelaxation { namespace Cuts { + +#ifdef GECODE_LP_CUT_LOOP_TEST_HOOKS +void root_cut_loop_test_event(const char* event); +#endif + +enum class RootLoopCompletion { + NoNewCuts, RoundLimit, WorkLimit, StorageLimit, SeparationLimit, + Cancelled, TimeLimit, NoPrimalSuggestion, InvalidSuggestion, + CallbackError, BackendError, AllocationFailure +}; + +struct RootLoopOptions { + std::size_t max_rounds=4,max_work=4000000; + std::size_t max_columns=200000,max_rows=200000,max_nonzeros=2000000; + PoolLimits pool; + SeparationOptions separation; + // A bounded power of two keeps native endpoints * denominator exact in double. + Integer denominator=1048576; + std::optional deadline; + std::function stop_requested; + void validate() const { + if (denominator<=0 || denominator>1048576 || (denominator&(denominator-1))) + throw std::invalid_argument("root cover denominator must be a power of two in [1,1048576]"); + } +}; + +struct RootLoopStatistics { + std::size_t work=0,rounds=0,augmentations=0,projected_coordinates=0; + std::size_t separated_cuts=0,duplicate_cuts=0,unsupported_rows=0,oversized_rows=0; + std::size_t arithmetic_rejections=0; + std::uint64_t lp_calls=0,valid_bounds=0,rejected_bounds=0,floating_infeasible_reports=0; + double lp_seconds=0.0; +}; + +/** Exact bound evidence retains its particular matrix and all appended-row + * attribution. Every cuts[i] is global and belongs to the original source; + * matrix row original_rows+i is the negation of cuts[i].inequality(). + * It does not certify integer feasibility or floating LP optimality. + */ +struct RootBoundEvidence { + SourceModel model; + std::vector cuts; + BoundResult bound; +}; + +struct RootLoopResult { + SourceModel original; + SourceModel model; + std::vector cuts; + // Null until construction has completed. Its model is an immutable copy of model. + std::shared_ptr backend; + std::optional best_bound; + RootLoopCompletion completion=RootLoopCompletion::RoundLimit; + RootLoopStatistics stats; + explicit RootLoopResult(SourceModel source):original(source),model(std::move(source)) {} +}; + +struct RationalSelection { + FractionalPoint point; + std::size_t projected_coordinates=0; +}; + +/** This projects a finite numerical suggestion into the original box, then + * rounds to the nearest grid point, halfway away from zero. It is solely a cut + * selection heuristic: neither a feasible witness nor a primal bound. + */ +inline RationalSelection rational_selection_point(const SourceModel& source, + const std::vector& values,Integer denominator=1048576) { + RootLoopOptions options;options.denominator=denominator;options.validate(); + const auto& model=source.model(); + if (values.size()!=model.lower.size()) + throw std::invalid_argument("root cover suggestion dimensions"); + RationalSelection result;result.point.denominator=denominator; + result.point.numerator.reserve(values.size()); + for (std::size_t j=0;j(model.lower[j]), + std::min(static_cast(model.upper[j]),values[j])); + if (projected!=values[j]) ++result.projected_coordinates; + // Source validation and the denominator cap bound these exact integer + // endpoints below 2^51. Scaling by a power of two introduces no error. + const auto lower=Detail::times_positive(model.lower[j],denominator); + const auto upper=Detail::times_positive(model.upper[j],denominator); + const double rounded=std::round(projected*static_cast(denominator)); + if (!std::isfinite(rounded) || rounded(lower) || rounded>static_cast(upper)) + throw std::invalid_argument("root cover rational projection is outside the original box"); + result.point.numerator.push_back(static_cast(rounded)); + } + return result; +} + +namespace LoopDetail { +struct Stop {RootLoopCompletion reason;}; +inline void event(const char* name) { +#ifdef GECODE_LP_CUT_LOOP_TEST_HOOKS + root_cut_loop_test_event(name); +#else + (void)name; +#endif +} +class Budget { + const RootLoopOptions& options_; + RootLoopStatistics& stats_; +public: + Budget(const RootLoopOptions& options,RootLoopStatistics& stats):options_(options),stats_(stats) {} + void checkpoint() const { + bool cancelled=false; + if (options_.stop_requested) { + try {cancelled=options_.stop_requested();} + catch (...) {throw Stop{RootLoopCompletion::CallbackError};} + } + if (cancelled) throw Stop{RootLoopCompletion::Cancelled}; + if (options_.deadline && std::chrono::steady_clock::now()>=*options_.deadline) + throw Stop{RootLoopCompletion::TimeLimit}; + } + std::size_t remaining() const {return options_.max_work-stats_.work;} + void charge(std::size_t units) { + checkpoint(); + if (units>remaining()) throw Stop{RootLoopCompletion::WorkLimit}; + stats_.work+=units; + } +}; +inline void shape(const BoundedIntegerModel& model,const RootLoopOptions& options) { + const auto limit=static_cast(std::numeric_limits::max()); + if (model.linear.c.size()>std::min(options.max_columns,limit) || + model.linear.b.size()>std::min(options.max_rows,limit) || + model.linear.a.size()>std::min(options.max_nonzeros,limit)) + throw Stop{RootLoopCompletion::StorageLimit}; +} +// A structural work reservation for each full validation or model copy. Copies, +// CSR validation and native activity checks are O(columns+rows+nonzeros). +inline void model_work(const BoundedIntegerModel& model,Budget& budget) { + for (unsigned i=0;i<3;++i) budget.charge(model.linear.c.size()); + for (unsigned i=0;i<2;++i) budget.charge(model.linear.b.size()); + for (unsigned i=0;i<2;++i) budget.charge(model.linear.a.size()); + budget.charge(1); +} +inline void records_work(const std::vector& cuts,Budget& budget) { + for (const auto& cut:cuts) {budget.charge(1);budget.charge(cut.inequality().column.size());} +} +inline BoundedIntegerModel append(const SourceModel& original,const std::vector& cuts, + const RootLoopOptions& options,Budget& budget) { + const auto& base=original.model(); + const auto row_limit=std::min({options.max_rows, + static_cast(std::numeric_limits::max()), + static_cast(Int::Limits::max)}); + const auto term_limit=std::min(options.max_nonzeros, + static_cast(std::numeric_limits::max())); + if (cuts.size()>row_limit-base.linear.b.size()) throw Stop{RootLoopCompletion::StorageLimit}; + std::size_t terms=base.linear.a.size(); + for (const auto& record:cuts) { + budget.charge(1); + if (!record.source().same_identity(original) || record.proof().scope.kind!=ScopeKind::Global) + throw std::invalid_argument("root cover append requires verified global original-source records"); + const auto n=record.inequality().column.size(); + if (n>term_limit-terms) throw Stop{RootLoopCompletion::StorageLimit}; + terms+=n; + } + model_work(base,budget); + BoundedIntegerModel result=base; + result.linear.a.reserve(terms);result.linear.column.reserve(terms); + result.linear.b.reserve(base.linear.b.size()+cuts.size()); + result.linear.row_start.reserve(base.linear.b.size()+cuts.size()+1); + for (const auto& record:cuts) { + budget.charge(1);const auto& cut=record.inequality(); + for (std::size_t k=0;k(result.model.model()); + budget.checkpoint();result.backend=std::move(initial); + for (std::size_t round=0;roundstatistics(); + ++result.stats.rounds; + LoopDetail::event("before_bound"); + BoundResult bound; + try {bound=result.backend->bound(source.model().lower,source.model().upper,true,true);} + catch (...) {LoopDetail::observed(before,result.backend->statistics(),result.stats);throw;} + LoopDetail::observed(before,result.backend->statistics(),result.stats); + LoopDetail::event("after_bound"); + budget.checkpoint(); + if (bound.valid && (!result.best_bound || bound.lower_bound>result.best_bound->bound.lower_bound)) { + LoopDetail::records_work(result.cuts,budget); + BoundResult retained;retained.valid=true;retained.lower_bound=bound.lower_bound; + retained.lp_objective=bound.lp_objective;retained.certificate=bound.certificate; + RootBoundEvidence evidence{result.model,result.cuts,std::move(retained)}; + LoopDetail::event("bound_publication"); + budget.checkpoint();result.best_bound=std::move(evidence); + } + if (!bound.primal_suggestion) throw LoopDetail::Stop{RootLoopCompletion::NoPrimalSuggestion}; + budget.charge(source.model().lower.size()); + RationalSelection selection; + try {selection=rational_selection_point(source,*bound.primal_suggestion,options.denominator);} + catch (const std::invalid_argument&) {throw LoopDetail::Stop{RootLoopCompletion::InvalidSuggestion};} + result.stats.projected_coordinates+=selection.projected_coordinates; + budget.checkpoint(); + auto separation=options.separation; + separation.max_work=std::min(separation.max_work,budget.remaining()); + auto separated=separate_covers(source,selection.point,Scope::global(),separation); + // The separator has already consumed these units, even if a stop occurs + // immediately afterward. Its own cap guarantees this addition is safe. + result.stats.work+=separated.stats.work; + result.stats.separated_cuts+=separated.cuts.size(); + result.stats.duplicate_cuts+=separated.stats.duplicate_cuts; + result.stats.unsupported_rows+=separated.stats.unsupported_rows; + result.stats.oversized_rows+=separated.stats.oversized_rows; + result.stats.arithmetic_rejections+=separated.stats.arithmetic_rejections; + budget.checkpoint(); + LoopDetail::records_work(pool.records(),budget); + CutPool staged_pool=pool; + bool storage=false; + for (const auto& cut:separated.cuts) { + // Pool canonical comparisons and copies are linear in its bounded + // records/terms; reserve that work before each transactional insertion. + LoopDetail::records_work(staged_pool.records(),budget); + budget.charge(1);budget.charge(cut.inequality().column.size()); + const auto inserted=staged_pool.insert(cut); + if (inserted==InsertStatus::Capacity) {storage=true;break;} + if (inserted==InsertStatus::Duplicate) ++result.stats.duplicate_cuts; + if (inserted==InsertStatus::ForeignSource || inserted==InsertStatus::Replaced) + throw std::runtime_error("root cover pool violated original/global append invariants"); + } + if (staged_pool.records().size()==pool.records().size()) { + if (storage) throw LoopDetail::Stop{RootLoopCompletion::StorageLimit}; + if (separated.stats.work_limit) throw LoopDetail::Stop{RootLoopCompletion::WorkLimit}; + if (separated.stats.row_limit || separated.stats.cut_limit) + throw LoopDetail::Stop{RootLoopCompletion::SeparationLimit}; + budget.checkpoint(); + result.completion=RootLoopCompletion::NoNewCuts;return result; + } + LoopDetail::event("augmentation_build"); + auto augmented=LoopDetail::append(source,staged_pool.records(),options,budget); + LoopDetail::model_work(augmented,budget); + SourceModel staged_model(std::move(augmented)); + LoopDetail::model_work(staged_model.model(),budget); + LoopDetail::model_work(staged_model.model(),budget); + LoopDetail::event("augmented_backend"); + auto staged_backend=std::make_shared(staged_model.model()); + LoopDetail::records_work(staged_pool.records(),budget); + auto staged_cuts=staged_pool.records(); + LoopDetail::event("augmentation_publication"); + budget.checkpoint(); + // All operations after this publication gate move/swap already owned data. + result.model=std::move(staged_model);result.backend=std::move(staged_backend); + result.cuts.swap(staged_cuts);pool=std::move(staged_pool);++result.stats.augmentations; + LoopDetail::event("after_augmentation_publication"); + if (storage) throw LoopDetail::Stop{RootLoopCompletion::StorageLimit}; + if (separated.stats.work_limit) throw LoopDetail::Stop{RootLoopCompletion::WorkLimit}; + } + budget.checkpoint(); + result.completion=RootLoopCompletion::RoundLimit; + } catch (const LoopDetail::Stop& stop) { + result.completion=stop.reason; + } catch (const std::bad_alloc&) { + result.completion=RootLoopCompletion::AllocationFailure; + } catch (const std::exception&) { + result.completion=RootLoopCompletion::BackendError; + } catch (...) { + result.completion=RootLoopCompletion::BackendError; + } + return result; +} + +}}}} +#endif diff --git a/gecode/minimodel/lp-cuts.hpp b/gecode/minimodel/lp-cuts.hpp new file mode 100644 index 0000000000..4a7be5f439 --- /dev/null +++ b/gecode/minimodel/lp-cuts.hpp @@ -0,0 +1,422 @@ +/* Exact scoped cover-cut records and bounded deterministic separation. + * Experimental, opt-in; no native or numerical backend integration. + * SPDX-License-Identifier: MIT + */ +#ifndef GECODE_MINIMODEL_LP_CUTS_HPP +#define GECODE_MINIMODEL_LP_CUTS_HPP + +#include +#include +#include + +namespace Gecode { namespace Experimental { namespace LpRelaxation { namespace Cuts { + +using Integer=std::int64_t; + +/// Copies share one immutable identity; rebuilding an equal model creates another. +class SourceModel { + std::shared_ptr data_; + static std::shared_ptr snapshot(BoundedIntegerModel input) { + validate_integer_model(input); + return std::make_shared(std::move(input)); + } +public: + explicit SourceModel(BoundedIntegerModel input):data_(snapshot(std::move(input))) {} + const BoundedIntegerModel& model() const { + if (!data_) throw std::invalid_argument("cut source is moved from"); + return *data_; + } + bool same_identity(const SourceModel& other) const noexcept { + return data_ && data_==other.data_; + } +}; + +struct Box { + std::vector lower,upper; +}; +enum class ScopeKind { Global, Local }; +struct Scope { + ScopeKind kind=ScopeKind::Global; + Box box; + static Scope global() {return {};} + static Scope local(Box value) {return {ScopeKind::Local,std::move(value)};} +}; + +/// Untrusted proof request. The checker derives weights/signs from the source row. +struct CoverProof { + std::size_t row=0; + std::vector columns; + Scope scope; +}; +/// Canonical original-variable inequality sum(coefficient[k]*x[column[k]])<=upper. +struct SparseCut { + std::vector column; + std::vector coefficient; + Integer upper=0; +}; + +namespace Detail { +struct LimitReached {}; +struct Meter { + std::size_t used=0,limit=std::numeric_limits::max(); + void tick() { + if (used==limit) throw LimitReached{}; + ++used; + } +}; +// A fixed merge schedule makes work-limit prefixes independent of std::sort's +// implementation. Both comparisons and output entries consume work units. +template +inline void sort(std::vector& values,Less less,Meter& work) { + const auto n=values.size(); + if (n<2) return; + std::vector scratch(n); + for (std::size_t width=1;widthn/2) break; + width*=2; + } +} +// Reuse the established strengthening arithmetic and literal representation. +using Term=Strengthening::Detail::Term; +using PackingRow=Strengthening::Detail::PackingRow; +inline Integer add(Integer a,Integer b) { + Integer out; + if (!Strengthening::Detail::add(a,b,out)) throw std::overflow_error("cover addition overflow"); + return out; +} +inline Integer subtract(Integer a,Integer b) { + Integer out; + if (!Strengthening::Detail::subtract(a,b,out)) throw std::overflow_error("cover subtraction overflow"); + return out; +} +inline Integer times_positive(Integer value,Integer positive) { + if (positive<=0) throw std::invalid_argument("cover multiplier must be positive"); + if ((value>0 && value>std::numeric_limits::max()/positive) || + (value<0 && value::min()/positive)) + throw std::overflow_error("cover multiplication overflow"); + return value*positive; +} +inline bool valid_box(const BoundedIntegerModel& model,const Box& box,Meter& work) { + const auto n=model.lower.size(); + if (box.lower.size()!=n || box.upper.size()!=n) return false; + for (std::size_t j=0;jmodel.upper[j] || box.lower[j]>box.upper[j]) return false; + } + return true; +} +struct Bounds { + const std::vector& lower; + const std::vector& upper; +}; +inline Bounds bounds(const BoundedIntegerModel& model,const Scope& scope,Meter& work) { + if (scope.kind==ScopeKind::Global) { + if (!scope.box.lower.empty() || !scope.box.upper.empty()) + throw std::invalid_argument("global cover proof cannot carry local bounds"); + return {model.lower,model.upper}; + } + if (scope.kind!=ScopeKind::Local || !valid_box(model,scope.box,work)) + throw std::invalid_argument("local cover scope must be a nonempty box inside the source domains"); + return {scope.box.lower,scope.box.upper}; +} +inline bool contains(const Box& outer,const Box& inner) { + for (std::size_t j=0;jouter.upper[j]) return false; + return true; +} +inline bool covers_scope(const Scope& outer,const Scope& inner) { + if (outer.kind==ScopeKind::Global) return true; + if (inner.kind==ScopeKind::Global) return false; + return contains(outer.box,inner.box); +} +struct UnsupportedRow : std::invalid_argument { + UnsupportedRow():std::invalid_argument("cover row has a free nonbinary variable in its certified scope") {} +}; +inline PackingRow packing(const BoundedIntegerModel& model,std::size_t row, + const Bounds& box,Meter& work) { + const auto& matrix=model.linear; + if (row>=matrix.b.size()) throw std::invalid_argument("cover proof source row is out of range"); + PackingRow result; + result.capacity=subtract(0,matrix.b[row]); + for (auto k=matrix.row_start[row];k0?a:subtract(0,a); + if (box.lower[j]==box.upper[j]) { + Integer fixed=times_positive(box.lower[j],weight); + if (a<0) fixed=subtract(0,fixed); + result.capacity=add(result.capacity,fixed); + continue; + } + if (box.lower[j]<0 || box.upper[j]>1) throw UnsupportedRow{}; + const bool complement=a>0; + result.terms.push_back({2*j+(complement?1U:0U),weight}); + if (complement) result.capacity=add(result.capacity,weight); + } + return result; +} +struct Verifier; +inline bool same_row(const SparseCut& a,const SparseCut& b) { + return a.upper==b.upper && a.column==b.column && a.coefficient==b.coefficient; +} +inline bool same_row(const SparseCut& a,const SparseCut& b,Meter& work) { + work.tick(); + if (a.upper!=b.upper || a.column.size()!=b.column.size()) return false; + for (std::size_t i=0;irow.terms.size()) + throw std::invalid_argument("cover proof selects too many free source terms"); + auto columns=claim.columns; + Detail::sort(columns,[](std::size_t a,std::size_t b){return a(columns.size())-1; + Integer weight=0;std::size_t position=0; + for (std::size_t i=0;i cuts_; + std::size_t nonzeros_=0,scope_values_=0; + static bool accumulate(std::size_t value,std::size_t limit,std::size_t& total) { + if (value>limit-total) return false; + total+=value;return true; + } +public: + explicit CutPool(SourceModel source,PoolLimits limits={}) + : source_(std::move(source)),limits_(limits) {(void)source_.model();} + const std::vector& records() const {return cuts_;} + std::size_t nonzeros() const {return nonzeros_;} + std::size_t scope_values() const {return scope_values_;} + InsertStatus insert(const VerifiedCut& candidate) { + if (!source_.same_identity(candidate.source())) return InsertStatus::ForeignSource; + std::vector remove(cuts_.size(),0);std::size_t removed=0; + for (std::size_t i=0;i next; + for (std::size_t i=0;i applicable(const Box& box) const { + std::vector result; + for (const auto& cut:cuts_) if (cut.applies_to(source_,box)) result.push_back(cut); + return result; + } +}; + +/// Exact rational selection point. It is not proof of a cut's validity. +struct FractionalPoint { + std::vector numerator; + Integer denominator=1048576; +}; +struct SeparationOptions { + std::size_t max_work=100000,max_rows=256,max_terms_per_row=512; + std::size_t max_cuts=32,max_cuts_per_row=4,max_starts_per_row=4; +}; +struct SeparationStats { + std::size_t work=0,rows=0,unsupported_rows=0,oversized_rows=0; + std::size_t arithmetic_rejections=0,duplicate_cuts=0; + bool work_limit=false,row_limit=false,cut_limit=false; +}; +struct SeparationResult { + std::vector cuts; + SeparationStats stats; +}; + +namespace Detail { +inline void point_in_box(const FractionalPoint& point,const Bounds& box,Meter& work) { + if (point.denominator<=0 || point.numerator.size()!=box.lower.size()) + throw std::invalid_argument("cover selection point requires matching coordinates and a positive denominator"); + for (std::size_t j=0;jupper) + throw std::invalid_argument("cover selection point is outside its certified scope box"); + } +} +inline Integer literal_value(const Term& term,const FractionalPoint& point) { + return term.literal&1U ? subtract(point.denominator,point.numerator[term.literal/2]) + : point.numerator[term.literal/2]; +} +inline bool violated(const std::vector& cover,const FractionalPoint& point,Meter& work) { + Integer activity=0; + for (const auto& term:cover) {work.tick();activity=add(activity,literal_value(term,point));} + return activity>times_positive(static_cast(cover.size())-1,point.denominator); +} +} + +/** Deterministic greedy covers with exact proof reconstruction and point checks. + * Reuses the established strengthening rule: grow a cover, remove any light + * term while its remainder still exceeds capacity, then emit cardinality <=k-1. + * Work caps can miss cuts; an empty result makes no separation-completeness claim. + */ +inline SeparationResult separate_covers(const SourceModel& source,const FractionalPoint& point, + const Scope& scope=Scope::global(),const SeparationOptions& options={}) { + SeparationResult result;Detail::Meter work{0,options.max_work}; + if (!options.max_cuts) {result.stats.cut_limit=true;return result;} + try { + const auto& model=source.model();const auto& matrix=model.linear; + const auto box=Detail::bounds(model,scope,work); + Detail::point_in_box(point,box,work); + for (std::size_t i=0;ioptions.max_terms_per_row) { + ++result.stats.oversized_rows;continue; + } + Detail::PackingRow row; + try {row=Detail::packing(model,i,box,work);} + catch (const Detail::UnsupportedRow&) {++result.stats.unsupported_rows;continue;} + catch (const std::overflow_error&) {++result.stats.arithmetic_rejections;continue;} + const auto before=result.cuts.size(); + const auto append=[&](const std::vector& cover) { + if (!Detail::violated(cover,point,work)) return; + CoverProof claim;claim.row=i;claim.scope=scope; + for (const auto& term:cover) {work.tick();claim.columns.push_back(term.literal/2);} + auto cut=Detail::Verifier::make(source,claim,work); + for (const auto& prior:result.cuts) { + if (Detail::same_row(prior.inequality(),cut.inequality(),work)) {++result.stats.duplicate_cuts;return;} + } + result.cuts.push_back(std::move(cut)); + }; + if (!options.max_cuts_per_row) continue; + try { + if (row.capacity<0) append({}); + else for (unsigned policy=0;policy<3 && result.cuts.size()bv; + } + if (policy!=2 && a.weight!=b.weight) return a.weight>b.weight; + return a.literal cover; + for (std::size_t k=0;k minimal; + for (const auto& term:cover) { + work.tick();const auto remaining=Detail::subtract(weight,term.weight); + if (remaining>row.capacity) weight=remaining;else minimal.push_back(term); + } + append(minimal); + } + } + } catch (const std::overflow_error&) {++result.stats.arithmetic_rejections;} + if (result.cuts.size()==options.max_cuts) {result.stats.cut_limit=true;break;} + } + } catch (const Detail::LimitReached&) {result.stats.work_limit=true;} + result.stats.work=work.used; + return result; +} + +}}}} +#endif diff --git a/gecode/minimodel/lp-model.hpp b/gecode/minimodel/lp-model.hpp index 334b92a92d..ebaef7e2eb 100644 --- a/gecode/minimodel/lp-model.hpp +++ b/gecode/minimodel/lp-model.hpp @@ -1,20 +1,80 @@ -/* Experimental binary linear models. SPDX-License-Identifier: MIT */ +/* Experimental binary and bounded-integer linear models. SPDX-License-Identifier: MIT */ #ifndef GECODE_MINIMODEL_LP_MODEL_HPP #define GECODE_MINIMODEL_LP_MODEL_HPP #include +#include #include #include #include +#include +#include +#include #include namespace Gecode { namespace Experimental { namespace LpRelaxation { /// Binary minimization: min c*x, subject to a*x >= b. Dense row-major a. +/// Kept unchanged for source compatibility, including mutable public data. struct LinearModel { std::vector a, b, c; }; +/** Binary minimization in canonical compressed sparse row (CSR) storage. + * a[k] belongs to column[k]; row i occupies [row_start[i],row_start[i+1]). + * Each row's columns must be strictly increasing and values must be nonzero. + * The default value describes the empty model. No dense shadow is retained. + */ +struct SparseLinearModel { + std::vector row_start{0}, column; + std::vector a, b, c; + + LpCertificate::SparseMatrixView matrix() const { + return {row_start,column,a,c.size()}; + } + std::size_t nonzeros() const { return a.size(); } +}; + +/// Convert the current dense value, never a cached copy of mutable input. +inline SparseLinearModel sparse_model(const LinearModel& model) { + const auto n=model.c.size(),m=model.b.size(); + if (m==std::numeric_limits::max() || + (n && m>std::numeric_limits::max()/n) || model.a.size()!=m*n) + throw std::invalid_argument("Binary linear model dimensions"); + SparseLinearModel result; + result.b=model.b; result.c=model.c; + result.row_start.reserve(m+1); + for (std::size_t i=0;i::value,int>::type=0> +inline void validate_model(const Model& model) { + const auto n=model.c.size(),m=model.b.size(); + if (n>static_cast(std::numeric_limits::max()) || + m>static_cast(std::numeric_limits::max()) || + !LpCertificate::valid_sparse(model.matrix(),m,n)) + throw std::invalid_argument("Binary sparse model needs canonical CSR dimensions/indices"); + for (const auto* values : {&model.a,&model.b,&model.c}) + for (auto value : *values) + if (value < -1000000000LL || value > 1000000000LL) + throw std::invalid_argument("Binary linear coefficients must have magnitude <= 1e9"); + // n<=INT_MAX and abs(c)<=1e9 keep both sums within signed int64. + std::int64_t lo=0,hi=0; + for (auto value : model.c) { if (value<0) lo+=value; else hi+=value; } + if (loInt::Limits::max) + throw std::invalid_argument("Binary objective range exceeds Gecode integer limits"); +} + inline void validate_model(const LinearModel& model) { const auto n=model.c.size(), m=model.b.size(); if (n>static_cast(std::numeric_limits::max()) || @@ -31,9 +91,11 @@ inline void validate_model(const LinearModel& model) { throw std::invalid_argument("Binary objective range exceeds Gecode integer limits"); } -/// Post the original constraints. Identical code is used by both benchmarks. +/// Post original sparse constraints without allocating or scanning dense rows. +template::value,int>::type=0> inline void post_native(Home home,const IntVarArgs& x,IntVar objective, - const LinearModel& model) { + const Model& model) { validate_model(model); if (model.c.size()!=static_cast(x.size())) throw Int::ArgumentSizeMismatch("LpRelaxation::post_native"); @@ -42,11 +104,10 @@ inline void post_native(Home home,const IntVarArgs& x,IntVar objective, for (std::size_t i=0;i(model.a[i*x.size()+j]); - variables << x[j]; - } + for (std::size_t k=model.row_start[i];k(model.a[k]); + variables << x[static_cast(model.column[k])]; + } linear(home,coefficients,variables,IRT_GQ,static_cast(model.b[i]),IPL_BND); } IntArgs costs(x.size()); @@ -54,5 +115,88 @@ inline void post_native(Home home,const IntVarArgs& x,IntVar objective, linear(home,costs,x,IRT_EQ,objective,IPL_BND); } +/// Legacy dense posting reads the current input and converts exactly once. +inline void post_native(Home home,const IntVarArgs& x,IntVar objective, + const LinearModel& model) { + post_native(home,x,objective,sparse_model(model)); +} + +/** Explicit finite integer domains over a sparse linear model. No objective + * offset or fractional coefficient/lattice is implied by this integer API. + */ +struct BoundedIntegerModel { + SparseLinearModel linear; + std::vector lower,upper; +}; + +namespace Detail { +inline std::pair validate_integer_native(const BoundedIntegerModel& model) { + const auto& linear=model.linear; + const auto n=linear.c.size(),m=linear.b.size(); + if (n>static_cast(Int::Limits::max) || + m>static_cast(Int::Limits::max) || + model.lower.size()!=n || model.upper.size()!=n || + !LpCertificate::valid_sparse(linear.matrix(),m,n)) + throw std::invalid_argument("Bounded integer model needs matching domains and canonical CSR"); + for (const auto* values : {&linear.a,&linear.b,&linear.c}) + for (auto value : *values) + if (value < -1000000000LL || value > 1000000000LL) + throw std::invalid_argument("Integer linear coefficients must have magnitude <= 1e9"); + for (std::size_t j=0;jInt::Limits::max || + model.lower[j]>model.upper[j]) + throw std::invalid_argument("Integer domains must be nonempty and within native Gecode limits"); + // Each product fits int64 before comparison (1e9 * native_max). The sum + // never crosses its checked native limit. This excludes floating-point + // fallback propagation and protects every signed native row activity. + const auto accumulate=[&](std::int64_t coefficient,std::size_t j,std::int64_t limit, + std::int64_t& magnitude,std::int64_t& lo,std::int64_t& hi) { + const auto a=coefficient*model.lower[j],b=coefficient*model.upper[j]; + const auto absolute=std::max(std::abs(a),std::abs(b)); + if (absolute>limit-magnitude) + throw std::invalid_argument("Integer linear activity exceeds exact native limits; tighten domains or rescale with exact integers"); + magnitude+=absolute; lo+=std::min(a,b); hi+=std::max(a,b); + }; + for (std::size_t i=0;i(lo),static_cast(hi)}; +} +} + +inline void validate_integer_model(const BoundedIntegerModel& model) { + (void) Detail::validate_integer_native(model); +} + +/// Preserve original sparse integer rows/domains and the objective equality. +inline void post_native_integer(Home home,const IntVarArgs& x,IntVar objective, + const BoundedIntegerModel& model) { + const auto objective_range=Detail::validate_integer_native(model); + if (model.linear.c.size()!=static_cast(x.size())) + throw Int::ArgumentSizeMismatch("LpRelaxation::post_native_integer"); + if (home.failed()) return; + for (int j=0;j(model.lower[j]),static_cast(model.upper[j])); + dom(home,objective,objective_range.first,objective_range.second); + const auto& linear_model=model.linear; + for (std::size_t i=0;i(linear_model.a[k]); + variables << x[static_cast(linear_model.column[k])]; + } + linear(home,coefficients,variables,IRT_GQ,static_cast(linear_model.b[i]),IPL_BND); + } + IntArgs costs(x.size()); + for (int j=0;j(linear_model.c[j]); + linear(home,costs,x,IRT_EQ,objective,IPL_BND); +} + }}} #endif diff --git a/gecode/minimodel/lp-relaxation.hpp b/gecode/minimodel/lp-relaxation.hpp index 39669db5f2..7acdaa414d 100644 --- a/gecode/minimodel/lp-relaxation.hpp +++ b/gecode/minimodel/lp-relaxation.hpp @@ -28,7 +28,7 @@ struct Options { class BoundPropagator : public Propagator { ViewArray x; Int::IntView objective; - std::shared_ptr backend; + std::shared_ptr backend; std::shared_ptr certificate; Options options; int last_assigned; @@ -37,7 +37,7 @@ class BoundPropagator : public Propagator { public: BoundPropagator(Home home,const IntVarArgs& variables,IntVar cost, - const std::shared_ptr& engine,const Options& policy) + const std::shared_ptr& engine,const Options& policy) : Propagator(home),x(home,variables),objective(cost),backend(engine), options(policy),last_assigned(-1),has_bound(false),bound_value(0) { home.notice(*this,AP_DISPOSE); @@ -45,7 +45,7 @@ class BoundPropagator : public Propagator { objective.subscribe(home,*this,Int::PC_INT_BND); } BoundPropagator(Home home,const IntVarArgs& variables,IntVar cost, - const std::shared_ptr& engine,Frequency f) + const std::shared_ptr& engine,Frequency f) : BoundPropagator(home,variables,cost,engine,Options{f,false,1}) {} BoundPropagator(Space& home,BoundPropagator& other) : Propagator(home,other),backend(other.backend),certificate(other.certificate), @@ -156,22 +156,166 @@ class BoundPropagator : public Propagator { }; /// Post all native rows/objective equality plus the optional LP bound actor. +template::value,int>::type=0> inline void binary_linear_minimize(Home home,const IntVarArgs& x,IntVar objective, - const std::shared_ptr& backend, + const std::shared_ptr& backend, const Options& options) { if (!backend) throw std::invalid_argument("LP backend is null"); if (!options.assignment_interval) throw std::invalid_argument("LP assignment interval must be positive"); - post_native(home,x,objective,backend->model); + const std::shared_ptr engine=backend; + post_native(home,x,objective,engine->model); if (!home.failed()) - (void) new(home) BoundPropagator(home,x,objective,backend,options); + (void) new(home) BoundPropagator(home,x,objective,engine,options); } +template::value,int>::type=0> +inline void binary_linear_minimize(Home home,const IntVarArgs& x,IntVar objective, + const std::shared_ptr& backend, + Frequency frequency=Frequency::EveryNode) { + binary_linear_minimize(home,x,objective,backend,Options{frequency,false,1}); +} + +// Keep the original posting signatures for source/function-pointer compatibility. +inline void binary_linear_minimize(Home home,const IntVarArgs& x,IntVar objective, + const std::shared_ptr& backend, + const Options& options) { + binary_linear_minimize(home,x,objective, + std::shared_ptr(backend),options); +} inline void binary_linear_minimize(Home home,const IntVarArgs& x,IntVar objective, const std::shared_ptr& backend, Frequency frequency=Frequency::EveryNode) { binary_linear_minimize(home,x,objective,backend,Options{frequency,false,1}); } +/// Explicit integer policy; no binary-assignment scheduling is inferred. +struct IntegerOptions { + Frequency frequency=Frequency::EveryNode; + bool bound_tightening=false; + /// Reoptimize after this many observed variable interval changes (root always). + unsigned int bound_change_interval=1; +}; + +namespace Detail { +class IntegerBoundPropagator : public Propagator { + ViewArray x; + Int::IntView objective; + std::shared_ptr backend; + std::shared_ptr certificate; + std::vector last_lower,last_upper; + IntegerOptions options; + std::uint64_t pending_changes=0; + bool attempted=false,has_bound=false; + std::int64_t bound_value=0; +public: + IntegerBoundPropagator(Home home,const IntVarArgs& variables,IntVar cost, + const std::shared_ptr& engine,const IntegerOptions& policy) + : Propagator(home),x(home,variables),objective(cost),backend(engine),options(policy) { + home.notice(*this,AP_DISPOSE); + x.subscribe(home,*this,Int::PC_INT_BND); + objective.subscribe(home,*this,Int::PC_INT_BND); + } + IntegerBoundPropagator(Space& home,IntegerBoundPropagator& other) + : Propagator(home,other),backend(other.backend),certificate(other.certificate), + last_lower(other.last_lower),last_upper(other.last_upper),options(other.options), + pending_changes(other.pending_changes),attempted(other.attempted), + has_bound(other.has_bound),bound_value(other.bound_value) { + x.update(home,other.x);objective.update(home,other.objective); + } + Actor* copy(Space& home) override {return new(home) IntegerBoundPropagator(home,*this);} + PropCost cost(const Space&,const ModEventDelta&) const override { + return PropCost::crazy(PropCost::HI,x.size()); + } + void reschedule(Space& home) override { + x.reschedule(home,*this,Int::PC_INT_BND);objective.reschedule(home,*this,Int::PC_INT_BND); + } + std::size_t dispose(Space& home) override { + home.ignore(*this,AP_DISPOSE); + if (!home.failed()) { + x.cancel(home,*this,Int::PC_INT_BND);objective.cancel(home,*this,Int::PC_INT_BND); + } + last_lower.~vector();last_upper.~vector(); + certificate.~shared_ptr();backend.~shared_ptr(); + (void) Propagator::dispose(home);return sizeof(*this); + } + ExecStatus propagate(Space& home,const ModEventDelta&) override { + std::vector lower(x.size()),upper(x.size()); + int assigned=0;std::uint64_t changed=0; + for (int j=0;j(options.bound_change_interval,pending_changes+changed); + last_lower=lower;last_upper=upper; + const bool solve_lp=!attempted || (options.frequency==Frequency::EveryNode && + pending_changes>=options.bound_change_interval); + if (solve_lp) { + const bool retain=options.bound_tightening || options.bound_change_interval>1; + auto result=backend->bound(lower,upper,retain); + attempted=true;pending_changes=0; + if (result.certificate) certificate=std::move(result.certificate); + if (result.valid && (!has_bound || result.lower_bound>bound_value)) { + has_bound=true;bound_value=result.lower_bound; + } + } + bool modified=false; + if (certificate) { + if (options.bound_tightening) { + LpCertificate::IntegerFilterResult result; + if (certificate->filter_integer(lower,upper,objective.max(),result)) { + if (!has_bound || result.lower_bound>bound_value) {has_bound=true;bound_value=result.lower_bound;} + const auto checks=static_cast(x.size()-assigned); + std::uint64_t tightened=0,fixed=0; + if (result.infeasible || bound_value>objective.max()) { + backend->record_filtering(checks,tightened,fixed);return ES_FAILED; + } + // All intersections were certified against the same original box. + for (int j=0;j(result.lower[j])); + if (me_failed(a)) {backend->record_filtering(checks,tightened,fixed);return ES_FAILED;} + const auto b=x[j].lq(home,static_cast(result.upper[j])); + if (me_failed(b)) {backend->record_filtering(checks,tightened,fixed);return ES_FAILED;} + if (me_modified(a) || me_modified(b)) { + modified=true;++tightened; + if (!was_assigned && x[j].assigned()) ++fixed; + } + } + backend->record_filtering(checks,tightened,fixed); + } + } else { + std::int64_t evaluated; + if (certificate->lower_bound_integer(lower,upper,evaluated) && + (!has_bound || evaluated>bound_value)) {has_bound=true;bound_value=evaluated;} + } + } + if (has_bound) { + if (bound_value>objective.max()) return ES_FAILED; + if (bound_value>objective.min()) GECODE_ME_CHECK(objective.gq(home,static_cast(bound_value))); + } + if (options.frequency==Frequency::Root && (!options.bound_tightening || !certificate)) + return home.ES_SUBSUMED(*this); + return modified ? ES_NOFIX : ES_FIX; + } +}; +} + +inline void integer_linear_minimize(Home home,const IntVarArgs& x,IntVar objective, + const std::shared_ptr& backend, + const IntegerOptions& options={}) { + if (!backend) throw std::invalid_argument("Integer LP backend is null"); + if (!options.bound_change_interval || + (options.frequency!=Frequency::Root && options.frequency!=Frequency::EveryNode)) + throw std::invalid_argument("Invalid integer LP frequency or bound-change interval"); + post_native_integer(home,x,objective,backend->model); + if (!home.failed()) (void) new(home) Detail::IntegerBoundPropagator(home,x,objective,backend,options); +} + }}} #endif diff --git a/gecode/optimize.hh b/gecode/optimize.hh new file mode 100644 index 0000000000..a8ff351b24 --- /dev/null +++ b/gecode/optimize.hh @@ -0,0 +1,29 @@ +/* Additive numerical modeling, solving and workflows. Requires C++17. */ +#ifndef GECODE_OPTIMIZE_HH +#define GECODE_OPTIMIZE_HH + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/gecode/optimize/CMakeLists.txt b/gecode/optimize/CMakeLists.txt new file mode 100644 index 0000000000..7bd813f0c8 --- /dev/null +++ b/gecode/optimize/CMakeLists.txt @@ -0,0 +1,482 @@ +cmake_minimum_required(VERSION 3.21) +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + project(GecodeOptimize VERSION 0.1.0 LANGUAGES C CXX) + include(CTest) + include(GNUInstallDirs) + set(GECODE_OPTIMIZE_STANDALONE ON) +endif() + +get_filename_component(GECODE_OPTIMIZE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE) +option(GECODE_OPTIMIZE_WITH_HIGHS "Enable numerical HiGHS LP/MILP adapter" ON) +set(_optimize_native_default OFF) +if(TARGET gecodeint AND TARGET gecodesearch) + set(_optimize_native_default ON) +endif() +option(GECODE_OPTIMIZE_WITH_NATIVE "Enable bounded integer Gecode bridge" ${_optimize_native_default}) +if(GECODE_OPTIMIZE_WITH_NATIVE AND GECODE_OPTIMIZE_STANDALONE) + message(FATAL_ERROR "Native optimization bridge requires a top-level Gecode build: configure the repository root with GECODE_ENABLE_OPTIMIZE=ON and enable int and search. Standalone builds support HiGHS or the backend-free core.") +endif() +if(GECODE_OPTIMIZE_WITH_NATIVE AND (NOT TARGET gecodeint OR NOT TARGET gecodesearch)) + message(FATAL_ERROR "Native optimization bridge requires both int and search components") +endif() +option(GECODE_OPTIMIZE_BUILD_TESTS "Build independent optimization conformance tests" ${BUILD_TESTING}) +option(GECODE_OPTIMIZE_TEST_PYTHON "Register Python binding tests (disable for sanitizer runtimes without an instrumented Python host)" ON) +set(GECODE_OPTIMIZE_HIGHS_SOURCE "" CACHE PATH "Optional local pinned HiGHS source (no download)") + +find_package(Threads REQUIRED) +if(GECODE_OPTIMIZE_WITH_HIGHS) + if(GECODE_OPTIMIZE_HIGHS_SOURCE) + # The source is provided explicitly; never fetch at configure/runtime. + set(_saved_build_testing "${BUILD_TESTING}") + set(BUILD_TESTING OFF) + set(BUILD_EXAMPLES OFF) + set(BUILD_CXX ON) + set(FAST_BUILD ON) + add_subdirectory("${GECODE_OPTIMIZE_HIGHS_SOURCE}" "${CMAKE_CURRENT_BINARY_DIR}/highs") + set(BUILD_TESTING "${_saved_build_testing}") + else() + find_package(highs 1.15 CONFIG REQUIRED) + endif() +endif() + +if(DEFINED GECODE_DEFAULT_LINK_VARIANT) + string(TOUPPER "${GECODE_DEFAULT_LINK_VARIANT}" _optimize_library_type) +elseif(BUILD_SHARED_LIBS) + set(_optimize_library_type SHARED) +else() + set(_optimize_library_type STATIC) +endif() +add_library(gecodeoptimize ${_optimize_library_type} model.cpp result.cpp validate.cpp constraints.cpp globals.cpp io.cpp solve.cpp lp_observations.cpp lp_basis.cpp lp_evidence.cpp lp_sensitivity.cpp lp_sensitivity_backend.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp diagnostics.cpp workflow.cpp scenarios.cpp relaxation.cpp pool.cpp presolve.cpp flatzinc.cpp quadratic.cpp quadratic_bound.cpp quadratic_solve.cpp) +add_library(Gecode::gecodeoptimize ALIAS gecodeoptimize) +add_library(Gecode::optimize ALIAS gecodeoptimize) +target_compile_features(gecodeoptimize PUBLIC cxx_std_17) +target_include_directories(gecodeoptimize PUBLIC + $ + $) +target_link_libraries(gecodeoptimize PUBLIC Threads::Threads) +if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(gecodeoptimize PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(gecodeoptimize PRIVATE highs::highs) +endif() +if(GECODE_OPTIMIZE_WITH_NATIVE) + target_compile_definitions(gecodeoptimize PRIVATE GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(gecodeoptimize PRIVATE gecodeint gecodesearch) + # ELF shared C wrappers cannot embed non-PIC native archives. Keep the + # normal native-only build policy unchanged unless this component needs them. + if(UNIX AND NOT APPLE) + foreach(component support kernel search int) + if(TARGET gecode${component}_static) + set_property(TARGET gecode${component}_static PROPERTY POSITION_INDEPENDENT_CODE ON) + endif() + endforeach() + endif() +endif() +set_target_properties(gecodeoptimize PROPERTIES POSITION_INDEPENDENT_CODE ON WINDOWS_EXPORT_ALL_SYMBOLS ON) +# The C/Python boundary is always a shared library, including a static C++ build. +# Its explicit C exports are independent of internal C++ symbol visibility. +add_library(gecodeoptimize_c SHARED c_api.cpp) +add_library(Gecode::gecodeoptimize_c ALIAS gecodeoptimize_c) +add_library(Gecode::optimize_c ALIAS gecodeoptimize_c) +target_compile_features(gecodeoptimize_c PRIVATE cxx_std_17) +target_compile_definitions(gecodeoptimize_c PRIVATE GECODE_OPT_C_API_EXPORTS) +target_include_directories(gecodeoptimize_c PUBLIC + $ + $) +target_link_libraries(gecodeoptimize_c PRIVATE gecodeoptimize) +# Keep facade RTTI visible across shared-library boundaries: hiding ModelError's +# typeinfo in this wrapper breaks its exception classification on Apple libc++. +set_target_properties(gecodeoptimize_c PROPERTIES VERSION 1.0.0 SOVERSION 1) +if(APPLE) + set_target_properties(gecodeoptimize gecodeoptimize_c PROPERTIES INSTALL_RPATH "@loader_path") +elseif(UNIX) + set_target_properties(gecodeoptimize gecodeoptimize_c PROPERTIES INSTALL_RPATH "$ORIGIN") +endif() + +if(GECODE_OPTIMIZE_BUILD_TESTS) + enable_testing() + foreach(test_name model bulk flatzinc quadratic quadratic_bound result validate constraints globals regular io solve lp_observations lp_observations_checks lp_basis lp_evidence lp_sensitivity session session_limits native native_auto native_race native_presolve native_components native_symmetry native_lp native_search native_knapsack native_branching native_starts native_neighborhoods diagnostics workflow scenarios relaxation pool presolve presolve_solve) + add_executable(optimize-${test_name}-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/${test_name}.cpp") + target_link_libraries(optimize-${test_name}-test PRIVATE gecodeoptimize) + if(MSVC) + target_compile_options(optimize-${test_name}-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-${test_name}-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-${test_name} COMMAND optimize-${test_name}-test) + set_tests_properties(optimize-${test_name} PROPERTIES TIMEOUT 60) + endforeach() + # Full-source Debug sanitizers make this nontrivial MIP lifetime fixture + # substantially slower. It is separate from the bounded fast regression gate. + set_tests_properties(optimize-session_limits PROPERTIES TIMEOUT 180) + if(GECODE_OPTIMIZE_WITH_HIGHS) + # Dirty the real backend before the separately compiled rejection seam. + # The production adapter and all ordinary solves contain no test selector. + add_library(optimize-lp-basis-failure-adapter OBJECT solve.cpp) + target_compile_features(optimize-lp-basis-failure-adapter PRIVATE cxx_std_17) + target_include_directories(optimize-lp-basis-failure-adapter PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-lp-basis-failure-adapter PRIVATE + GECODE_OPTIMIZE_WITH_HIGHS=1 GECODE_OPTIMIZE_TEST_LP_BASIS_FAILURE=1) + target_link_libraries(optimize-lp-basis-failure-adapter PRIVATE highs::highs Threads::Threads) + add_executable(optimize-lp-basis-failure-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_basis_failure.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp + lp_observations.cpp lp_basis.cpp $) + target_compile_features(optimize-lp-basis-failure-test PRIVATE cxx_std_17) + target_include_directories(optimize-lp-basis-failure-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_link_libraries(optimize-lp-basis-failure-test PRIVATE highs::highs Threads::Threads) + if(MSVC) + target_compile_options(optimize-lp-basis-failure-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-lp-basis-failure-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-lp-basis-failure COMMAND optimize-lp-basis-failure-test) + set_tests_properties(optimize-lp-basis-failure PROPERTIES TIMEOUT 60) + endif() + # This executable owns its substitute backend and lifecycle hooks; neither + # they nor the experimental regularization override enter the public library. + add_executable(optimize-quadratic-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/quadratic.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp + quadratic.cpp quadratic_bound.cpp quadratic_solve.cpp) + target_compile_features(optimize-quadratic-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-quadratic-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-quadratic-coordinator-test PRIVATE GECODE_QUADRATIC_TEST_HOOKS=1) + target_link_libraries(optimize-quadratic-coordinator-test PRIVATE Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-quadratic-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-quadratic-coordinator-test PRIVATE highs::highs) + endif() + if(MSVC) + target_compile_options(optimize-quadratic-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-quadratic-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-quadratic-coordinator COMMAND optimize-quadratic-coordinator-test) + set_tests_properties(optimize-quadratic optimize-quadratic-coordinator PROPERTIES TIMEOUT 180) + if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$" AND NOT MSVC) + # Compile only the checker with unsafe arithmetic. Keep the harness and + # foundation normal so this verifies rejection, not a corrupted test oracle. + add_library(optimize-quadratic-fast-math OBJECT quadratic_bound.cpp) + target_compile_features(optimize-quadratic-fast-math PRIVATE cxx_std_17) + target_include_directories(optimize-quadratic-fast-math PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_options(optimize-quadratic-fast-math PRIVATE -ffast-math) + add_executable(optimize-quadratic-arithmetic-rejection-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/quadratic_bound.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp quadratic.cpp + $) + target_compile_features(optimize-quadratic-arithmetic-rejection-test PRIVATE cxx_std_17) + target_include_directories(optimize-quadratic-arithmetic-rejection-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-quadratic-arithmetic-rejection-test PRIVATE + GECODE_QUADRATIC_EXPECT_UNSUPPORTED_ARITHMETIC=1) + target_compile_options(optimize-quadratic-arithmetic-rejection-test PRIVATE -UNDEBUG) + target_link_libraries(optimize-quadratic-arithmetic-rejection-test PRIVATE Threads::Threads) + add_test(NAME optimize-quadratic-arithmetic-rejection COMMAND optimize-quadratic-arithmetic-rejection-test) + set_tests_properties(optimize-quadratic-arithmetic-rejection PROPERTIES TIMEOUT 60) + endif() + if(GECODE_OPTIMIZE_WITH_NATIVE) + target_compile_definitions(optimize-native-test PRIVATE GECODE_OPTIMIZE_WITH_NATIVE=1) + add_executable(optimize-brancher-lifecycle-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/brancher_lifecycle.cpp") + target_link_libraries(optimize-brancher-lifecycle-test PRIVATE gecodeint gecodesearch) + add_test(NAME optimize-brancher-lifecycle COMMAND optimize-brancher-lifecycle-test) + set_tests_properties(optimize-brancher-lifecycle PROPERTIES TIMEOUT 60) + # This proof checker is header-only: native configuration headers are + # needed, but neither a native library nor HiGHS is linked into its oracle. + add_executable(optimize-cut-proofs-test "${GECODE_OPTIMIZE_ROOT}/experiments/lp-relaxation/tests/cuts.cpp") + target_compile_features(optimize-cut-proofs-test PRIVATE cxx_std_17) + target_compile_definitions(optimize-cut-proofs-test PRIVATE GECODE_NO_AUTOLINK) + target_include_directories(optimize-cut-proofs-test PRIVATE "${CMAKE_BINARY_DIR}" "${GECODE_OPTIMIZE_ROOT}") + add_test(NAME optimize-cut-proofs COMMAND optimize-cut-proofs-test) + set_tests_properties(optimize-cut-proofs PROPERTIES TIMEOUT 60) + if(GECODE_OPTIMIZE_WITH_HIGHS) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles("#if !defined(__SIZEOF_INT128__) || !(defined(__GNUC__) || defined(__clang__)) +#error Checked wide integer certificates are unavailable +#endif +int main() { return 0; }" GECODE_OPTIMIZE_HAVE_CHECKED_WIDE) + if(GECODE_OPTIMIZE_HAVE_CHECKED_WIDE) + # Header-only coordinator: hooks exist only in this oracle executable. + add_executable(optimize-cut-loop-test + "${GECODE_OPTIMIZE_ROOT}/experiments/lp-relaxation/tests/cut-loop.cpp") + target_compile_features(optimize-cut-loop-test PRIVATE cxx_std_17) + target_compile_definitions(optimize-cut-loop-test PRIVATE GECODE_NO_AUTOLINK + GECODE_LP_CUT_LOOP_TEST_NATIVE=1 GECODE_LP_CUT_LOOP_TEST_HOOKS=1) + target_include_directories(optimize-cut-loop-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_link_libraries(optimize-cut-loop-test PRIVATE gecodeint gecodesearch highs::highs Threads::Threads) + add_test(NAME optimize-cut-loop COMMAND optimize-cut-loop-test) + set_tests_properties(optimize-cut-loop PROPERTIES TIMEOUT 120) + endif() + endif() + add_executable(optimize-native-search-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/native_search.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp) + target_compile_features(optimize-native-search-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-native-search-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-native-search-coordinator-test PRIVATE + GECODE_NATIVE_SEARCH_TEST_HOOKS=1 GECODE_NATIVE_ROOT_CUT_TEST_HOOKS=1 GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(optimize-native-search-coordinator-test PRIVATE gecodeint gecodesearch Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-native-search-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-native-search-coordinator-test PRIVATE highs::highs) + endif() + add_test(NAME optimize-native-search-coordinator COMMAND optimize-native-search-coordinator-test) + set_tests_properties(optimize-native-search-coordinator PROPERTIES TIMEOUT 120) + add_executable(optimize-native-lp-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/native_lp.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp) + target_compile_features(optimize-native-lp-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-native-lp-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-native-lp-coordinator-test PRIVATE + GECODE_NATIVE_ROOT_CUT_TEST_HOOKS=1 GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(optimize-native-lp-coordinator-test PRIVATE gecodeint gecodesearch Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-native-lp-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-native-lp-coordinator-test PRIVATE highs::highs) + endif() + add_test(NAME optimize-native-lp-coordinator COMMAND optimize-native-lp-coordinator-test) + set_tests_properties(optimize-native-lp-coordinator PROPERTIES TIMEOUT 120) + add_executable(optimize-native-branching-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/native_branching.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp) + target_compile_features(optimize-native-branching-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-native-branching-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-native-branching-coordinator-test PRIVATE + GECODE_NATIVE_BRANCHING_TEST_HOOKS=1 GECODE_NATIVE_SEARCH_TEST_HOOKS=1 GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(optimize-native-branching-coordinator-test PRIVATE gecodeint gecodesearch Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-native-branching-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-native-branching-coordinator-test PRIVATE highs::highs) + endif() + add_test(NAME optimize-native-branching-coordinator COMMAND optimize-native-branching-coordinator-test) + set_tests_properties(optimize-native_branching optimize-native-branching-coordinator PROPERTIES TIMEOUT 120) + add_executable(optimize-native-neighborhood-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/native_neighborhoods.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp) + target_compile_features(optimize-native-neighborhood-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-native-neighborhood-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-native-neighborhood-coordinator-test PRIVATE + GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS=1 GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(optimize-native-neighborhood-coordinator-test PRIVATE gecodeint gecodesearch Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-native-neighborhood-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-native-neighborhood-coordinator-test PRIVATE highs::highs) + endif() + add_test(NAME optimize-native-neighborhood-coordinator COMMAND optimize-native-neighborhood-coordinator-test) + set_tests_properties(optimize-native_neighborhoods optimize-native-neighborhood-coordinator PROPERTIES TIMEOUT 120) + add_executable(optimize-native-start-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/native_starts.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp native.cpp native_presolve.cpp native_components.cpp native_symmetry.cpp presolve.cpp) + target_compile_features(optimize-native-start-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-native-start-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-native-start-coordinator-test PRIVATE + GECODE_NATIVE_START_TEST_HOOKS=1 GECODE_NATIVE_SEARCH_TEST_HOOKS=1 GECODE_NATIVE_ROOT_CUT_TEST_HOOKS=1 GECODE_OPTIMIZE_WITH_NATIVE=1) + target_link_libraries(optimize-native-start-coordinator-test PRIVATE gecodeint gecodesearch Threads::Threads) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-native-start-coordinator-test PRIVATE GECODE_OPTIMIZE_WITH_HIGHS=1) + target_link_libraries(optimize-native-start-coordinator-test PRIVATE highs::highs) + endif() + add_test(NAME optimize-native-start-coordinator COMMAND optimize-native-start-coordinator-test) + set_tests_properties(optimize-native_starts optimize-native-start-coordinator PROPERTIES TIMEOUT 120) + endif() + add_executable(optimize-fast-benchmark "${GECODE_OPTIMIZE_ROOT}/test/optimize/fast_benchmark.cpp") + target_link_libraries(optimize-fast-benchmark PRIVATE gecodeoptimize gecodeoptimize_c) + # Explicit measurement target: ordinary builds do not run or compile the panel. + add_executable(optimize-native-benchmark EXCLUDE_FROM_ALL + "${GECODE_OPTIMIZE_ROOT}/experiments/optimize/native_benchmark.cpp") + target_link_libraries(optimize-native-benchmark PRIVATE gecodeoptimize) + if(GECODE_OPTIMIZE_WITH_HIGHS) + target_compile_definitions(optimize-io-test PRIVATE GECODE_OPTIMIZE_IO_TEST_HIGHS=1) + target_link_libraries(optimize-io-test PRIVATE highs::highs) + endif() + set_tests_properties(optimize-io PROPERTIES + WORKING_DIRECTORY "${GECODE_OPTIMIZE_ROOT}") + if(EXISTS "${GECODE_OPTIMIZE_ROOT}/experiments/solver-bench/miplib-cache/p0033.mps") + add_test(NAME optimize-io-public COMMAND optimize-io-test + "${GECODE_OPTIMIZE_ROOT}/experiments/solver-bench/miplib-cache") + set_tests_properties(optimize-io-public PROPERTIES TIMEOUT 60) + endif() + # A deterministic substitute backend tests interruptions and invalid stage + # reports without timing-dependent sleeps or reliance on solver heuristics. + add_executable(optimize-workflow-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/workflow.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp workflow.cpp) + target_compile_features(optimize-workflow-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-workflow-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-workflow-coordinator-test PRIVATE GECODE_WORKFLOW_TEST_FAKE_SOLVER=1) + target_link_libraries(optimize-workflow-coordinator-test PRIVATE Threads::Threads) + if(MSVC) + target_compile_options(optimize-workflow-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-workflow-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-workflow-coordinator COMMAND optimize-workflow-coordinator-test) + set_tests_properties(optimize-workflow-coordinator PROPERTIES TIMEOUT 60) + add_executable(optimize-diagnostics-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/diagnostics.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp diagnostics.cpp) + target_compile_features(optimize-diagnostics-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-diagnostics-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-diagnostics-coordinator-test PRIVATE GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER=1) + target_link_libraries(optimize-diagnostics-coordinator-test PRIVATE Threads::Threads) + if(MSVC) + target_compile_options(optimize-diagnostics-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-diagnostics-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-diagnostics-coordinator COMMAND optimize-diagnostics-coordinator-test) + set_tests_properties(optimize-diagnostics-coordinator PROPERTIES TIMEOUT 60) + add_executable(optimize-relaxation-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/relaxation.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp workflow.cpp relaxation.cpp) + target_compile_features(optimize-relaxation-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-relaxation-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-relaxation-coordinator-test PRIVATE GECODE_RELAXATION_TEST_FAKE_SOLVER=1) + target_link_libraries(optimize-relaxation-coordinator-test PRIVATE Threads::Threads) + if(MSVC) + target_compile_options(optimize-relaxation-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-relaxation-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-relaxation-coordinator COMMAND optimize-relaxation-coordinator-test) + set_tests_properties(optimize-relaxation-coordinator PROPERTIES TIMEOUT 60) + add_executable(optimize-pool-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/pool.cpp" + model.cpp result.cpp validate.cpp constraints.cpp globals.cpp pool.cpp) + target_compile_features(optimize-pool-coordinator-test PRIVATE cxx_std_17) + target_include_directories(optimize-pool-coordinator-test PRIVATE "${GECODE_OPTIMIZE_ROOT}") + target_compile_definitions(optimize-pool-coordinator-test PRIVATE GECODE_POOL_TEST_FAKE_SOLVER=1) + target_link_libraries(optimize-pool-coordinator-test PRIVATE Threads::Threads) + if(MSVC) + target_compile_options(optimize-pool-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-pool-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-pool-coordinator COMMAND optimize-pool-coordinator-test) + set_tests_properties(optimize-pool-coordinator PROPERTIES TIMEOUT 60) + # Only this executable has substitute scenario solves and checkpoint hooks. + # Link the ordinary library for shared model/session support; its separate + # scenarios object is not pulled into a static link by these definitions. + add_executable(optimize-scenarios-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/scenarios_coordinator.cpp" scenarios.cpp) + target_compile_definitions(optimize-scenarios-coordinator-test PRIVATE GECODE_OPTIMIZE_TEST_SCENARIOS=1) + target_link_libraries(optimize-scenarios-coordinator-test PRIVATE gecodeoptimize) + if(MSVC) + target_compile_options(optimize-scenarios-coordinator-test PRIVATE /UNDEBUG) + else() + target_compile_options(optimize-scenarios-coordinator-test PRIVATE -UNDEBUG) + endif() + add_test(NAME optimize-scenarios-coordinator COMMAND optimize-scenarios-coordinator-test) + set_tests_properties(optimize-scenarios-coordinator PROPERTIES TIMEOUT 60) + add_executable(optimize-lp-evidence-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_evidence_coordinator.cpp" lp_evidence.cpp) + target_compile_definitions(optimize-lp-evidence-coordinator-test PRIVATE GECODE_OPTIMIZE_TEST_LP_EVIDENCE=1) + target_link_libraries(optimize-lp-evidence-coordinator-test PRIVATE gecodeoptimize) + add_test(NAME optimize-lp-evidence-coordinator COMMAND optimize-lp-evidence-coordinator-test) + set_tests_properties(optimize-lp-evidence-coordinator PROPERTIES TIMEOUT 60) + # The substitute factor and lifecycle checkpoints exist only in this test's + # separately compiled analyzer, never in the product library. + add_executable(optimize-lp-sensitivity-coordinator-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_sensitivity_coordinator.cpp" lp_sensitivity.cpp) + target_compile_definitions(optimize-lp-sensitivity-coordinator-test PRIVATE GECODE_OPTIMIZE_TEST_LP_SENSITIVITY=1) + target_link_libraries(optimize-lp-sensitivity-coordinator-test PRIVATE gecodeoptimize) + add_test(NAME optimize-lp-sensitivity-coordinator COMMAND optimize-lp-sensitivity-coordinator-test) + set_tests_properties(optimize-lp-sensitivity-coordinator PROPERTIES TIMEOUT 60) + if(GECODE_OPTIMIZE_WITH_HIGHS) + add_executable(optimize-lp-sensitivity-factor-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_sensitivity_factor.cpp") + target_compile_features(optimize-lp-sensitivity-factor-test PRIVATE cxx_std_17) + target_link_libraries(optimize-lp-sensitivity-factor-test PRIVATE highs::highs) + add_test(NAME optimize-lp-sensitivity-factor COMMAND optimize-lp-sensitivity-factor-test) + set_tests_properties(optimize-lp-sensitivity-factor PROPERTIES TIMEOUT 60) + endif() + add_executable(optimize-lp-sensitivity-binding-cleanup-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_sensitivity_binding_cleanup.cpp" c_api.cpp) + target_compile_definitions(optimize-lp-sensitivity-binding-cleanup-test PRIVATE + GECODE_OPTIMIZE_TEST_SENSITIVITY_BINDING=1 GECODE_OPT_C_API_EXPORTS) + target_link_libraries(optimize-lp-sensitivity-binding-cleanup-test PRIVATE gecodeoptimize) + add_test(NAME optimize-lp-sensitivity-binding-cleanup COMMAND optimize-lp-sensitivity-binding-cleanup-test) + set_tests_properties(optimize-lp-sensitivity-binding-cleanup PROPERTIES TIMEOUT 60) + add_executable(optimize-lp-sensitivity-c-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_sensitivity_c.c") + set_target_properties(optimize-lp-sensitivity-c-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-lp-sensitivity-c-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-lp-sensitivity-c COMMAND optimize-lp-sensitivity-c-test) + set_tests_properties(optimize-lp-sensitivity-c PROPERTIES TIMEOUT 60) + add_executable(optimize-lp-evidence-binding-cleanup-test + "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_evidence_binding_cleanup.cpp" c_api.cpp) + target_compile_definitions(optimize-lp-evidence-binding-cleanup-test PRIVATE + GECODE_OPTIMIZE_TEST_EVIDENCE_BINDING=1 GECODE_OPT_C_API_EXPORTS) + target_link_libraries(optimize-lp-evidence-binding-cleanup-test PRIVATE gecodeoptimize) + add_test(NAME optimize-lp-evidence-binding-cleanup COMMAND optimize-lp-evidence-binding-cleanup-test) + set_tests_properties(optimize-lp-evidence-binding-cleanup PROPERTIES TIMEOUT 60) + add_executable(optimize-lp-evidence-c-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_evidence_c.c") + set_target_properties(optimize-lp-evidence-c-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-lp-evidence-c-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-lp-evidence-c COMMAND optimize-lp-evidence-c-test) + set_tests_properties(optimize-lp-evidence-c PROPERTIES TIMEOUT 60) + add_executable(optimize-c-api-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/c_api.c") + set_target_properties(optimize-c-api-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-c-api-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-c-api COMMAND optimize-c-api-test) + set_tests_properties(optimize-c-api PROPERTIES TIMEOUT 60) + add_executable(optimize-lp-observations-c-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/lp_observations_c.c") + set_target_properties(optimize-lp-observations-c-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-lp-observations-c-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-lp-observations-c COMMAND optimize-lp-observations-c-test) + set_tests_properties(optimize-lp-observations-c PROPERTIES TIMEOUT 60) + add_executable(optimize-scenarios-c-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/scenarios_c.c") + set_target_properties(optimize-scenarios-c-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-scenarios-c-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-scenarios-c COMMAND optimize-scenarios-c-test) + set_tests_properties(optimize-scenarios-c PROPERTIES TIMEOUT 60) + foreach(c_test lp_basis regular) + string(REPLACE "_" "-" c_test_name "${c_test}") + add_executable(optimize-${c_test_name}-c-api-test "${GECODE_OPTIMIZE_ROOT}/test/optimize/${c_test}_c_api.c") + set_target_properties(optimize-${c_test_name}-c-api-test PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(optimize-${c_test_name}-c-api-test PRIVATE gecodeoptimize_c) + add_test(NAME optimize-${c_test_name}-c-api COMMAND optimize-${c_test_name}-c-api-test) + set_tests_properties(optimize-${c_test_name}-c-api PROPERTIES TIMEOUT 60) + endforeach() + find_package(Python3 3.9 COMPONENTS Interpreter QUIET) + if(Python3_Interpreter_FOUND AND GECODE_OPTIMIZE_TEST_PYTHON) + add_test(NAME optimize-python COMMAND "${CMAKE_COMMAND}" -E env + "PYTHONDONTWRITEBYTECODE=1" "PYTHONPATH=${GECODE_OPTIMIZE_ROOT}/python" + "GECODE_OPTIMIZE_LIBRARY=$" + "${Python3_EXECUTABLE}" -m unittest discover -s "${GECODE_OPTIMIZE_ROOT}/python/tests" -v) + set_tests_properties(optimize-python PROPERTIES TIMEOUT 60) + endif() +endif() + +add_executable(optimize-example "${GECODE_OPTIMIZE_ROOT}/examples/optimize-linear.cpp") +target_link_libraries(optimize-example PRIVATE gecodeoptimize) +add_executable(optimize-file "${GECODE_OPTIMIZE_ROOT}/examples/optimize-file.cpp") +target_link_libraries(optimize-file PRIVATE gecodeoptimize) + +if(GECODE_OPTIMIZE_STANDALONE) + include(CMakePackageConfigHelpers) + install(TARGETS gecodeoptimize gecodeoptimize_c EXPORT GecodeOptimizeTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gecode/optimize" + FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" + PATTERN "quadratic_bound.hpp" EXCLUDE + PATTERN "lp_basis_detail.hpp" EXCLUDE + PATTERN "learning_reasons_detail.hpp" EXCLUDE + PATTERN "lp_sensitivity_backend.hpp" EXCLUDE + PATTERN "lp_sensitivity_highs_detail.hpp" EXCLUDE + PATTERN "native_regular_limits.hpp" EXCLUDE + PATTERN "lp_observations_detail.hpp" EXCLUDE) + install(FILES "${GECODE_OPTIMIZE_ROOT}/gecode/optimize.hh" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gecode") + # The semantic compiler consumes owning records without a parser dependency. + install(FILES "${GECODE_OPTIMIZE_ROOT}/gecode/flatzinc/capture-records.hh" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/gecode/flatzinc") + configure_package_config_file(GecodeOptimizeConfig.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/GecodeOptimize") + write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfigVersion.cmake" + VERSION 0.1.0 COMPATIBILITY SameMajorVersion) + install(EXPORT GecodeOptimizeTargets NAMESPACE Gecode:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/GecodeOptimize") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/GecodeOptimize") +endif() diff --git a/gecode/optimize/GecodeOptimizeConfig.cmake.in b/gecode/optimize/GecodeOptimizeConfig.cmake.in new file mode 100644 index 0000000000..8d9b26b736 --- /dev/null +++ b/gecode/optimize/GecodeOptimizeConfig.cmake.in @@ -0,0 +1,44 @@ +@PACKAGE_INIT@ + +# A generated export silently returns when its targets already +# exists. Distinguish repeated finds of this package from an optimization +# target imported by a combined Gecode package or another install prefix. +get_filename_component(_gecode_optimize_origin "${CMAKE_CURRENT_LIST_DIR}" REALPATH) +foreach(_gecode_optimize_target IN ITEMS Gecode::gecodeoptimize Gecode::optimize Gecode::gecodeoptimize_c Gecode::optimize_c) + if(TARGET "${_gecode_optimize_target}") + get_target_property(_gecode_optimize_existing_origin "${_gecode_optimize_target}" + GECODE_OPTIMIZE_PACKAGE_ORIGIN) + if(NOT "${_gecode_optimize_existing_origin}" STREQUAL "${_gecode_optimize_origin}") + set(GecodeOptimize_FOUND FALSE) + set(GecodeOptimize_NOT_FOUND_MESSAGE + "Target ${_gecode_optimize_target} already belongs to a different optimization package. Use either the combined Gecode optimization component or one standalone GecodeOptimize installation in a CMake target scope.") + unset(_gecode_optimize_existing_origin) + unset(_gecode_optimize_target) + unset(_gecode_optimize_origin) + return() + endif() + endif() +endforeach() +unset(_gecode_optimize_existing_origin) +unset(_gecode_optimize_target) + +include(CMakeFindDependencyMacro) +find_dependency(Threads) +if("@GECODE_OPTIMIZE_WITH_HIGHS@" STREQUAL "ON") + find_dependency(highs 1.15 CONFIG) +endif() +include("${CMAKE_CURRENT_LIST_DIR}/GecodeOptimizeTargets.cmake") +set_property(TARGET Gecode::gecodeoptimize PROPERTY GECODE_OPTIMIZE_PACKAGE_ORIGIN + "${_gecode_optimize_origin}") +if(NOT TARGET Gecode::optimize) + add_library(Gecode::optimize ALIAS Gecode::gecodeoptimize) +endif() +if(TARGET Gecode::gecodeoptimize_c) + set_property(TARGET Gecode::gecodeoptimize_c PROPERTY GECODE_OPTIMIZE_PACKAGE_ORIGIN + "${_gecode_optimize_origin}") + if(NOT TARGET Gecode::optimize_c) + add_library(Gecode::optimize_c ALIAS Gecode::gecodeoptimize_c) + endif() +endif() +unset(_gecode_optimize_origin) +check_required_components(GecodeOptimize) diff --git a/gecode/optimize/c_api.cpp b/gecode/optimize/c_api.cpp new file mode 100644 index 0000000000..4064972edc --- /dev/null +++ b/gecode/optimize/c_api.cpp @@ -0,0 +1,1361 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace { +thread_local char last_error[4096] = {}; +struct ApiError { int32_t code; const char* message; }; +[[noreturn]] void argument(const char* message){throw ApiError{GECODE_OPT_INVALID_ARGUMENT,message};} +void required(const void* pointer){if(!pointer)argument("required pointer is NULL");} +template int32_t boundary(F&& call) noexcept { + last_error[0]='\0'; + try{call();return GECODE_OPT_OK;} + catch(const ApiError& e){std::snprintf(last_error,sizeof(last_error),"%s",e.message);return e.code;} + catch(const O::ModelError& e){std::snprintf(last_error,sizeof(last_error),"%s",e.what());return GECODE_OPT_MODEL_ERROR;} + catch(const std::bad_alloc&){std::snprintf(last_error,sizeof(last_error),"allocation failed");return GECODE_OPT_OUT_OF_MEMORY;} + catch(const std::exception& e){std::snprintf(last_error,sizeof(last_error),"C++ backend exception: %s",e.what());return GECODE_OPT_INTERNAL_ERROR;} + catch(...){std::snprintf(last_error,sizeof(last_error),"unknown C++ backend exception");return GECODE_OPT_INTERNAL_ERROR;} +} +enum class Kind { Model, Session, Result, Cancellation, Pool, Repair, QuadraticModel, QuadraticResult, LpObservedResult, Basis, BasisSolveResult, ScenarioBatchResult, LpEvidenceResult, LpEvidenceStage, SensitivityResult }; +struct Entry {Kind kind;std::shared_ptr value;}; +struct Registry {std::mutex mutex;uint64_t next=1;std::unordered_map entries;}; +Registry& registry(){static Registry value;return value;} +struct ModelBox {std::mutex mutex;O::Model model;ModelBox()=default;explicit ModelBox(O::Model&& value):model(std::move(value)){};}; +struct QuadraticBox {std::mutex mutex;O::QuadraticModel model;}; +struct SessionBox {std::mutex mutex;O::SolveSession session;}; +struct BasisBox {std::shared_ptr basis;}; +struct RepairBox {O::RelaxationResult result;std::vector active;}; +template std::shared_ptr get(uint64_t handle,Kind kind){ + auto& r=registry();std::lock_guard lock(r.mutex);const auto found=r.entries.find(handle); + if(!handle||found==r.entries.end()||found->second.kind!=kind)throw ApiError{GECODE_OPT_INVALID_HANDLE,"unknown, destroyed, or wrong-kind handle"}; + return std::static_pointer_cast(found->second.value); +} +template uint64_t put(Kind kind,std::shared_ptr value){ + auto& r=registry();std::lock_guard lock(r.mutex); + if(r.next==std::numeric_limits::max())throw ApiError{GECODE_OPT_INTERNAL_ERROR,"handle token space exhausted"}; + const auto token=r.next++;r.entries.emplace(token,Entry{kind,std::move(value)});return token; +} +void destroy(uint64_t handle,Kind kind){ + std::shared_ptr doomed; + {auto& r=registry();std::lock_guard lock(r.mutex);const auto found=r.entries.find(handle); + if(!handle||found==r.entries.end()||found->second.kind!=kind)throw ApiError{GECODE_OPT_INVALID_HANDLE,"unknown, destroyed, or wrong-kind handle"}; + doomed=std::move(found->second.value);r.entries.erase(found);} +} +template void mutate(uint64_t handle,F&& f){auto box=get(handle,Kind::Model);std::lock_guard lock(box->mutex);f(box->model);} +O::ModelSnapshot snapshot(uint64_t handle){auto box=get(handle,Kind::Model);std::lock_guard lock(box->mutex);return box->model.snapshot();} +template void mutate_quadratic(uint64_t handle,F&& f){ + auto box=get(handle,Kind::QuadraticModel); + std::lock_guard lock(box->mutex);f(box->model); +} +O::QuadraticSnapshot quadratic_snapshot(uint64_t handle){ + auto box=get(handle,Kind::QuadraticModel); + std::lock_guard lock(box->mutex);return box->model.snapshot(); +} +O::Variable variable(gecode_opt_id id){if(id.kind!=GECODE_OPT_VARIABLE_ID||id.reserved)argument("wrong variable ID kind/reserved field");return {id.model_id,id.slot};} +O::Constraint row(gecode_opt_id id){if(id.kind!=GECODE_OPT_ROW_ID||id.reserved)argument("wrong row ID kind/reserved field");return {id.model_id,id.slot};} +O::GlobalConstraint global(gecode_opt_id id){if(id.kind!=GECODE_OPT_GLOBAL_ID||id.reserved)argument("wrong global ID kind/reserved field");return {id.model_id,id.slot};} +O::Indicator indicator(gecode_opt_id id){if(id.kind!=GECODE_OPT_INDICATOR_ID||id.reserved)argument("wrong indicator ID kind/reserved field");return {id.model_id,id.slot};} +gecode_opt_id identifier(O::GlobalConstraint id) noexcept {return {id.model_id,id.id,GECODE_OPT_GLOBAL_ID,0};} +gecode_opt_id identifier(O::Variable id) noexcept {return {id.model_id,id.id,GECODE_OPT_VARIABLE_ID,0};} +gecode_opt_id identifier(O::Constraint id) noexcept {return {id.model_id,id.id,GECODE_OPT_ROW_ID,0};} +template std::size_t length(uint64_t n){ + if(n>std::numeric_limits::max()||n>static_cast(std::numeric_limits::max())/sizeof(T)) + argument("count exceeds representable address/vector range"); + if(n>std::vector().max_size())argument("count exceeds vector maximum size"); + return static_cast(n); +} +template std::size_t count(uint64_t n,const T* pointer){ + const auto size=length(n);if(n&&!pointer)argument("nonzero count requires a non-NULL array");return size; +} +std::vector variables(const gecode_opt_id* input,uint64_t n){ + const auto size=count(n,input);std::vector result;result.reserve(size); + for(std::size_t i=0;i integers(const int64_t* input,uint64_t n){ + const auto size=count(n,input);if(!size)return {};return {input,input+size}; +} +std::vector terms(const gecode_opt_term* input,uint64_t n){std::vector result;const auto size=count(n,input);result.reserve(size); + for(std::size_t i=0;i(name); + while(*p){ + const unsigned char first=*p++; + if(first<0x80)continue; + unsigned count=0;uint32_t code=0,min=0; + if(first>=0xc2&&first<=0xdf){count=1;code=first&0x1f;min=0x80;} + else if(first>=0xe0&&first<=0xef){count=2;code=first&0x0f;min=0x800;} + else if(first>=0xf0&&first<=0xf4){count=3;code=first&7;min=0x10000;} + else argument("bulk name is not valid UTF-8"); + for(unsigned i=0;i0xbf)argument("bulk name is not valid UTF-8"); + ++p;code=(code<<6)|(next&0x3f); + } + if(code0x10ffff||(code>=0xd800&&code<=0xdfff))argument("bulk name is not valid UTF-8"); + } + return name; +} +void bulk_output(gecode_opt_id* output,uint64_t capacity,uint64_t needed){ + length(capacity); + if(capacity indices(const uint64_t* input,uint64_t n){ + const auto size=count(n,input);std::vector out;out.reserve(size); + for(std::size_t i=0;istd::numeric_limits::max())argument("CSR index exceeds size_t range"); + out.push_back(static_cast(input[i])); + } + return out; +} +std::vector numbers(const double* input,uint64_t n,bool finite=false){ + const auto size=count(n,input);std::vector out;out.reserve(size); + for(std::size_t i=0;istruct_size!=sizeof(*input))argument("options struct_size does not match ABI v1"); + if(input->reserved||input->has_node_limit<0||input->has_node_limit>1)argument("invalid reserved field or node-limit presence flag"); + result.backend=backend(input->backend);result.guarantee=guarantee(input->guarantee); + result.threads=input->threads;result.random_seed=input->random_seed;result.time_limit_seconds=input->time_limit_seconds; + result.relative_gap=input->relative_gap;result.absolute_gap=input->absolute_gap; + result.feasibility_tolerance=input->feasibility_tolerance;result.integrality_tolerance=input->integrality_tolerance; + if(input->has_node_limit)result.node_limit=input->node_limit; + if(input->cancellation)result.cancellation=get(input->cancellation,Kind::Cancellation); + const auto n=count(input->primal_start_count,input->primal_start);result.primal_start.reserve(n); + for(std::size_t i=0;iprimal_start[i].variable),input->primal_start[i].value}); + result.validate();return result; +} +void size_check(const void* pointer,uint64_t actual,std::size_t expected){required(pointer);if(actual!=expected)argument("output struct size does not match ABI v1");} +using Clock=std::chrono::steady_clock; +void account_preparation(O::SolveOptions& options,Clock::time_point start){ + if(std::isfinite(options.time_limit_seconds))options.time_limit_seconds=std::max(0.0,options.time_limit_seconds-std::chrono::duration(Clock::now()-start).count()); +} +gecode_opt_options_v1 default_options(){ + O::SolveOptions o;gecode_opt_options_v1 out{};out.struct_size=sizeof(out); + out.backend=GECODE_OPT_AUTO;out.guarantee=GECODE_OPT_NUMERICAL; + out.threads=o.threads;out.random_seed=o.random_seed;out.time_limit_seconds=o.time_limit_seconds; + out.relative_gap=o.relative_gap;out.absolute_gap=o.absolute_gap; + out.feasibility_tolerance=o.feasibility_tolerance;out.integrality_tolerance=o.integrality_tolerance;return out; +} +gecode_opt_optional_number_v1 optional(std::optional value){return {value.has_value(),0,value.value_or(0)};} +int32_t completion(O::PoolCompletion value){switch(value){ + case O::PoolCompletion::Incomplete:return GECODE_OPT_POOL_INCOMPLETE; + case O::PoolCompletion::RequestedLimit:return GECODE_OPT_POOL_REQUESTED_LIMIT; + case O::PoolCompletion::Exhausted:return GECODE_OPT_POOL_EXHAUSTED;} + argument("unknown pool completion"); +} +O::RelaxationSide side(int32_t value){switch(value){case GECODE_OPT_RELAX_LOWER:return O::RelaxationSide::Lower; + case GECODE_OPT_RELAX_UPPER:return O::RelaxationSide::Upper;default:argument("unknown relaxation side");}} +int32_t side(O::RelaxationSide value){switch(value){case O::RelaxationSide::Lower:return GECODE_OPT_RELAX_LOWER; + case O::RelaxationSide::Upper:return GECODE_OPT_RELAX_UPPER;}argument("unknown relaxation side");} +template const T& at(const std::vector& values,uint64_t index){ + if(index>=values.size())argument("workflow index is out of range");return values[static_cast(index)]; +} +template bool output_array(T* buffer,uint64_t capacity,uint64_t* needed,std::size_t n){ + required(needed);*needed=static_cast(n);if(!capacity&&!buffer)return false; + count(capacity,buffer);if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"workflow buffer is smaller than required count"};return true; +} +void output_text(const std::string& text,char* buffer,uint64_t capacity,uint64_t* needed){ + if(text.size()==std::numeric_limits::max()||text.size()==std::numeric_limits::max())argument("text length cannot include NUL"); + if(output_array(buffer,capacity,needed,text.size()+1))std::memcpy(buffer,text.c_str(),text.size()+1); +} +void original_variable(const RepairBox& box,O::Variable variable){ + if(variable.model_id!=box.result.source_model_id||variable.id>=box.active.size()||!box.active[variable.id]) + throw O::ModelError("repair lookup variable is foreign, absent, or deleted"); +} +} + +#define API(name, signature, ...) extern "C" int32_t gecode_opt_v1_##name signature noexcept {return boundary([&](){__VA_ARGS__;});} +extern "C" uint32_t gecode_opt_v1_abi_version(void) noexcept {return 1;} +extern "C" const char* gecode_opt_v1_last_error(void) noexcept {return last_error;} +API(options_default,(gecode_opt_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));O::SolveOptions o;*out={};out->struct_size=sizeof(*out);out->backend=GECODE_OPT_AUTO;out->guarantee=GECODE_OPT_NUMERICAL; + out->threads=o.threads;out->random_seed=o.random_seed;out->time_limit_seconds=o.time_limit_seconds;out->relative_gap=o.relative_gap;out->absolute_gap=o.absolute_gap; + out->feasibility_tolerance=o.feasibility_tolerance;out->integrality_tolerance=o.integrality_tolerance) +API(capabilities,(int32_t selection,int32_t* available,int32_t* lp,int32_t* mip), + required(available);required(lp);required(mip);auto c=O::capabilities(backend(selection));*available=c.available;*lp=c.linear_programming;*mip=c.mixed_integer_linear) +API(model_create,(gecode_opt_handle* out),required(out);*out=0;*out=put(Kind::Model,std::make_shared())) +API(model_destroy,(gecode_opt_handle handle),destroy(handle,Kind::Model)) +API(model_identity,(gecode_opt_handle handle,uint64_t* owner,uint64_t* revision), + required(owner);required(revision);mutate(handle,[&](O::Model& m){*owner=m.id();*revision=m.revision();})) +API(model_read,(const char* filename,gecode_opt_handle* out),required(filename);required(out);*out=0;*out=put(Kind::Model,std::make_shared(O::read_model(filename)))) +API(model_write,(gecode_opt_handle handle,const char* filename),required(filename);O::write_model(snapshot(handle),filename)) +API(model_add_variable,(gecode_opt_handle handle,int32_t kind,double lower,double upper,const char* name,gecode_opt_id* out), + required(out);*out={};const auto t=type(kind);mutate(handle,[&](O::Model& m){auto v=m.add_variable(t,lower,upper,name?name:"");*out={v.model_id,v.id,GECODE_OPT_VARIABLE_ID,0};})) +API(model_add_row,(gecode_opt_handle handle,const gecode_opt_term* input,uint64_t n,double lower,double upper,const char* name,gecode_opt_id* out), + required(out);*out={};auto ts=terms(input,n);mutate(handle,[&](O::Model& m){auto r=m.add_row(ts,lower,upper,name?name:"");*out={r.model_id,r.id,GECODE_OPT_ROW_ID,0};})) +API(model_add_variables,(gecode_opt_handle h,const gecode_opt_variable_spec_v1* input,uint64_t n,gecode_opt_id* output,uint64_t capacity), + const auto size=count(n,input);length(n);bulk_output(output,capacity,n); + std::vector specs;specs.reserve(size); + for(std::size_t i=0;i(n);bulk_output(output,capacity,n); + std::vector specs;specs.reserve(size); + for(std::size_t i=0;i(b.lower_count);bulk_output(output,capacity,b.lower_count); + if(b.lower_count!=b.upper_count||!b.row_start_count||b.row_start_count-1!=b.lower_count|| + b.column_count!=b.coefficient_count||(b.names_count&&b.names_count!=b.lower_count)) + argument("CSR independent array dimensions do not agree"); + O::SparseRowBatch batch; + batch.columns=variables(b.columns,b.columns_count);batch.row_start=indices(b.row_start,b.row_start_count); + batch.column=indices(b.column,b.column_count);batch.coefficient=numbers(b.coefficient,b.coefficient_count,true); + batch.lower=numbers(b.lower,b.lower_count);batch.upper=numbers(b.upper,b.upper_count); + const auto names=count(b.names_count,b.names);length(b.names_count);batch.names.reserve(names); + for(std::size_t i=0;istd::numeric_limits::max()/arity)argument("table dimensions overflow"); + if(n!=arity*rows)argument("table value_count must equal arity times tuple_count"); + const auto row_count=length>(rows);auto vs=variables(input,arity);auto values=integers(flat,n); + std::vector> tuples;tuples.reserve(row_count); + if(vs.empty())tuples.resize(row_count); + else for(std::size_t i=0;i(edge_count); + for(std::size_t i=0;imodel_id,data.inactive_gate->id,GECODE_OPT_VARIABLE_ID,0};}})) +API(model_remove_indicator,(gecode_opt_handle h,gecode_opt_id id),mutate(h,[&](O::Model& m){O::remove_indicator(m,indicator(id));})) +API(model_add_boolean_and,(gecode_opt_handle h,gecode_opt_id result,const gecode_opt_id* input,uint64_t n,const char* name), + auto vs=variables(input,n);auto r=variable(result);mutate(h,[&](O::Model& m){O::add_boolean_and(m,r,vs,name?name:"");})) +API(model_add_boolean_or,(gecode_opt_handle h,gecode_opt_id result,const gecode_opt_id* input,uint64_t n,const char* name), + auto vs=variables(input,n);auto r=variable(result);mutate(h,[&](O::Model& m){O::add_boolean_or(m,r,vs,name?name:"");})) +API(cancellation_create,(gecode_opt_handle* out),required(out);*out=0;*out=put(Kind::Cancellation,std::make_shared())) +API(cancellation_cancel,(gecode_opt_handle h),get(h,Kind::Cancellation)->cancel()) +API(cancellation_is_cancelled,(gecode_opt_handle h,int32_t* out),required(out);*out=get(h,Kind::Cancellation)->cancelled()) +API(cancellation_copy,(gecode_opt_handle h,gecode_opt_handle* out),required(out);*out=0;auto token=get(h,Kind::Cancellation);*out=put(Kind::Cancellation,std::move(token))) +API(cancellation_destroy,(gecode_opt_handle h),destroy(h,Kind::Cancellation)) +API(session_create,(gecode_opt_handle* out),required(out);*out=0;*out=put(Kind::Session,std::make_shared())) +API(session_destroy,(gecode_opt_handle h),destroy(h,Kind::Session)) +API(session_reset,(gecode_opt_handle h),auto box=get(h,Kind::Session);std::lock_guard lock(box->mutex);box->session.reset()) +API(session_statistics,(gecode_opt_handle h,gecode_opt_session_statistics_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto box=get(h,Kind::Session);std::lock_guard lock(box->mutex);auto s=box->session.statistics(); + *out={s.solve_calls,s.model_loads,s.incremental_updates,s.unchanged_models,s.basis_warm_starts,s.incumbent_starts}) +API(solve,(gecode_opt_handle h,const gecode_opt_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=options(input);auto model=snapshot(h);account_preparation(opts,start);*out=put(Kind::Result,std::make_shared(O::solve(model,opts)))) +API(session_solve,(gecode_opt_handle session,gecode_opt_handle h,const gecode_opt_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=options(input);auto model=snapshot(h);auto box=get(session,Kind::Session); + std::lock_guard lock(box->mutex);account_preparation(opts,start);*out=put(Kind::Result,std::make_shared(box->session.solve(model,opts)))) +API(result_destroy,(gecode_opt_handle h),destroy(h,Kind::Result)) +API(result_info,(gecode_opt_handle h,gecode_opt_result_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto r=get(h,Kind::Result); + *out={r->model_id,r->revision,static_cast(r->active_variables.size()),termination(r->termination),guarantee(r->guarantee),r->has_solution(),r->solution_validated,r->start_submitted,0,r->elapsed_seconds}) +API(result_number,(gecode_opt_handle h,int32_t field,int32_t* present,double* value), + required(present);required(value);*present=0;*value=0;auto r=get(h,Kind::Result);std::optional number; + switch(field){case GECODE_OPT_OBJECTIVE:number=r->objective;break;case GECODE_OPT_BEST_BOUND:number=r->best_bound;break; + case GECODE_OPT_ABSOLUTE_GAP:number=r->absolute_gap;break;case GECODE_OPT_RELATIVE_GAP:number=r->relative_gap;break; + case GECODE_OPT_NATIVE_GAP:number=r->native_backend_gap;break;default:argument("unknown result number field");} + if(number){*present=1;*value=*number;}) +API(result_value,(gecode_opt_handle h,gecode_opt_id v,double* out),required(out);auto r=get(h,Kind::Result); + if(!r->has_solution())throw ApiError{GECODE_OPT_NO_SOLUTION,"result has no validated solution"};*out=r->value(variable(v))) +API(result_values,(gecode_opt_handle h,double* values,uint8_t* active,uint8_t* present,uint64_t capacity,uint64_t* needed), + required(needed);auto r=get(h,Kind::Result);*needed=static_cast(r->active_variables.size()); + if(capacity==0&&!values&&!active&&!present)return; + count(capacity,values);required(active);required(present); + if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"value buffers are smaller than required slot count"}; + const bool solution=r->has_solution();for(std::size_t i=0;iactive_variables.size();++i){active[i]=r->active_variables[i];present[i]=active[i]&&solution;values[i]=present[i]?r->values[i]:0;}) +API(result_text,(gecode_opt_handle h,int32_t field,char* buffer,uint64_t capacity,uint64_t* needed), + required(needed);auto r=get(h,Kind::Result);const std::string* text=nullptr; + switch(field){case GECODE_OPT_BACKEND_NAME:text=&r->backend;break;case GECODE_OPT_BACKEND_VERSION:text=&r->backend_version;break;case GECODE_OPT_MESSAGE:text=&r->message;break;default:argument("unknown result text field");} + if(text->size()==std::numeric_limits::max())argument("text length cannot include NUL");*needed=static_cast(text->size())+1; + if(!capacity&&!buffer)return;count(capacity,buffer);if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"text buffer is smaller than required NUL-terminated length"}; + std::memcpy(buffer,text->c_str(),static_cast(*needed))) +API(pool_options_default,(gecode_opt_pool_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));*out={};out->struct_size=sizeof(*out);out->solve=default_options();out->max_solutions=10) +API(pool_solve,(gecode_opt_handle h,const gecode_opt_pool_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;O::PoolOptions opts; + if(input){if(input->struct_size!=sizeof(*input)||input->reserved||input->has_projection<0||input->has_projection>1) + argument("invalid pool options size, reserved field, or projection presence flag"); + opts.solve=options(&input->solve);opts.max_solutions=length(input->max_solutions); + if(input->has_projection)opts.projection=variables(input->projection,input->projection_count); + else if(input->projection||input->projection_count)argument("absent projection requires NULL pointer and zero count");} + auto model=snapshot(h);account_preparation(opts.solve,start); + *out=put(Kind::Pool,std::make_shared(O::solve_pool(model,opts)))) +API(pool_destroy,(gecode_opt_handle h),destroy(h,Kind::Pool)) +API(pool_info,(gecode_opt_handle h,gecode_opt_pool_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto r=get(h,Kind::Pool); + *out={r->model_id,r->revision,static_cast(r->projection.size()),static_cast(r->entries.size()), + static_cast(r->attempts.size()),static_cast(r->ranked_prefix),termination(r->termination),completion(r->completion),guarantee(r->guarantee),0,r->elapsed_seconds}) +API(pool_projection,(gecode_opt_handle h,gecode_opt_id* buffer,uint64_t capacity,uint64_t* needed), + auto r=get(h,Kind::Pool);if(output_array(buffer,capacity,needed,r->projection.size())) + for(std::size_t i=0;iprojection.size();++i)buffer[i]=identifier(r->projection[i])) +API(pool_entry_info,(gecode_opt_handle h,uint64_t index,gecode_opt_pool_entry_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto r=get(h,Kind::Pool);const auto& e=at(r->entries,index); + *out={static_cast(e.projection_values.size()),e.rank_established,0}) +API(pool_entry_result,(gecode_opt_handle h,uint64_t index,gecode_opt_handle* out), + required(out);*out=0;auto r=get(h,Kind::Pool);*out=put(Kind::Result,std::make_shared(at(r->entries,index).solution))) +API(pool_entry_projection,(gecode_opt_handle h,uint64_t index,int64_t* buffer,uint64_t capacity,uint64_t* needed), + auto r=get(h,Kind::Pool);const auto& values=at(r->entries,index).projection_values; + if(output_array(buffer,capacity,needed,values.size()))std::copy(values.begin(),values.end(),buffer)) +API(pool_attempt_info,(gecode_opt_handle h,uint64_t index,gecode_opt_pool_attempt_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto r=get(h,Kind::Pool);const auto& a=at(r->attempts,index); + *out={termination(a.termination),guarantee(a.guarantee),a.candidate_accepted,a.rank_established,optional(a.objective),optional(a.remaining_bound)}) +API(pool_message,(gecode_opt_handle h,char* buffer,uint64_t capacity,uint64_t* needed), + auto r=get(h,Kind::Pool);output_text(r->message,buffer,capacity,needed)) +API(repair_options_default,(gecode_opt_repair_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));*out={};out->struct_size=sizeof(*out);out->solve=default_options()) +API(repair_solve,(gecode_opt_handle h,const gecode_opt_repair_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;O::RelaxationOptions opts; + if(input){if(input->struct_size!=sizeof(*input)||input->reserved||input->optimize_original_objective<0||input->optimize_original_objective>1) + argument("invalid repair options size, reserved field, or objective refinement flag"); + opts.solve=options(&input->solve);opts.optimize_original_objective=input->optimize_original_objective; + const auto n=count(input->selection_count,input->selections); + for(std::size_t i=0;iselections[i]; + if(selection.reserved)argument("relaxation selection reserved field must be zero");const auto s=side(selection.side); + if(!std::isfinite(selection.penalty)||selection.penalty<=0)argument("relaxation penalty must be positive and finite"); + if(selection.source.kind==GECODE_OPT_VARIABLE_ID)opts.bounds.push_back({variable(selection.source),s,selection.penalty}); + else if(selection.source.kind==GECODE_OPT_ROW_ID)opts.rows.push_back({row(selection.source),s,selection.penalty}); + else argument("relaxation selection requires a Variable or Row ID");}} + auto model=snapshot(h);auto box=std::make_shared();box->active.reserve(model.variables.size()); + for(const auto& v:model.variables)box->active.push_back(v.active); + account_preparation(opts.solve,start);box->result=O::relax_feasibility(model,opts);*out=put(Kind::Repair,std::move(box))) +API(repair_destroy,(gecode_opt_handle h),destroy(h,Kind::Repair)) +API(repair_info,(gecode_opt_handle h,gecode_opt_repair_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::Repair);const auto& r=b->result; + *out={r.source_model_id,r.source_revision,r.private_model?r.private_model->model_id:0,r.private_model?r.private_model->revision:0, + static_cast(b->active.size()),static_cast(r.items.size()),static_cast(r.workflow.stages.size()), + static_cast(r.workflow.completed_stages),termination(r.termination),guarantee(r.guarantee),r.private_model.has_value(),r.has_repair(), + r.minimum_violation_established,r.original_objective_optimized,termination(r.workflow.termination),guarantee(r.workflow.guarantee),r.elapsed_seconds,r.workflow.elapsed_seconds}) +API(repair_number,(gecode_opt_handle h,int32_t field,int32_t* present,double* value), + required(present);required(value);*present=0;*value=0;auto b=get(h,Kind::Repair);const auto& r=b->result;std::optional number; + switch(field){case GECODE_OPT_REPAIR_MINIMUM_VIOLATION:number=r.minimum_weighted_violation;break; + case GECODE_OPT_REPAIR_VIOLATION:number=r.weighted_violation;break;case GECODE_OPT_REPAIR_ORIGINAL_OBJECTIVE:number=r.original_objective;break; + default:argument("unknown repair number field");}if(number){*present=1;*value=*number;}) +API(repair_original_value,(gecode_opt_handle h,gecode_opt_id id,double* out), + required(out);auto b=get(h,Kind::Repair);const auto v=variable(id);original_variable(*b,v); + if(!b->result.has_repair())throw ApiError{GECODE_OPT_NO_SOLUTION,"repair has no independently validated repaired assignment"}; + *out=at(b->result.original_values,v.id)) +API(repair_original_values,(gecode_opt_handle h,double* values,uint8_t* active,uint8_t* present,uint64_t capacity,uint64_t* needed), + required(needed);auto b=get(h,Kind::Repair);*needed=static_cast(b->active.size()); + if(!capacity&&!values&&!active&&!present)return;count(capacity,values);required(active);required(present); + if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"repair value buffers are smaller than source slot count"}; + const bool solution=b->result.has_repair();if(solution&&b->result.original_values.size()!=b->active.size())throw std::runtime_error("malformed repair assignment size"); + for(std::size_t i=0;iactive.size();++i){active[i]=b->active[i];present[i]=active[i]&&solution;values[i]=present[i]?b->result.original_values[i]:0;}) +API(repair_variable_map,(gecode_opt_handle h,gecode_opt_id* source,gecode_opt_id* private_ids,uint8_t* active,uint64_t capacity,uint64_t* needed), + required(needed);auto b=get(h,Kind::Repair);*needed=static_cast(b->active.size()); + if(!capacity&&!source&&!private_ids&&!active)return;count(capacity,source);required(private_ids);required(active); + if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"repair mapping buffers are smaller than source slot count"}; + const auto& ids=b->result.private_variables;if(!ids.empty()&&ids.size()!=b->active.size())throw std::runtime_error("malformed repair variable mapping"); + for(std::size_t i=0;iactive.size();++i){source[i]={b->result.source_model_id,static_cast(i),GECODE_OPT_VARIABLE_ID,0}; + private_ids[i]=ids.empty()?gecode_opt_id{}:identifier(ids[i]);active[i]=b->active[i];}) +API(repair_validation,(gecode_opt_handle h,gecode_opt_validation_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::Repair);const auto& v=b->result.original_validation; + *out={v.valid,v.model_valid,static_cast(v.violated_globals),v.max_bound_violation,v.max_row_violation, + v.max_integrality_violation,v.max_indicator_violation,optional(v.objective)}) +API(repair_item_info,(gecode_opt_handle h,uint64_t index,gecode_opt_repair_item_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::Repair);const auto& item=at(b->result.items,index); + *out={item.source_row?identifier(*item.source_row):item.source_variable?identifier(*item.source_variable):gecode_opt_id{}, + identifier(item.slack),identifier(item.penalty_row),side(item.side),0,item.original_bound,item.penalty, + optional(item.activity),optional(item.violation),optional(item.weighted_violation),optional(item.slack_value)}) +API(repair_stage_info,(gecode_opt_handle h,uint64_t index,gecode_opt_repair_stage_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::Repair);const auto& stage=at(b->result.workflow.stages,index); + *out={static_cast(stage.index),stage.completed,0,optional(stage.retention_bound)}) +API(repair_stage_result,(gecode_opt_handle h,uint64_t index,gecode_opt_handle* out), + required(out);*out=0;auto b=get(h,Kind::Repair);*out=put(Kind::Result,std::make_shared(at(b->result.workflow.stages,index).result))) +API(repair_final_result,(gecode_opt_handle h,gecode_opt_handle* out), + required(out);*out=0;auto b=get(h,Kind::Repair); + if(!b->result.has_repair())throw ApiError{GECODE_OPT_NO_SOLUTION,"repair has no independently validated repaired assignment"}; + *out=put(Kind::Result,std::make_shared(b->result.workflow.final_solution))) +API(repair_violation_lock,(gecode_opt_handle h,int32_t* present,gecode_opt_id* out), + required(present);required(out);*present=0;*out={};auto b=get(h,Kind::Repair); + if(b->result.violation_lock){*present=1;*out=identifier(*b->result.violation_lock);}) +API(repair_objective_values,(gecode_opt_handle h,double* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::Repair);const auto& values=b->result.workflow.objective_values; + if(output_array(buffer,capacity,needed,values.size()))std::copy(values.begin(),values.end(),buffer)) +API(repair_text,(gecode_opt_handle h,int32_t field,uint64_t index,char* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::Repair);const auto& r=b->result;const std::string* text=nullptr; + if(field>=GECODE_OPT_REPAIR_MESSAGE&&field<=GECODE_OPT_REPAIR_VALIDATION_MESSAGE&&index)argument("non-indexed repair text requires index zero"); + switch(field){case GECODE_OPT_REPAIR_MESSAGE:text=&r.message;break;case GECODE_OPT_REPAIR_WORKFLOW_MESSAGE:text=&r.workflow.message;break; + case GECODE_OPT_REPAIR_VALIDATION_MESSAGE:text=&r.original_validation.message;break; + case GECODE_OPT_REPAIR_ITEM_NAME:text=&at(r.items,index).name;break;case GECODE_OPT_REPAIR_STAGE_NAME:text=&at(r.workflow.stages,index).name;break; + default:argument("unknown repair text field");}output_text(*text,buffer,capacity,needed)) +API(quadratic_capabilities,(int32_t* available), + required(available);*available=O::quadratic_capabilities().available) +API(quadratic_options_default,(gecode_opt_quadratic_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));O::QuadraticOptions defaults;*out={};out->struct_size=sizeof(*out); + out->solve=default_options();out->iteration_limit=defaults.iteration_limit; + out->max_auxiliary_variables=defaults.max_auxiliary_variables;out->max_lifted_nonzeros=defaults.max_lifted_nonzeros; + out->stationarity_tolerance=defaults.stationarity_tolerance;out->complementarity_tolerance=defaults.complementarity_tolerance; + out->optimality_tolerance=defaults.optimality_tolerance) +API(quadratic_model_create,(gecode_opt_handle* out), + required(out);*out=0;*out=put(Kind::QuadraticModel,std::make_shared())) +API(quadratic_model_destroy,(gecode_opt_handle h),destroy(h,Kind::QuadraticModel)) +API(quadratic_model_identity,(gecode_opt_handle h,uint64_t* owner,uint64_t* revision), + required(owner);required(revision);mutate_quadratic(h,[&](O::QuadraticModel& m){*owner=m.id();*revision=m.revision();})) +API(quadratic_model_add_continuous,(gecode_opt_handle h,double l,double u,const char* name,gecode_opt_id* out), + required(out);*out={};auto label=bulk_name(name); + mutate_quadratic(h,[&](O::QuadraticModel& m){*out=identifier(m.add_continuous(l,u,std::move(label)));})) +API(quadratic_model_add_row,(gecode_opt_handle h,const gecode_opt_term* input,uint64_t n,double l,double u,const char* name,gecode_opt_id* out), + required(out);*out={};auto ts=terms(input,n);auto label=bulk_name(name); + mutate_quadratic(h,[&](O::QuadraticModel& m){*out=identifier(m.add_row(ts,l,u,std::move(label)));})) +API(quadratic_model_set_objective,(gecode_opt_handle h,const gecode_opt_weighted_square_v1* input,uint64_t n, + const gecode_opt_term* linear,uint64_t linear_n,int32_t objective_sense,double offset), + const auto selected=sense(objective_sense);const auto size=count(n,input); + length(n); + std::vector squares;squares.reserve(size); + for(std::size_t i=0;istruct_size!=sizeof(*input))argument("quadratic options struct_size does not match ABI v1"); + if(input->solve.struct_size!=sizeof(input->solve))argument("nested options struct_size does not match ABI v1"); + if(input->reserved)argument("quadratic options reserved field must be zero"); + opts.solve=options(&input->solve);opts.iteration_limit=input->iteration_limit; + opts.max_auxiliary_variables=length(input->max_auxiliary_variables); + opts.max_lifted_nonzeros=length(input->max_lifted_nonzeros); + opts.stationarity_tolerance=input->stationarity_tolerance;opts.complementarity_tolerance=input->complementarity_tolerance; + opts.optimality_tolerance=input->optimality_tolerance;opts.validate();} + const auto model=quadratic_snapshot(h);account_preparation(opts.solve,start); + auto result=std::make_shared(O::solve_quadratic(model,opts)); + result->result.elapsed_seconds=std::chrono::duration(Clock::now()-start).count(); + *out=put(Kind::QuadraticResult,std::move(result))) +API(quadratic_result_destroy,(gecode_opt_handle h),destroy(h,Kind::QuadraticResult)) +API(quadratic_result_info,(gecode_opt_handle h,gecode_opt_quadratic_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto q=get(h,Kind::QuadraticResult);const auto& r=q->result; + *out={{r.model_id,r.revision,static_cast(r.active_variables.size()),termination(r.termination),guarantee(r.guarantee), + r.has_solution(),r.solution_validated,r.start_submitted,0,r.elapsed_seconds},q->qp_iterations,q->regularization}) +API(quadratic_result_checks,(gecode_opt_handle h,gecode_opt_quadratic_checks_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto q=get(h,Kind::QuadraticResult);const auto& c=q->checks; + *out={c.primal_valid,c.objective_valid,c.kkt_available,c.kkt_valid,c.bound_valid,0, + optional(c.kkt_available?std::optional(c.max_stationarity):std::nullopt), + optional(c.kkt_available?std::optional(c.max_complementarity):std::nullopt), + optional(c.original_objective),optional(c.normalized_lower_bound),optional(c.gap_upper_bound), + static_cast(c.objective_valid?c.square_values.size():0), + static_cast(c.objective_valid?c.original_gradient.size():0)}) +API(quadratic_result_number,(gecode_opt_handle h,int32_t field,int32_t* present,double* value), + required(present);required(value);*present=0;*value=0;auto q=get(h,Kind::QuadraticResult); + const auto& r=q->result;std::optional number; + switch(field){case GECODE_OPT_OBJECTIVE:number=r.objective;break;case GECODE_OPT_BEST_BOUND:number=r.best_bound;break; + case GECODE_OPT_ABSOLUTE_GAP:number=r.absolute_gap;break;case GECODE_OPT_RELATIVE_GAP:number=r.relative_gap;break; + case GECODE_OPT_NATIVE_GAP:number=r.native_backend_gap;break;case GECODE_OPT_QP_VENDOR_OBJECTIVE:number=q->vendor_objective;break; + case GECODE_OPT_QP_VENDOR_DUAL_ESTIMATE:number=q->vendor_dual_estimate;break;default:argument("unknown quadratic number field");} + if(number){*present=1;*value=*number;}) +API(quadratic_result_value,(gecode_opt_handle h,gecode_opt_id v,double* out), + required(out);auto q=get(h,Kind::QuadraticResult);const auto& r=q->result; + if(!r.has_solution())throw ApiError{GECODE_OPT_NO_SOLUTION,"QP result has no validated original solution"};*out=r.value(variable(v))) +API(quadratic_result_values,(gecode_opt_handle h,double* values,uint8_t* active,uint8_t* present,uint64_t capacity,uint64_t* needed), + required(needed);auto q=get(h,Kind::QuadraticResult);const auto& r=q->result; + *needed=static_cast(r.active_variables.size());if(!capacity&&!values&&!active&&!present)return; + count(capacity,values);count(capacity,active);count(capacity,present); + if(capacity<*needed)throw ApiError{GECODE_OPT_BUFFER_TOO_SMALL,"QP value buffers are smaller than required slot count"}; + const bool solution=r.has_solution();for(std::size_t i=0;i(h,Kind::QuadraticResult);const auto& c=q->checks;const std::vector* data=nullptr; + switch(field){case GECODE_OPT_QP_SQUARE_RESIDUALS:data=&c.square_values;break; + case GECODE_OPT_QP_ORIGINAL_GRADIENT:data=&c.original_gradient;break;default:argument("unknown quadratic array field");} + const auto size=c.objective_valid?data->size():0; + if(output_array(values,capacity,needed,size)&&size)std::copy(data->begin(),data->end(),values)) +API(quadratic_result_text,(gecode_opt_handle h,int32_t field,char* buffer,uint64_t capacity,uint64_t* needed), + auto q=get(h,Kind::QuadraticResult);const std::string* value=nullptr; + switch(field){case GECODE_OPT_BACKEND_NAME:value=&q->result.backend;break;case GECODE_OPT_BACKEND_VERSION:value=&q->result.backend_version;break; + case GECODE_OPT_MESSAGE:value=&q->result.message;break;case GECODE_OPT_QP_CHECK_MESSAGE:value=&q->checks.message;break; + default:argument("unknown quadratic text field");}output_text(*value,buffer,capacity,needed)) +namespace { +O::LpObservationOptions lp_options(const gecode_opt_lp_options_v1* input) { + O::LpObservationOptions out;if(!input)return out; + if(input->struct_size!=sizeof(*input))argument("LP options struct_size does not match ABI v1"); + if(input->reserved || input->duals<0 || input->duals>1 || input->basis<0 || input->basis>1) + argument("invalid LP reserved field or request flag"); + out.solve=options(&input->solve);out.duals=input->duals;out.basis=input->basis; + out.checks={input->dual_feasibility,input->stationarity,input->complementarity,input->objective_gap}; + out.validate();return out; +} +std::shared_ptr lp_observations(uint64_t handle) { + auto result=get(handle,Kind::LpObservedResult); + if(!result->observations)throw ApiError{GECODE_OPT_NO_OBSERVATIONS,"result has no owning LP observations"}; + return result->observations; +} +int32_t lp_state(O::LpObservationState value) {switch(value){ + case O::LpObservationState::NotRequested:return GECODE_OPT_LP_NOT_REQUESTED; + case O::LpObservationState::Available:return GECODE_OPT_LP_AVAILABLE; + case O::LpObservationState::Unavailable:return GECODE_OPT_LP_UNAVAILABLE; + case O::LpObservationState::Rejected:return GECODE_OPT_LP_REJECTED; +}argument("unknown LP LpObservationState enum");} +int32_t lp_reason(O::LpObservationReason value) {switch(value){ + case O::LpObservationReason::None:return GECODE_OPT_LP_REASON_NONE; + case O::LpObservationReason::NotRequested:return GECODE_OPT_LP_REASON_NOT_REQUESTED; + case O::LpObservationReason::Unsupported:return GECODE_OPT_LP_REASON_UNSUPPORTED; + case O::LpObservationReason::NoBackendSolve:return GECODE_OPT_LP_REASON_NO_BACKEND_SOLVE; + case O::LpObservationReason::NoPrimalPoint:return GECODE_OPT_LP_REASON_NO_PRIMAL_POINT; + case O::LpObservationReason::NotOptimal:return GECODE_OPT_LP_REASON_NOT_OPTIMAL; + case O::LpObservationReason::NoDualPoint:return GECODE_OPT_LP_REASON_NO_DUAL_POINT; + case O::LpObservationReason::NoBasis:return GECODE_OPT_LP_REASON_NO_BASIS; + case O::LpObservationReason::ElidedConstantRows:return GECODE_OPT_LP_REASON_ELIDED_CONSTANT_ROWS; + case O::LpObservationReason::Interrupted:return GECODE_OPT_LP_REASON_INTERRUPTED; + case O::LpObservationReason::InvalidBackendData:return GECODE_OPT_LP_REASON_INVALID_BACKEND_DATA; + case O::LpObservationReason::FailedChecks:return GECODE_OPT_LP_REASON_FAILED_CHECKS; + case O::LpObservationReason::AllocationFailure:return GECODE_OPT_LP_REASON_ALLOCATION_FAILURE; + case O::LpObservationReason::InvalidModel:return GECODE_OPT_LP_REASON_INVALID_MODEL; +}argument("unknown LP LpObservationReason enum");} +int32_t lp_basis(O::LpBasisStatus value) {switch(value){ + case O::LpBasisStatus::Lower:return GECODE_OPT_LP_BASIS_LOWER; + case O::LpBasisStatus::Basic:return GECODE_OPT_LP_BASIS_BASIC; + case O::LpBasisStatus::Upper:return GECODE_OPT_LP_BASIS_UPPER; + case O::LpBasisStatus::Zero:return GECODE_OPT_LP_BASIS_ZERO; + case O::LpBasisStatus::NonbasicUnspecified:return GECODE_OPT_LP_BASIS_NONBASIC_UNSPECIFIED; +}argument("unknown LP LpBasisStatus enum");} +int32_t lp_source(O::LpDualSource value) {switch(value){ + case O::LpDualSource::None:return GECODE_OPT_LP_DUAL_NONE; + case O::LpDualSource::Backend:return GECODE_OPT_LP_DUAL_BACKEND; + case O::LpDualSource::DerivedConstantRow:return GECODE_OPT_LP_DUAL_DERIVED_CONSTANT_ROW; +}argument("unknown LP LpDualSource enum");} +const O::LpObservationGroup& lp_group(const O::LpObservations& data,int32_t field) { + switch(field){case GECODE_OPT_LP_PRIMAL_ROWS:return data.primal_rows(); + case GECODE_OPT_LP_DUAL_POINT:return data.dual_point();case GECODE_OPT_LP_BASIS:return data.basis(); + default:argument("unknown LP group selector");} +} +gecode_opt_lp_row_v1 lp_row(const O::LpRowObservation& data) { + gecode_opt_lp_row_v1 out{};out.struct_size=sizeof(out);out.active=data.active; + out.dual_source=lp_source(data.dual_source);out.has_basis=data.basis.has_value(); + if(data.basis)out.basis=lp_basis(*data.basis); + out.activity=optional(data.activity);out.lower_slack=optional(data.lower_slack); + out.upper_slack=optional(data.upper_slack);out.dual=optional(data.dual);return out; +} +gecode_opt_lp_column_v1 lp_column(const O::LpColumnObservation& data) { + gecode_opt_lp_column_v1 out{};out.struct_size=sizeof(out);out.active=data.active; + out.has_basis=data.basis.has_value();if(data.basis)out.basis=lp_basis(*data.basis); + out.reduced_cost=optional(data.reduced_cost);return out; +} +} +API(lp_options_default,(gecode_opt_lp_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));O::LpObservationOptions o;*out={};out->struct_size=sizeof(*out);out->solve=default_options(); + out->duals=o.duals;out->basis=o.basis;out->dual_feasibility=o.checks.dual_feasibility;out->stationarity=o.checks.stationarity; + out->complementarity=o.checks.complementarity;out->objective_gap=o.checks.objective_gap) +API(lp_capabilities,(gecode_opt_lp_capabilities_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));const auto c=O::lp_observation_capabilities();*out={};out->struct_size=sizeof(*out); + out->available=c.available;out->duals=c.duals;out->basis_export=c.basis_export;out->limitation_count=c.limitations.size()) +API(lp_capability_text,(int32_t field,uint64_t index,char* buffer,uint64_t capacity,uint64_t* needed), + const auto c=O::lp_observation_capabilities();const std::string* value=nullptr; + if(field!=GECODE_OPT_LP_CAP_LIMITATION&&index)argument("LP capability text index must be zero"); + switch(field){case GECODE_OPT_LP_CAP_BACKEND:value=&c.backend;break;case GECODE_OPT_LP_CAP_VERSION:value=&c.backend_version;break; + case GECODE_OPT_LP_CAP_LIMITATION:value=&at(c.limitations,index);break;default:argument("unknown LP capability text selector");} + output_text(*value,buffer,capacity,needed)) +API(solve_lp_observed,(gecode_opt_handle h,const gecode_opt_lp_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=lp_options(input);auto model=snapshot(h); + account_preparation(opts.solve,start);*out=put(Kind::LpObservedResult,std::make_shared(O::solve_lp_observed(model,opts)))) +API(session_solve_lp_observed,(gecode_opt_handle session,gecode_opt_handle h,const gecode_opt_lp_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=lp_options(input);auto model=snapshot(h);auto box=get(session,Kind::Session); + std::lock_guard lock(box->mutex);account_preparation(opts.solve,start); + *out=put(Kind::LpObservedResult,std::make_shared(box->session.solve_lp_observed(model,opts)))) +API(lp_observed_result_destroy,(gecode_opt_handle h),destroy(h,Kind::LpObservedResult)) +API(lp_observed_result_copy_result,(gecode_opt_handle h,gecode_opt_handle* out), + required(out);*out=0;auto r=get(h,Kind::LpObservedResult); + *out=put(Kind::Result,std::make_shared(r->result))) +API(lp_observed_result_info,(gecode_opt_handle h,gecode_opt_lp_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto observed=get(h,Kind::LpObservedResult);const auto& r=observed->result; + *out={};out->struct_size=sizeof(*out);out->result={r.model_id,r.revision,static_cast(r.active_variables.size()),termination(r.termination), + guarantee(r.guarantee),r.has_solution(),r.solution_validated,r.start_submitted,0,r.elapsed_seconds}; + if(observed->observations){const auto& d=*observed->observations;out->has_observations=1;out->model_id=d.id();out->revision=d.revision();out->row_slots=d.rows().size();out->column_slots=d.columns().size();}) +API(lp_observed_result_metadata,(gecode_opt_handle h,gecode_opt_lp_metadata_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto data=lp_observations(h);const auto& m=data->metadata();*out={};out->struct_size=sizeof(*out); + out->dual_feasibility=m.checks.dual_feasibility;out->stationarity=m.checks.stationarity;out->complementarity=m.checks.complementarity; + out->objective_gap=m.checks.objective_gap;out->primal_check_tolerance=m.primal_check_tolerance; + out->backend_primal_tolerance=optional(m.backend_primal_tolerance);out->backend_dual_tolerance=optional(m.backend_dual_tolerance)) +API(lp_observed_result_group,(gecode_opt_handle h,int32_t field,gecode_opt_lp_group_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto data=lp_observations(h);const auto& g=lp_group(*data,field); + *out={};out->struct_size=sizeof(*out);out->state=lp_state(g.state);out->reason=lp_reason(g.reason)) +API(lp_observed_result_checks,(gecode_opt_handle h,gecode_opt_lp_checks_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto data=lp_observations(h);const auto& c=data->checks();*out={};out->struct_size=sizeof(*out); + out->primal_valid=c.primal_valid;out->dual_signs_valid=c.dual_signs_valid;out->stationarity_valid=c.stationarity_valid; + out->complementarity_valid=c.complementarity_valid;out->gap_valid=c.gap_valid;out->accepted=c.accepted; + out->max_dual_sign_violation=optional(c.max_dual_sign_violation);out->max_stationarity=optional(c.max_stationarity); + out->max_complementarity=optional(c.max_complementarity);out->dual_objective_estimate=optional(c.dual_objective_estimate);out->normalized_gap=optional(c.normalized_gap)) +API(lp_observed_result_row,(gecode_opt_handle h,gecode_opt_id id,gecode_opt_lp_row_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto data=lp_observations(h);*out=lp_row(data->row(row(id)))) +API(lp_observed_result_column,(gecode_opt_handle h,gecode_opt_id id,gecode_opt_lp_column_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto data=lp_observations(h);*out=lp_column(data->column(variable(id)))) +API(lp_observed_result_rows,(gecode_opt_handle h,gecode_opt_lp_row_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("LP row element size does not match ABI v1");auto data=lp_observations(h); + if(output_array(buffer,capacity,needed,data->rows().size()))for(std::size_t i=0;irows().size();++i)buffer[i]=lp_row(data->rows()[i])) +API(lp_observed_result_columns,(gecode_opt_handle h,gecode_opt_lp_column_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("LP column element size does not match ABI v1");auto data=lp_observations(h); + if(output_array(buffer,capacity,needed,data->columns().size()))for(std::size_t i=0;icolumns().size();++i)buffer[i]=lp_column(data->columns()[i])) +API(lp_observed_result_text,(gecode_opt_handle h,int32_t field,char* buffer,uint64_t capacity,uint64_t* needed), + auto d=lp_observations(h);const std::string* value=nullptr; + switch(field){case GECODE_OPT_LP_BACKEND_NAME:value=&d->metadata().backend;break;case GECODE_OPT_LP_BACKEND_VERSION:value=&d->metadata().backend_version;break; + case GECODE_OPT_LP_PRIMAL_MESSAGE:value=&d->primal_rows().message;break;case GECODE_OPT_LP_DUAL_MESSAGE:value=&d->dual_point().message;break; + case GECODE_OPT_LP_BASIS_MESSAGE:value=&d->basis().message;break;case GECODE_OPT_LP_CHECK_MESSAGE:value=&d->checks().message;break; + default:argument("unknown LP observation text selector");}output_text(*value,buffer,capacity,needed)) + +namespace { +std::vector> basis_status_input(const int32_t* values,uint64_t n) { + const auto size=count(n,values);length>(n); + std::vector> out;out.reserve(size); + for(std::size_t i=0;i basis) { + if(!basis)throw ApiError{GECODE_OPT_NO_BASIS,"result has no requested LP basis"}; + auto box=std::make_shared();box->basis=std::move(basis);return put(Kind::Basis,std::move(box)); +} +O::LpBasisSolveOptions basis_options(uint64_t h,const gecode_opt_lp_options_v1* input) { + O::LpBasisSolveOptions out;out.observations=lp_options(input);out.basis=get(h,Kind::Basis)->basis; + out.validate();return out; +} +} +API(basis_from_observed,(gecode_opt_handle h,gecode_opt_handle* out), + required(out);*out=0;*out=own_basis(O::make_lp_basis(*lp_observations(h)))) +API(basis_from_model,(gecode_opt_handle h,const int32_t* columns,uint64_t column_count,const int32_t* rows,uint64_t row_count,gecode_opt_handle* out), + required(out);*out=0;count(column_count,columns);count(row_count,rows); + O::LpBasisData data;data.columns=basis_status_input(columns,column_count);data.rows=basis_status_input(rows,row_count); + data.source=snapshot(h);*out=own_basis(O::make_lp_basis(data))) +API(basis_destroy,(gecode_opt_handle h),destroy(h,Kind::Basis)) +API(basis_info,(gecode_opt_handle h,gecode_opt_basis_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::Basis)->basis;*out={};out->struct_size=sizeof(*out); + out->model_id=b->id();out->revision=b->revision();out->row_slots=b->rows().size();out->column_slots=b->columns().size();out->origin=basis_origin(b->origin())) +API(basis_statuses,(gecode_opt_handle h,int32_t entity_kind,int32_t* buffer,uint64_t capacity,uint64_t* needed), + if(entity_kind!=GECODE_OPT_VARIABLE_ID&&entity_kind!=GECODE_OPT_ROW_ID)argument("basis statuses require VARIABLE_ID or ROW_ID selector"); + auto b=get(h,Kind::Basis)->basis;const auto& values=entity_kind==GECODE_OPT_VARIABLE_ID?b->columns():b->rows(); + if(output_array(buffer,capacity,needed,values.size()))for(std::size_t i=0;i(h,Kind::Basis)->basis; + if(key.model_id!=b->id()||key.id>=b->rows().size()||!b->rows()[key.id])throw O::ModelError("basis row is foreign, absent, or deleted"); + *out=lp_basis(*b->rows()[key.id])) +API(basis_column,(gecode_opt_handle h,gecode_opt_id id,int32_t* out), + required(out);const auto key=variable(id);auto b=get(h,Kind::Basis)->basis; + if(key.model_id!=b->id()||key.id>=b->columns().size()||!b->columns()[key.id])throw O::ModelError("basis variable is foreign, absent, or deleted"); + *out=lp_basis(*b->columns()[key.id])) +API(solve_lp_with_basis,(gecode_opt_handle h,gecode_opt_handle basis,const gecode_opt_lp_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=basis_options(basis,input);auto model=snapshot(h); + account_preparation(opts.observations.solve,start); + *out=put(Kind::BasisSolveResult,std::make_shared(O::solve_lp_with_basis(model,opts)))) +API(session_solve_lp_with_basis,(gecode_opt_handle session,gecode_opt_handle h,gecode_opt_handle basis,const gecode_opt_lp_options_v1* input,gecode_opt_handle* out), + const auto start=Clock::now();required(out);*out=0;auto opts=basis_options(basis,input);auto model=snapshot(h);auto box=get(session,Kind::Session); + std::lock_guard lock(box->mutex);account_preparation(opts.observations.solve,start); + *out=put(Kind::BasisSolveResult,std::make_shared(box->session.solve_lp_with_basis(model,opts)))) +API(basis_result_destroy,(gecode_opt_handle h),destroy(h,Kind::BasisSolveResult)) +API(basis_result_info,(gecode_opt_handle h,gecode_opt_basis_result_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::BasisSolveResult);const auto& r=b->observed.result; + *out={};out->struct_size=sizeof(*out);out->result={r.model_id,r.revision,static_cast(r.active_variables.size()),termination(r.termination), + guarantee(r.guarantee),r.has_solution(),r.solution_validated,r.start_submitted,0,r.elapsed_seconds}; + if(b->requested_basis){out->has_requested_basis=1;out->requested_model_id=b->requested_basis->id();out->requested_revision=b->requested_basis->revision();} + out->state=basis_submission(b->submission.state);out->backend_attempted=b->submission.backend_attempted; + out->has_statuses_changed=b->submission.statuses_changed.has_value();if(b->submission.statuses_changed)out->statuses_changed=*b->submission.statuses_changed) +API(basis_result_message,(gecode_opt_handle h,char* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::BasisSolveResult);output_text(b->submission.message,buffer,capacity,needed)) +API(basis_result_copy_observed,(gecode_opt_handle h,gecode_opt_handle* out), + required(out);*out=0;auto b=get(h,Kind::BasisSolveResult); + *out=put(Kind::LpObservedResult,std::make_shared(b->observed))) +API(basis_result_copy_basis,(gecode_opt_handle h,gecode_opt_handle* out), + required(out);*out=0;auto b=get(h,Kind::BasisSolveResult);*out=own_basis(b->requested_basis)) + + +namespace { +O::ScenarioId scenario_id(gecode_opt_scenario_id id){return {id.batch_id,id.index};} +gecode_opt_scenario_id scenario_id(O::ScenarioId id){return {id.batch_id,id.index};} +const O::ScenarioBatch& scenario_batch(const O::ScenarioBatchResult& result){ + if(!result.batch)throw O::ModelError("scenario batch was not admitted");return *result.batch; +} +const O::ScenarioOutcome& scenario_outcome(const O::ScenarioBatchResult& result,gecode_opt_scenario_id id){ + scenario_batch(result).definition(scenario_id(id));return at(result.outcomes,id.index); +} +gecode_opt_session_statistics_v1 scenario_statistics(const O::SessionStatistics& s){ + return {s.solve_calls,s.model_loads,s.incremental_updates,s.unchanged_models,s.basis_warm_starts,s.incumbent_starts}; +} +int32_t scenario_completion(O::ScenarioBatchCompletion value){switch(value){ + case O::ScenarioBatchCompletion::Rejected:return GECODE_OPT_SCENARIO_REJECTED; + case O::ScenarioBatchCompletion::Interrupted:return GECODE_OPT_SCENARIO_INTERRUPTED; + case O::ScenarioBatchCompletion::Complete:return GECODE_OPT_SCENARIO_COMPLETE; +}argument("unknown scenario completion");} +int32_t scenario_state(O::ScenarioRunState value){switch(value){ + case O::ScenarioRunState::NotStarted:return GECODE_OPT_SCENARIO_NOT_STARTED; + case O::ScenarioRunState::Attempted:return GECODE_OPT_SCENARIO_ATTEMPTED; +}argument("unknown scenario run state");} +O::ScenarioBatchOptions scenario_options(const gecode_opt_scenario_options_v1* input){ + O::ScenarioBatchOptions result;if(!input)return result; + if(input->struct_size!=sizeof(*input))argument("scenario options struct_size does not match v1"); + if(input->reserved||input->reserved_flags)argument("scenario options reserved fields must be zero"); + result.solve=options(&input->solve); + switch(input->reuse){case GECODE_OPT_SCENARIO_AUTOMATIC:result.reuse=O::ScenarioReuse::Automatic;break; + case GECODE_OPT_SCENARIO_COLD:result.reuse=O::ScenarioReuse::Cold;break;default:argument("unknown scenario reuse");} + result.max_scenarios=length(input->max_scenarios); + result.max_patch_entries=length(input->max_patch_entries); + result.max_saved_value_slots=length(input->max_saved_value_slots); + if(input->max_work>std::numeric_limits::max())argument("scenario work limit exceeds size_t"); + result.max_work=static_cast(input->max_work);result.validate();return result; +} +void scenario_presence(int32_t present){if(present!=0&&present!=1)argument("scenario presence flag must be zero or one");} +void scenario_bounds(const gecode_opt_scenario_bounds_v1& input){ + if(input.struct_size!=sizeof(input)||input.reserved)argument("invalid scenario bound size/reserved"); + scenario_presence(input.has_lower);scenario_presence(input.has_upper); +} +std::optional scenario_side(int32_t present,double value){return present?std::optional(value):std::nullopt;} +gecode_opt_scenario_bounds_v1 scenario_bound(gecode_opt_id id,std::optional lower,std::optional upper){ + return {sizeof(gecode_opt_scenario_bounds_v1),0,id,lower.has_value(),upper.has_value(),lower.value_or(0),upper.value_or(0)}; +} +std::vector scenario_definitions(const gecode_opt_scenario_definition_v1* input,std::size_t n){ + std::vector out;out.reserve(n); + for(std::size_t i=0;istruct_size=sizeof(*out);out->solve=default_options(); + out->reuse=GECODE_OPT_SCENARIO_AUTOMATIC;out->max_scenarios=o.max_scenarios;out->max_patch_entries=o.max_patch_entries; + out->max_saved_value_slots=o.max_saved_value_slots;out->max_work=o.max_work) +API(solve_scenarios,(gecode_opt_handle h,const gecode_opt_scenario_definition_v1* input,uint64_t n,uint64_t element_size,const gecode_opt_scenario_options_v1* option_input,gecode_opt_handle* output), + const auto start=Clock::now();required(output);*output=0; + if(element_size!=sizeof(*input))argument("scenario definition element_size does not match v1"); + const auto size=count(n,input);length(n);auto opts=scenario_options(option_input);const auto total_seconds=opts.solve.time_limit_seconds; + std::shared_ptr result; + {auto model=snapshot(h); + bool capped=size>opts.max_scenarios;std::size_t patches=0; + // Preflight counts and versioned headers before allocating owned patch arrays. + if(!capped)for(std::size_t i=0;i(item.objective_count); + const auto nv=count(item.variable_count,item.variable_bounds);length(item.variable_count); + const auto nr=count(item.row_count,item.row_bounds);length(item.row_count); + for(auto add:{nt,nv,nr}){if(add>opts.max_patch_entries-patches){capped=true;break;}patches+=add;} + if(capped)break; + } + if(capped){result=std::make_shared();result->model_id=model.model_id;result->revision=model.revision; + result->stop_reason=O::Termination::MemoryLimit;result->message="scenario binding input storage limit"; + if(opts.solve.cancellation&&opts.solve.cancellation->cancelled()){ + result->stop_reason=O::Termination::Cancelled;result->message="scenario binding cancelled before input copies"; + }else if(std::isfinite(total_seconds)&&std::chrono::duration(Clock::now()-start).count()>=total_seconds){ + result->stop_reason=O::Termination::TimeLimit;result->message="scenario binding deadline reached before input copies"; + }} + else {auto definitions=scenario_definitions(input,size);account_preparation(opts.solve,start); + result=std::make_shared(O::solve_scenarios(model,definitions,opts));}} + // The binding's temporary source and copied input arrays are now gone. Keep + // timely individual histories if only whole-call cleanup exceeded the budget. + if(result->completion==O::ScenarioBatchCompletion::Complete){ + std::optional stopped; + if(opts.solve.cancellation&&opts.solve.cancellation->cancelled())stopped=O::Termination::Cancelled; + else if(std::isfinite(total_seconds)&&std::chrono::duration(Clock::now()-start).count()>=total_seconds)stopped=O::Termination::TimeLimit; + if(stopped){result->completion=O::ScenarioBatchCompletion::Interrupted;result->stop_reason=stopped; + result->message="Whole scenario binding budget stopped during final input cleanup";} + } + result->elapsed_seconds=std::chrono::duration(Clock::now()-start).count(); + *output=put(Kind::ScenarioBatchResult,std::move(result))) +API(scenario_batch_destroy,(gecode_opt_handle h),destroy(h,Kind::ScenarioBatchResult)) +API(scenario_batch_info,(gecode_opt_handle h,gecode_opt_scenario_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto r=get(h,Kind::ScenarioBatchResult);*out={};out->struct_size=sizeof(*out); + out->model_id=r->model_id;out->revision=r->revision;out->has_batch=bool(r->batch);out->completion=scenario_completion(r->completion); + if(r->batch){out->batch_id=r->batch->id();out->scenario_count=r->batch->size();}out->outcome_count=r->outcomes.size(); + out->has_stop_reason=r->stop_reason.has_value();if(r->stop_reason)out->stop_reason=termination(*r->stop_reason); + out->has_offending_scenario=r->offending_scenario.has_value();if(r->offending_scenario)out->offending_scenario=*r->offending_scenario; + out->all_resolved=r->all_resolved();out->attempted=r->attempted;out->resolved=r->resolved;out->work=r->work; + out->elapsed_seconds=r->elapsed_seconds;out->reuse_statistics=scenario_statistics(r->reuse_statistics)) +API(scenario_batch_id,(gecode_opt_handle h,uint64_t index,gecode_opt_scenario_id* out), + required(out);auto r=get(h,Kind::ScenarioBatchResult); + if(index>std::numeric_limits::max())argument("scenario index exceeds size_t"); + *out=scenario_id(scenario_batch(*r).scenario(static_cast(index)))) +API(scenario_batch_outcome,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_scenario_outcome_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::ScenarioBatchResult);const auto& o=scenario_outcome(*b,id); + *out={};out->struct_size=sizeof(*out);out->scenario=scenario_id(o.scenario);out->state=scenario_state(o.state); + out->has_result=o.result.has_value();out->has_check=o.check.has_value();out->reuse_delta=scenario_statistics(o.reuse_delta);out->elapsed_seconds=o.elapsed_seconds; + if(o.result){const auto& r=*o.result;out->result={r.model_id,r.revision,static_cast(r.active_variables.size()), + termination(r.termination),guarantee(r.guarantee),r.has_solution(),r.solution_validated,r.start_submitted,0,r.elapsed_seconds};}) +API(scenario_batch_check,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_scenario_check_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::ScenarioBatchResult);const auto& o=scenario_outcome(*b,id); + *out={};out->struct_size=sizeof(*out);out->has_check=o.check.has_value();if(o.check){const auto& c=*o.check; + out->identity_valid=c.identity_valid;out->candidate_examined=c.candidate_examined; + if(c.candidate_examined){out->objective_matches=c.objective_matches;out->exact_witness_validated=c.exact_witness_validated; + const auto& v=c.validation;out->validation={v.valid,v.model_valid,static_cast(v.violated_globals), + v.max_bound_violation,v.max_row_violation,v.max_integrality_violation,v.max_indicator_violation,optional(v.objective)};}}) +API(scenario_batch_copy_result,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_handle* out), + required(out);*out=0;auto b=get(h,Kind::ScenarioBatchResult);const auto& o=scenario_outcome(*b,id); + if(!o.result)throw ApiError{GECODE_OPT_NO_SOLUTION,"scenario has no attempted result"}; + *out=put(Kind::Result,std::make_shared(*o.result))) +API(scenario_batch_map,(gecode_opt_handle h,gecode_opt_id original,gecode_opt_id* out), + required(out);auto b=get(h,Kind::ScenarioBatchResult);const auto& source=scenario_batch(*b); + if(original.kind==GECODE_OPT_VARIABLE_ID)*out=identifier(source.map(variable(original))); + else if(original.kind==GECODE_OPT_ROW_ID)*out=identifier(source.map(row(original)));else argument("scenario map requires variable or row ID")) +API(scenario_batch_value,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_id original,double* out), + required(out);auto b=get(h,Kind::ScenarioBatchResult);const auto& o=scenario_outcome(*b,id); + const auto v=variable(original);scenario_batch(*b).map(v); + if(!o.result||!o.result->has_solution())throw ApiError{GECODE_OPT_NO_SOLUTION,"scenario has no validated solution"}; + *out=b->value(scenario_id(id),v)) +API(scenario_batch_message,(gecode_opt_handle h,char* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::ScenarioBatchResult);output_text(b->message,buffer,capacity,needed)) +API(scenario_batch_text,(gecode_opt_handle h,gecode_opt_scenario_id id,int32_t field,char* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::ScenarioBatchResult);const auto& def=scenario_batch(*b).definition(scenario_id(id)); + switch(field){case GECODE_OPT_SCENARIO_NAME:output_text(def.name,buffer,capacity,needed);break; + case GECODE_OPT_SCENARIO_VALIDATION_MESSAGE:{const auto& o=scenario_outcome(*b,id); + output_text(o.check&&o.check->candidate_examined?o.check->validation.message:std::string(),buffer,capacity,needed);break;} + default:argument("unknown scenario text selector");}) +API(scenario_batch_definition,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_scenario_definition_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::ScenarioBatchResult);const auto& d=scenario_batch(*b).definition(scenario_id(id)); + *out={sizeof(*out),0,static_cast(d.objective_coefficients.size()),static_cast(d.variable_bounds.size()), + static_cast(d.row_bounds.size()),optional(d.objective_offset)}) +API(scenario_batch_objective,(gecode_opt_handle h,gecode_opt_scenario_id id,gecode_opt_term* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::ScenarioBatchResult);const auto& d=scenario_batch(*b).definition(scenario_id(id)); + if(output_array(buffer,capacity,needed,d.objective_coefficients.size()))for(std::size_t i=0;i(h,Kind::ScenarioBatchResult);const auto& d=scenario_batch(*b).definition(scenario_id(id)); + if(kind==GECODE_OPT_VARIABLE_ID){if(output_array(buffer,capacity,needed,d.variable_bounds.size()))for(std::size_t i=0;i owner;std::size_t index;}; +const O::LpEvidence& evidence(const EvidenceBox& box){ + if(!box.result.evidence)throw ApiError{GECODE_OPT_NO_EVIDENCE,"LP evidence artifact is unavailable"};return *box.result.evidence; +} +O::LpEvidenceOptions evidence_options(const gecode_opt_evidence_options_v1* input){ + O::LpEvidenceOptions out;if(!input)return out; + if(input->struct_size!=sizeof(*input)||input->reserved||input->reserved_flags)argument("invalid LP evidence options size/reserved"); + out.solve=options(&input->solve); + switch(input->request){case GECODE_OPT_EVIDENCE_AUTOMATIC:out.request=O::LpEvidenceRequest::Automatic;break; + case GECODE_OPT_EVIDENCE_PRIMAL_RAY:out.request=O::LpEvidenceRequest::PrimalRay;break; + case GECODE_OPT_EVIDENCE_FARKAS:out.request=O::LpEvidenceRequest::Farkas;break; + case GECODE_OPT_EVIDENCE_BOTH:out.request=O::LpEvidenceRequest::Both;break;default:argument("unknown LP evidence request");} + out.checks={input->recession,input->stationarity,input->minimum_improvement,input->minimum_contradiction}; + const auto limit=[](uint64_t value){if(value>std::numeric_limits::max())argument("LP evidence limit exceeds size_t");return static_cast(value);}; + out.limits.max_auxiliary_variables=limit(input->max_auxiliary_variables);out.limits.max_auxiliary_rows=limit(input->max_auxiliary_rows); + out.limits.max_auxiliary_nonzeros=limit(input->max_auxiliary_nonzeros);out.limits.max_retained_slots=limit(input->max_retained_slots); + out.limits.max_work=limit(input->max_work);out.limits.max_auxiliary_solves=limit(input->max_auxiliary_solves);out.validate();return out; +} +int32_t evidence_state(O::LpEvidenceState value){switch(value){ + case O::LpEvidenceState::NotRequested:return GECODE_OPT_EVIDENCE_NOT_REQUESTED; + case O::LpEvidenceState::Available:return GECODE_OPT_EVIDENCE_AVAILABLE; + case O::LpEvidenceState::Unavailable:return GECODE_OPT_EVIDENCE_UNAVAILABLE; + case O::LpEvidenceState::Rejected:return GECODE_OPT_EVIDENCE_REJECTED; +}argument("unknown LP evidence state");} +int32_t evidence_reason(O::LpEvidenceReason value){switch(value){ + case O::LpEvidenceReason::None:return GECODE_OPT_EVIDENCE_REASON_NONE; + case O::LpEvidenceReason::NotRequested:return GECODE_OPT_EVIDENCE_REASON_NOT_REQUESTED; + case O::LpEvidenceReason::Unsupported:return GECODE_OPT_EVIDENCE_REASON_UNSUPPORTED; + case O::LpEvidenceReason::NoFeasibleBase:return GECODE_OPT_EVIDENCE_REASON_NO_FEASIBLE_BASE; + case O::LpEvidenceReason::NoImprovingDirection:return GECODE_OPT_EVIDENCE_REASON_NO_IMPROVEMENT; + case O::LpEvidenceReason::NoContradiction:return GECODE_OPT_EVIDENCE_REASON_NO_CONTRADICTION; + case O::LpEvidenceReason::Stopped:return GECODE_OPT_EVIDENCE_REASON_STOPPED; + case O::LpEvidenceReason::InvalidBackendData:return GECODE_OPT_EVIDENCE_REASON_INVALID_BACKEND; + case O::LpEvidenceReason::FailedOriginalChecks:return GECODE_OPT_EVIDENCE_REASON_FAILED_CHECKS; + case O::LpEvidenceReason::InconsistentEvidence:return GECODE_OPT_EVIDENCE_REASON_INCONSISTENT; + case O::LpEvidenceReason::InvalidModel:return GECODE_OPT_EVIDENCE_REASON_INVALID_MODEL; + case O::LpEvidenceReason::ResourceLimit:return GECODE_OPT_EVIDENCE_REASON_RESOURCE_LIMIT; + case O::LpEvidenceReason::AllocationFailure:return GECODE_OPT_EVIDENCE_REASON_ALLOCATION; +}argument("unknown LP evidence reason");} +int32_t evidence_completion(O::LpEvidenceCompletion value){switch(value){ + case O::LpEvidenceCompletion::Complete:return GECODE_OPT_EVIDENCE_COMPLETE; + case O::LpEvidenceCompletion::Interrupted:return GECODE_OPT_EVIDENCE_INTERRUPTED; + case O::LpEvidenceCompletion::Rejected:return GECODE_OPT_EVIDENCE_ANALYSIS_REJECTED; +}argument("unknown LP evidence completion");} +int32_t evidence_phase(O::LpEvidencePhase value){switch(value){ + case O::LpEvidencePhase::FeasibleBase:return GECODE_OPT_EVIDENCE_FEASIBLE_BASE; + case O::LpEvidencePhase::Recession:return GECODE_OPT_EVIDENCE_RECESSION; + case O::LpEvidencePhase::Farkas:return GECODE_OPT_EVIDENCE_FARKAS_PHASE; +}argument("unknown LP evidence phase");} +int32_t evidence_side(O::LpEvidenceSide value){switch(value){case O::LpEvidenceSide::Lower:return GECODE_OPT_EVIDENCE_LOWER; + case O::LpEvidenceSide::Upper:return GECODE_OPT_EVIDENCE_UPPER;}argument("unknown LP evidence side");} +int32_t evidence_column(O::LpEvidenceColumnKind value){switch(value){ + case O::LpEvidenceColumnKind::SourceVariable:return GECODE_OPT_EVIDENCE_SOURCE_VARIABLE; + case O::LpEvidenceColumnKind::RowSide:return GECODE_OPT_EVIDENCE_ROW_SIDE; + case O::LpEvidenceColumnKind::VariableSide:return GECODE_OPT_EVIDENCE_VARIABLE_SIDE; +}argument("unknown LP evidence column kind");} +const O::LpEvidenceGroup& evidence_group(const EvidenceBox& box,int32_t field){ + const auto& data=evidence(box);switch(field){case GECODE_OPT_EVIDENCE_PRIMAL_GROUP:return data.primal_ray(); + case GECODE_OPT_EVIDENCE_FARKAS_GROUP:return data.farkas();default:argument("unknown LP evidence group");} +} +bool evidence_available(const EvidenceBox& box,int32_t field){return evidence_group(box,field).state==O::LpEvidenceState::Available&&!box.cleanup_stopped;} +void require_evidence_available(const EvidenceBox& box,int32_t field){if(!evidence_available(box,field))throw ApiError{GECODE_OPT_NO_EVIDENCE,"LP evidence group is not Available"};} +std::size_t evidence_slot(const O::LpEvidence& data,gecode_opt_id id){ + const auto& source=data.source(); + if(id.kind==GECODE_OPT_VARIABLE_ID){const auto v=variable(id); + if(v.model_id!=data.id()||v.id>=source.variables.size()||!source.variables[v.id].active)throw O::ModelError("LP evidence variable is foreign, absent or deleted");return static_cast(v.id);} + if(id.kind==GECODE_OPT_ROW_ID){const auto r=row(id); + if(r.model_id!=data.id()||r.id>=source.rows.size()||!source.rows[r.id].active)throw O::ModelError("LP evidence row is foreign, absent or deleted");return static_cast(r.id);} + argument("LP evidence source must be variable or row"); +} +gecode_opt_validation_info_v1 evidence_validation(const O::ValidationReport& v){return {v.valid,v.model_valid,static_cast(v.violated_globals), + v.max_bound_violation,v.max_row_violation,v.max_integrality_violation,v.max_indicator_violation,optional(v.objective)};} +gecode_opt_evidence_slot_v1 evidence_slot_record(const O::LpEvidence& data,int32_t kind,std::size_t index){ + gecode_opt_evidence_slot_v1 out{};out.struct_size=sizeof(out);const bool column=kind==GECODE_OPT_VARIABLE_ID; + const auto& source=data.source();const auto& primal=data.primal_data();const auto& farkas=data.farkas_data(); + out.source={data.id(),static_cast(index),static_cast(kind),0}; + double lower,upper; + if(column){const auto& v=at(source.variables,index);out.active=v.active;lower=v.lower;upper=v.upper; + if(out.active&&indexstruct_size=sizeof(*out);out->solve=default_options();out->request=GECODE_OPT_EVIDENCE_AUTOMATIC; + out->recession=o.checks.recession;out->stationarity=o.checks.stationarity;out->minimum_improvement=o.checks.minimum_improvement;out->minimum_contradiction=o.checks.minimum_contradiction; + out->max_auxiliary_variables=o.limits.max_auxiliary_variables;out->max_auxiliary_rows=o.limits.max_auxiliary_rows;out->max_auxiliary_nonzeros=o.limits.max_auxiliary_nonzeros; + out->max_retained_slots=o.limits.max_retained_slots;out->max_work=o.limits.max_work;out->max_auxiliary_solves=o.limits.max_auxiliary_solves) +API(analyze_lp_evidence,(gecode_opt_handle h,const gecode_opt_evidence_options_v1* input,gecode_opt_handle* output), + const auto start=Clock::now();required(output);*output=0;auto opts=evidence_options(input);const auto seconds=opts.solve.time_limit_seconds; + auto box=std::make_shared();{auto source=snapshot(h);account_preparation(opts.solve,start);box->result=O::analyze_lp_evidence(source,opts);} + evidence_binding_checkpoint(); + std::optional stopped; + if(opts.solve.cancellation&&opts.solve.cancellation->cancelled())stopped=O::Termination::Cancelled; + else if(std::isfinite(seconds)&&std::chrono::duration(Clock::now()-start).count()>=seconds)stopped=O::Termination::TimeLimit; + if(stopped){box->cleanup_stopped=true;box->result.completion=O::LpEvidenceCompletion::Interrupted;box->result.stop_reason=stopped; + box->result.message="Whole LP evidence binding allowance stopped during input cleanup";} + box->result.elapsed_seconds=std::chrono::duration(Clock::now()-start).count();*output=put(Kind::LpEvidenceResult,std::move(box))) +API(lp_evidence_destroy,(gecode_opt_handle h),destroy(h,Kind::LpEvidenceResult)) +API(lp_evidence_info,(gecode_opt_handle h,gecode_opt_evidence_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& r=b->result; + *out={};out->struct_size=sizeof(*out);out->model_id=r.model_id;out->revision=r.revision;out->has_evidence=bool(r.evidence); + out->completion=evidence_completion(r.completion);out->has_stop_reason=r.stop_reason.has_value();if(r.stop_reason)out->stop_reason=termination(*r.stop_reason); + if(r.evidence){out->row_slots=r.evidence->source().rows.size();out->column_slots=r.evidence->source().variables.size();out->stage_count=r.evidence->stages().size();} + out->attempted_calls=r.attempted_calls;out->work=r.work;out->elapsed_seconds=r.elapsed_seconds) +API(lp_evidence_group,(gecode_opt_handle h,int32_t field,gecode_opt_evidence_group_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& g=evidence_group(*b,field); + *out={sizeof(*out),0,evidence_state(g.state),evidence_reason(g.reason)}; + if(b->cleanup_stopped&&g.state!=O::LpEvidenceState::NotRequested){out->state=GECODE_OPT_EVIDENCE_UNAVAILABLE;out->reason=GECODE_OPT_EVIDENCE_REASON_STOPPED;}) +API(lp_evidence_metadata,(gecode_opt_handle h,gecode_opt_evidence_metadata_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& e=evidence(*b);const auto& t=e.tolerances(); + *out={sizeof(*out),0,t.recession,t.stationarity,t.minimum_improvement,t.minimum_contradiction,e.primal_tolerance()}) +API(lp_evidence_primal,(gecode_opt_handle h,gecode_opt_evidence_primal_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& p=evidence(*b).primal_data(); + *out={};out->struct_size=sizeof(*out);out->has_base_check=p.base_check.model_valid; + if(out->has_base_check)out->base_check=evidence_validation(p.base_check); + out->direction_scale=optional(p.direction_scale);out->normalized_objective_slope=optional(p.normalized_objective_slope); + out->max_variable_recession_violation=optional(p.max_variable_recession_violation);out->max_row_recession_violation=optional(p.max_row_recession_violation)) +API(lp_evidence_farkas,(gecode_opt_handle h,gecode_opt_evidence_farkas_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& f=evidence(*b).farkas_data(); + *out={sizeof(*out),0,optional(f.multiplier_scale),optional(f.contradiction_margin),optional(f.max_stationarity)}) +API(lp_evidence_slot,(gecode_opt_handle h,gecode_opt_id id,gecode_opt_evidence_slot_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& e=evidence(*b); + *out=evidence_slot_record(e,static_cast(id.kind),evidence_slot(e,id))) +API(lp_evidence_slots,(gecode_opt_handle h,int32_t kind,gecode_opt_evidence_slot_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("LP evidence slot element size does not match v1"); + auto b=get(h,Kind::LpEvidenceResult);const auto& e=evidence(*b);std::size_t n; + if(kind==GECODE_OPT_VARIABLE_ID)n=e.source().variables.size();else if(kind==GECODE_OPT_ROW_ID)n=e.source().rows.size();else argument("LP evidence slots require variable/row kind"); + if(output_array(buffer,capacity,needed,n))for(std::size_t i=0;i(h,Kind::LpEvidenceResult);const auto v=variable(id);const auto& e=evidence(*b);evidence_slot(e,id); + if(field!=GECODE_OPT_EVIDENCE_BASE_VALUE&&field!=GECODE_OPT_EVIDENCE_DIRECTION_VALUE)argument("unknown LP evidence value selector"); + require_evidence_available(*b,GECODE_OPT_EVIDENCE_PRIMAL_GROUP); + *out=field==GECODE_OPT_EVIDENCE_BASE_VALUE?e.base_value(v):e.direction_value(v)) +API(lp_evidence_multiplier,(gecode_opt_handle h,gecode_opt_id id,gecode_opt_evidence_slot_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceResult);const auto& e=evidence(*b);const auto slot=evidence_slot(e,id); + require_evidence_available(*b,GECODE_OPT_EVIDENCE_FARKAS_GROUP);*out=evidence_slot_record(e,static_cast(id.kind),slot)) +API(lp_evidence_text,(gecode_opt_handle h,int32_t field,char* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::LpEvidenceResult); + if(field==GECODE_OPT_EVIDENCE_MESSAGE)output_text(b->result.message,buffer,capacity,needed); + else if(field==GECODE_OPT_EVIDENCE_BASE_CHECK_MESSAGE)output_text(evidence(*b).primal_data().base_check.message,buffer,capacity,needed); + else if(field==GECODE_OPT_EVIDENCE_PRIMAL_MESSAGE||field==GECODE_OPT_EVIDENCE_FARKAS_MESSAGE){const auto& g=evidence_group(*b,field==GECODE_OPT_EVIDENCE_PRIMAL_MESSAGE?GECODE_OPT_EVIDENCE_PRIMAL_GROUP:GECODE_OPT_EVIDENCE_FARKAS_GROUP); + output_text(b->cleanup_stopped&&g.state!=O::LpEvidenceState::NotRequested?b->result.message:g.message,buffer,capacity,needed);} + else argument("unknown LP evidence text selector")) +API(lp_evidence_copy_stage,(gecode_opt_handle h,uint64_t index,gecode_opt_handle* output), + required(output);*output=0;auto b=get(h,Kind::LpEvidenceResult);at(evidence(*b).stages(),index); + auto child=std::make_shared();child->owner=std::move(b);child->index=static_cast(index); + *output=put(Kind::LpEvidenceStage,std::move(child))) +API(lp_evidence_stage_destroy,(gecode_opt_handle h),destroy(h,Kind::LpEvidenceStage)) +API(lp_evidence_stage_info,(gecode_opt_handle h,gecode_opt_evidence_stage_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::LpEvidenceStage);const auto& s=evidence_stage(*b); + *out={};out->struct_size=sizeof(*out);out->index=b->index;out->phase=evidence_phase(s.phase);out->attempted=s.attempted; + if(s.auxiliary_model){out->private_model_id=s.auxiliary_model->model_id;out->private_revision=s.auxiliary_model->revision; + out->row_count=s.auxiliary_model->rows.size();out->column_count=s.auxiliary_model->variables.size();} + out->nonzeros=s.nonzeros;out->candidate_examined=s.candidate_examined;if(s.candidate_examined)out->check=evidence_validation(s.auxiliary_check); + out->has_raw_result=s.auxiliary_result.has_value();if(s.auxiliary_result){const auto& r=*s.auxiliary_result;auto& raw=out->raw_result; + raw.struct_size=sizeof(raw);raw.model_id=r.model_id;raw.revision=r.revision;raw.value_count=r.values.size();raw.mask_count=r.active_variables.size(); + // Raw diagnostics preserve unknown integer codes instead of asserting that + // a rejected backend result satisfies the ordinary Result contract. + raw.termination_code=static_cast(r.termination);raw.guarantee_code=static_cast(r.guarantee); + raw.reported_solution_validated=r.solution_validated;raw.reported_start_submitted=r.start_submitted;raw.elapsed_seconds=r.elapsed_seconds; + raw.objective=optional(r.objective);raw.best_bound=optional(r.best_bound);raw.absolute_gap=optional(r.absolute_gap); + raw.relative_gap=optional(r.relative_gap);raw.native_gap=optional(r.native_backend_gap);}) +API(lp_evidence_stage_columns,(gecode_opt_handle h,gecode_opt_evidence_column_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("LP evidence column element size does not match v1"); + auto b=get(h,Kind::LpEvidenceStage);const auto& s=evidence_stage(*b);const auto& e=evidence(*b->owner); + if(output_array(buffer,capacity,needed,s.columns.size()))for(std::size_t i=0;i=s.auxiliary_model->variables.size())throw O::ModelError("Malformed auxiliary column mapping"); + out.private_variable=identifier(s.auxiliary_model->variables[i].variable); + out.source={e.id(),static_cast(c.original_slot),c.kind==O::LpEvidenceColumnKind::RowSide?GECODE_OPT_ROW_ID:GECODE_OPT_VARIABLE_ID,0};buffer[i]=out;}) +API(lp_evidence_stage_raw_values,(gecode_opt_handle h,gecode_opt_evidence_raw_value_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("LP evidence raw value element size does not match v1"); + auto b=get(h,Kind::LpEvidenceStage);const auto& s=evidence_stage(*b); + const auto n=s.auxiliary_result?std::max(s.auxiliary_result->values.size(),s.auxiliary_result->active_variables.size()):0; + if(output_array(buffer,capacity,needed,n))for(std::size_t i=0;i(h,Kind::LpEvidenceStage);const auto& s=evidence_stage(*b);const std::string* text=nullptr; + switch(field){case GECODE_OPT_EVIDENCE_RAW_BACKEND:if(s.auxiliary_result)text=&s.auxiliary_result->backend;break; + case GECODE_OPT_EVIDENCE_RAW_BACKEND_VERSION:if(s.auxiliary_result)text=&s.auxiliary_result->backend_version;break; + case GECODE_OPT_EVIDENCE_RAW_MESSAGE:if(s.auxiliary_result)text=&s.auxiliary_result->message;break; + case GECODE_OPT_EVIDENCE_STAGE_CHECK_MESSAGE:if(s.candidate_examined)text=&s.auxiliary_check.message;break; + default:argument("unknown LP evidence stage text selector");}output_text(text?*text:std::string(),buffer,capacity,needed)) + +#ifdef GECODE_OPTIMIZE_TEST_SENSITIVITY_BINDING +extern "C" void gecode_opt_test_sensitivity_binding_checkpoint(void); +#endif +namespace { +void sensitivity_binding_checkpoint(){ +#ifdef GECODE_OPTIMIZE_TEST_SENSITIVITY_BINDING + gecode_opt_test_sensitivity_binding_checkpoint(); +#endif +} +struct SensitivityBox { + std::shared_ptr source; + O::LpSensitivityResult result; + std::size_t preparation_visits=0; + bool cleanup_stopped=false; +}; +const O::LpSensitivity& sensitivity(const SensitivityBox& box){ + if(!box.result.sensitivity)throw ApiError{GECODE_OPT_NO_SENSITIVITY,"No historical LP sensitivity artifact"}; + return *box.result.sensitivity; +} +std::size_t sensitivity_limit(uint64_t n){ + if(n>std::numeric_limits::max())argument("sensitivity limit exceeds size_t");return static_cast(n); +} +template void sensitivity_input(const T& r){ + if(r.struct_size!=sizeof(r)||r.reserved)argument("sensitivity record size/reserved mismatch"); +} +O::LpSensitivityOptions sensitivity_options(const gecode_opt_sensitivity_options_v1* input){ + O::LpSensitivityOptions o;if(!input)return o; + sensitivity_input(*input);if(input->reserved_flags)argument("sensitivity options reserved flags must be zero"); + sensitivity_input(input->checks);sensitivity_input(input->limits); + o.backend=backend(input->backend);o.time_limit_seconds=input->time_limit_seconds; + if(input->cancellation)o.cancellation=get(input->cancellation,Kind::Cancellation); + const auto& c=input->checks;o.checks.primal_feasibility=c.primal_feasibility; + o.checks.kkt={c.dual_feasibility,c.stationarity,c.complementarity,c.objective_gap}; + o.checks.system_absolute=c.system_absolute;o.checks.system_relative=c.system_relative; + const auto& l=input->limits; + o.limits={sensitivity_limit(l.max_rows),sensitivity_limit(l.max_columns),sensitivity_limit(l.max_nonzeros), + sensitivity_limit(l.max_requests),sensitivity_limit(l.max_basis_solves),sensitivity_limit(l.max_factor_entries), + sensitivity_limit(l.max_retained_slots),sensitivity_limit(l.max_work)};return o; +} +gecode_opt_sensitivity_checks_options_v1 sensitivity_checks_options(const O::LpSensitivityTolerances& c){ + return {sizeof(gecode_opt_sensitivity_checks_options_v1),0,c.primal_feasibility,c.kkt.dual_feasibility, + c.kkt.stationarity,c.kkt.complementarity,c.kkt.objective_gap,c.system_absolute,c.system_relative}; +} +int32_t sensitivity_reason(O::LpSensitivityReason r){switch(r){ + case O::LpSensitivityReason::None:return GECODE_OPT_SENSITIVITY_REASON_NONE; + case O::LpSensitivityReason::NotRequested:return GECODE_OPT_SENSITIVITY_REASON_NOT_REQUESTED; + case O::LpSensitivityReason::Unsupported:return GECODE_OPT_SENSITIVITY_REASON_UNSUPPORTED; + case O::LpSensitivityReason::NotOptimal:return GECODE_OPT_SENSITIVITY_REASON_NOT_OPTIMAL; + case O::LpSensitivityReason::NoBasis:return GECODE_OPT_SENSITIVITY_REASON_NO_BASIS; + case O::LpSensitivityReason::InvalidSource:return GECODE_OPT_SENSITIVITY_REASON_INVALID_SOURCE; + case O::LpSensitivityReason::InvalidBasis:return GECODE_OPT_SENSITIVITY_REASON_INVALID_BASIS; + case O::LpSensitivityReason::ChangedBasis:return GECODE_OPT_SENSITIVITY_REASON_CHANGED_BASIS; + case O::LpSensitivityReason::FailedReferenceChecks:return GECODE_OPT_SENSITIVITY_REASON_REFERENCE_CHECKS; + case O::LpSensitivityReason::FailedLinearSolveChecks:return GECODE_OPT_SENSITIVITY_REASON_SYSTEM_CHECKS; + case O::LpSensitivityReason::FailedIntervalChecks:return GECODE_OPT_SENSITIVITY_REASON_INTERVAL_CHECKS; + case O::LpSensitivityReason::ResourceLimit:return GECODE_OPT_SENSITIVITY_REASON_RESOURCE_LIMIT; + case O::LpSensitivityReason::Stopped:return GECODE_OPT_SENSITIVITY_REASON_STOPPED; + case O::LpSensitivityReason::AllocationFailure:return GECODE_OPT_SENSITIVITY_REASON_ALLOCATION; + case O::LpSensitivityReason::BackendFailure:return GECODE_OPT_SENSITIVITY_REASON_BACKEND; +}argument("unknown sensitivity reason");} +int32_t sensitivity_completion(O::LpSensitivityCompletion c){switch(c){ + case O::LpSensitivityCompletion::Complete:return GECODE_OPT_SENSITIVITY_COMPLETE; + case O::LpSensitivityCompletion::Partial:return GECODE_OPT_SENSITIVITY_PARTIAL; + case O::LpSensitivityCompletion::Interrupted:return GECODE_OPT_SENSITIVITY_INTERRUPTED; + case O::LpSensitivityCompletion::Rejected:return GECODE_OPT_SENSITIVITY_ANALYSIS_REJECTED; +}argument("unknown sensitivity completion");} +int32_t sensitivity_state(O::LpSensitivityState s){switch(s){ + case O::LpSensitivityState::NotRequested:return GECODE_OPT_SENSITIVITY_NOT_REQUESTED; + case O::LpSensitivityState::Available:return GECODE_OPT_SENSITIVITY_AVAILABLE; + case O::LpSensitivityState::Unavailable:return GECODE_OPT_SENSITIVITY_UNAVAILABLE; + case O::LpSensitivityState::Rejected:return GECODE_OPT_SENSITIVITY_REJECTED; +}argument("unknown sensitivity state");} +gecode_opt_id sensitivity_entity(const O::LpSensitivityEntity& e){return std::visit([](const auto& v){return identifier(v);},e);} +gecode_opt_sensitivity_request_v1 sensitivity_request(const O::LpSensitivityParameter& p){ + gecode_opt_sensitivity_request_v1 r{};r.struct_size=sizeof(r); + if(const auto* v=std::get_if(&p)){r.kind=GECODE_OPT_SENSITIVITY_OBJECTIVE;r.entity=identifier(v->variable);} + else {r.kind=GECODE_OPT_SENSITIVITY_EQUALITY_RHS;r.entity=identifier(std::get(p).row);}return r; +} +O::LpSensitivityParameter sensitivity_request(const gecode_opt_sensitivity_request_v1& r){ + sensitivity_input(r);if(r.reserved_flags)argument("sensitivity request reserved flags must be zero"); + switch(r.kind){case GECODE_OPT_SENSITIVITY_OBJECTIVE:return O::LpObjectiveParameter{variable(r.entity)}; + case GECODE_OPT_SENSITIVITY_EQUALITY_RHS:return O::LpEqualityRhsParameter{row(r.entity)}; + default:argument("unknown sensitivity request kind");} +} +gecode_opt_sensitivity_end_v1 sensitivity_end(const O::LpRangeEnd& e){ + gecode_opt_sensitivity_end_v1 r{};r.struct_size=sizeof(r); + switch(e.kind){case O::LpRangeEndKind::Finite:r.kind=GECODE_OPT_RANGE_FINITE; + if(!e.value||!std::isfinite(*e.value))throw O::ModelError("Malformed finite sensitivity endpoint");break; + case O::LpRangeEndKind::NegativeInfinity:r.kind=GECODE_OPT_RANGE_NEGATIVE_INFINITY;break; + case O::LpRangeEndKind::PositiveInfinity:r.kind=GECODE_OPT_RANGE_POSITIVE_INFINITY;break; + default:throw O::ModelError("Unknown sensitivity endpoint kind");} + if(e.kind!=O::LpRangeEndKind::Finite&&e.value)throw O::ModelError("Infinite endpoint has a numeric value");r.value=optional(e.value);return r; +} +gecode_opt_sensitivity_limiter_v1 sensitivity_limiter(const O::LpSensitivityLimiter& l){ + gecode_opt_sensitivity_limiter_v1 r{};r.struct_size=sizeof(r);r.entity=sensitivity_entity(l.entity);r.dual_condition=l.dual_condition; + switch(l.side){case O::LpSensitivitySide::Lower:r.side=GECODE_OPT_SENSITIVITY_LOWER;break; + case O::LpSensitivitySide::Upper:r.side=GECODE_OPT_SENSITIVITY_UPPER;break; + case O::LpSensitivitySide::Fixed:r.side=GECODE_OPT_SENSITIVITY_FIXED;break; + case O::LpSensitivitySide::Free:r.side=GECODE_OPT_SENSITIVITY_FREE;break; + default:throw O::ModelError("Unknown sensitivity limiter side");}return r; +} +gecode_opt_sensitivity_entry_v1 sensitivity_entry(const SensitivityBox& box,const O::LpSensitivityParameter& p,const O::LpSensitivityEntry* entry){ + gecode_opt_sensitivity_entry_v1 r{};r.struct_size=sizeof(r);r.request=sensitivity_request(p);r.group.struct_size=sizeof(r.group); + r.lower.struct_size=sizeof(r.lower);r.upper.struct_size=sizeof(r.upper);r.lower_limiter.struct_size=sizeof(r.lower_limiter); + r.upper_limiter.struct_size=sizeof(r.upper_limiter);r.checks.struct_size=sizeof(r.checks); + r.group.state=GECODE_OPT_SENSITIVITY_NOT_REQUESTED;r.group.reason=GECODE_OPT_SENSITIVITY_REASON_NOT_REQUESTED; + if(!entry)return r;r.requested=1;r.index=static_cast(entry-sensitivity(box).entries().data()); + r.group.state=sensitivity_state(entry->group.state);r.group.reason=sensitivity_reason(entry->group.reason); + if(box.cleanup_stopped){r.group.state=GECODE_OPT_SENSITIVITY_UNAVAILABLE;r.group.reason=GECODE_OPT_SENSITIVITY_REASON_STOPPED;return r;} + if(!entry->interval){if(entry->group.state==O::LpSensitivityState::Available)throw O::ModelError("Available sensitivity has no interval");return r;} + if(entry->group.state!=O::LpSensitivityState::Available)throw O::ModelError("Sensitivity interval is present without Available state"); + const auto& v=*entry->interval;r.has_interval=1;r.anchor=v.anchor;r.lower=sensitivity_end(v.lower);r.upper=sensitivity_end(v.upper); + r.objective_slope=optional(v.objective_slope);r.has_lower_limiter=v.lower_limiter.has_value();r.has_upper_limiter=v.upper_limiter.has_value(); + if(v.lower_limiter)r.lower_limiter=sensitivity_limiter(*v.lower_limiter);if(v.upper_limiter)r.upper_limiter=sensitivity_limiter(*v.upper_limiter); + r.checks.inequalities=v.checks.inequalities;r.checks.accepted=v.checks.accepted;r.checks.lower_direction_checked=v.checks.lower_direction_checked; + r.checks.upper_direction_checked=v.checks.upper_direction_checked;r.checks.max_endpoint_violation=optional(v.checks.max_endpoint_violation);return r; +} +std::optional sensitivity_stop(const std::shared_ptr& token,double seconds,Clock::time_point start){ + if(token&&token->cancelled())return O::Termination::Cancelled; + if(std::chrono::duration(Clock::now()-start).count()>=seconds)return O::Termination::TimeLimit;return {}; +} +const char* sensitivity_cleanup_message="Whole LP sensitivity binding allowance stopped during input cleanup"; +void sensitivity_failure(SensitivityBox& b,O::LpSensitivityReason reason,const char* message,std::optional stop={}){ + b.result.reason=reason;b.result.message=message;b.result.stop_reason=stop; + b.result.completion=stop?O::LpSensitivityCompletion::Interrupted:O::LpSensitivityCompletion::Rejected; +} +} +API(sensitivity_options_default,(gecode_opt_sensitivity_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));O::LpSensitivityOptions o;*out={};out->struct_size=sizeof(*out);out->backend=GECODE_OPT_AUTO; + out->time_limit_seconds=o.time_limit_seconds;out->checks=sensitivity_checks_options(o.checks);const auto& l=o.limits; + out->limits={sizeof(out->limits),0,l.max_rows,l.max_columns,l.max_nonzeros,l.max_requests,l.max_basis_solves,l.max_factor_entries,l.max_retained_slots,l.max_work}) +API(analyze_lp_sensitivity,(gecode_opt_handle h,const gecode_opt_sensitivity_options_v1* input,gecode_opt_handle* output), + const auto start=Clock::now();required(output);*output=0;auto source=get(h,Kind::LpObservedResult); + auto b=std::make_shared();b->source=std::move(source);b->result.model_id=b->source->result.model_id;b->result.revision=b->source->result.revision; + double seconds=std::numeric_limits::infinity();std::shared_ptr token;bool valid_options=false; + {auto o=sensitivity_options(input);seconds=o.time_limit_seconds;token=o.cancellation; + const auto n=input?count(input->request_count,input->requests):0;length(n); + try {o.checks.validate();if(std::isnan(seconds)||seconds<0)throw O::ModelError("Invalid sensitivity time limit"); + if(!n)throw O::ModelError("Sensitivity requires a nonempty explicit parameter list");valid_options=true; + } catch(const O::ModelError& e){sensitivity_failure(*b,O::LpSensitivityReason::InvalidSource,e.what());} + if(valid_options){ + if(const auto stop=sensitivity_stop(token,seconds,start))sensitivity_failure(*b,O::LpSensitivityReason::Stopped,"Sensitivity binding input preparation stopped",stop); + else if(n>o.limits.max_requests)sensitivity_failure(*b,O::LpSensitivityReason::ResourceLimit,"Sensitivity request limit exceeded before marshalling",O::Termination::MemoryLimit); + else if(n>o.limits.max_work)sensitivity_failure(*b,O::LpSensitivityReason::ResourceLimit,"Sensitivity work limit exceeded before marshalling",O::Termination::IterationLimit); + else {o.parameters.reserve(n); + for(std::size_t i=0;ipreparation_visits;o.parameters.push_back(sensitivity_request(input->requests[i]));} + if(o.parameters.size()==n){o.limits.max_work-=b->preparation_visits; + if(std::isfinite(seconds))o.time_limit_seconds=std::max(0.0,seconds-std::chrono::duration(Clock::now()-start).count()); + b->result=O::analyze_lp_sensitivity(*b->source,o);} + } + } + } + sensitivity_binding_checkpoint(); + if(valid_options)if(const auto stop=sensitivity_stop(token,seconds,start)){b->cleanup_stopped=true; + sensitivity_failure(*b,O::LpSensitivityReason::Stopped,sensitivity_cleanup_message,stop);} + b->result.elapsed_seconds=std::chrono::duration(Clock::now()-start).count();*output=put(Kind::SensitivityResult,std::move(b))) +API(sensitivity_destroy,(gecode_opt_handle h),destroy(h,Kind::SensitivityResult)) +API(sensitivity_copy_source_observed,(gecode_opt_handle h,gecode_opt_handle* output), + required(output);*output=0;auto b=get(h,Kind::SensitivityResult); + *output=put(Kind::LpObservedResult,std::make_shared(*b->source))) +API(sensitivity_copy_basis,(gecode_opt_handle h,gecode_opt_handle* output), + required(output);*output=0;auto b=get(h,Kind::SensitivityResult); + if(!b->result.sensitivity||!b->result.sensitivity->basis())throw ApiError{GECODE_OPT_NO_BASIS,"No selected sensitivity basis"}; + auto out=std::make_shared();out->basis=b->result.sensitivity->basis();*output=put(Kind::Basis,std::move(out))) +API(sensitivity_info,(gecode_opt_handle h,gecode_opt_sensitivity_info_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);const auto& r=b->result;*out={};out->struct_size=sizeof(*out); + out->model_id=r.model_id;out->revision=r.revision;out->completion=sensitivity_completion(r.completion);out->reason=sensitivity_reason(r.reason); + out->has_stop_reason=r.stop_reason.has_value();if(r.stop_reason)out->stop_reason=termination(*r.stop_reason);out->guarantee=GECODE_OPT_NUMERICAL; + out->has_sensitivity=bool(r.sensitivity);out->elapsed_seconds=r.elapsed_seconds; + if(r.sensitivity){const auto& s=*r.sensitivity;out->has_basis=bool(s.basis());out->entry_count=s.entries().size();out->factor_order_count=s.factor_order().size(); + out->row_slots=s.active_rows().size();out->column_slots=s.active_columns().size();}) +API(sensitivity_work,(gecode_opt_handle h,gecode_opt_sensitivity_work_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);const auto& w=b->result.work; + *out={sizeof(*out),0,w.factor_setup_attempted,0,w.basis_solves,w.coordinator_visits,w.retained_slots,b->preparation_visits}) +API(sensitivity_checks_options,(gecode_opt_handle h,gecode_opt_sensitivity_checks_options_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);*out=sensitivity_checks_options(sensitivity(*b).tolerances())) +API(sensitivity_reference_checks,(gecode_opt_handle h,gecode_opt_sensitivity_reference_checks_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);const auto& c=sensitivity(*b).checks();*out={};out->struct_size=sizeof(*out); + out->primal=evidence_validation(c.primal);out->basis_point_matches=c.basis_point_matches;out->max_point_difference=optional(c.max_point_difference); + out->max_system_residual=optional(c.max_system_residual);out->max_scaled_system_residual=optional(c.max_scaled_system_residual); + const auto& k=c.kkt;auto& r=out->kkt;r.struct_size=sizeof(r);r.primal_valid=k.primal_valid;r.dual_signs_valid=k.dual_signs_valid; + r.stationarity_valid=k.stationarity_valid;r.complementarity_valid=k.complementarity_valid;r.gap_valid=k.gap_valid;r.accepted=k.accepted; + r.max_dual_sign_violation=optional(k.max_dual_sign_violation);r.max_stationarity=optional(k.max_stationarity); + r.max_complementarity=optional(k.max_complementarity);r.dual_objective_estimate=optional(k.dual_objective_estimate);r.normalized_gap=optional(k.normalized_gap)) +API(sensitivity_entry,(gecode_opt_handle h,uint64_t index,gecode_opt_sensitivity_entry_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);const auto& e=at(sensitivity(*b).entries(),index);*out=sensitivity_entry(*b,e.parameter,&e)) +API(sensitivity_entries,(gecode_opt_handle h,gecode_opt_sensitivity_entry_v1* buffer,uint64_t element_size,uint64_t capacity,uint64_t* needed), + if(element_size!=sizeof(*buffer))argument("Sensitivity entry element size mismatch");auto b=get(h,Kind::SensitivityResult);const auto& es=sensitivity(*b).entries(); + if(output_array(buffer,capacity,needed,es.size()))for(std::size_t i=0;i(h,Kind::SensitivityResult);const auto v=variable(id); + *out=sensitivity_entry(*b,O::LpObjectiveParameter{v},sensitivity(*b).objective(v))) +API(sensitivity_equality_rhs,(gecode_opt_handle h,gecode_opt_id id,gecode_opt_sensitivity_entry_v1* out,uint64_t size), + size_check(out,size,sizeof(*out));auto b=get(h,Kind::SensitivityResult);const auto r=row(id); + *out=sensitivity_entry(*b,O::LpEqualityRhsParameter{r},sensitivity(*b).equality_rhs(r))) +API(sensitivity_factor_order,(gecode_opt_handle h,gecode_opt_id* buffer,uint64_t capacity,uint64_t* needed), + auto b=get(h,Kind::SensitivityResult);const auto& order=sensitivity(*b).factor_order(); + if(output_array(buffer,capacity,needed,order.size()))for(std::size_t i=0;i(h,Kind::SensitivityResult);const auto& s=sensitivity(*b); + if(kind!=GECODE_OPT_VARIABLE_ID&&kind!=GECODE_OPT_ROW_ID)argument("Sensitivity mask must select Variable or Row"); + const auto& mask=kind==GECODE_OPT_VARIABLE_ID?s.active_columns():s.active_rows(); + if(output_array(buffer,capacity,needed,mask.size()))for(std::size_t i=0;i(h,Kind::SensitivityResult);const std::string* value=nullptr; + if(field!=GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE&&field!=GECODE_OPT_SENSITIVITY_INTERVAL_MESSAGE&&index)argument("Sensitivity text index must be zero"); + switch(field){case GECODE_OPT_SENSITIVITY_MESSAGE:value=&b->result.message;break; + case GECODE_OPT_SENSITIVITY_BACKEND_VERSION:value=&sensitivity(*b).backend_version();break; + case GECODE_OPT_SENSITIVITY_PRIMAL_MESSAGE:value=&sensitivity(*b).checks().primal.message;break; + case GECODE_OPT_SENSITIVITY_KKT_MESSAGE:value=&sensitivity(*b).checks().kkt.message;break; + case GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE:case GECODE_OPT_SENSITIVITY_INTERVAL_MESSAGE:{const auto& e=at(sensitivity(*b).entries(),index); + if(b->cleanup_stopped){output_text(sensitivity_cleanup_message,buffer,capacity,needed);return;} + if(field==GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE)value=&e.group.message;else if(e.interval)value=&e.interval->checks.message;break;} + default:argument("Unknown sensitivity text field");}output_text(value?*value:std::string(),buffer,capacity,needed)) +#undef API diff --git a/gecode/optimize/c_api.h b/gecode/optimize/c_api.h new file mode 100644 index 0000000000..df350ad6d4 --- /dev/null +++ b/gecode/optimize/c_api.h @@ -0,0 +1,788 @@ +/* Version 1 C ABI. C99; no C++ headers or borrowed solver storage. */ +#ifndef GECODE_OPTIMIZE_C_API_H +#define GECODE_OPTIMIZE_C_API_H +#include +#if defined(_WIN32) +# if defined(GECODE_OPT_C_API_EXPORTS) +# define GECODE_OPT_API __declspec(dllexport) +# else +# define GECODE_OPT_API __declspec(dllimport) +# endif +#else +# define GECODE_OPT_API __attribute__((visibility("default"))) +#endif +#ifdef __cplusplus +# define GECODE_OPT_NOEXCEPT noexcept +extern "C" { +#else +# define GECODE_OPT_NOEXCEPT +#endif + +typedef uint64_t gecode_opt_handle; +enum { GECODE_OPT_VARIABLE_ID=1, GECODE_OPT_ROW_ID=2, + GECODE_OPT_GLOBAL_ID=3, GECODE_OPT_INDICATOR_ID=4 }; +typedef struct { uint64_t model_id; uint64_t slot; uint32_t kind, reserved; } gecode_opt_id; +typedef struct { gecode_opt_id variable; double coefficient; } gecode_opt_term; +typedef struct { gecode_opt_id variable; double value; } gecode_opt_start; + +enum { GECODE_OPT_OK=0, GECODE_OPT_INVALID_ARGUMENT=1, GECODE_OPT_INVALID_HANDLE=2, + GECODE_OPT_MODEL_ERROR=3, GECODE_OPT_OUT_OF_MEMORY=4, GECODE_OPT_INTERNAL_ERROR=5, + GECODE_OPT_BUFFER_TOO_SMALL=6, GECODE_OPT_NO_SOLUTION=7, GECODE_OPT_NO_OBSERVATIONS=8, GECODE_OPT_NO_BASIS=9 }; +enum { GECODE_OPT_CONTINUOUS=0, GECODE_OPT_INTEGER=1, GECODE_OPT_BINARY=2, + GECODE_OPT_SEMI_CONTINUOUS=3, GECODE_OPT_SEMI_INTEGER=4 }; +enum { GECODE_OPT_MINIMIZE=0, GECODE_OPT_MAXIMIZE=1 }; +enum { GECODE_OPT_AUTO=0, GECODE_OPT_HIGHS=1, GECODE_OPT_NATIVE=2 }; +enum { GECODE_OPT_NUMERICAL=0, GECODE_OPT_EXACT=1, GECODE_OPT_CERTIFIED=2 }; +enum { GECODE_OPT_UNKNOWN=0, GECODE_OPT_OPTIMAL=1, GECODE_OPT_INFEASIBLE=2, + GECODE_OPT_UNBOUNDED=3, GECODE_OPT_INFEASIBLE_OR_UNBOUNDED=4, GECODE_OPT_TIME_LIMIT=5, + GECODE_OPT_NODE_LIMIT=6, GECODE_OPT_MEMORY_LIMIT=7, GECODE_OPT_ITERATION_LIMIT=8, + GECODE_OPT_SOLUTION_LIMIT=9, GECODE_OPT_OBJECTIVE_LIMIT=10, GECODE_OPT_CANCELLED=11, + GECODE_OPT_NUMERICAL_FAILURE=12, GECODE_OPT_UNSUPPORTED=13, GECODE_OPT_INVALID_MODEL=14, + GECODE_OPT_BACKEND_ERROR=15 }; +enum { GECODE_OPT_OBJECTIVE=0, GECODE_OPT_BEST_BOUND=1, GECODE_OPT_ABSOLUTE_GAP=2, + GECODE_OPT_RELATIVE_GAP=3, GECODE_OPT_NATIVE_GAP=4 }; +enum { GECODE_OPT_BACKEND_NAME=0, GECODE_OPT_BACKEND_VERSION=1, GECODE_OPT_MESSAGE=2 }; + +typedef struct { + uint64_t struct_size; + int32_t backend, guarantee, threads, random_seed; + double time_limit_seconds, relative_gap, absolute_gap; + double feasibility_tolerance, integrality_tolerance; + uint64_t node_limit; + int32_t has_node_limit, reserved; + gecode_opt_handle cancellation; /* zero means no cancellation token */ + const gecode_opt_start* primal_start; + uint64_t primal_start_count; +} gecode_opt_options_v1; + +typedef struct { + uint64_t model_id, revision, variable_slots; + int32_t termination, guarantee, has_solution, solution_validated, start_submitted, reserved; + double elapsed_seconds; +} gecode_opt_result_info_v1; +typedef struct { + uint64_t solve_calls, model_loads, incremental_updates, unchanged_models; + uint64_t basis_warm_starts, incumbent_starts; +} gecode_opt_session_statistics_v1; + +/* Atomic bulk input records; exact struct_size and zero reserved required. + * Names are NUL-terminated UTF-8 (NULL means empty), copied during the call. + * CSR uses independent counts; names_count is zero or the row count. */ +typedef struct { + uint64_t struct_size; + int32_t type, reserved; + double lower, upper; + const char* name; +} gecode_opt_variable_spec_v1; +typedef struct { + uint64_t struct_size, reserved; + const gecode_opt_term* terms; + uint64_t term_count; + double lower, upper; + const char* name; +} gecode_opt_row_spec_v1; +typedef struct { + uint64_t struct_size, reserved; + const gecode_opt_id* columns; uint64_t columns_count; + const uint64_t* row_start; uint64_t row_start_count; + const uint64_t* column; uint64_t column_count; + const double* coefficient; uint64_t coefficient_count; + const double* lower; uint64_t lower_count; + const double* upper; uint64_t upper_count; + const char* const* names; uint64_t names_count; +} gecode_opt_sparse_row_batch_v1; + +/* Additive workflow records. No existing ABI-1 record changes layout. */ +typedef struct { int32_t present, reserved; double value; } gecode_opt_optional_number_v1; +enum { GECODE_OPT_POOL_INCOMPLETE=0, GECODE_OPT_POOL_REQUESTED_LIMIT=1, GECODE_OPT_POOL_EXHAUSTED=2 }; +enum { GECODE_OPT_RELAX_LOWER=0, GECODE_OPT_RELAX_UPPER=1 }; +enum { GECODE_OPT_REPAIR_MINIMUM_VIOLATION=0, GECODE_OPT_REPAIR_VIOLATION=1, + GECODE_OPT_REPAIR_ORIGINAL_OBJECTIVE=2 }; +enum { GECODE_OPT_REPAIR_MESSAGE=0, GECODE_OPT_REPAIR_WORKFLOW_MESSAGE=1, + GECODE_OPT_REPAIR_VALIDATION_MESSAGE=2, GECODE_OPT_REPAIR_ITEM_NAME=3, + GECODE_OPT_REPAIR_STAGE_NAME=4 }; +typedef struct { + uint64_t struct_size; + gecode_opt_options_v1 solve; + uint64_t max_solutions; + int32_t has_projection, reserved; + const gecode_opt_id* projection; + uint64_t projection_count; +} gecode_opt_pool_options_v1; +typedef struct { + uint64_t model_id, revision, projection_count, entry_count, attempt_count, ranked_prefix; + int32_t termination, completion, guarantee, reserved; + double elapsed_seconds; +} gecode_opt_pool_info_v1; +typedef struct { uint64_t projection_count; int32_t rank_established, reserved; } gecode_opt_pool_entry_info_v1; +typedef struct { + int32_t termination, guarantee, candidate_accepted, rank_established; + gecode_opt_optional_number_v1 objective, remaining_bound; +} gecode_opt_pool_attempt_info_v1; +typedef struct { + gecode_opt_id source; /* active Variable or Row identity */ + int32_t side, reserved; + double penalty; +} gecode_opt_relaxation_selection_v1; +typedef struct { + uint64_t struct_size; + gecode_opt_options_v1 solve; + const gecode_opt_relaxation_selection_v1* selections; + uint64_t selection_count; + int32_t optimize_original_objective, reserved; +} gecode_opt_repair_options_v1; +typedef struct { + uint64_t source_model_id, source_revision, private_model_id, private_revision; + uint64_t variable_slots, item_count, stage_count, completed_stages; + int32_t termination, guarantee, has_private_model, has_repair; + int32_t minimum_violation_established, original_objective_optimized; + int32_t workflow_termination, workflow_guarantee; + double elapsed_seconds, workflow_elapsed_seconds; +} gecode_opt_repair_info_v1; +typedef struct { + gecode_opt_id source, slack, penalty_row; + int32_t side, reserved; + double original_bound, penalty; + gecode_opt_optional_number_v1 activity, violation, weighted_violation, slack_value; +} gecode_opt_repair_item_info_v1; +typedef struct { + uint64_t index; + int32_t completed, reserved; + gecode_opt_optional_number_v1 retention_bound; +} gecode_opt_repair_stage_info_v1; +typedef struct { + int32_t valid, model_valid; + uint64_t violated_globals; + double max_bound_violation, max_row_violation, max_integrality_violation, max_indicator_violation; + gecode_opt_optional_number_v1 objective; +} gecode_opt_validation_info_v1; + +/* Distinct finite-box continuous QP input. Exact sizes and zero reserved fields + * are required. All square/term/name data is copied before an atomic objective + * replacement. Minimize adds positive weighted squares; maximize subtracts them. */ +typedef struct { + uint64_t struct_size, reserved; + const gecode_opt_term* terms; + uint64_t term_count; + double offset, weight; + const char* name; +} gecode_opt_weighted_square_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_options_v1 solve; + uint64_t iteration_limit, max_auxiliary_variables, max_lifted_nonzeros; + double stationarity_tolerance, complementarity_tolerance, optimality_tolerance; +} gecode_opt_quadratic_options_v1; +typedef struct { + gecode_opt_result_info_v1 result; + uint64_t qp_iterations; + double regularization; +} gecode_opt_quadratic_info_v1; +typedef struct { + int32_t primal_valid, objective_valid, kkt_available, kkt_valid, bound_valid, reserved; + gecode_opt_optional_number_v1 max_stationarity, max_complementarity; + gecode_opt_optional_number_v1 original_objective, normalized_lower_bound, gap_upper_bound; + uint64_t square_count, gradient_slots; /* complete arrays only if objective_valid */ +} gecode_opt_quadratic_checks_v1; +enum { GECODE_OPT_QP_VENDOR_OBJECTIVE=5, GECODE_OPT_QP_VENDOR_DUAL_ESTIMATE=6 }; +enum { GECODE_OPT_QP_CHECK_MESSAGE=3 }; +enum { GECODE_OPT_QP_SQUARE_RESIDUALS=0, GECODE_OPT_QP_ORIGINAL_GRADIENT=1 }; + +/* Tokens are process-local, typed, never reused. Destroy invalidates a token; + * already-running operations retain shared ownership and may complete. + * Every nonnull pointer must identify valid accessible C storage. Arrays are + * copied before solving. NULL arrays are accepted only with zero count. + * Outputs are caller-owned. API errors differ from solver termination codes. + * last_error is thread-local, valid until the next API call on that thread. + */ +GECODE_OPT_API uint32_t gecode_opt_v1_abi_version(void) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API const char* gecode_opt_v1_last_error(void) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_options_default(gecode_opt_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_capabilities(int32_t backend, int32_t* available, int32_t* lp, int32_t* mip) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_create(gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_identity(gecode_opt_handle, uint64_t* model_id, uint64_t* revision) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_read(const char* filename, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_write(gecode_opt_handle, const char* filename) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_variable(gecode_opt_handle, int32_t type, double lower, double upper, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_row(gecode_opt_handle, const gecode_opt_term*, uint64_t count, double lower, double upper, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +/* These mutations have NO size-query mode. Output capacity must cover the + * input count (CSR lower_count) before posting. NULL output is valid only for + * zero capacity/count. Errors leave model/revision/output elements unchanged. + * Nonempty success advances revision once; valid empty batches do not. + * Output storage must not overlap input arrays/records/names. */ +GECODE_OPT_API int32_t gecode_opt_v1_model_add_variables(gecode_opt_handle, const gecode_opt_variable_spec_v1*, uint64_t count, gecode_opt_id* output, uint64_t capacity) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_rows(gecode_opt_handle, const gecode_opt_row_spec_v1*, uint64_t count, gecode_opt_id* output, uint64_t capacity) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_rows_sparse(gecode_opt_handle, const gecode_opt_sparse_row_batch_v1*, gecode_opt_id* output, uint64_t capacity) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_objective(gecode_opt_handle, const gecode_opt_term*, uint64_t count, int32_t sense, double offset) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_variable_bounds(gecode_opt_handle, gecode_opt_id, double lower, double upper) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_row_bounds(gecode_opt_handle, gecode_opt_id, double lower, double upper) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_coefficient(gecode_opt_handle, gecode_opt_id row, gecode_opt_id variable, double value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_objective_coefficient(gecode_opt_handle, gecode_opt_id variable, double value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_objective_offset(gecode_opt_handle, double offset) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_variable_name(gecode_opt_handle, gecode_opt_id, const char*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_row_name(gecode_opt_handle, gecode_opt_id, const char*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_remove_variable(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_remove_row(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +/* Typed global records preserve aliases and explicit integer index bases. + * Table values are row-major; value_count must equal arity * tuple_count, + * including arity zero. Cumulative arrays have independently checked counts. */ +GECODE_OPT_API int32_t gecode_opt_v1_model_add_all_different(gecode_opt_handle, const gecode_opt_id* variables, uint64_t count, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_element(gecode_opt_handle, gecode_opt_id index, const gecode_opt_id* elements, uint64_t count, gecode_opt_id result, int64_t index_base, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_table(gecode_opt_handle, const gecode_opt_id* variables, uint64_t arity, const int64_t* values, uint64_t value_count, uint64_t tuple_count, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_cumulative(gecode_opt_handle, const gecode_opt_id* starts, uint64_t count, const int64_t* durations, uint64_t duration_count, const int64_t* heights, uint64_t height_count, int64_t capacity, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_circuit(gecode_opt_handle, const gecode_opt_id* successors, uint64_t count, int64_t index_base, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +/* Sparse deterministic automaton. States are zero based, symbols are signed + * exact integers within +/-2^53. Missing edges reject; duplicate (from,symbol) + * keys are invalid, even identical edges. Final-state duplicates are harmless. + * Empty words accept iff initial_state is final; repeated variables retain + * equality. All input arrays are copied. element_size and each struct_size + * must equal sizeof(gecode_opt_regular_transition_v1); reserved must be zero. + * A failed addition leaves the model unchanged and clears the output ID. */ +typedef struct { + uint64_t struct_size, reserved, from; + int64_t symbol; + uint64_t to; +} gecode_opt_regular_transition_v1; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_regular(gecode_opt_handle, const gecode_opt_id* variables, uint64_t variable_count, + uint64_t state_count, uint64_t initial_state, const gecode_opt_regular_transition_v1* transitions, uint64_t transition_count, + uint64_t transition_element_size, const uint64_t* final_states, uint64_t final_count, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_remove_global(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_set_global_name(gecode_opt_handle, gecode_opt_id, const char*) GECODE_OPT_NOEXCEPT; +/* Indicator posting is one atomic model edit. has_gate is 0/1 and gate is + * zeroed when absent. Generated rows remain private and protected. Removing + * the indicator removes its rows; a generated gate remains until removed. */ +GECODE_OPT_API int32_t gecode_opt_v1_model_add_indicator(gecode_opt_handle, gecode_opt_id activator, int32_t active_value, const gecode_opt_term*, uint64_t count, double lower, double upper, const char* name, gecode_opt_id* indicator, int32_t* has_gate, gecode_opt_id* gate) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_remove_indicator(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +/* Atomic ordinary-row posting; no helper handle/group removal is exposed. + * AND(empty)=true and OR(empty)=false; inputs/result must have Binary type. */ +GECODE_OPT_API int32_t gecode_opt_v1_model_add_boolean_and(gecode_opt_handle, gecode_opt_id result, const gecode_opt_id* inputs, uint64_t count, const char* name) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_model_add_boolean_or(gecode_opt_handle, gecode_opt_id result, const gecode_opt_id* inputs, uint64_t count, const char* name) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_cancellation_create(gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_cancellation_cancel(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_cancellation_is_cancelled(gecode_opt_handle, int32_t*) GECODE_OPT_NOEXCEPT; +/* Independent registry owner sharing the same thread-safe cancellation state. */ +GECODE_OPT_API int32_t gecode_opt_v1_cancellation_copy(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_cancellation_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_create(gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_reset(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_statistics(gecode_opt_handle, gecode_opt_session_statistics_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_solve(gecode_opt_handle model, const gecode_opt_options_v1*, gecode_opt_handle* result) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_solve(gecode_opt_handle session, gecode_opt_handle model, const gecode_opt_options_v1*, gecode_opt_handle* result) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_result_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_result_info(gecode_opt_handle, gecode_opt_result_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +/* present=0 and value=0 represent absence, never an ambiguous NaN sentinel. */ +GECODE_OPT_API int32_t gecode_opt_v1_result_number(gecode_opt_handle, int32_t field, int32_t* present, double* value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_result_value(gecode_opt_handle, gecode_opt_id variable, double* value) GECODE_OPT_NOEXCEPT; +/* Query with NULL buffer(s), capacity0. required includes the string NUL. + * Insufficient capacity writes no array/string elements. Deleted/missing + * values are zero with distinct active/present masks. */ +GECODE_OPT_API int32_t gecode_opt_v1_result_values(gecode_opt_handle, double* values, uint8_t* active, uint8_t* present, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_result_text(gecode_opt_handle, int32_t field, char* buffer, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* Original-coordinate continuous-LP observations. These additive symbols keep + * ABI version 1. No observed-result token implicitly converts to Result; use + * copy_result for a new independent owner. Group availability is independent + * of primal termination. Basis/duals are numerical observations, not proofs. + * NULL options use defaults; outer/nested sizes must match exactly and reserved + * fields must be zero. Output size arguments are exact sizeof(record); returned + * struct_size is populated and all reserved fields are zero. Bulk arrays include + * inactive historical slots; individual row/column lookups reject tombstones. + * Absent observation owners return NO_OBSERVATIONS for observation accessors. + * Buffer queries use NULL/capacity zero; short buffers receive no elements. */ +enum { GECODE_OPT_LP_NOT_REQUESTED=0, GECODE_OPT_LP_AVAILABLE=1, + GECODE_OPT_LP_UNAVAILABLE=2, GECODE_OPT_LP_REJECTED=3 }; +enum { GECODE_OPT_LP_REASON_NONE=0, GECODE_OPT_LP_REASON_NOT_REQUESTED=1, + GECODE_OPT_LP_REASON_UNSUPPORTED=2, GECODE_OPT_LP_REASON_NO_BACKEND_SOLVE=3, + GECODE_OPT_LP_REASON_NO_PRIMAL_POINT=4, GECODE_OPT_LP_REASON_NOT_OPTIMAL=5, + GECODE_OPT_LP_REASON_NO_DUAL_POINT=6, GECODE_OPT_LP_REASON_NO_BASIS=7, + GECODE_OPT_LP_REASON_ELIDED_CONSTANT_ROWS=8, GECODE_OPT_LP_REASON_INTERRUPTED=9, + GECODE_OPT_LP_REASON_INVALID_BACKEND_DATA=10, GECODE_OPT_LP_REASON_FAILED_CHECKS=11, + GECODE_OPT_LP_REASON_ALLOCATION_FAILURE=12, GECODE_OPT_LP_REASON_INVALID_MODEL=13 }; +enum { GECODE_OPT_LP_BASIS_LOWER=0, GECODE_OPT_LP_BASIS_BASIC=1, + GECODE_OPT_LP_BASIS_UPPER=2, GECODE_OPT_LP_BASIS_ZERO=3, + GECODE_OPT_LP_BASIS_NONBASIC_UNSPECIFIED=4 }; +enum { GECODE_OPT_LP_DUAL_NONE=0, GECODE_OPT_LP_DUAL_BACKEND=1, + GECODE_OPT_LP_DUAL_DERIVED_CONSTANT_ROW=2 }; +enum { GECODE_OPT_LP_PRIMAL_ROWS=0, GECODE_OPT_LP_DUAL_POINT=1, GECODE_OPT_LP_BASIS=2 }; +enum { GECODE_OPT_LP_BACKEND_NAME=0, GECODE_OPT_LP_BACKEND_VERSION=1, + GECODE_OPT_LP_PRIMAL_MESSAGE=2, GECODE_OPT_LP_DUAL_MESSAGE=3, + GECODE_OPT_LP_BASIS_MESSAGE=4, GECODE_OPT_LP_CHECK_MESSAGE=5 }; +enum { GECODE_OPT_LP_CAP_BACKEND=0, GECODE_OPT_LP_CAP_VERSION=1, GECODE_OPT_LP_CAP_LIMITATION=2 }; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_options_v1 solve; + int32_t duals, basis; + double dual_feasibility, stationarity, complementarity, objective_gap; +} gecode_opt_lp_options_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t available, duals, basis_export, reserved_flags; + uint64_t limitation_count; +} gecode_opt_lp_capabilities_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_result_info_v1 result; + int32_t has_observations, reserved_flags; + uint64_t model_id, revision, row_slots, column_slots; +} gecode_opt_lp_info_v1; +typedef struct { + uint64_t struct_size, reserved; + double dual_feasibility, stationarity, complementarity, objective_gap, primal_check_tolerance; + gecode_opt_optional_number_v1 backend_primal_tolerance, backend_dual_tolerance; +} gecode_opt_lp_metadata_v1; +typedef struct { uint64_t struct_size, reserved; int32_t state, reason; } gecode_opt_lp_group_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t active, dual_source, has_basis, basis; + gecode_opt_optional_number_v1 activity, lower_slack, upper_slack, dual; +} gecode_opt_lp_row_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t active, has_basis, basis, reserved_flags; + gecode_opt_optional_number_v1 reduced_cost; +} gecode_opt_lp_column_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t primal_valid, dual_signs_valid, stationarity_valid, complementarity_valid, + gap_valid, accepted; + gecode_opt_optional_number_v1 max_dual_sign_violation, max_stationarity, + max_complementarity, dual_objective_estimate, normalized_gap; +} gecode_opt_lp_checks_v1; +GECODE_OPT_API int32_t gecode_opt_v1_lp_capabilities(gecode_opt_lp_capabilities_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_capability_text(int32_t field, uint64_t index, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_options_default(gecode_opt_lp_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_solve_lp_observed(gecode_opt_handle model, const gecode_opt_lp_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_solve_lp_observed(gecode_opt_handle session, gecode_opt_handle model, const gecode_opt_lp_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_copy_result(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_info(gecode_opt_handle, gecode_opt_lp_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_metadata(gecode_opt_handle, gecode_opt_lp_metadata_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_group(gecode_opt_handle, int32_t group, gecode_opt_lp_group_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_checks(gecode_opt_handle, gecode_opt_lp_checks_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_row(gecode_opt_handle, gecode_opt_id, gecode_opt_lp_row_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_column(gecode_opt_handle, gecode_opt_id, gecode_opt_lp_column_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_rows(gecode_opt_handle, gecode_opt_lp_row_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_columns(gecode_opt_handle, gecode_opt_lp_column_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_observed_result_text(gecode_opt_handle, int32_t field, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* Owning LP basis submission. Factories copy source snapshots and require + * original-slot counts, with -1 only for inactive slots. Status buffers use + * VARIABLE_ID or ROW_ID as entity_kind. Empty arrays are valid for empty models. + * Factories do not solve; singularity may be repaired/rejected upon submission. + * Submission requires identical source identity/revision and active content. + * All options use the existing LP options layout. No primal_start is allowed. + * Solver termination and submission state are independent. Copied child tokens + * own their data and outlive every parent/model/session token. Absent requested + * basis returns NO_BASIS; a missing observation artifact is not an invalid token. + * Info outputs require exact size; reserved output fields are always zero. */ +enum { GECODE_OPT_BASIS_CALLER=0, GECODE_OPT_BASIS_OBSERVATIONS=1 }; +enum { GECODE_OPT_BASIS_NOT_ATTEMPTED=0, GECODE_OPT_BASIS_ACCEPTED=1, + GECODE_OPT_BASIS_REPAIRED=2, GECODE_OPT_BASIS_REJECTED=3, + GECODE_OPT_BASIS_INTERRUPTED=4 }; +typedef struct { + uint64_t struct_size, reserved, model_id, revision, row_slots, column_slots; + int32_t origin, reserved_flags; +} gecode_opt_basis_info_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_result_info_v1 result; + uint64_t requested_model_id, requested_revision; + int32_t has_requested_basis, state, backend_attempted, + has_statuses_changed, statuses_changed, reserved_flags; +} gecode_opt_basis_result_info_v1; +GECODE_OPT_API int32_t gecode_opt_v1_basis_from_observed(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_from_model(gecode_opt_handle, const int32_t* columns, uint64_t column_count, const int32_t* rows, uint64_t row_count, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_info(gecode_opt_handle, gecode_opt_basis_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_statuses(gecode_opt_handle, int32_t entity_kind, int32_t*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_row(gecode_opt_handle, gecode_opt_id, int32_t*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_column(gecode_opt_handle, gecode_opt_id, int32_t*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_solve_lp_with_basis(gecode_opt_handle model, gecode_opt_handle basis, const gecode_opt_lp_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_session_solve_lp_with_basis(gecode_opt_handle session, gecode_opt_handle model, gecode_opt_handle basis, const gecode_opt_lp_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_result_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_result_info(gecode_opt_handle, gecode_opt_basis_result_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_result_message(gecode_opt_handle, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_result_copy_observed(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_basis_result_copy_basis(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; + +/* Quadratic tokens never convert to ordinary Model or Result tokens. Every + * ordinary solve/session/workflow rejects a QP model token. NULL options use + * defaults. Unsupported solver policies remain explicit termination values. + * Info/check outputs require exact sizeof(record), like the other v1 outputs. + * Array queries follow result_values/text conventions above; absent complete + * objective evaluation yields zero array length, distinguished by objective_valid. + * QP result_number accepts ordinary scalar fields plus the two vendor fields. + * KKT residuals are absent unless kkt_available; bound/gap presence is explicit. + * gap_upper_bound cancels the objective offset before rounding and need not + * equal the scalar absolute_gap. Neither implies an Exact guarantee. */ +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_capabilities(int32_t* available) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_options_default(gecode_opt_quadratic_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_create(gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_identity(gecode_opt_handle, uint64_t* model_id, uint64_t* revision) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_add_continuous(gecode_opt_handle, double lower, double upper, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_add_row(gecode_opt_handle, const gecode_opt_term*, uint64_t count, double lower, double upper, const char* name, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_set_objective(gecode_opt_handle, const gecode_opt_weighted_square_v1*, uint64_t square_count, const gecode_opt_term* linear, uint64_t linear_count, int32_t sense, double offset) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_set_variable_bounds(gecode_opt_handle, gecode_opt_id, double lower, double upper) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_set_row_bounds(gecode_opt_handle, gecode_opt_id, double lower, double upper) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_set_coefficient(gecode_opt_handle, gecode_opt_id row, gecode_opt_id variable, double value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_remove_variable(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_model_remove_row(gecode_opt_handle, gecode_opt_id) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_solve(gecode_opt_handle model, const gecode_opt_quadratic_options_v1*, gecode_opt_handle* result) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_info(gecode_opt_handle, gecode_opt_quadratic_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_checks(gecode_opt_handle, gecode_opt_quadratic_checks_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_number(gecode_opt_handle, int32_t field, int32_t* present, double* value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_value(gecode_opt_handle, gecode_opt_id variable, double* value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_values(gecode_opt_handle, double* values, uint8_t* active, uint8_t* present, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_array(gecode_opt_handle, int32_t field, double* values, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_quadratic_result_text(gecode_opt_handle, int32_t field, char* buffer, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* Pools retain original slot identities. Entries return NEW owning Result + * tokens with Unknown termination and no original-model optimality bound. + * Attempt bounds refer to the remaining, restricted model, never the original. + * max_solutions stops enumeration without proving exhaustion. NULL options use + * defaults. has_projection=0 requires NULL projection and count zero. */ +GECODE_OPT_API int32_t gecode_opt_v1_pool_options_default(gecode_opt_pool_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_solve(gecode_opt_handle model, const gecode_opt_pool_options_v1*, gecode_opt_handle* pool) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_info(gecode_opt_handle, gecode_opt_pool_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_projection(gecode_opt_handle, gecode_opt_id*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_entry_info(gecode_opt_handle, uint64_t index, gecode_opt_pool_entry_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_entry_result(gecode_opt_handle, uint64_t index, gecode_opt_handle* result) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_entry_projection(gecode_opt_handle, uint64_t index, int64_t*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_attempt_info(gecode_opt_handle, uint64_t index, gecode_opt_pool_attempt_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_pool_message(gecode_opt_handle, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +/* Repairs never manufacture a feasible/optimal original-model Result. The + * final/stage Result tokens belong to the PRIVATE model and own independent + * copies, surviving repair/model destruction. Source values and validation + * are separate. Source-variable masks include historical deleted slots. + * Mapping supplies zero private IDs when no private model exists. */ +GECODE_OPT_API int32_t gecode_opt_v1_repair_options_default(gecode_opt_repair_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_solve(gecode_opt_handle model, const gecode_opt_repair_options_v1*, gecode_opt_handle* repair) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_info(gecode_opt_handle, gecode_opt_repair_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_number(gecode_opt_handle, int32_t field, int32_t* present, double* value) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_original_value(gecode_opt_handle, gecode_opt_id variable, double*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_original_values(gecode_opt_handle, double*, uint8_t* active, uint8_t* present, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_variable_map(gecode_opt_handle, gecode_opt_id* source, gecode_opt_id* private_ids, uint8_t* active, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_validation(gecode_opt_handle, gecode_opt_validation_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_item_info(gecode_opt_handle, uint64_t index, gecode_opt_repair_item_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_stage_info(gecode_opt_handle, uint64_t index, gecode_opt_repair_stage_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_stage_result(gecode_opt_handle, uint64_t index, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_final_result(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_violation_lock(gecode_opt_handle, int32_t* present, gecode_opt_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_repair_objective_values(gecode_opt_handle, double*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +/* index must be zero for message/workflow/validation fields; item/stage names + * require an in-range index. Strings/arrays use the same stable size protocol. */ +GECODE_OPT_API int32_t gecode_opt_v1_repair_text(gecode_opt_handle, int32_t field, uint64_t index, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* Owning serial scenario batches (ordinary linear models only). ABI 1 remains + * additive. No caller Session is mutated; materialize() is C++-only. */ +typedef struct { uint64_t batch_id, index; } gecode_opt_scenario_id; +enum { GECODE_OPT_SCENARIO_AUTOMATIC=0, GECODE_OPT_SCENARIO_COLD=1 }; +enum { GECODE_OPT_SCENARIO_REJECTED=0, GECODE_OPT_SCENARIO_INTERRUPTED=1, GECODE_OPT_SCENARIO_COMPLETE=2 }; +enum { GECODE_OPT_SCENARIO_NOT_STARTED=0, GECODE_OPT_SCENARIO_ATTEMPTED=1 }; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_id entity; + int32_t has_lower, has_upper; + double lower, upper; +} gecode_opt_scenario_bounds_v1; +typedef struct { + uint64_t struct_size, reserved; + const char* name; + const gecode_opt_term* objective_coefficients; + uint64_t objective_count; + gecode_opt_optional_number_v1 objective_offset; + const gecode_opt_scenario_bounds_v1* variable_bounds; + uint64_t variable_count; + const gecode_opt_scenario_bounds_v1* row_bounds; + uint64_t row_count; +} gecode_opt_scenario_definition_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_options_v1 solve; + int32_t reuse, reserved_flags; + uint64_t max_scenarios, max_patch_entries, max_saved_value_slots, max_work; +} gecode_opt_scenario_options_v1; +typedef struct { + uint64_t struct_size, reserved, model_id, revision, batch_id, scenario_count, outcome_count; + int32_t has_batch, completion, has_stop_reason, stop_reason; + int32_t has_offending_scenario, all_resolved; + uint64_t offending_scenario, attempted, resolved, work; + double elapsed_seconds; + gecode_opt_session_statistics_v1 reuse_statistics; +} gecode_opt_scenario_info_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_scenario_id scenario; + int32_t state, has_result, has_check, reserved_flags; + gecode_opt_result_info_v1 result; + gecode_opt_session_statistics_v1 reuse_delta; + double elapsed_seconds; +} gecode_opt_scenario_outcome_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t has_check, identity_valid, candidate_examined, objective_matches, exact_witness_validated, reserved_flags; + /* Meaningful only when candidate_examined; otherwise all zero/absent. */ + gecode_opt_validation_info_v1 validation; +} gecode_opt_scenario_check_v1; +typedef struct { + uint64_t struct_size, reserved, objective_count, variable_count, row_count; + gecode_opt_optional_number_v1 objective_offset; +} gecode_opt_scenario_definition_info_v1; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_options_default(gecode_opt_scenario_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +/* All definitions/arrays/names are copied before any solve. Input sizes must + * equal v1, reserved fields zero, presence flags exactly 0/1. */ +GECODE_OPT_API int32_t gecode_opt_v1_solve_scenarios(gecode_opt_handle model, const gecode_opt_scenario_definition_v1*, uint64_t count, uint64_t element_size, const gecode_opt_scenario_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_info(gecode_opt_handle, gecode_opt_scenario_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_id(gecode_opt_handle, uint64_t index, gecode_opt_scenario_id*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_outcome(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_scenario_outcome_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_check(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_scenario_check_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +/* Copy is an independent ordinary Result with PRIVATE owner/revision. Save a + * map() output to use its values after closing the batch; original IDs differ. */ +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_copy_result(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_map(gecode_opt_handle, gecode_opt_id original, gecode_opt_id* private_id) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_value(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_id original, double*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_message(gecode_opt_handle, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +enum { GECODE_OPT_SCENARIO_NAME=0, GECODE_OPT_SCENARIO_VALIDATION_MESSAGE=1 }; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_text(gecode_opt_handle, gecode_opt_scenario_id, int32_t field, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_definition(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_scenario_definition_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_objective(gecode_opt_handle, gecode_opt_scenario_id, gecode_opt_term*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +/* entity_kind selects VARIABLE_ID or ROW_ID. Query size with NULL/capacity 0; + * short buffers remain unchanged. Returned bounds have original source IDs. */ +GECODE_OPT_API int32_t gecode_opt_v1_scenario_batch_bounds(gecode_opt_handle, gecode_opt_scenario_id, int32_t entity_kind, gecode_opt_scenario_bounds_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* O3: additional-work numerical evidence. No source-model Result conversion. */ +enum { GECODE_OPT_NO_EVIDENCE=10 }; +enum { GECODE_OPT_EVIDENCE_AUTOMATIC=0, GECODE_OPT_EVIDENCE_PRIMAL_RAY=1, GECODE_OPT_EVIDENCE_FARKAS=2, GECODE_OPT_EVIDENCE_BOTH=3 }; +enum { GECODE_OPT_EVIDENCE_NOT_REQUESTED=0, GECODE_OPT_EVIDENCE_AVAILABLE=1, GECODE_OPT_EVIDENCE_UNAVAILABLE=2, GECODE_OPT_EVIDENCE_REJECTED=3 }; +enum { GECODE_OPT_EVIDENCE_REASON_NONE=0, GECODE_OPT_EVIDENCE_REASON_NOT_REQUESTED=1, + GECODE_OPT_EVIDENCE_REASON_UNSUPPORTED=2, GECODE_OPT_EVIDENCE_REASON_NO_FEASIBLE_BASE=3, + GECODE_OPT_EVIDENCE_REASON_NO_IMPROVEMENT=4, GECODE_OPT_EVIDENCE_REASON_NO_CONTRADICTION=5, + GECODE_OPT_EVIDENCE_REASON_STOPPED=6, GECODE_OPT_EVIDENCE_REASON_INVALID_BACKEND=7, + GECODE_OPT_EVIDENCE_REASON_FAILED_CHECKS=8, GECODE_OPT_EVIDENCE_REASON_INCONSISTENT=9, + GECODE_OPT_EVIDENCE_REASON_INVALID_MODEL=10, GECODE_OPT_EVIDENCE_REASON_RESOURCE_LIMIT=11, + GECODE_OPT_EVIDENCE_REASON_ALLOCATION=12 }; +enum { GECODE_OPT_EVIDENCE_COMPLETE=0, GECODE_OPT_EVIDENCE_INTERRUPTED=1, GECODE_OPT_EVIDENCE_ANALYSIS_REJECTED=2 }; +enum { GECODE_OPT_EVIDENCE_FEASIBLE_BASE=0, GECODE_OPT_EVIDENCE_RECESSION=1, GECODE_OPT_EVIDENCE_FARKAS_PHASE=2 }; +enum { GECODE_OPT_EVIDENCE_LOWER=0, GECODE_OPT_EVIDENCE_UPPER=1 }; +enum { GECODE_OPT_EVIDENCE_SOURCE_VARIABLE=0, GECODE_OPT_EVIDENCE_ROW_SIDE=1, GECODE_OPT_EVIDENCE_VARIABLE_SIDE=2 }; +enum { GECODE_OPT_EVIDENCE_PRIMAL_GROUP=0, GECODE_OPT_EVIDENCE_FARKAS_GROUP=1 }; +enum { GECODE_OPT_EVIDENCE_BASE_VALUE=0, GECODE_OPT_EVIDENCE_DIRECTION_VALUE=1 }; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_options_v1 solve; + int32_t request, reserved_flags; + double recession, stationarity, minimum_improvement, minimum_contradiction; + uint64_t max_auxiliary_variables, max_auxiliary_rows, max_auxiliary_nonzeros; + uint64_t max_retained_slots, max_work, max_auxiliary_solves; +} gecode_opt_evidence_options_v1; +typedef struct { + uint64_t struct_size, reserved, model_id, revision; + int32_t has_evidence, completion, has_stop_reason, stop_reason; + uint64_t row_slots, column_slots, stage_count, attempted_calls, work; + double elapsed_seconds; +} gecode_opt_evidence_info_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t state, reason; +} gecode_opt_evidence_group_v1; +typedef struct { + uint64_t struct_size, reserved; + double recession, stationarity, minimum_improvement, minimum_contradiction, primal_tolerance; +} gecode_opt_evidence_metadata_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t has_base_check, reserved_flags; + gecode_opt_validation_info_v1 base_check; + gecode_opt_optional_number_v1 direction_scale, normalized_objective_slope; + gecode_opt_optional_number_v1 max_variable_recession_violation, max_row_recession_violation; +} gecode_opt_evidence_primal_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_optional_number_v1 multiplier_scale, contradiction_margin, max_stationarity; +} gecode_opt_evidence_farkas_v1; +/* Diagnostic slots may remain populated after rejection. Group Available alone + * denotes accepted numerical evidence. Inactive/absent data has present=0. */ +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_id source; + int32_t active, has_side, side, reserved_flags; + gecode_opt_optional_number_v1 base_value, direction, multiplier, contribution, selected_bound; +} gecode_opt_evidence_slot_v1; +/* Explicitly reported raw auxiliary fields: never ordinary has_solution(). + * Integer termination/guarantee codes can be unknown malformed backend values. */ +typedef struct { + uint64_t struct_size, reserved, model_id, revision, value_count, mask_count; + int32_t termination_code, guarantee_code, reported_solution_validated, reported_start_submitted; + double elapsed_seconds; + gecode_opt_optional_number_v1 objective, best_bound, absolute_gap, relative_gap, native_gap; +} gecode_opt_evidence_raw_result_v1; +typedef struct { + uint64_t struct_size, reserved, index, private_model_id, private_revision, row_count, column_count, nonzeros; + int32_t phase, attempted, has_raw_result, candidate_examined; + gecode_opt_validation_info_v1 check; + gecode_opt_evidence_raw_result_v1 raw_result; +} gecode_opt_evidence_stage_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_id private_variable, source; + int32_t kind, has_side, side, reserved_flags; +} gecode_opt_evidence_column_v1; +typedef struct { + uint64_t struct_size, reserved, slot; + gecode_opt_optional_number_v1 reported_value; + int32_t has_reported_mask, reported_mask; +} gecode_opt_evidence_raw_value_v1; +GECODE_OPT_API int32_t gecode_opt_v1_evidence_options_default(gecode_opt_evidence_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_analyze_lp_evidence(gecode_opt_handle model, const gecode_opt_evidence_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_info(gecode_opt_handle, gecode_opt_evidence_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_group(gecode_opt_handle, int32_t group, gecode_opt_evidence_group_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_metadata(gecode_opt_handle, gecode_opt_evidence_metadata_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_primal(gecode_opt_handle, gecode_opt_evidence_primal_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_farkas(gecode_opt_handle, gecode_opt_evidence_farkas_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_slot(gecode_opt_handle, gecode_opt_id source, gecode_opt_evidence_slot_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_slots(gecode_opt_handle, int32_t entity_kind, gecode_opt_evidence_slot_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +/* These typed accepted getters additionally require effective Available. */ +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_value(gecode_opt_handle, gecode_opt_id source, int32_t field, double*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_multiplier(gecode_opt_handle, gecode_opt_id source, gecode_opt_evidence_slot_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +enum { GECODE_OPT_EVIDENCE_MESSAGE=0, GECODE_OPT_EVIDENCE_PRIMAL_MESSAGE=1, + GECODE_OPT_EVIDENCE_FARKAS_MESSAGE=2, GECODE_OPT_EVIDENCE_BASE_CHECK_MESSAGE=3 }; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_text(gecode_opt_handle, int32_t field, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +/* Independent owning typed child; no ordinary Result conversion. */ +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_copy_stage(gecode_opt_handle, uint64_t index, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_stage_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_stage_info(gecode_opt_handle, gecode_opt_evidence_stage_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_stage_columns(gecode_opt_handle, gecode_opt_evidence_column_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_stage_raw_values(gecode_opt_handle, gecode_opt_evidence_raw_value_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +enum { GECODE_OPT_EVIDENCE_RAW_BACKEND=0, GECODE_OPT_EVIDENCE_RAW_BACKEND_VERSION=1, + GECODE_OPT_EVIDENCE_RAW_MESSAGE=2, GECODE_OPT_EVIDENCE_STAGE_CHECK_MESSAGE=3 }; +GECODE_OPT_API int32_t gecode_opt_v1_lp_evidence_stage_text(gecode_opt_handle, int32_t field, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +/* Owning numerical sensitivity of the exact supplied O1 result and selected + * basis. No ordinary Result conversion, implicit solve, or replacement basis. + * All new records require exact sizes and zero reserved input fields. Requests + * are explicit/nonempty/unique. Infinity is an endpoint tag, not a parameter. + * Getters copy historical data and perform no factorization or solver work. + * Whole-operation stops revoke every interval, retaining source diagnostics. + * Valid unrequested lookup sets requested=0; foreign/deleted IDs are errors. */ +enum { GECODE_OPT_NO_SENSITIVITY=11 }; +enum { GECODE_OPT_SENSITIVITY_OBJECTIVE=0, GECODE_OPT_SENSITIVITY_EQUALITY_RHS=1 }; +enum { GECODE_OPT_SENSITIVITY_NOT_REQUESTED=0, GECODE_OPT_SENSITIVITY_AVAILABLE=1, + GECODE_OPT_SENSITIVITY_UNAVAILABLE=2, GECODE_OPT_SENSITIVITY_REJECTED=3 }; +enum { GECODE_OPT_SENSITIVITY_COMPLETE=0, GECODE_OPT_SENSITIVITY_PARTIAL=1, + GECODE_OPT_SENSITIVITY_INTERRUPTED=2, GECODE_OPT_SENSITIVITY_ANALYSIS_REJECTED=3 }; +enum { GECODE_OPT_SENSITIVITY_REASON_NONE=0, GECODE_OPT_SENSITIVITY_REASON_NOT_REQUESTED=1, + GECODE_OPT_SENSITIVITY_REASON_UNSUPPORTED=2, GECODE_OPT_SENSITIVITY_REASON_NOT_OPTIMAL=3, + GECODE_OPT_SENSITIVITY_REASON_NO_BASIS=4, GECODE_OPT_SENSITIVITY_REASON_INVALID_SOURCE=5, + GECODE_OPT_SENSITIVITY_REASON_INVALID_BASIS=6, GECODE_OPT_SENSITIVITY_REASON_CHANGED_BASIS=7, + GECODE_OPT_SENSITIVITY_REASON_REFERENCE_CHECKS=8, GECODE_OPT_SENSITIVITY_REASON_SYSTEM_CHECKS=9, + GECODE_OPT_SENSITIVITY_REASON_INTERVAL_CHECKS=10, GECODE_OPT_SENSITIVITY_REASON_RESOURCE_LIMIT=11, + GECODE_OPT_SENSITIVITY_REASON_STOPPED=12, GECODE_OPT_SENSITIVITY_REASON_ALLOCATION=13, + GECODE_OPT_SENSITIVITY_REASON_BACKEND=14 }; +enum { GECODE_OPT_RANGE_FINITE=0, GECODE_OPT_RANGE_NEGATIVE_INFINITY=1, + GECODE_OPT_RANGE_POSITIVE_INFINITY=2 }; +enum { GECODE_OPT_SENSITIVITY_LOWER=0, GECODE_OPT_SENSITIVITY_UPPER=1, + GECODE_OPT_SENSITIVITY_FIXED=2, GECODE_OPT_SENSITIVITY_FREE=3 }; +typedef struct { + uint64_t struct_size, reserved; + int32_t kind, reserved_flags; + gecode_opt_id entity; +} gecode_opt_sensitivity_request_v1; +typedef struct { + uint64_t struct_size, reserved; + double primal_feasibility, dual_feasibility, stationarity, complementarity, + objective_gap, system_absolute, system_relative; +} gecode_opt_sensitivity_checks_options_v1; +typedef struct { + uint64_t struct_size, reserved, max_rows, max_columns, max_nonzeros, max_requests, + max_basis_solves, max_factor_entries, max_retained_slots, max_work; +} gecode_opt_sensitivity_limits_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t backend, reserved_flags; + double time_limit_seconds; + gecode_opt_handle cancellation; + gecode_opt_sensitivity_checks_options_v1 checks; + gecode_opt_sensitivity_limits_v1 limits; + const gecode_opt_sensitivity_request_v1* requests; + uint64_t request_count; +} gecode_opt_sensitivity_options_v1; +typedef struct { + uint64_t struct_size, reserved, model_id, revision; + int32_t completion, reason, has_stop_reason, stop_reason, has_sensitivity, + has_basis, guarantee, reserved_flags; + uint64_t entry_count, factor_order_count, row_slots, column_slots; + double elapsed_seconds; +} gecode_opt_sensitivity_info_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t factor_setup_attempted, reserved_flags; + uint64_t basis_solves, coordinator_visits, retained_slots, preparation_visits; +} gecode_opt_sensitivity_work_v1; +typedef struct { uint64_t struct_size, reserved; int32_t state, reason; } gecode_opt_sensitivity_group_v1; +typedef struct { + uint64_t struct_size, reserved; + int32_t kind, reserved_flags; + gecode_opt_optional_number_v1 value; +} gecode_opt_sensitivity_end_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_id entity; + int32_t side, dual_condition; +} gecode_opt_sensitivity_limiter_v1; +typedef struct { + uint64_t struct_size, reserved, inequalities; + int32_t accepted, lower_direction_checked, upper_direction_checked, reserved_flags; + gecode_opt_optional_number_v1 max_endpoint_violation; +} gecode_opt_sensitivity_interval_checks_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_sensitivity_request_v1 request; + gecode_opt_sensitivity_group_v1 group; + uint64_t index; + int32_t requested, has_interval, has_lower_limiter, has_upper_limiter; + double anchor; + gecode_opt_sensitivity_end_v1 lower, upper; + gecode_opt_optional_number_v1 objective_slope; + gecode_opt_sensitivity_limiter_v1 lower_limiter, upper_limiter; + gecode_opt_sensitivity_interval_checks_v1 checks; +} gecode_opt_sensitivity_entry_v1; +typedef struct { + uint64_t struct_size, reserved; + gecode_opt_validation_info_v1 primal; + gecode_opt_lp_checks_v1 kkt; + int32_t basis_point_matches, reserved_flags; + gecode_opt_optional_number_v1 max_point_difference, max_system_residual, + max_scaled_system_residual; +} gecode_opt_sensitivity_reference_checks_v1; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_options_default(gecode_opt_sensitivity_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_analyze_lp_sensitivity(gecode_opt_handle observed, const gecode_opt_sensitivity_options_v1*, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_destroy(gecode_opt_handle) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_info(gecode_opt_handle, gecode_opt_sensitivity_info_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_work(gecode_opt_handle, gecode_opt_sensitivity_work_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_checks_options(gecode_opt_handle, gecode_opt_sensitivity_checks_options_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_reference_checks(gecode_opt_handle, gecode_opt_sensitivity_reference_checks_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_copy_source_observed(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_copy_basis(gecode_opt_handle, gecode_opt_handle*) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_entry(gecode_opt_handle, uint64_t index, gecode_opt_sensitivity_entry_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_entries(gecode_opt_handle, gecode_opt_sensitivity_entry_v1*, uint64_t element_size, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_objective(gecode_opt_handle, gecode_opt_id, gecode_opt_sensitivity_entry_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_equality_rhs(gecode_opt_handle, gecode_opt_id, gecode_opt_sensitivity_entry_v1*, uint64_t size) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_factor_order(gecode_opt_handle, gecode_opt_id*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_active_slots(gecode_opt_handle, int32_t entity_kind, uint8_t*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; +enum { GECODE_OPT_SENSITIVITY_MESSAGE=0, GECODE_OPT_SENSITIVITY_BACKEND_VERSION=1, + GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE=2, GECODE_OPT_SENSITIVITY_INTERVAL_MESSAGE=3, + GECODE_OPT_SENSITIVITY_PRIMAL_MESSAGE=4, GECODE_OPT_SENSITIVITY_KKT_MESSAGE=5 }; +GECODE_OPT_API int32_t gecode_opt_v1_sensitivity_text(gecode_opt_handle, int32_t field, uint64_t index, char*, uint64_t capacity, uint64_t* required) GECODE_OPT_NOEXCEPT; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/gecode/optimize/constraints.cpp b/gecode/optimize/constraints.cpp new file mode 100644 index 0000000000..02047f30ba --- /dev/null +++ b/gecode/optimize/constraints.cpp @@ -0,0 +1,407 @@ +#include + +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +constexpr double infinity = std::numeric_limits::infinity(); + +void bounds(double lower, double upper) { + if (std::isnan(lower) || std::isnan(upper) || lower == infinity || + upper == -infinity || lower > upper) + throw ModelError("Invalid indicator lower/upper bounds"); +} + +double effective_lower(const VariableData& variable) { + return variable.type == VariableType::SemiContinuous || + variable.type == VariableType::SemiInteger ? 0.0 : variable.lower; +} + +double outward(double value, bool up) { + if (!std::isfinite(value)) + throw ModelError("Indicator activity/M overflow; tighten domains or rescale the model"); + const double result = std::nextafter(value, up ? infinity : -infinity); + if (!std::isfinite(result)) + throw ModelError("Indicator activity/M cannot be enclosed finitely; rescale the model"); + return result; +} + +double add_bound(double a, double b, bool up) { + if (a == 0.0) return b; + if (b == 0.0) return a; + if (a == -b) return 0.0; + return outward(a + b, up); +} + +double product_bound(double coefficient, double endpoint, bool up) { + if (!std::isfinite(endpoint)) + throw ModelError("Indicator needs a finite inactive-domain activity bound; tighten the relevant variable bounds"); + if (endpoint == 0.0) return 0.0; + if (endpoint == 1.0) return coefficient; + if (endpoint == -1.0) return -coefficient; + if (coefficient == 1.0) return endpoint; + if (coefficient == -1.0) return -endpoint; + return outward(coefficient * endpoint, up); +} + +struct Derived { + std::optional lower_m; + std::optional upper_m; +}; + +Derived derive(const IndicatorData& data) { + Derived result; + for (bool upper : {false, true}) { + const double bound = upper ? data.upper : data.lower; + if (!std::isfinite(bound)) continue; + double activity = 0.0; + std::size_t domain = 0; + for (const auto& term : data.terms) { + double lower, higher; + if (term.variable == data.activator) { + lower = higher = data.active_value ? 0.0 : 1.0; + } else { + if (domain >= data.domains.size() || data.domains[domain].variable != term.variable) + throw ModelError("Indicator domain dependencies do not match original terms"); + lower = data.domains[domain].lower; + higher = data.domains[domain].upper; + ++domain; + } + const bool use_upper = (term.coefficient > 0.0) == upper; + const double contribution = product_bound(term.coefficient, + use_upper ? higher : lower, upper); + activity = add_bound(activity, contribution, upper); + } + double m = 0.0; + if (upper ? activity > bound : bound > activity) + m = upper ? add_bound(activity, -bound, true) : add_bound(bound, -activity, true); + if (upper) result.upper_m = m; + else result.lower_m = m; + } + return result; +} + +bool needs_gate(const IndicatorData& data) { + return data.lower_m.value_or(0.0) > 0.0 || data.upper_m.value_or(0.0) > 0.0; +} + +struct LoweredRow { + std::vector terms; + double lower; + double upper; + const char* suffix; +}; + +std::vector lower_rows(const IndicatorData& data) { + std::vector result; + if (data.inactive_gate) { + std::vector terms{{data.activator, data.active_value ? 1.0 : -1.0}, + {*data.inactive_gate, 1.0}}; + std::sort(terms.begin(), terms.end(), [](const Term& a, const Term& b) { + return a.variable.id < b.variable.id; + }); + const double rhs = data.active_value ? 1.0 : 0.0; + result.push_back({std::move(terms), rhs, rhs, "gate"}); + } + for (bool upper : {false, true}) { + const auto& m = upper ? data.upper_m : data.lower_m; + if (!m) continue; + auto terms = data.terms; + if (*m > 0.0) { + if (!data.inactive_gate) throw ModelError("Indicator M requires an inactive gate"); + terms.push_back({*data.inactive_gate, upper ? -*m : *m}); + std::sort(terms.begin(), terms.end(), [](const Term& a, const Term& b) { + return a.variable.id < b.variable.id; + }); + } + result.push_back({std::move(terms), upper ? -infinity : data.lower, + upper ? data.upper : infinity, upper ? "upper" : "lower"}); + } + return result; +} + +bool same_terms(const std::vector& a, const std::vector& b) { + if (a.size() != b.size()) return false; + for (std::size_t i = 0; i < a.size(); ++i) + if (a[i].variable != b[i].variable || a[i].coefficient != b[i].coefficient) + return false; + return true; +} + +const VariableData& checked_variable(const ModelSnapshot& model, Variable handle, + bool active = true) { + if (handle.model_id != model.model_id || handle.id >= model.variables.size() || + (active && !model.variables[static_cast(handle.id)].active)) + throw ModelError("Indicator references a foreign, absent, or deleted variable"); + return model.variables[static_cast(handle.id)]; +} + +void require_binary(const VariableData& variable) { + if (variable.type != VariableType::Binary) + throw ModelError("Logical helpers require Binary variables; use add_binary"); +} +} // namespace + +namespace Detail { + +/** Private two-phase append: allocations complete before any observable change. */ +class ConstraintBatch { + Model& model_; + std::vector variables_; + std::vector rows_; + std::vector indicators_; + + template + struct Append { + std::vector& target; + std::vector& additions; + std::vector replacement; + bool replace = false; + Append(std::vector& target, std::vector& additions) + : target(target), additions(additions) { + static_assert(std::is_nothrow_move_constructible::value, "Commit must not throw"); + if (additions.size() > target.max_size() - target.size()) + throw ModelError("Logical formulation exceeds container limits"); + const auto desired = target.size() + additions.size(); + if (desired <= target.capacity()) return; + replace = true; + const auto extra = std::min(target.size(), target.max_size() - target.size()); + replacement.reserve(std::max(desired, target.size() + extra)); + replacement.insert(replacement.end(), target.begin(), target.end()); + for (auto& value : additions) replacement.push_back(std::move(value)); + } + void commit() noexcept { + if (replace) target.swap(replacement); + else for (auto& value : additions) target.push_back(std::move(value)); + } + }; + +public: + explicit ConstraintBatch(Model& model) : model_(model) { + model_.require_revision_capacity(); + } + std::vector normalize(const std::vector& terms) const { + return model_.normalize(terms, &variables_); + } + Variable binary(std::string name, Indicator origin) { + if (variables_.size() >= std::numeric_limits::max() - model_.variables_.size()) + throw ModelError("Variable slot space exhausted"); + Variable handle{model_.id(), static_cast(model_.variables_.size() + variables_.size())}; + variables_.push_back({handle, VariableType::Binary, 0.0, 1.0, std::move(name), true, origin}); + return handle; + } + Indicator indicator_handle() const { + if (indicators_.size() >= std::numeric_limits::max() - model_.indicators_.size()) + throw ModelError("Indicator slot space exhausted"); + return {model_.id(), static_cast(model_.indicators_.size() + indicators_.size())}; + } + Constraint row(const std::vector& terms, double lower, double upper, + std::string name, std::optional origin = {}) { + bounds(lower, upper); + if (rows_.size() >= std::numeric_limits::max() - model_.rows_.size()) + throw ModelError("Constraint slot space exhausted"); + auto normalized = normalize(terms); + Constraint handle{model_.id(), static_cast(model_.rows_.size() + rows_.size())}; + rows_.push_back({handle, std::move(normalized), lower, upper, std::move(name), true, origin}); + return handle; + } + void indicator(IndicatorData data) { indicators_.push_back(std::move(data)); } + void commit() { + if (variables_.empty() && rows_.empty() && indicators_.empty()) return; + model_.require_revision_capacity(); + Append variables(model_.variables_, variables_); + Append rows(model_.rows_, rows_); + Append indicators(model_.indicators_, indicators_); + variables.commit(); + rows.commit(); + indicators.commit(); + ++model_.revision_; + } + static void remove(Model& model, Indicator handle) { + model.require_revision_capacity(); + if (handle.model_id != model.id() || handle.id >= model.indicators_.size() || + !model.indicators_[static_cast(handle.id)].active) + throw ModelError("Indicator handle is foreign, invalid, or removed"); + auto& data = model.indicators_[static_cast(handle.id)]; + for (auto row : data.generated_rows) { + auto& generated = model.rows_[static_cast(row.id)]; + generated.active = false; + generated.terms.clear(); + } + data.active = false; + ++model.revision_; + } +}; + +void validate_indicators(const ModelSnapshot& model) { + std::set owned_rows; + std::set owned_gates; + for (std::size_t i = 0; i < model.indicators.size(); ++i) { + const auto& data = model.indicators[i]; + if (data.indicator.model_id != model.model_id || data.indicator.id != i) + throw ModelError("Indicator identity does not match its model/slot"); + if (data.inactive_gate) { + const auto& gate = checked_variable(model, *data.inactive_gate, data.active); + if (!owned_gates.insert(data.inactive_gate->id).second || !gate.indicator_origin || + gate.indicator_origin->model_id != model.model_id || gate.indicator_origin->id != i) + throw ModelError("Indicator gate identity is invalid, shared, or missing its origin"); + } + for (auto handle : data.generated_rows) { + if (handle.model_id != model.model_id || handle.id >= model.rows.size() || + !owned_rows.insert(handle.id).second) + throw ModelError("Indicator generated row identity is invalid or duplicated"); + const auto& row = model.rows[static_cast(handle.id)]; + if (!row.indicator_origin || row.indicator_origin->model_id != model.model_id || + row.indicator_origin->id != i || row.active != data.active) + throw ModelError("Indicator/generated row lifecycle mismatch"); + } + if (!data.active) continue; + require_binary(checked_variable(model, data.activator)); + bounds(data.lower, data.upper); + std::optional previous; + std::size_t domain = 0; + for (const auto& term : data.terms) { + const auto& variable = checked_variable(model, term.variable); + if (!std::isfinite(term.coefficient) || term.coefficient == 0.0 || + (previous && term.variable.id <= *previous)) + throw ModelError("Indicator original terms are not canonical"); + previous = term.variable.id; + if (term.variable == data.activator) continue; + if (domain >= data.domains.size() || data.domains[domain].variable != term.variable) + throw ModelError("Indicator domain dependencies do not match original terms"); + const auto& captured = data.domains[domain++]; + bounds(captured.lower, captured.upper); + if (effective_lower(variable) < captured.lower || variable.upper > captured.upper) + throw ModelError("Model bounds exceed the domains used by an indicator; rebuild the formulation"); + } + if (domain != data.domains.size()) + throw ModelError("Indicator has unrelated domain dependencies"); + const auto required = derive(data); + for (bool upper : {false, true}) { + const auto& supplied = upper ? data.upper_m : data.lower_m; + const auto& minimum = upper ? required.upper_m : required.lower_m; + if (supplied.has_value() != minimum.has_value() || + (supplied && (!std::isfinite(*supplied) || *supplied < *minimum))) + throw ModelError("Indicator M does not safely relax the captured inactive domain"); + } + if (data.inactive_gate.has_value() != needs_gate(data)) + throw ModelError("Indicator inactive gate does not match its relaxation"); + if (data.inactive_gate) { + const auto& gate = checked_variable(model, *data.inactive_gate); + require_binary(gate); + if (gate.lower != 0.0 || gate.upper != 1.0 || + *data.inactive_gate == data.activator || + std::any_of(data.terms.begin(), data.terms.end(), [&](const Term& term) { + return term.variable == *data.inactive_gate; + })) + throw ModelError("Indicator gate is aliased or its domain has changed"); + } + const auto expected = lower_rows(data); + if (expected.size() != data.generated_rows.size()) + throw ModelError("Indicator is missing generated rows"); + for (std::size_t r = 0; r < expected.size(); ++r) { + const auto& row = model.rows[static_cast(data.generated_rows[r].id)]; + if (row.lower != expected[r].lower || row.upper != expected[r].upper || + !same_terms(row.terms, expected[r].terms)) + throw ModelError("Indicator generated row no longer matches its original meaning"); + } + } + for (const auto& row : model.rows) + if (row.indicator_origin && owned_rows.count(row.constraint.id) == 0) + throw ModelError("Generated indicator row is missing its original metadata"); + for (const auto& variable : model.variables) + if (variable.indicator_origin && owned_gates.count(variable.variable.id) == 0) + throw ModelError("Generated indicator gate is missing its original metadata"); +} +} // namespace Detail + +IndicatorFormulation add_indicator(Model& model, Variable activator, + bool active_value, const std::vector& terms, + double lower, double upper, std::string name) { + Detail::ConstraintBatch batch(model); + require_binary(model.variable(activator)); + bounds(lower, upper); + IndicatorData data; + data.indicator = batch.indicator_handle(); + data.activator = activator; + data.active_value = active_value; + data.terms = batch.normalize(terms); + data.lower = lower; + data.upper = upper; + if (!std::isfinite(lower) && !std::isfinite(upper)) data.terms.clear(); + for (const auto& term : data.terms) + if (term.variable != activator) { + const auto& variable = model.variable(term.variable); + data.domains.push_back({term.variable, effective_lower(variable), variable.upper}); + } + const auto derived = derive(data); + data.lower_m = derived.lower_m; + data.upper_m = derived.upper_m; + const std::string prefix = name.empty() ? "indicator_" + std::to_string(data.indicator.id) : name; + if (needs_gate(data)) data.inactive_gate = batch.binary(prefix + "_inactive", data.indicator); + for (const auto& row : lower_rows(data)) + data.generated_rows.push_back(batch.row(row.terms, row.lower, row.upper, + prefix + "_" + row.suffix, data.indicator)); + IndicatorFormulation result{data.indicator, data.inactive_gate, data.generated_rows, + data.lower_m, data.upper_m}; + batch.indicator(std::move(data)); + batch.commit(); + return result; +} + +void remove_indicator(Model& model, Indicator indicator) { + Detail::ConstraintBatch::remove(model, indicator); +} + +namespace { +std::vector boolean(Model& model, Variable result, + std::vector inputs, bool conjunction, + std::string name) { + Detail::ConstraintBatch batch(model); + require_binary(model.variable(result)); + for (auto input : inputs) require_binary(model.variable(input)); + std::sort(inputs.begin(), inputs.end(), [](Variable a, Variable b) { return a.id < b.id; }); + inputs.erase(std::unique(inputs.begin(), inputs.end()), inputs.end()); + if (inputs.size() > 9007199254740991ULL) + throw ModelError("Boolean cardinality exceeds exact double integer range"); + const std::string prefix = name.empty() ? (conjunction ? "and" : "or") : name; + std::vector rows; + if (inputs.empty()) { + const double value = conjunction ? 1.0 : 0.0; + rows.push_back(batch.row({{result, 1.0}}, value, value, prefix + "_empty")); + } else if (inputs.size() == 1) { + rows.push_back(batch.row({{result, 1.0}, {inputs.front(), -1.0}}, 0, 0, prefix + "_equal")); + } else { + for (std::size_t i = 0; i < inputs.size(); ++i) + rows.push_back(batch.row({{result, 1.0}, {inputs[i], -1.0}}, + conjunction ? -infinity : 0.0, + conjunction ? 0.0 : infinity, + prefix + "_input_" + std::to_string(i))); + std::vector aggregate{{result, 1.0}}; + for (auto input : inputs) aggregate.push_back({input, -1.0}); + rows.push_back(batch.row(aggregate, + conjunction ? 1.0 - static_cast(inputs.size()) : -infinity, + conjunction ? infinity : 0.0, prefix + "_aggregate")); + } + batch.commit(); + return rows; +} +} // namespace + +std::vector add_boolean_and(Model& model, Variable result, + const std::vector& inputs, + std::string name) { + return boolean(model, result, inputs, true, std::move(name)); +} +std::vector add_boolean_or(Model& model, Variable result, + const std::vector& inputs, + std::string name) { + return boolean(model, result, inputs, false, std::move(name)); +} + +}} diff --git a/gecode/optimize/constraints.hpp b/gecode/optimize/constraints.hpp new file mode 100644 index 0000000000..74059f77cd --- /dev/null +++ b/gecode/optimize/constraints.hpp @@ -0,0 +1,51 @@ +/* Logical modeling helpers with explicit original-model semantics. */ +#ifndef GECODE_OPTIMIZE_CONSTRAINTS_HPP +#define GECODE_OPTIMIZE_CONSTRAINTS_HPP + +#include + +namespace Gecode { namespace Optimize { + +struct IndicatorFormulation { + Indicator indicator; + std::optional inactive_gate; + std::vector rows; + std::optional lower_m; + std::optional upper_m; +}; + +/** + * Add activator == active_value => lower <= sum(terms) <= upper. + * The activator must have Binary type. Every required inactive activity bound + * must be finite. M is derived conservatively; no guessed constant is used. + * The returned gate keeps original coefficients and row bounds unchanged. + * Original logical metadata is retained for independent solution validation. + * Successful posting is one revision; errors leave the model unchanged. + */ +IndicatorFormulation add_indicator(Model& model, Variable activator, + bool active_value, + const std::vector& terms, + double lower, double upper, + std::string name = {}); + +/** Remove logical metadata and all its generated rows in one revision. + * The auxiliary gate remains a model variable and can be removed once unused. + */ +void remove_indicator(Model& model, Indicator indicator); + +/** result == AND(inputs); AND(empty) is true. All variables must be Binary. */ +std::vector add_boolean_and(Model& model, Variable result, + const std::vector& inputs, + std::string name = {}); +/** result == OR(inputs); OR(empty) is false. All variables must be Binary. */ +std::vector add_boolean_or(Model& model, Variable result, + const std::vector& inputs, + std::string name = {}); + +namespace Detail { +/** Structural validation of untrusted original indicator metadata/lowerings. */ +void validate_indicators(const ModelSnapshot& model); +} + +}} +#endif diff --git a/gecode/optimize/diagnostics.cpp b/gecode/optimize/diagnostics.cpp new file mode 100644 index 0000000000..b437952012 --- /dev/null +++ b/gecode/optimize/diagnostics.cpp @@ -0,0 +1,306 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +constexpr double infinity = std::numeric_limits::infinity(); + +std::vector partition(const ModelSnapshot& model) { + std::vector parent(model.variables.size()); + std::iota(parent.begin(), parent.end(), 0); + auto root = [&](std::size_t i) { + while (parent[i] != i) { parent[i] = parent[parent[i]]; i = parent[i]; } + return i; + }; + auto join = [&](Variable a, Variable b) { + const auto x = root(a.id), y = root(b.id); + parent[std::max(x, y)] = std::min(x, y); + }; + std::vector guarded(model.variables.size(), false); + std::vector generated(model.rows.size(), false); + for (const auto& indicator : model.indicators) if (indicator.active) { + guarded[indicator.activator.id] = true; + auto include = [&](Variable variable) { + guarded[variable.id] = true; + join(indicator.activator, variable); + }; + if (indicator.inactive_gate) include(*indicator.inactive_gate); + for (const auto& term : indicator.terms) include(term.variable); + for (auto row : indicator.generated_rows) generated[row.id] = true; + } + std::vector groups; + for (const auto& row : model.rows) if (row.active && !generated[row.constraint.id]) { + ConflictGroup group; + group.kind = ConflictGroupKind::Row; + group.row = row.constraint; + group.name = row.name.empty() ? "row " + std::to_string(row.constraint.id) : row.name; + groups.push_back(std::move(group)); + } + for (const auto& variable : model.variables) { + if (!variable.active || guarded[variable.variable.id]) continue; + auto append = [&](ConflictGroupKind kind, const char* suffix) { + ConflictGroup group; + group.kind = kind; + group.variable = variable.variable; + group.name = (variable.name.empty() ? "variable " + std::to_string(variable.variable.id) + : variable.name) + suffix; + groups.push_back(std::move(group)); + }; + if (variable.type == VariableType::Binary || variable.type == VariableType::SemiContinuous || + variable.type == VariableType::SemiInteger) { + append(ConflictGroupKind::VariableDomain, " domain"); + } else { + if (std::isfinite(variable.lower)) append(ConflictGroupKind::LowerBound, " lower bound"); + if (std::isfinite(variable.upper)) append(ConflictGroupKind::UpperBound, " upper bound"); + if (variable.type == VariableType::Integer) append(ConflictGroupKind::Integrality, " integrality"); + } + } + std::map components; + for (const auto& indicator : model.indicators) if (indicator.active) { + auto& group = components[root(indicator.activator.id)]; + group.kind = ConflictGroupKind::IndicatorComponent; + group.indicators.push_back(indicator.indicator); + group.generated_rows.insert(group.generated_rows.end(), indicator.generated_rows.begin(), + indicator.generated_rows.end()); + } + for (const auto& variable : model.variables) if (guarded[variable.variable.id]) + components.at(root(variable.variable.id)).grouped_variables.push_back(variable.variable); + for (auto& entry : components) { + auto& group = entry.second; + group.name = "indicator component " + std::to_string(group.indicators.front().id); + groups.push_back(std::move(group)); + } + return groups; +} + +void relax(ModelSnapshot& model, const ConflictGroup& group) { + auto free_domain = [&](Variable handle) { + auto& variable = model.variables[handle.id]; + variable.type = VariableType::Continuous; + variable.lower = -infinity; + variable.upper = infinity; + }; + auto erase_row = [&](Constraint handle) { + auto& row = model.rows[handle.id]; + row.active = false; + row.terms.clear(); + }; + switch (group.kind) { + case ConflictGroupKind::Row: erase_row(*group.row); break; + case ConflictGroupKind::LowerBound: model.variables[group.variable->id].lower = -infinity; break; + case ConflictGroupKind::UpperBound: model.variables[group.variable->id].upper = infinity; break; + case ConflictGroupKind::Integrality: model.variables[group.variable->id].type = VariableType::Continuous; break; + case ConflictGroupKind::VariableDomain: free_domain(*group.variable); break; + case ConflictGroupKind::IndicatorComponent: + for (auto indicator : group.indicators) model.indicators[indicator.id].active = false; + for (auto row : group.generated_rows) erase_row(row); + for (auto variable : group.grouped_variables) free_domain(variable); + break; + } +} + +ModelSnapshot subset(const ModelSnapshot& original, const std::vector& groups, + const std::vector& kept) { + ModelSnapshot model = original; + model.objective = {}; + for (std::size_t i = 0; i < groups.size(); ++i) if (!kept[i]) relax(model, groups[i]); + return model; +} + +enum class Decision { Unknown, Feasible, Infeasible }; + +ConflictStatus stopped_status(const ConflictResult& result, Termination reason) { + if (result.infeasibility_established) return ConflictStatus::Incomplete; + if (reason == Termination::Unsupported) return ConflictStatus::Unsupported; + if (reason == Termination::InvalidModel) return ConflictStatus::InvalidModel; + if (reason == Termination::BackendError || reason == Termination::NumericalFailure || + reason == Termination::MemoryLimit) return ConflictStatus::Error; + return ConflictStatus::Unknown; +} + +ConflictResult run(const ModelSnapshot& original, const ConflictOptions& options, SolveBudget& budget) { + ConflictResult output; + output.model_id = original.model_id; + output.revision = original.revision; + std::vector groups; + std::vector kept; + auto stop = [&](Termination reason, std::string message) { + output.termination = reason; + output.status = stopped_status(output, reason); + output.message = std::move(message); + }; + auto finish = [&]() { + if (output.infeasibility_established) { + // Compact the existing allocation: reporting an interrupted conflict must + // not need another allocation proportional to its number of groups. + std::size_t retained = 0; + for (std::size_t i = 0; i < groups.size(); ++i) if (kept[i]) { + if (retained != i) groups[retained] = std::move(groups[i]); + ++retained; + } + groups.resize(retained); + output.groups = std::move(groups); + } + if (budget.expired() && (output.status == ConflictStatus::Irreducible || + output.status == ConflictStatus::Feasible)) { + stop(budget.stop_reason().value_or(Termination::Unknown), + "Shared conflict budget stopped before completion"); + output.feasible_witness.clear(); + } + output.elapsed_seconds = budget.elapsed_seconds(); + return std::move(output); + }; + try { + validate_structure(original); + if (std::any_of(original.globals.begin(),original.globals.end(),[](const auto& record){return record.active;})) { + stop(Termination::Unsupported,"Conflict analysis of native globals requires a global-aware feasibility oracle"); + return finish(); + } + if (options.solve.guarantee != Guarantee::Numerical || options.solve.node_limit) { + stop(Termination::Unsupported, + "Conflict analysis supports Numerical evidence and time/cancellation budgets; node budgets need consumed-node reporting"); + return finish(); + } + if (budget.expired()) { + stop(budget.stop_reason().value_or(Termination::Unknown), "Conflict budget stopped before analysis"); + return finish(); + } + groups = partition(original); + kept.assign(groups.size(), true); + auto oracle = [&](const ModelSnapshot& model, std::vector& witness) { + if (budget.expired()) { + stop(budget.stop_reason().value_or(Termination::Unknown), "Shared conflict budget stopped"); + return Decision::Unknown; + } + auto solve_options = options.solve; + solve_options.primal_start.clear(); + solve_options.relative_gap = solve_options.absolute_gap = 0.0; + solve_options.cancellation = budget.cancellation(); + solve_options.time_limit_seconds = budget.remaining_seconds(); + ++output.oracle_calls; + auto result = solve(model, solve_options); + output.backend = result.backend; + output.backend_version = result.backend_version; + if (budget.expired()) { + stop(budget.stop_reason().value_or(Termination::Unknown), "Feasibility oracle returned after the shared budget stopped"); + return Decision::Unknown; + } + if (result.model_id != model.model_id || result.revision != model.revision || + result.guarantee != Guarantee::Numerical) { + stop(Termination::NumericalFailure, "Feasibility oracle returned incompatible identity or evidence"); + return Decision::Unknown; + } + // Interrupted/ambiguous oracles are never advanced, even with an incumbent. + if (result.termination != Termination::Optimal && result.termination != Termination::Infeasible) { + stop(result.termination, "Feasibility oracle did not decide the subset: " + result.message); + return Decision::Unknown; + } + if (result.termination == Termination::Infeasible) { + if (result.has_solution()) { + stop(Termination::NumericalFailure, "Infeasible oracle result also carries a validated solution"); + return Decision::Unknown; + } + return Decision::Infeasible; + } + const auto check = validate(model, result.values, options.solve.feasibility_tolerance, + options.solve.integrality_tolerance); + if (!result.has_solution() || !check.valid) { + stop(Termination::NumericalFailure, "Feasible oracle candidate failed independent subset validation"); + return Decision::Unknown; + } + if (budget.expired()) { + stop(budget.stop_reason().value_or(Termination::Unknown), "Shared conflict budget stopped during candidate validation"); + return Decision::Unknown; + } + witness = std::move(result.values); + return Decision::Feasible; + }; + std::vector witness; + const auto initial = oracle(subset(original, groups, kept), witness); + if (initial == Decision::Unknown) return finish(); + if (initial == Decision::Feasible) { + output.status = ConflictStatus::Feasible; + output.termination = Termination::Optimal; + output.message = "Original constraints have an independently validated numerical feasible assignment"; + output.feasible_witness = std::move(witness); + return finish(); + } + output.infeasibility_established = true; + for (std::size_t i = 0; i < groups.size(); ++i) { + kept[i] = false; + Decision decision; + try { decision = oracle(subset(original, groups, kept), witness); } + catch (...) { kept[i] = true; throw; } + if (decision != Decision::Infeasible) kept[i] = true; + if (decision == Decision::Unknown) return finish(); + if (decision == Decision::Feasible) { + groups[i].necessity_verified = true; + if (options.retain_deletion_witnesses) groups[i].deletion_witness = std::move(witness); + } + } + // Feasible deletion witnesses remain feasible as other groups are relaxed. + // Recheck retained witnesses against the final conflict, independently. + for (std::size_t i = 0; i < groups.size(); ++i) if (kept[i]) { + if (budget.expired()) { + stop(budget.stop_reason().value_or(Termination::Unknown), "Shared conflict budget stopped during final checks"); + return finish(); + } + if (options.retain_deletion_witnesses) { + auto removed = kept; + removed[i] = false; + const auto check = validate(subset(original, groups, removed), groups[i].deletion_witness, + options.solve.feasibility_tolerance, options.solve.integrality_tolerance); + if (!check.valid) { + stop(Termination::NumericalFailure, "Final deletion witness no longer validates; conflict is not promoted"); + return finish(); + } + } + } + if (std::none_of(kept.begin(), kept.end(), [](bool keep) { return keep; })) { + stop(Termination::NumericalFailure, "Oracle reported an unconstrained continuous system infeasible"); + return finish(); + } + output.status = ConflictStatus::Irreducible; + output.termination = Termination::Infeasible; + output.message = "Numerically infeasible and deletion-minimal at the reported group granularity"; + } catch (const ModelError& error) { + stop(Termination::InvalidModel, error.what()); + } catch (const std::bad_alloc&) { + stop(Termination::MemoryLimit, "Conflict analysis allocation failed"); + } catch (const std::exception& error) { + stop(Termination::BackendError, error.what()); + } + return finish(); +} + +ConflictResult invalid(ModelId id, Revision revision, Termination reason, const std::string& message) { + ConflictResult result; + result.model_id = id; + result.revision = revision; + result.termination = reason; + result.status = stopped_status(result, reason); + result.message = message; + return result; +} +} + +ConflictResult analyze_conflict(const ModelSnapshot& model, const ConflictOptions& options) { + try { SolveBudget budget(options.solve); return run(model, options, budget); } + catch (const ModelError& error) { return invalid(model.model_id, model.revision, Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return invalid(model.model_id, model.revision, Termination::MemoryLimit, "Conflict allocation failed"); } +} + +ConflictResult analyze_conflict(const Model& model, const ConflictOptions& options) { + try { SolveBudget budget(options.solve); return run(model.snapshot(), options, budget); } + catch (const ModelError& error) { return invalid(model.id(), model.revision(), Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return invalid(model.id(), model.revision(), Termination::MemoryLimit, "Conflict allocation failed"); } +} + +}} diff --git a/gecode/optimize/diagnostics.hpp b/gecode/optimize/diagnostics.hpp new file mode 100644 index 0000000000..cf6432ff80 --- /dev/null +++ b/gecode/optimize/diagnostics.hpp @@ -0,0 +1,76 @@ +/* Numerical conflicts over explicit original-model groups. */ +#ifndef GECODE_OPTIMIZE_DIAGNOSTICS_HPP +#define GECODE_OPTIMIZE_DIAGNOSTICS_HPP + +#include + +namespace Gecode { namespace Optimize { + +enum class ConflictStatus { + Unknown, Feasible, Irreducible, Incomplete, Unsupported, InvalidModel, Error +}; + +enum class ConflictGroupKind { + Row, LowerBound, UpperBound, Integrality, VariableDomain, IndicatorComponent +}; + +struct ConflictGroup { + ConflictGroupKind kind = ConflictGroupKind::Row; + std::string name; + std::optional row; + std::optional variable; + // An indicator component owns these logical records, their generated rows, + // and the complete domains of all variables participating in the component. + std::vector indicators; + std::vector generated_rows; + std::vector grouped_variables; + bool necessity_verified = false; + // Optional feasible assignment after removing this group from the conflict. + // Original slot order, with tombstones; it need not satisfy this group. + std::vector deletion_witness; +}; + +struct ConflictOptions { + SolveOptions solve; + bool retain_deletion_witnesses = false; +}; + +struct ConflictResult { + ModelId model_id = 0; + Revision revision = 0; + ConflictStatus status = ConflictStatus::Unknown; + // Completion: Optimal for Feasible, Infeasible for Irreducible. Otherwise + // the stopping/error reason. This is separate from conflict completeness. + Termination termination = Termination::Unknown; + Guarantee guarantee = Guarantee::Numerical; + std::string backend; + std::string backend_version; + std::string message; + bool infeasibility_established = false; + std::size_t oracle_calls = 0; + double elapsed_seconds = 0.0; + // Empty until original feasibility has been decided as infeasible. During + // interruption this contains the last numerically established infeasible set. + std::vector groups; + // Present only for a feasible original constraint system; original slots. + std::vector feasible_witness; + bool irreducible() const noexcept { return status == ConflictStatus::Irreducible; } +}; + +/** + * Deterministic deletion filtering with numerical LP/MILP feasibility oracles. + * The original objective is replaced privately by zero. All calls share one + * end-to-end time/cancellation budget. Starts are ignored and gaps forced zero. + * Any node limit, Exact or Certified request is explicitly Unsupported. + * See DIAGNOSTICS.md for group granularity and indicator domain ownership. + * Irreducible means deletion-minimal at that granularity, not minimum size or + * an exact infeasibility certificate. Interrupted or ambiguous oracles never + * establish infeasibility or irreducibility. + */ +ConflictResult analyze_conflict(const ModelSnapshot& model, + const ConflictOptions& options = {}); +ConflictResult analyze_conflict(const Model& model, + const ConflictOptions& options = {}); + +}} +#endif diff --git a/gecode/optimize/flatzinc.cpp b/gecode/optimize/flatzinc.cpp new file mode 100644 index 0000000000..268168e31e --- /dev/null +++ b/gecode/optimize/flatzinc.cpp @@ -0,0 +1,762 @@ +/* Original-record compiler and checker, independent of native parser posting. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace F=Gecode::FlatZinc::Capture; +namespace Detail { +struct FlatZincArtifact { + F::Records source; + ModelSnapshot model; + std::vector mapping; +}; +namespace { +using I=std::int64_t; +constexpr I exact_limit=9007199254740992LL; +struct Failure { FlatZincCompileStatus status; std::string message; F::Location location; }; +[[noreturn]] void bad(const std::string& s) {throw Failure{FlatZincCompileStatus::InvalidInput,s,{}};} +[[noreturn]] void unsupported(const std::string& s) {throw Failure{FlatZincCompileStatus::Unsupported,s,{}};} +[[noreturn]] void limit(const std::string& s) {throw Failure{FlatZincCompileStatus::ResourceLimit,s,{}};} +I plus(I a,I b) { + if((b>0&&a>std::numeric_limits::max()-b)||(b<0&&a::min()-b)) + unsupported("integer arithmetic exceeds the exact compiler range"); + return a+b; +} +I neg(I a) {if(a==std::numeric_limits::min())unsupported("integer negation overflow");return -a;} +I times(I a,I b) { + if(!a||!b)return 0; + if((a==-1&&b==std::numeric_limits::min())||(b==-1&&a==std::numeric_limits::min()))unsupported("integer product overflow"); + if(a>0?(b>0?a>std::numeric_limits::max()/b:b::min()/a): + (b>0?a::min()/b:a::max()/b))unsupported("integer product overflow"); + return a*b; +} +double number(I a) {if(a < -exact_limit || a > exact_limit)unsupported("integer cannot be represented exactly as a model number");return static_cast(a);} +using Key=std::pair; +Key key(F::Reference r) { + switch(r.type){case F::Type::Integer:return {0,r.index};case F::Type::Boolean:return {1,r.index}; + case F::Type::Float:case F::Type::Set:unsupported("FlatZinc float and set variables are not supported by this compiler");} + bad("invalid variable namespace"); +} +struct Meter { + const FlatZincCompileOptions& options; SolveBudget budget; std::size_t work=0; + static SolveOptions solve_options(const FlatZincCompileOptions& o) {SolveOptions s;s.time_limit_seconds=o.time_limit_seconds;s.cancellation=o.cancellation;return s;} + explicit Meter(const FlatZincCompileOptions& o):options(o),budget(solve_options(o)) {} + void check() const { + if(budget.cancelled())throw Failure{FlatZincCompileStatus::Cancelled,"FlatZinc compilation cancelled",{}}; + if(budget.time_limit_reached())throw Failure{FlatZincCompileStatus::TimeLimit,"FlatZinc compilation deadline",{}}; + } + void add(std::size_t n=1) {check();if(n>options.max_work-work)limit("FlatZinc compiler work limit");work+=n;} +}; +void shape(const F::Value& v,Meter& m,std::size_t depth=0) { + if(depth>m.options.max_value_depth)limit("FlatZinc value nesting limit"); + m.add();m.add(v.text.size());m.add(v.set.values.size()); + switch(v.kind){case F::ValueKind::Integer:case F::ValueKind::Boolean:case F::ValueKind::Float: + case F::ValueKind::Set:case F::ValueKind::Reference:case F::ValueKind::Array:case F::ValueKind::Atom: + case F::ValueKind::String:case F::ValueKind::Call:break;default:bad("invalid captured value tag");} + // Account for even inactive public fields before copying untrusted records. + for(const auto& item:v.elements)shape(item,m,depth+1); +} +void constraint_shape(const F::Constraint& c,Meter& m) { + m.add();m.add(c.id.size());m.add(c.location.source.size()); + for(const auto& a:c.arguments)shape(a,m); + for(const auto& a:c.annotations)shape(a,m); +} +void all_shapes(const F::Records& r,Meter& m) { + if(r.raw_variables.size()>m.options.max_variables||r.variables.size()>m.options.max_variables)limit("FlatZinc variable limit"); + for(const auto* vars:{&r.raw_variables,&r.variables})for(const auto& v:*vars) { + m.add();m.add(v.name.size());m.add(v.domain.integers.values.size());shape(v.value,m); + } + for(const auto* rows:{&r.raw_domains,&r.raw_constraints,&r.domains,&r.constraints}) { + if(rows->size()>m.options.max_constraints)limit("FlatZinc constraint record limit"); + for(const auto& c:*rows)constraint_shape(c,m); + } + m.add(r.coverage.size());m.add(r.source.size());shape(r.solve.objective,m);m.add(r.solve.location.source.size()); + for(const auto& a:r.solve.annotations)shape(a,m); + for(const auto& a:r.declaration_annotations) { + m.add();m.add(a.name.size());m.add(a.location.source.size());for(const auto& x:a.annotations)shape(x,m); + } + for(const auto& o:r.output){m.add();m.add(o.name.size());shape(o.expression,m);} +} +std::pair interval(const F::SetLiteral& s,Meter* meter=nullptr) { + if(s.interval){number(s.lower);number(s.upper);return {s.lower,s.upper};} + auto values=s.values; + if(meter)meter->add(values.size()); + if(values.empty())return {1,0}; + std::sort(values.begin(),values.end());values.erase(std::unique(values.begin(),values.end()),values.end()); + for(std::size_t i=0;i& array(const F::Value& v) {if(v.kind!=F::ValueKind::Array)bad("expected a captured array");return v.elements;} +I literal(const F::Value& v) {if(v.kind!=F::ValueKind::Integer)bad("expected an integer literal");number(v.integer);return v.integer;} +void arity(const F::Constraint& c,std::size_t n){if(c.arguments.size()!=n)bad("wrong arity for "+c.id);} +void annotation(const F::Value& v,bool declaration=false) { + if(v.kind!=F::ValueKind::Atom&&v.kind!=F::ValueKind::Call)unsupported("unrecognized FlatZinc annotation form"); + const auto& n=v.text; + // MiniZinc 2.10.1 stdlib/stdlib_ann.mzn, context annotations: + // https://github.com/MiniZinc/libminizinc/blob/2.10.1/share/minizinc/std/stdlib/stdlib_ann.mzn + // Compiler context markers do not change the posted relation or its exact + // original-source check. Admit only the named atoms, never unknown calls. + if(n=="var_is_introduced"||n=="is_defined_var"||n=="domain"||n=="bounds"||n=="boundsD"||n=="boundsR"||n=="boundsZ"|| + n=="ctx_pos"||n=="ctx_neg"||n=="ctx_mix") { + if(v.kind!=F::ValueKind::Atom||!v.elements.empty())bad("malformed marker annotation");return; + } + if(n=="defines_var") {if(v.kind!=F::ValueKind::Call||v.elements.size()!=1||v.elements[0].kind!=F::ValueKind::Reference)bad("malformed defines_var annotation");return;} + if(n=="mzn_path") {if(v.kind!=F::ValueKind::Call||v.elements.size()!=1||v.elements[0].kind!=F::ValueKind::String)bad("malformed mzn_path annotation");return;} + if(declaration&&n=="output_var") {if(v.kind!=F::ValueKind::Atom||!v.elements.empty())bad("malformed output_var annotation");return;} + if(declaration&&n=="output_array") { + if(v.kind!=F::ValueKind::Call||v.elements.size()!=1)bad("malformed output_array annotation"); + const auto& dimensions=array(v.elements[0]);if(dimensions.empty())bad("output_array needs at least one dimension"); + for(const auto& d:dimensions){if(d.kind!=F::ValueKind::Set)bad("output dimension is not an integer set");interval(d.set);} + return; + } + unsupported("unhandled FlatZinc annotation: "+n); +} +struct Bounds { + std::optional lower,upper; bool empty=false; + // A finite member list is never replaced by its hull until contiguity is proved. + // Intervals stay symbolic, so a sparse set can span the full exact source range. + std::optional> members; + void intersect(I lo,I hi){empty=empty||lo>hi;lower=lower?std::max(*lower,lo):lo;upper=upper?std::min(*upper,hi):hi;if(*lower>*upper)empty=true;} + void intersect(const F::SetLiteral& input,Meter& meter) { + if(input.interval){number(input.lower);number(input.upper);intersect(input.lower,input.upper);return;} + if(input.values.size()>meter.options.max_nonzeros)limit("finite domain member storage limit"); + meter.add(input.values.size()); + for(const auto value:input.values){meter.check();number(value);} + auto allowed=input.values; + // Comparisons and filtering are charged, not just the final member count. + // Any thrown limit discards private compiler state, never the source records. + std::sort(allowed.begin(),allowed.end(),[&](I a,I b){meter.add();return asize(),allowed.size());meter.add(reserve); + std::vector common;common.reserve(reserve); + std::size_t i=0,j=0; + while(isize()&&jempty())intersect(1,0); + else intersect(members->front(),members->back()); + } + void finish(Meter& meter) { + if(!members)return; + std::size_t kept=0; + for(const auto value:*members){meter.add();if(!empty&&(!lower||value>=*lower)&&(!upper||value<=*upper))(*members)[kept++]=value;} + members->resize(kept); + if(!kept){intersect(1,0);members.reset();return;} + intersect(members->front(),members->back()); + bool contiguous=true; + for(std::size_t i=1;i coefficient; I constant=0;}; +void combine(Form& a,const Form& b,I multiplier=1) { + a.constant=plus(a.constant,times(b.constant,multiplier)); + for(const auto& e:b.coefficient) {auto& value=a.coefficient[e.first];value=plus(value,times(e.second,multiplier));if(!value)a.coefficient.erase(e.first);} +} +bool identifier(const std::string& s) { + if(s.empty())return false; + const auto first=[](unsigned char c){return(c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='_';}; + if(!first(s[0]))return false; + for(unsigned char c:s)if(!first(c)&&!(c>='0'&&c<='9'))return false; + return true; +} +const F::Value* output_array(const F::Records& source,const std::string& name) { + const F::Value* found=nullptr; + for(const auto& d:source.declaration_annotations)if(d.name==name)for(const auto& a:d.annotations)if(a.text=="output_array") { + if(found)bad("duplicate output_array annotation");found=&a; + } + return found; +} +const std::vector& output_values(const F::Value& value) { + const auto& a=array(value); + // Legacy printer layout contains fixed string fragments around one value array. + if(std::all_of(a.begin(),a.end(),[](const F::Value& x){return x.kind==F::ValueKind::Reference||x.kind==F::ValueKind::Integer||x.kind==F::ValueKind::Boolean;}))return a; + const std::vector* found=nullptr; + for(const auto& v:a){if(v.kind==F::ValueKind::Array){if(found)bad("ambiguous output value arrays");found=&v.elements;}else if(v.kind!=F::ValueKind::String)bad("unsupported output layout");} + if(!found)bad("output layout has no typed values");return *found; +} +} + +struct FlatZincCompiler { + const F::Records& source; const FlatZincCompileOptions& options; Meter meter; + std::map position; + std::vector parent; + std::vector domains; + std::vector handles; + Model model;std::size_t nonzeros=0,rows=0,variables=0; + std::map constants; + explicit FlatZincCompiler(const F::Records& s,const FlatZincCompileOptions& o):source(s),options(o),meter(o) {} + std::size_t lookup(F::Reference ref) const {auto p=position.find(key(ref));if(p==position.end())bad("unknown captured variable reference");return p->second;} + std::size_t representative(std::size_t n) { + auto root=n;std::size_t steps=0; + while(parent[root]!=root){meter.add();if(++steps>parent.size())bad("cyclic captured variable alias");root=parent[root];} + while(parent[n]!=n){meter.add();auto next=parent[n];parent[n]=root;n=next;}return root; + } + void typed(const F::Value& v,F::Type type) const { + if(v.kind==F::ValueKind::Reference){if(v.reference.type!=type)bad("captured operand has the wrong variable namespace");lookup(v.reference);return;} + if(type==F::Type::Integer&&v.kind==F::ValueKind::Integer){number(v.integer);return;} + if(type==F::Type::Boolean&&v.kind==F::ValueKind::Boolean)return; + bad("captured operand has the wrong literal type"); + } + Form term(const F::Value& v,F::Type type) { + typed(v,type);meter.add();Form f; + if(v.kind==F::ValueKind::Reference)f.coefficient.emplace(handles[lookup(v.reference)].id,1); + else f.constant=type==F::Type::Integer?v.integer:static_cast(v.boolean); + return f; + } + Form difference(const F::Value& a,const F::Value& b,F::Type type) {auto f=term(a,type);combine(f,term(b,type),-1);return f;} + void post(Form f,std::optional lo,std::optional hi) { + meter.add();if(rows==options.max_constraints)limit("generated FlatZinc row limit"); + if(f.coefficient.size()>options.max_nonzeros-nonzeros)limit("generated FlatZinc nonzero limit"); + meter.add(f.coefficient.size());std::vector terms;terms.reserve(f.coefficient.size()); + for(const auto& e:f.coefficient)terms.push_back({{model.id(),e.first},number(e.second)}); + const auto low=lo?number(plus(*lo,neg(f.constant))):-std::numeric_limits::infinity(); + const auto high=hi?number(plus(*hi,neg(f.constant))):std::numeric_limits::infinity(); + model.add_row(terms,low,high);++rows;nonzeros+=terms.size(); + } + void capacity(std::size_t added_variables,std::size_t added_rows,std::size_t added_nonzeros) { + meter.add(); + if(added_variables>options.max_variables-variables)limit("generated FlatZinc variable limit"); + if(added_rows>options.max_constraints-rows)limit("generated FlatZinc constraint limit"); + if(added_nonzeros>options.max_nonzeros-nonzeros)limit("generated FlatZinc nonzero limit"); + } + Variable global_term(const F::Value& value) { + typed(value,F::Type::Integer);meter.add(); + if(value.kind==F::ValueKind::Reference)return handles[lookup(value.reference)]; + const auto found=constants.find(value.integer);if(found!=constants.end())return found->second; + capacity(1,0,0);auto v=model.add_integer(number(value.integer),number(value.integer));++variables; + constants.emplace(value.integer,v);return v; + } + I fixed_integer(const F::Value& value,const char* role) { + typed(value,F::Type::Integer);meter.add(); + if(value.kind==F::ValueKind::Integer)return value.integer; + const auto& original=domains[representative(lookup(value.reference))]; + // A contradictory domain uses a dummy model slot; it proves no fixed + // source parameter. Ordinary equality rows are never propagated here. + if(original.empty||!original.lower||!original.upper||*original.lower!=*original.upper) + unsupported(std::string("cumulative ")+role+" must be a literal or an original singleton integer domain"); + return *original.lower; + } + void implication(const F::Value& guard,bool active,Form form,std::optional lo,std::optional hi) { + typed(guard,F::Type::Boolean);meter.add(); + if(guard.kind==F::ValueKind::Boolean){if(guard.boolean==active)post(std::move(form),lo,hi);return;} + const auto control=handles[lookup(guard.reference)]; + const auto& domain=model.variable(control); + if(domain.lower==domain.upper){if((domain.lower==1)==active)post(std::move(form),lo,hi);return;} + // Reserve the maximum footprint before the transactional helper allocates: + // one gate, its two-entry equality, and one row per finite side. + const std::size_t sides=std::size_t(bool(lo))+std::size_t(bool(hi)); + if(form.coefficient.size()>options.max_nonzeros)limit("indicator expression exceeds nonzero limit"); + const std::size_t width=form.coefficient.size()+1; + if(width>std::numeric_limits::max()/sides || sides*width>std::numeric_limits::max()-2) + limit("indicator nonzero count overflow"); + capacity(1,1+sides,2+sides*width);meter.add(2+sides*width); + std::vector terms;terms.reserve(form.coefficient.size()); + for(const auto& e:form.coefficient)terms.push_back({{model.id(),e.first},number(e.second)}); + const double lower=lo?number(plus(*lo,neg(form.constant))):-std::numeric_limits::infinity(); + const double upper=hi?number(plus(*hi,neg(form.constant))):std::numeric_limits::infinity(); + const auto added=add_indicator(model,control,active,terms,lower,upper); + if(added.inactive_gate)++variables; + rows+=added.rows.size();for(const auto r:added.rows)nonzeros+=model.row(r).terms.size(); + } + void restrict_domain(const F::Constraint& c) { + if(c.id!="int_in")return;arity(c,2); + if(c.arguments[1].kind!=F::ValueKind::Set)bad("int_in requires an integer set literal"); + const auto& value=c.arguments[0]; + if(value.kind==F::ValueKind::Reference)domains[representative(lookup(value.reference))].intersect(c.arguments[1].set,meter); + else { + if(value.kind!=F::ValueKind::Integer&&value.kind!=F::ValueKind::Boolean)bad("int_in has a noninteger operand"); + // Admit every set value even when the eventual constant predicate is false. + Bounds checked;checked.intersect(c.arguments[1].set,meter); + } + } + void declarations() { + parent.resize(source.raw_variables.size());std::iota(parent.begin(),parent.end(),0);domains.resize(parent.size());handles.resize(parent.size()); + for(std::size_t i=0;i(v.value.boolean);domains[root].intersect(value,value);} + } + for(const auto* input:{&source.raw_domains,&source.raw_constraints})for(const auto& c:*input) { + try {restrict_domain(c);}catch(Failure& f){f.location=c.location;throw;} + } + for(std::size_t i=0;isize()==std::numeric_limits::max())limit("finite domain cell count overflow"); + const auto cells=d.members->size()+1;capacity(0,1,cells);meter.add(cells); + std::vector> tuples;tuples.reserve(d.members->size()); + for(const auto value:*d.members){meter.add();tuples.push_back({value});} + add_table(model,{handles[i]},tuples);++rows;nonzeros+=cells; + } + } + for(std::size_t i=0;i(0):std::nullopt,0); + if(id=="int_le_reif")implication(a[2],false,std::move(f),1,{}); + return; + } + if(id=="int_lin_le_reif"||id=="int_lin_le_imp") { + arity(c,4);const auto& coefficients=array(a[0]);const auto& operands=array(a[1]); + if(coefficients.size()!=operands.size())bad("linear coefficient/operand lengths differ"); + Form f;for(std::size_t i=0;ioptions.max_nonzeros||flat.size()>options.max_nonzeros-values.size())limit("table payload cell limit"); + const auto cells=values.size()+flat.size();capacity(0,1,cells);meter.add(cells); + // Validate all parameter cells before creating private literal slots. + for(const auto& entry:flat){meter.add();literal(entry);} + std::vector arguments;arguments.reserve(values.size()); + for(const auto& value:values)arguments.push_back(global_term(value)); + const auto tuple_count=flat.size()/values.size();meter.add(tuple_count); + std::vector> tuples;tuples.reserve(tuple_count); + for(std::size_t offset=0;offset tuple;tuple.reserve(values.size()); + for(std::size_t j=0;jstates)bad("regular initial state is outside 1..Q"); + if(a[5].kind!=F::ValueKind::Set)bad("regular final states must be a literal integer set"); + const I expected=times(states,symbols); + if(static_cast(expected)>std::numeric_limits::max()) + unsupported("regular transition matrix count exceeds native size arithmetic"); + if(flat.size()!=static_cast(expected))bad("regular transition cell count must equal Q*S"); + const auto& final_set=a[5].set;std::size_t final_count=0; + if(final_set.interval){ + number(final_set.lower);number(final_set.upper); + if(final_set.lower<=final_set.upper){ + if(final_set.lower<1||final_set.upper>states)bad("regular final state is outside 1..Q"); + const auto count=static_cast(plus(plus(final_set.upper,neg(final_set.lower)),1)); + if(count>std::numeric_limits::max())unsupported("regular final set exceeds native size arithmetic"); + final_count=static_cast(count); + } + }else{ + final_count=final_set.values.size(); + for(const auto state:final_set.values){meter.add();number(state);if(state<1||state>states)bad("regular final state is outside 1..Q");} + } + // Bound retained input cells and worst-case expanded sparse edges before + // any payload allocation or parameter-set interval expansion. + std::size_t cells=0; + for(const auto count:{std::size_t(3),word.size(),flat.size(),final_count}){ + if(count>options.max_nonzeros-cells)limit("regular payload cell limit");cells+=count; + } + capacity(0,1,cells);meter.add(cells); + std::size_t edge_count=0; + for(const auto& value:flat){meter.add();const I target=literal(value);if(target<0||target>states)bad("regular transition target is outside 0..Q");if(target)++edge_count;} + if(edge_count>(options.max_nonzeros-cells)/3)limit("regular sparse transition cell limit"); + cells+=3*edge_count;capacity(0,1,cells);meter.add(3*edge_count); + for(const auto& value:word){meter.add();typed(value,F::Type::Integer);} + std::vector transitions;transitions.reserve(edge_count); + for(std::size_t i=0;i(i/static_cast(symbols)), + static_cast(i%static_cast(symbols))+1,static_cast(target-1)}); + } + std::vector finals;finals.reserve(final_count); + for(std::size_t i=0;i(i)):final_set.values[i];finals.push_back(static_cast(state-1));} + std::vector variables;variables.reserve(word.size());for(const auto& value:word)variables.push_back(global_term(value)); + add_regular(model,variables,static_cast(states),static_cast(initial-1),transitions,finals); + ++rows;nonzeros+=cells;return; + } + if(id=="gecode_circuit") { + arity(c,2);const I offset=literal(a[0]);const auto& values=array(a[1]); + if(values.empty())bad("gecode_circuit requires a nonempty successor array"); + if(offset<0)unsupported("gecode_circuit requires a nonnegative literal offset"); + if(values.size()-1>static_cast(std::numeric_limits::max())) + unsupported("circuit index count exceeds exact integer arithmetic"); + number(plus(offset,static_cast(values.size()-1))); + capacity(0,1,values.size());meter.add(values.size()); + // Every position is a source node, including repeated handles/literals. + // Do not deduplicate successors or infer a base from output dimensions. + for(const auto& value:values){meter.add();typed(value,F::Type::Integer);} + std::vector successors;successors.reserve(values.size()); + for(const auto& value:values)successors.push_back(global_term(value)); + add_circuit(model,successors,offset);++rows;nonzeros+=successors.size();return; + } + if(id=="gecode_cumulatives"||id=="cumulatives") { + if(a.size()==6||a.size()==7)unsupported("multi-machine cumulative signatures are not supported"); + arity(c,4);const auto& starts=array(a[0]);const auto& duration_values=array(a[1]);const auto& height_values=array(a[2]); + if(starts.size()!=duration_values.size()||starts.size()!=height_values.size()) + bad("cumulative starts, durations and heights must have equal lengths"); + if(!options.max_nonzeros||starts.size()>(options.max_nonzeros-1)/3) + limit("cumulative payload cell limit"); + const auto cells=3*starts.size()+1;capacity(0,1,cells);meter.add(cells); + const I bound=fixed_integer(a[3],"capacity"); + if(bound<0)unsupported("cumulative capacity must be nonnegative in the fixed-data interface"); + std::vector durations,heights;durations.reserve(starts.size());heights.reserve(starts.size()); + for(std::size_t i=0;i arguments;arguments.reserve(starts.size()); + for(const auto& start:starts)arguments.push_back(global_term(start)); + add_cumulative(model,arguments,durations,heights,bound);++rows;nonzeros+=cells;return; + } + if(id=="all_different_int") { + arity(c,1);const auto& values=array(a[0]);capacity(0,1,values.size());meter.add(values.size()); + std::vector terms;terms.reserve(values.size());for(const auto& v:values)terms.push_back(global_term(v)); + add_all_different(model,terms);++rows;nonzeros+=terms.size();return; + } + if(id=="array_int_element"||id=="array_var_int_element") { + arity(c,3);const auto& values=array(a[1]); + if(id=="array_int_element")for(const auto& v:values) + if(v.kind!=F::ValueKind::Integer)bad("array_int_element requires a parameter integer array"); + if(values.size()>options.max_nonzeros || values.size()>std::numeric_limits::max()-2) + limit("element expression exceeds nonzero limit"); + capacity(0,1,values.size()+2);meter.add(values.size()+2); + auto index=global_term(a[0]),result=global_term(a[2]); + std::vector terms;terms.reserve(values.size());for(const auto& v:values)terms.push_back(global_term(v)); + add_element(model,index,terms,result,1);++rows;nonzeros+=terms.size()+2;return; + } + if(id=="int_in") { + arity(c,2);if(a[1].kind!=F::ValueKind::Set)bad("int_in requires a set"); + const auto type=a[0].kind==F::ValueKind::Boolean?F::Type::Boolean:a[0].kind==F::ValueKind::Reference?a[0].reference.type:F::Type::Integer; + const auto f=term(a[0],type); + // Every reference restriction was intersected exactly before declarations. + // Its raw predicate remains in the owning source and independent checker. + if(a[0].kind==F::ValueKind::Reference)return; + bool member=false;const auto& set=a[1].set; + if(set.interval)member=f.constant>=set.lower&&f.constant<=set.upper; + else for(const auto value:set.values){meter.add();if(value==f.constant)member=true;} + if(!member)post({},1,1);return; + } + if(id=="int_eq"||id=="int_le"||id=="int_lt"||id=="int_ge"||id=="int_gt"||id=="bool_eq"||id=="bool_le") { + arity(c,2);auto f=difference(a[0],a[1],id.rfind("bool_",0)==0?F::Type::Boolean:F::Type::Integer); + if(id=="int_eq"||id=="bool_eq")post(f,0,0); + else if(id=="int_le"||id=="bool_le")post(f,{},0); + else if(id=="int_lt")post(f,{},-1); + else if(id=="int_ge")post(f,0,{});else post(f,1,{});return; + } + if(id=="int_plus"||id=="int_minus"||id=="bool2int"||id=="bool_not") { + if(id=="int_plus"||id=="int_minus"){arity(c,3);auto f=term(a[0],F::Type::Integer);combine(f,term(a[1],F::Type::Integer),id=="int_plus"?1:-1);combine(f,term(a[2],F::Type::Integer),-1);post(f,0,0);} + else {arity(c,2);auto f=term(a[0],F::Type::Boolean);combine(f,term(a[1],id=="bool2int"?F::Type::Integer:F::Type::Boolean),id=="bool2int"?-1:1);post(f,id=="bool2int"?0:1,id=="bool2int"?0:1);}return; + } + if(id=="int_lin_eq"||id=="int_lin_le"||id=="bool_lin_eq"||id=="bool_lin_le") { + arity(c,3);const auto& coeff=array(a[0]);const auto& values=array(a[1]);if(coeff.size()!=values.size())bad("linear coefficient/operand lengths differ"); + Form f;for(std::size_t i=0;i(0):std::nullopt,0);return; + } + if(id=="bool_and"||id=="bool_or"||id=="array_bool_and"||id=="array_bool_or") { + const bool is_array=id.rfind("array_",0)==0,and_op=id.find("and")!=std::string::npos; + arity(c,is_array?2:3);const auto values=is_array?array(a[0]):std::vector{a[0],a[1]};auto result=term(a[is_array?1:2],F::Type::Boolean);Form sum; + for(const auto& value:values){auto operand=term(value,F::Type::Boolean);combine(sum,operand);auto f=result;combine(f,operand,-1);if(and_op)post(f,{},0);else post(f,0,{});} + auto last=result;combine(last,sum,-1); + if(and_op)post(last,plus(1,neg(static_cast(values.size()))),{});else post(last,{},0);return; + } + if(id=="bool_clause") { + arity(c,2);const auto& positive=array(a[0]);const auto& negative=array(a[1]);Form f; + for(const auto& x:positive)combine(f,term(x,F::Type::Boolean)); + for(const auto& x:negative)combine(f,term(x,F::Type::Boolean),-1); + post(f,plus(1,neg(static_cast(negative.size()))),{});return; + } + unsupported("unsupported complete FlatZinc predicate: "+id); + } + void outputs() { + std::set names; + for(const auto& d:source.declaration_annotations)for(const auto& a:d.annotations){annotation(a,true);annotation_references(a);} + for(const auto& o:source.output) { + if(!identifier(o.name)||!names.insert(o.name).second)bad("invalid or duplicate FlatZinc output name"); + const auto scalar=[&](const F::Value& value){ + if(value.kind==F::ValueKind::Reference)lookup(value.reference); + else if(value.kind==F::ValueKind::Integer)number(value.integer); + else if(value.kind!=F::ValueKind::Boolean)unsupported("unsupported FlatZinc output value"); + }; + if(const auto* ann=output_array(source,o.name)) { + const auto& dimensions=array(ann->elements[0]);I count=1; + for(const auto& d:dimensions){auto range=interval(d.set,&meter);count=times(count,range.first>range.second?0:plus(plus(range.second,neg(range.first)),1));} + const auto& values=output_values(o.expression); + if(count<0||static_cast(count)!=values.size())bad("FlatZinc output array dimensions do not match its values"); + for(const auto& v:values)scalar(v); + }else scalar(o.expression); + } + for(const auto& d:source.declaration_annotations)for(const auto& a:d.annotations) + if((a.text=="output_var"||a.text=="output_array")&&!names.count(d.name))bad("requested FlatZinc output is missing from the captured plan"); + } + CompiledFlatZinc run() { + all_shapes(source,meter);meter.check();declarations();outputs(); + // Search controls are not implemented by recording their text. + if(!source.solve.annotations.empty())unsupported("FlatZinc search annotations are not supported by the explicit compiler"); + for(const auto* input:{&source.raw_domains,&source.raw_constraints})for(const auto& c:*input) { + try {compile_constraint(c);}catch(Failure& f){f.location=c.location;throw;} + } + switch(source.solve.method){ + case F::Method::Satisfy:if(source.solve.has_objective)bad("satisfaction request has an objective");model.minimize({});break; + case F::Method::Minimize:case F::Method::Maximize:{ + if(!source.solve.has_objective)bad("optimization request lacks its original objective"); + auto f=term(source.solve.objective,F::Type::Integer);std::vector terms; + for(const auto& e:f.coefficient)terms.push_back({{model.id(),e.first},number(e.second)}); + model.set_objective(terms,source.solve.method==F::Method::Minimize?ObjectiveSense::Minimize:ObjectiveSense::Maximize,number(f.constant));break; + } + default:bad("invalid FlatZinc solve method"); + } + // Reserve copy work before publishing owned source/model data. + meter.add(meter.work);auto data=std::make_shared();data->source=source;data->model=model.snapshot(); + data->mapping.reserve(handles.size());for(std::size_t i=0;imapping.push_back({source.raw_variables[i].reference,handles[i]}); + meter.check();return CompiledFlatZinc(std::move(data)); + } +}; + +namespace { +struct SourceEvaluator { + std::map values; + I value(const F::Value& v) const { + switch(v.kind){ + case F::ValueKind::Integer:return v.integer; + case F::ValueKind::Boolean:return v.boolean?1:0; + case F::ValueKind::Reference:{auto p=values.find(key(v.reference));if(p==values.end())bad("missing original variable value");return p->second;} + default:bad("noninteger original expression"); + } + } + bool member(I x,const F::SetLiteral& set) const { + return set.interval?(x>=set.lower&&x<=set.upper):std::find(set.values.begin(),set.values.end(),x)!=set.values.end(); + } + bool relation(const F::Constraint& c) const { + const auto& a=c.arguments;const auto& id=c.id; + if(id=="int_le_reif")return (value(a[0])<=value(a[1]))==(value(a[2])!=0); + if(id=="int_le_imp")return value(a[2])==0||value(a[0])<=value(a[1]); + if(id=="int_eq_imp")return value(a[2])==0||value(a[0])==value(a[1]); + if(id=="int_lin_le_reif"||id=="int_lin_le_imp") { + if(id=="int_lin_le_imp"&&value(a[3])==0)return true; + I sum=0;for(std::size_t i=0;isymbols)return false; + if(state<1||state>states)bad("unadmitted original regular state"); + const I index=plus(times(state-1,symbols),symbol-1); + if(index<0||static_cast(index)>=flat.size())bad("unadmitted original regular matrix shape"); + state=flat[static_cast(index)].integer;if(!state)return false; + } + return member(state,a[5].set); + } + if(id=="gecode_circuit") { + const I offset=a[0].integer;const auto& successors=a[1].elements; + if(successors.empty())bad("unadmitted empty original circuit"); + // Read raw source terms in their original order. Range-check before + // subtraction/indexing; never use the compiled CircuitData as evidence. + std::vector visited(successors.size(),false);std::size_t node=0; + for(std::size_t step=0;step(index)>=successors.size())return false; + node=static_cast(index); + } + return node==0; + } + if(id=="gecode_cumulatives"||id=="cumulatives") { + // Fixed parameters are read again from their original source slots. The + // compiler's embedded constants and generated global are not evidence. + struct Event {I time,height;bool start;}; + const auto size=a[0].elements.size();const I bound=value(a[3]); + if(size>std::numeric_limits::max()/2)bad("original cumulative event count overflow"); + std::vector events;events.reserve(2*size); + for(std::size_t i=0;ibound-used)return false;used=plus(used,event.height);} + else used=plus(used,neg(event.height)); + } + return true; + } + if(id=="all_different_int") { + std::set assigned;for(const auto& v:a[0].elements)if(!assigned.insert(value(v)).second)return false;return true; + } + if(id=="array_int_element"||id=="array_var_int_element") { + const I index=value(a[0]);if(index<1||static_cast(index)>a[1].elements.size())return false; + return value(a[1].elements[static_cast(index-1)])==value(a[2]); + } + if(id=="int_in")return member(value(a[0]),a[1].set); + if(id=="int_eq"||id=="bool_eq")return value(a[0])==value(a[1]); + if(id=="int_le"||id=="bool_le")return value(a[0])<=value(a[1]); + if(id=="int_lt")return value(a[0])=value(a[1]); + if(id=="int_gt")return value(a[0])>value(a[1]); + if(id=="int_plus")return plus(value(a[0]),value(a[1]))==value(a[2]); + if(id=="int_minus")return plus(value(a[0]),neg(value(a[1])))==value(a[2]); + if(id=="bool2int")return value(a[0])==value(a[1]); + if(id=="bool_not")return value(a[0])!=value(a[1]); + if(id=="int_lin_eq"||id=="int_lin_le"||id=="bool_lin_eq"||id=="bool_lin_le") { + I sum=0;for(std::size_t i=0;i(id=="bool_and"?(left&&right):(left||right)); + } + if(id=="array_bool_and"||id=="array_bool_or") { + const bool conjunction=id=="array_bool_and";bool actual=conjunction; + for(const auto& x:a[0].elements)actual=conjunction?(actual&&value(x)!=0):(actual||value(x)!=0); + return value(a[1])==static_cast(actual); + } + if(id=="bool_clause") { + for(const auto& x:a[0].elements)if(value(x)==1)return true; + for(const auto& x:a[1].elements)if(value(x)==0)return true; + return false; + } + bad("unadmitted predicate reached original-source evaluator"); + } + void declarations(const F::Records& source) const { + for(const auto& v:source.raw_variables) { + const auto current=values.at(key(v.reference)); + if(v.reference.type==F::Type::Boolean&&(current<0||current>1))bad("original Boolean domain violation"); + if(v.alias){if(current!=values.at(key(v.target)))bad("original declaration alias violation");continue;} + if(v.domain.present&&!member(current,v.domain.integers))bad("original declared domain violation"); + if(v.assigned&¤t!=value(v.value))bad("original fixed value violation"); + } + for(const auto* input:{&source.raw_domains,&source.raw_constraints})for(const auto& c:*input) + if(!relation(c))bad("original FlatZinc predicate is false: "+c.id); + } +}; +} +} // Detail + +CompiledFlatZinc::CompiledFlatZinc(std::shared_ptr data):data_(std::move(data)) {} +const ModelSnapshot& CompiledFlatZinc::model() const {if(!data_)throw ModelError("moved-from compiled FlatZinc artifact");return data_->model;} +const F::Records& CompiledFlatZinc::source() const {if(!data_)throw ModelError("moved-from compiled FlatZinc artifact");return data_->source;} +const std::vector& CompiledFlatZinc::variables() const {if(!data_)throw ModelError("moved-from compiled FlatZinc artifact");return data_->mapping;} +FlatZincCompileResult compile_flatzinc(const F::Records& source,const FlatZincCompileOptions& options) { + FlatZincCompileResult result; + try { + if(std::isnan(options.time_limit_seconds)||options.time_limit_seconds<0)throw ModelError("invalid FlatZinc compile time limit"); + Detail::FlatZincCompiler compiler(source,options); + try {result.compiled=compiler.run();result.status=FlatZincCompileStatus::Complete;result.message="complete bounded integer/Boolean FlatZinc source compilation";} + catch(...){result.work=compiler.meter.work;throw;} + result.work=compiler.meter.work; + }catch(const Detail::Failure& error){result.compiled.reset();result.status=error.status;result.message=error.message;result.location=error.location;} + catch(const std::bad_alloc&){result.compiled.reset();result.status=FlatZincCompileStatus::ResourceLimit;result.message="FlatZinc compiler allocation failed";} + catch(const ModelError& e){result.compiled.reset();result.status=FlatZincCompileStatus::InvalidInput;result.message=e.what();} + catch(const std::exception& e){result.compiled.reset();result.status=FlatZincCompileStatus::Error;result.message=e.what();} + return result; +} +FlatZincValidation validate_flatzinc(const CompiledFlatZinc& compiled,const SolveResult& result,double tolerance) { + FlatZincValidation check; + try { + if(!std::isfinite(tolerance)||tolerance<0||tolerance>=0.5)throw ModelError("invalid original-source rounding tolerance"); + const auto& model=compiled.model(); + if(result.model_id!=model.model_id||result.revision!=model.revision)Detail::bad("foreign or stale FlatZinc result"); + if(!result.has_solution()||result.values.size()!=model.variables.size()||result.active_variables.size()!=model.variables.size())Detail::bad("missing full FlatZinc witness"); + std::vector rounded=result.values; + for(std::size_t i=0;i(Detail::exact_limit)||integer>static_cast(Detail::exact_limit)||std::abs(integer-x)>tolerance)Detail::bad("FlatZinc witness is not a representable integer"); + rounded[i]=integer; + } + if(!validate(model,rounded,0,0).valid)Detail::bad("rounded witness violates the complete compiled model"); + Detail::SourceEvaluator evaluator;check.source_values.reserve(compiled.variables().size()); + for(const auto& map:compiled.variables()) { + if(map.variable.model_id!=model.model_id||map.variable.id>=rounded.size())Detail::bad("invalid compiled source mapping"); + auto value=static_cast(rounded[map.variable.id]);evaluator.values.emplace(Detail::key(map.source),value);check.source_values.push_back(value); + } + evaluator.declarations(compiled.source()); + const auto objective=compiled.source().solve.method==F::Method::Satisfy?Detail::I(0):evaluator.value(compiled.source().solve.objective); + const auto expected=Detail::number(objective); + if(!result.objective||std::abs(*result.objective-expected)>tolerance)Detail::bad("solver objective disagrees with the original FlatZinc objective"); + check.original_objective=expected;check.valid=true;check.message="all original domains and predicates hold on the rounded source assignment"; + }catch(const Detail::Failure& e){check.message=e.message;} + catch(const std::exception& e){check.message=e.what();} + if(!check.valid){check.original_objective.reset();check.source_values.clear();} + return check; +} +std::string format_flatzinc_solution(const CompiledFlatZinc& compiled,const SolveResult& result,double tolerance) { + const auto checked=validate_flatzinc(compiled,result,tolerance); + if(!checked.valid)throw ModelError("cannot format an invalid FlatZinc solution: "+checked.message); + Detail::SourceEvaluator evaluator; + for(std::size_t i=0;i +#include +#include + +namespace Gecode { namespace Optimize { + +enum class FlatZincCompileStatus { + Complete, Unsupported, InvalidInput, ResourceLimit, TimeLimit, Cancelled, Error +}; +struct FlatZincCompileOptions { + std::size_t max_variables=1000000, max_constraints=1000000; + std::size_t max_nonzeros=2000000, max_work=16000000, max_value_depth=64; + double time_limit_seconds=std::numeric_limits::infinity(); + std::shared_ptr cancellation; +}; +struct FlatZincVariableMapping { + FlatZinc::Capture::Reference source; + Variable variable; +}; +namespace Detail { struct FlatZincArtifact; struct FlatZincCompiler; } +/** Immutable original source and compiled model; no parser or Space lifetime. */ +class CompiledFlatZinc { + std::shared_ptr data_; + explicit CompiledFlatZinc(std::shared_ptr data); + friend struct Detail::FlatZincCompiler; +public: + const ModelSnapshot& model() const; + const FlatZinc::Capture::Records& source() const; + const std::vector& variables() const; +}; +struct FlatZincCompileResult { + FlatZincCompileStatus status=FlatZincCompileStatus::InvalidInput; + std::optional compiled; + FlatZinc::Capture::Location location; + std::string message; + std::size_t work=0; +}; +/** + * Compiles authoritative raw_variables/raw_domains/raw_constraints. Normalized + * parser records are audit data, never a replacement for an original predicate. + * Only a fully admitted model is published. No backend is called here. + * Admits bounded integer/Boolean linear/Boolean relations, <= reification and + * implication, integer equality implication, AllDifferent, 1-based integer + * Element, positive-arity gecode_table_int and bounded finite integer domains + * with holes; explicit-offset nonempty Circuit, fixed four-argument Cumulative, + * and six-argument Regular with literal automaton parameters are also admitted. + * Equality reification, other global/signature forms, floats/sets and unknown + * controls remain Unsupported. Invalid literal schemas are InvalidInput. + * Private gates and fixed literal slots are not source outputs. + */ +FlatZincCompileResult compile_flatzinc(const FlatZinc::Capture::Records& source, + const FlatZincCompileOptions& options={}); +struct FlatZincValidation { + bool valid=false; + std::optional original_objective; + /** Values in variables() order, including each repeated alias. */ + std::vector source_values; + std::string message; +}; +/** Recheck identity, all model slots and every original source relation exactly + * after tolerance-qualified integer rounding. Does not certify the solve bound. + */ +FlatZincValidation validate_flatzinc(const CompiledFlatZinc&, const SolveResult&, + double integrality_tolerance=1e-6); +/** Buffered assignments and a solution separator; never an optimality or + * enumeration-completion marker. Rejects invalid full-model witnesses. + */ +std::string format_flatzinc_solution(const CompiledFlatZinc&, const SolveResult&, + double integrality_tolerance=1e-6); + +}} +#endif diff --git a/gecode/optimize/globals.cpp b/gecode/optimize/globals.cpp new file mode 100644 index 0000000000..308d447e92 --- /dev/null +++ b/gecode/optimize/globals.cpp @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +GlobalConstraint add_all_different(Model& m,const std::vector& v,std::string name) { + return m.add_global(AllDifferentData{v},std::move(name)); +} +GlobalConstraint add_element(Model& m,Variable index,const std::vector& elements, + Variable result,std::int64_t base,std::string name) { + return m.add_global(ElementData{index,elements,result,base},std::move(name)); +} +GlobalConstraint add_table(Model& m,const std::vector& v, + const std::vector>& tuples,std::string name) { + return m.add_global(TableData{v,tuples},std::move(name)); +} +GlobalConstraint add_cumulative(Model& m,const std::vector& starts, + const std::vector& durations, + const std::vector& heights, + std::int64_t capacity,std::string name) { + return m.add_global(CumulativeData{starts,durations,heights,capacity},std::move(name)); +} +GlobalConstraint add_circuit(Model& m,const std::vector& successors, + std::int64_t base,std::string name) { + return m.add_global(CircuitData{successors,base},std::move(name)); +} +GlobalConstraint add_regular(Model& m,const std::vector& variables, + std::uint64_t state_count,std::uint64_t initial_state, + const std::vector& transitions, + const std::vector& final_states,std::string name) { + return m.add_global(RegularData{variables,state_count,initial_state,transitions,final_states},std::move(name)); +} + +namespace Detail { +namespace { +constexpr std::int64_t exact_limit=INT64_C(9007199254740992); +void constant(std::int64_t value) { + if(value < -exact_limit || value > exact_limit) + throw ModelError("Global integer constants must be exactly representable within +/-2^53"); +} +void index_range(std::int64_t base,std::size_t size) { + constant(base); + if(size>static_cast(exact_limit) || + (size && base>exact_limit-static_cast(size-1))) + throw ModelError("Global index range exceeds exact integer representation"); +} +} + +std::vector global_variables(const GlobalPayload& payload) { + if(payload.valueless_by_exception()) throw ModelError("Global constraint has no payload"); + return std::visit([](const auto& data) { + using T=std::decay_t; + if constexpr(std::is_same_v || std::is_same_v || std::is_same_v) return data.variables; + else if constexpr(std::is_same_v) { + auto out=data.elements;out.push_back(data.index);out.push_back(data.result);return out; + } else if constexpr(std::is_same_v) return data.starts; + else return data.successors; + },payload); +} + +void validate_global_payload(const GlobalPayload& payload,ModelId owner, + const std::vector& variables,bool require_active) { + for(const auto handle:global_variables(payload)) { + if(handle.model_id!=owner || handle.id>=variables.size() || + (require_active && !variables[handle.id].active)) + throw ModelError("Global constraint references a foreign, invalid, or deleted variable"); + const auto type=variables[handle.id].type; + if(type!=VariableType::Integer && type!=VariableType::Binary && type!=VariableType::SemiInteger) + throw ModelError("Global constraints require integer, binary, or semi-integer variables"); + } + std::visit([](const auto& data) { + using T=std::decay_t; + if constexpr(std::is_same_v) index_range(data.index_base,data.elements.size()); + else if constexpr(std::is_same_v) { + for(const auto& tuple:data.tuples) { + if(tuple.size()!=data.variables.size()) throw ModelError("Table tuple arity mismatch"); + for(const auto value:tuple) constant(value); + } + } else if constexpr(std::is_same_v) { + if(data.starts.size()!=data.durations.size() || data.starts.size()!=data.heights.size()) + throw ModelError("Cumulative starts, durations and heights must have equal lengths"); + constant(data.capacity); + if(data.capacity<0) throw ModelError("Cumulative capacity must be nonnegative"); + for(const auto duration:data.durations) { + constant(duration);if(duration<0) throw ModelError("Task durations must be nonnegative"); + } + for(const auto height:data.heights) { + constant(height);if(height<0) throw ModelError("Task heights must be nonnegative"); + } + } else if constexpr(std::is_same_v) { + if(data.successors.empty()) throw ModelError("A circuit needs at least one successor"); + index_range(data.index_base,data.successors.size()); + } else if constexpr(std::is_same_v) { + if(!data.state_count||data.initial_state>=data.state_count) + throw ModelError("Regular state count must be positive and initial state in range"); + std::set> keys; + for(const auto& transition:data.transitions){ + constant(transition.symbol); + if(transition.from>=data.state_count||transition.to>=data.state_count) + throw ModelError("Regular transition state is outside the declared state range"); + if(!keys.emplace(transition.from,transition.symbol).second) + throw ModelError("Regular transition keys (from,symbol) must be unique"); + } + for(auto final:data.final_states)if(final>=data.state_count) + throw ModelError("Regular final state is outside the declared state range"); + } + },payload); +} + +void validate_globals(const ModelSnapshot& model) { + for(std::size_t i=0;i& values, + double tolerance,std::string& reason) { + bool representable=true; + const auto value=[&](Variable variable) { + const double raw=values.at(static_cast(variable.id)); + if(!std::isfinite(raw) || std::abs(raw)>static_cast(exact_limit) || + std::abs(raw-std::round(raw))>tolerance) { + representable=false;return std::int64_t{0}; + } + return static_cast(std::round(raw)); + }; + // Check representability before branching/indexing on any rounded value. + for(const auto variable:global_variables(payload)) (void)value(variable); + if(!representable) {reason="global value is not an exact integer within +/-2^53";return false;} + const bool valid=std::visit([&](const auto& data)->bool { + using T=std::decay_t; + if constexpr(std::is_same_v) { + std::vector assigned; + for(const auto variable:data.variables) assigned.push_back(value(variable)); + std::sort(assigned.begin(),assigned.end()); + return std::adjacent_find(assigned.begin(),assigned.end())==assigned.end(); + } else if constexpr(std::is_same_v) { + const auto index=value(data.index); + if(index(index-data.index_base)>=data.elements.size()) return false; + return value(data.result)==value(data.elements[static_cast(index-data.index_base)]); + } else if constexpr(std::is_same_v) { + for(const auto& tuple:data.tuples) { + bool equal=true; + for(std::size_t i=0;i) { + std::vector> events; + for(std::size_t i=0;i0 && event.second>data.capacity-used) return false; + used+=event.second; + } + return true; + } else if constexpr(std::is_same_v) { + std::map,std::uint64_t> transitions; + for(const auto& edge:data.transitions)transitions.emplace(std::make_pair(edge.from,edge.symbol),edge.to); + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=transitions.find({state,value(variable)}); + if(edge==transitions.end())return false; + state=edge->second; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + std::vector visited(data.successors.size(),false); + std::size_t node=0; + for(std::size_t step=0;step(successor-data.index_base)>=visited.size()) return false; + node=static_cast(successor-data.index_base); + } + return node==0; + } + },payload); + if(!valid) reason="original global constraint violated"; + return valid; +} +} +}} diff --git a/gecode/optimize/globals.hpp b/gecode/optimize/globals.hpp new file mode 100644 index 0000000000..892f3374f4 --- /dev/null +++ b/gecode/optimize/globals.hpp @@ -0,0 +1,47 @@ +#ifndef GECODE_OPTIMIZE_GLOBALS_HPP +#define GECODE_OPTIMIZE_GLOBALS_HPP +#include + +namespace Gecode { namespace Optimize { +/// Retain pairwise inequality of the supplied integer-variable slots. +GlobalConstraint add_all_different(Model&, const std::vector&, std::string name = {}); +/// Retain result == elements[index-index_base], including repeated handles. +GlobalConstraint add_element(Model&, Variable index, const std::vector& elements, + Variable result, std::int64_t index_base = 0, std::string name = {}); +/** Retain membership in a positive integer tuple table with matching arity. + * An empty tuple list is false. A zero-variable table containing an empty + * tuple is true; the separate FlatZinc compiler requires positive arity. + */ +GlobalConstraint add_table(Model&, const std::vector&, + const std::vector>&, std::string name = {}); +/** Mandatory fixed-duration tasks, half-open intervals; zero duration/height uses no resource. */ +GlobalConstraint add_cumulative(Model&, const std::vector& starts, + const std::vector& durations, + const std::vector& heights, + std::int64_t capacity, std::string name = {}); +/** One cycle through a nonempty successor array, with explicit index base. */ +GlobalConstraint add_circuit(Model&, const std::vector& successors, + std::int64_t index_base = 0, std::string name = {}); +/** Retain membership in a deterministic finite automaton's language. + * States are in [0,state_count); missing transitions reject. Transition keys + * (from,symbol) must be unique; repeated final states have set semantics. + * Empty words accept exactly when initial_state is final. No epsilon edges. + * Posting validates original metadata; native solving applies additional + * integer, array-size and automaton-storage limits before compilation. + */ +GlobalConstraint add_regular(Model&, const std::vector& variables, + std::uint64_t state_count, std::uint64_t initial_state, + const std::vector& transitions, + const std::vector& final_states, + std::string name = {}); + +namespace Detail { +std::vector global_variables(const GlobalPayload&); +void validate_global_payload(const GlobalPayload&, ModelId, const std::vector&, + bool require_active); +void validate_globals(const ModelSnapshot&); +bool global_satisfied(const GlobalPayload&, const std::vector&, double integrality_tolerance, + std::string& reason); +} +}} +#endif diff --git a/gecode/optimize/io.cpp b/gecode/optimize/io.cpp new file mode 100644 index 0000000000..889cda105d --- /dev/null +++ b/gecode/optimize/io.cpp @@ -0,0 +1,590 @@ +/* Lossless, deliberately bounded LP/free-MPS I/O. No backend parser is used. */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#include +#include +#include +#else +#include +#include +#endif + +namespace Gecode { namespace Optimize { +namespace { +constexpr double inf = std::numeric_limits::infinity(); +using Terms = std::vector>; + +[[noreturn]] void fail(const std::string& message) { + throw ModelError("LP/MPS I/O: " + message); +} +std::string lower(std::string text) { + for (char& c : text) if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; + return text; +} +std::string trim(const std::string& s) { + const auto first = s.find_first_not_of(" \t\r\n"); + return first == std::string::npos ? "" : s.substr(first, s.find_last_not_of(" \t\r\n")-first+1); +} +bool identifier(const std::string& s) { + const auto alpha = [](char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; }; + if (s.empty() || !alpha(s.front())) return false; + return std::all_of(s.begin()+1, s.end(), [&](char c) { return alpha(c) || (c >= '0' && c <= '9'); }); +} +std::string format(const std::string& filename) { + const auto extension = lower(std::filesystem::path(filename).extension().string()); + if (extension != ".lp" && extension != ".mps") fail("only uncompressed .lp and .mps are supported"); + return extension; +} +std::vector words(const std::string& line) { + std::istringstream in(line); in.imbue(std::locale::classic()); + std::vector result; + for (std::string word; in >> word;) result.push_back(word); + return result; +} +long double number(std::string text, bool infinity = false) { + const auto lc = lower(text); + if (infinity && (lc == "inf" || lc == "+inf" || lc == "infinity" || lc == "+infinity")) return inf; + if (infinity && (lc == "-inf" || lc == "-infinity")) return -inf; + if (text.empty()) fail("missing number"); + for (auto& c : text) if (c == 'd' || c == 'D') c = 'e'; + std::istringstream in(text); in.imbue(std::locale::classic()); + long double value = 0; + in >> value; + if (!in || !in.eof() || !std::isfinite(value)) fail("invalid finite number: " + text); + return value; +} +double narrow(long double value) { + if (!std::isfinite(value) || std::fabs(value) > std::numeric_limits::max()) + fail("numeric value or arithmetic result exceeds double range"); + const double result = static_cast(value); + if (value != 0 && result == 0) fail("nonzero value underflows double range"); + return result; +} +double scalar(const std::string& value, bool infinity = false) { + const auto n = number(value, infinity); + return std::isinf(n) ? static_cast(n) : narrow(n); +} +std::string hex(const std::string& s) { + static constexpr char digits[] = "0123456789abcdef"; + if (s.empty()) return "-"; + std::string result; + for (unsigned char c : s) { result += digits[c >> 4]; result += digits[c & 15]; } + return result; +} +std::string unhex(const std::string& s) { + if (s == "-") return ""; + if (s.empty() || s.size()%2) fail("malformed name metadata"); + const auto digit = [](char c) -> int { + if (c >= '0' && c <= '9') return c-'0'; + if (c >= 'a' && c <= 'f') return c-'a'+10; + fail("malformed name metadata"); + }; + std::string result; + for (std::size_t i=0; i(16*digit(s[i])+digit(s[i+1])); + return result; +} + +struct DraftVar { + std::string name; + VariableType type = VariableType::Continuous; + double lb = 0, ub = inf; + bool lower_set = false, upper_set = false, marker = false, any_bound = false; +}; +struct DraftRow { std::string name; Terms terms; double lb = -inf, ub = inf; }; +Terms canonical(const Terms& terms) { + std::map> sums; + for(const auto& term:terms) { + auto& pair=sums[term.first];const long double next=pair.first+term.second; + pair.second+=std::fabs(pair.first)>=std::fabs(term.second)?(pair.first-next)+term.second:(term.second-next)+pair.first; + pair.first=next;if(!std::isfinite(next)||!std::isfinite(pair.second))fail("coefficient sum overflow"); + } + Terms result;for(const auto& sum:sums){const double value=narrow(sum.second.first+sum.second.second);if(value!=0)result.push_back({sum.first,value});} + return result; +} +struct Draft { + std::vector vars; + std::map indices; + std::vector rows; + Terms objective; + double offset = 0; + ObjectiveSense sense = ObjectiveSense::Minimize; + std::map,std::string> names; + std::map ranges; + std::size_t variable(const std::string& name) { + if (!identifier(name)) fail("unsupported identifier: " + name); + const auto found = indices.find(name); + if (found != indices.end()) return found->second; + const auto id = vars.size(); vars.push_back({name}); indices.emplace(name,id); return id; + } + void metadata(const std::string& text) { + const auto w=words(text); + if (w.empty() || w[0].rfind("GECODE_",0)!=0) return; + if (w[0]=="GECODE_NAME" && w.size()==4 && (w[1]=="V" || w[1]=="R") && identifier(w[2])) { + if (!names.emplace(std::make_pair(w[1],w[2]),unhex(w[3])).second) fail("duplicate name metadata"); + } else if (w[0]=="GECODE_RANGE" && w.size()==3 && identifier(w[1]) && identifier(w[2])) { + if (!ranges.emplace(w[1],w[2]).second) fail("duplicate range metadata"); + } else fail("unsupported or malformed Gecode metadata"); + } + Model build() { + // LP ranged rows are serialized as two portable inequalities. Only a + // matching pair with exactly equal canonical expressions is recombined. + Model model; + std::vector handles; + for (auto& var : vars) { + const auto named=names.find({"V",var.name}); + handles.push_back(model.add_variable(var.type,var.lb,var.ub,named==names.end()?var.name:named->second)); + if (named!=names.end()) names.erase(named); + } + const auto terms = [&](const Terms& input) { + std::vector output; + for (const auto& t : input) output.push_back({handles.at(t.first),t.second}); + return output; + }; + std::map row_names; + for (std::size_t i=0;i omitted; + for (const auto& range : ranges) { + const auto li=row_names.find(range.first), ui=row_names.find(range.second); + if(li==row_names.end()||ui==row_names.end())fail("range metadata references absent row"); + auto lo=rows.begin()+static_cast(li->second),hi=rows.begin()+static_cast(ui->second); + if (lo==hi || !std::isfinite(lo->lb) || lo->ub!=inf || + hi->lb!=-inf || !std::isfinite(hi->ub) || omitted.count(lo->name) || + !omitted.insert(hi->name).second) fail("invalid ranged-row metadata"); + if(canonical(lo->terms)!=canonical(hi->terms))fail("range metadata expressions differ"); + lo->ub=hi->ub; + } + for (const auto& row : rows) { + if (omitted.count(row.name)) continue; + const auto named=names.find({"R",row.name}); + model.add_row(terms(row.terms),row.lb,row.ub,named==names.end()?row.name:named->second); + if (named!=names.end()) names.erase(named); + } + if (!names.empty()) fail("name metadata references absent entity"); + model.set_objective(terms(objective),sense,offset); + validate_structure(model.snapshot()); + return model; + } +}; + +std::vector lex(const std::string& text) { + std::vector result; + for (std::size_t i=0;i') { + if(i+1>=text.size()||text[i+1]!='=') fail("strict or incomplete LP comparison"); + result.push_back(text.substr(i,2));i+=2;continue; + } + const auto begin=i; + if((c>='0'&&c<='9')||c=='.') { + while(i='0'&&text[i]<='9')||text[i]=='.')) ++i; + if(i='0'&&text[i]<='9')++i; + if(i==exponent)fail("invalid LP exponent"); + } + if(i='a'&&text[i]<='z')||(text[i]>='A'&&text[i]<='Z')||text[i]=='_')) + fail("LP numeric coefficients need whitespace before variable names"); + auto value=text.substr(begin,i-begin); (void)number(value); result.push_back(value); continue; + } + if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') { + ++i;while(i='A'&&text[i]<='Z')||(text[i]>='a'&&text[i]<='z')|| + (text[i]>='0'&&text[i]<='9')||text[i]=='_'))++i; + result.push_back(text.substr(begin,i-begin));continue; + } + fail("unsupported LP syntax (nonlinear/SOS/quoted names are not supported)"); + } + return result; +} +double signed_number(const std::vector& tokens,std::size_t& p,bool infinity=false) { + std::string sign; + if(p=std::fabs(value)?(sum-next)+value:(value-next)+sum; + sum=next; + if(!std::isfinite(sum)||!std::isfinite(correction))fail("LP expression offset overflow"); + } + double value() const {return narrow(sum+correction);} +}; +std::pair expression(Draft& draft,const std::vector& tokens,std::size_t first,std::size_t last) { + Terms terms; Offset offset; + bool initial=true; + while(first1&&t[1]==":"?2:0; + auto e=expression(draft,t,start,t.size());draft.objective=std::move(e.first);draft.offset=e.second.value();objective_parsed=true;}; + const auto parse_row=[&](const std::string& text) { + const auto t=lex(text);std::size_t first=0; + std::string name="row_"+std::to_string(draft.rows.size()); + if(t.size()>1&&t[1]==":"){name=t[0];first=2;} + auto relation=std::find_if(t.begin()+static_cast(first),t.end(),[](const auto& s){return s=="<="||s==">="||s=="=";}); + if(relation==t.end())fail("LP row missing comparison"); + const auto at=static_cast(relation-t.begin()); + auto e=expression(draft,t,first,at);std::size_t pos=at+1;const double rhs=signed_number(t,pos,true); + if(pos!=t.size())fail("LP rows require one comparison and numeric RHS"); + // Keep the compensation through RHS subtraction: narrowing the LHS + // constant first loses the residual in x + 1 - 1e16 >= -1e16. + if(std::isfinite(rhs))e.second.add(-static_cast(rhs)); + const double side=std::isinf(rhs)?rhs:-e.second.value(); + DraftRow row{name,std::move(e.first),-inf,inf}; + if(*relation=="<="||*relation=="=")row.ub=side; + if(*relation==">="||*relation=="=")row.lb=side; + draft.rows.push_back(std::move(row)); + }; + for(std::string line;std::getline(input,line);) { + line=trim(line);if(line.empty())continue; + if(line.front()=='\\'){draft.metadata(trim(line.substr(1)));continue;} + if(end_seen)fail("content follows LP End"); + if(line.find('\\')!=std::string::npos)line=trim(line.substr(0,line.find('\\'))); + const auto keyword=lower(line);Section next=Section::None; + if(keyword=="minimize"||keyword=="minimum"||keyword=="min"||keyword=="maximize"||keyword=="maximum"||keyword=="max") { + if(objective_seen)fail("multiple LP objectives"); objective_seen=true; + draft.sense=keyword.rfind("max",0)==0?ObjectiveSense::Maximize:ObjectiveSense::Minimize;next=Section::Objective; + } else if(keyword=="subject to"||keyword=="such that"||keyword=="st"||keyword=="s.t."||keyword=="s.t") { + if(rows_seen)fail("duplicate LP constraint section");rows_seen=true;next=Section::Rows; + } else if(keyword=="bounds"||keyword=="bound")next=Section::Bounds; + else if(keyword=="binary"||keyword=="binaries"||keyword=="bin")next=Section::Binary; + else if(keyword=="general"||keyword=="generals"||keyword=="gen"||keyword=="integer"||keyword=="integers")next=Section::General; + else if(keyword=="semi"||keyword=="semis"||keyword=="semi-continuous")next=Section::Semi; + else if(keyword=="end"){next=Section::End;end_seen=true;} + else if(keyword=="sos"||keyword=="pwl"||keyword=="indicators")fail("unsupported LP section: "+line); + if(next!=Section::None){if(!pending.empty())fail("incomplete LP row"); + if(!objective_seen)fail("LP objective must be first"); + if(section==Section::Objective&&!objective_parsed)parse_objective();section=next;continue;} + if(section==Section::Objective){objective+=" "+line;continue;} + if(section==Section::Rows) { + pending+=" "+line; + const auto t=lex(pending);auto rel=std::find_if(t.begin(),t.end(),[](const auto& s){return s=="<="||s==">="||s=="=";}); + if(rel!=t.end()&&rel+1!=t.end()&&t.back()!="+"&&t.back()!="-"){parse_row(pending);pending.clear();} + continue; + } + const auto t=lex(line); + if(section==Section::Bounds) { + if(t.size()==2&&identifier(t[0])&&lower(t[1])=="free") { + auto& v=draft.vars[draft.variable(t[0])];if(v.lower_set||v.upper_set)fail("duplicate LP bound side"); + v.lb=-inf;v.ub=inf;v.lower_set=v.upper_set=true;continue; + } + std::size_t p=0;std::string name;double lb=-inf,ub=inf;bool set_lb=false,set_ub=false; + if(!t.empty()&&identifier(t[0])&&lower(t[0])!="inf"&&lower(t[0])!="infinity") { + name=t[p++];if(p>=t.size())fail("incomplete LP bound");const auto op=t[p++]; + const double n=signed_number(t,p,true); + if(op=="<="||op=="="){ub=n;set_ub=true;}if(op==">="||op=="="){lb=n;set_lb=true;} + if(!set_lb&&!set_ub)fail("invalid LP bound comparison"); + } else { + lb=signed_number(t,p,true);if(p>=t.size()||t[p++]!="<=")fail("unsupported LP bound direction"); + if(p>=t.size())fail("missing LP bound variable");name=t[p++];set_lb=true; + if(p rows;std::vector senses;std::map ranges; + std::set rhs_seen;std::set> bound_seen; + std::string objective,rhs_name,range_name,bound_name;bool integer=false,ended=false,columns=false; + std::set
sections; + for(std::string line;std::getline(input,line);) { + line=trim(line);if(line.empty())continue;if(line.front()=='*'){d.metadata(trim(line.substr(1)));continue;} + if(ended)fail("content follows MPS ENDATA");const auto w=words(line);const auto key=lower(w[0]);Section next=Section::None; + if(key=="name"&&w.size()<=2)next=Section::Name; + else if(key=="objsense"&&w.size()<=2)next=Section::Sense; + else if(w.size()==1) { + if(key=="rows")next=Section::Rows;else if(key=="columns")next=Section::Columns; + else if(key=="rhs")next=Section::Rhs;else if(key=="ranges")next=Section::Ranges; + else if(key=="bounds")next=Section::Bounds;else if(key=="endata")next=Section::End; + else if(sec!=Section::Sense)fail("unsupported MPS section: "+w[0]); + } + if(next!=Section::None) { + if(!sections.insert(next).second)fail("duplicate MPS section"); + if(next==Section::Columns){if(objective.empty())fail("MPS requires objective N row before COLUMNS");columns=true;} + if(next==Section::Rows&&columns)fail("MPS ROWS out of order"); + if((next==Section::Rhs||next==Section::Ranges||next==Section::Bounds)&&!columns)fail("MPS sections out of order"); + if(sec==Section::Columns&&integer)fail("unclosed MPS integer marker");sec=next; + if(next==Section::End){ended=true;continue;} + if(next!=Section::Sense||w.size()==1)continue; + } + if(sec==Section::Sense) { + const auto value=lower(w.back());if(value!="min"&&value!="max")fail("invalid MPS objective sense"); + d.sense=value=="min"?ObjectiveSense::Minimize:ObjectiveSense::Maximize;sec=Section::Name;continue; + } + if(sec==Section::Rows) { + if(w.size()!=2||w[0].size()!=1||!identifier(w[1]))fail("invalid MPS ROWS record"); + const char kind=static_cast(std::toupper(static_cast(w[0][0]))); + if(kind!='N'&&kind!='L'&&kind!='G'&&kind!='E')fail("unsupported MPS row type"); + if(rows.count(w[1])||w[1]==objective)fail("duplicate MPS row name"); + if(kind=='N'&&objective.empty()){objective=w[1];continue;} + rows.emplace(w[1],d.rows.size());d.rows.push_back({w[1],{},kind=='G'||kind=='E'?0:-inf,kind=='L'||kind=='E'?0:inf});senses.push_back(kind);continue; + } + if(sec==Section::Columns) { + if(w.size()==3&&w[1]=="'MARKER'") { + if(w[2]=="'INTORG'"&&!integer)integer=true;else if(w[2]=="'INTEND'"&&integer)integer=false;else fail("invalid integer marker");continue; + } + if(w.size()!=3&&w.size()!=5)fail("invalid MPS COLUMNS record"); + const bool existed=d.indices.count(w[0])!=0;const auto id=d.variable(w[0]);auto& v=d.vars[id]; + if(existed&&v.marker!=integer)fail("inconsistent column integrality markers"); + if(integer){v.marker=true;v.type=VariableType::Integer;} + for(std::size_t p=1;psecond].terms.push_back({id,value});} + }continue; + } + if(sec==Section::Rhs||sec==Section::Ranges) { + if(w.size()!=3&&w.size()!=5)fail("invalid RHS/RANGES record"); + auto& vector_name=sec==Section::Rhs?rhs_name:range_name; + if(vector_name.empty())vector_name=w[0];if(vector_name!=w[0])fail("multiple RHS/RANGES vectors are unsupported"); + for(std::size_t p=1;p::max()).second)fail("duplicate/invalid objective RHS");d.offset=-scalar(w[p+1]);continue;} + const auto found=rows.find(w[p]);if(found==rows.end())fail("RHS/RANGES references unknown row");const auto id=found->second; + if(sec==Section::Ranges){if(senses[id]=='N'||!ranges.emplace(id,number(w[p+1])).second)fail("duplicate/invalid row range");} + else {if(!rhs_seen.insert(id).second)fail("duplicate RHS row");const double value=scalar(w[p+1]); + if(senses[id]=='N')fail("RHS for nonobjective free row unsupported"); + if(senses[id]=='L'||senses[id]=='E')d.rows[id].ub=value;if(senses[id]=='G'||senses[id]=='E')d.rows[id].lb=value;} + }continue; + } + if(sec==Section::Bounds) { + if(w.size()!=3&&w.size()!=4)fail("invalid MPS BOUNDS record"); + if(bound_name.empty())bound_name=w[1];if(bound_name!=w[1])fail("multiple bound vectors unsupported"); + const auto found=d.indices.find(w[2]);if(found==d.indices.end())fail("BOUNDS references unknown column"); + const auto id=found->second;auto& v=d.vars[id];const auto code=lower(w[0]); + if(!bound_seen.insert({id,code}).second)fail("duplicate MPS bound record");v.any_bound=true; + const bool valued=code=="lo"||code=="up"||code=="fx"||code=="li"||code=="ui"||code=="sc"||code=="si"; + if((valued&&w.size()!=4)||(!valued&&w.size()!=3))fail("wrong MPS bound arity"); + const double value=valued?scalar(w[3]):0; + const bool writes_lower=code=="lo"||code=="li"||code=="fx"||code=="fr"||code=="mi"; + const bool writes_upper=code=="up"||code=="ui"||code=="fx"||code=="fr"||code=="pl"||code=="sc"||code=="si"; + if((writes_lower&&v.lower_set)||(writes_upper&&v.upper_set)|| + (code=="bv"&&(v.lower_set||v.upper_set)))fail("overlapping MPS bound definitions"); + if((code=="li"||code=="ui")&&(v.type==VariableType::Binary||v.type==VariableType::SemiContinuous||v.type==VariableType::SemiInteger)) + fail("conflicting MPS variable type definitions"); + if((code=="sc"&&v.type!=VariableType::Continuous)|| + (code=="si"&&v.type!=VariableType::Continuous&&v.type!=VariableType::Integer)|| + (code=="bv"&&(v.type==VariableType::SemiContinuous||v.type==VariableType::SemiInteger))) + fail("conflicting MPS variable type definitions (use SI for semi-integer columns)"); + if(code=="lo"||code=="li"){v.lb=value;v.lower_set=true;if(code=="li")v.type=VariableType::Integer;} + else if(code=="up"||code=="ui"){v.ub=value;v.upper_set=true;if(code=="ui")v.type=VariableType::Integer;} + else if(code=="fx"){v.lb=v.ub=value;v.lower_set=v.upper_set=true;} + else if(code=="fr"){v.lb=-inf;v.ub=inf;v.lower_set=v.upper_set=true;} + else if(code=="mi"){v.lb=-inf;v.lower_set=true;} + else if(code=="pl"){v.ub=inf;v.upper_set=true;} + else if(code=="bv"){v.type=VariableType::Binary;v.lb=0;v.ub=1;v.lower_set=v.upper_set=true;} + else if(code=="sc"||code=="si"){v.type=code=="si"?VariableType::SemiInteger:VariableType::SemiContinuous;v.ub=value;v.upper_set=true;if(!v.lower_set)v.lb=1;} + else fail("unsupported MPS bound type: "+w[0]);continue; + } + fail("unexpected MPS record or unsupported section"); + } + if(!ended||!columns||objective.empty())fail("MPS requires ROWS, COLUMNS and ENDATA"); + for(auto& v:d.vars)if(v.marker&&!v.any_bound)v.ub=1; + for(const auto& range:ranges) { + const auto id=range.first;const auto value=range.second;auto& row=d.rows[id]; + if(senses[id]=='L'||(senses[id]=='E'&&value<0))row.lb=narrow(static_cast(row.ub)-std::fabs(value)); + else row.ub=narrow(static_cast(row.lb)+std::fabs(value)); + } + return d.build(); +} + +std::string real(double value) { + if(std::isinf(value))return value<0?"-inf":"+inf"; + std::ostringstream out;out.imbue(std::locale::classic());out<::max_digits10)< map(original.variables.size()); + for(const auto& v:original.variables)if(v.active)map[v.variable.id]=m.add_variable(v.type,v.lower,v.upper,v.name); + const auto terms=[&](const std::vector& src){std::vector out;for(const auto& t:src)out.push_back({map[t.variable.id],t.coefficient});return out;}; + for(const auto& r:original.rows)if(r.active)m.add_row(terms(r.terms),r.lower,r.upper,r.name); + m.set_objective(terms(original.objective.terms),original.objective.sense,original.objective.offset);return m.snapshot(); +} +void equivalent(const ModelSnapshot& a,const ModelSnapshot& b) { + if(a.variables.size()!=b.variables.size()||a.rows.size()!=b.rows.size()||a.objective.offset!=b.objective.offset||a.objective.sense!=b.objective.sense) + fail("export round trip changed dimensions/objective"); + const auto terms=[](const auto& x,const auto& y){if(x.size()!=y.size())fail("export changed expression size");for(std::size_t i=0;i costs(m.variables.size(),0);for(const auto& t:m.objective.terms)costs[t.variable.id]=t.coefficient; + const auto expression_out=[&](const std::vector& terms){if(terms.empty())out<<" 0";for(const auto& t:terms)out<<(t.coefficient<0?" - ":" + ")<= "<>> by_column(m.variables.size()); + for(const auto& r:m.rows)for(const auto& t:r.terms)by_column[t.variable.id].push_back({r.constraint.id,t.coefficient}); + out<<"COLUMNS\n";bool integer=false;std::size_t marker=0; + for(const auto& v:m.variables) { + const bool integral=v.type==VariableType::Integer||v.type==VariableType::Binary||v.type==VariableType::SemiInteger; + if(integral!=integer){out<<" mark"<(r.upper)-r.lower))<<'\n';} + out<<"BOUNDS\n"; + for(const auto& v:m.variables) { + if(v.type==VariableType::Binary) { + if(v.lower!=0||v.upper!=1)fail("MPS binary export requires bounds [0,1]; use LP for tighter binary bounds"); + out<<" BV bnd x"< serial{0};std::random_device random; + for(int attempt=0;attempt<64;++attempt) { + path=destination.parent_path()/("."+destination.filename().string()+".tmp-"+std::to_string(random())+"-"+std::to_string(serial++)); +#ifdef _WIN32 + const int fd=_wopen(path.c_str(),_O_CREAT|_O_EXCL|_O_WRONLY|_O_BINARY,_S_IREAD|_S_IWRITE); + if(fd>=0){file=_fdopen(fd,"wb");if(!file)_close(fd);} +#else + const int fd=::open(path.c_str(),O_CREAT|O_EXCL|O_WRONLY,0600); + if(fd>=0){file=fdopen(fd,"wb");if(!file)::close(fd);} +#endif + if(file)return; + if(fd>=0){std::error_code ec;std::filesystem::remove(path,ec);fail("cannot open temporary output stream");} + if(errno!=EEXIST)fail("cannot create same-directory temporary output"); + }fail("cannot allocate unique temporary output"); + } + ~Temporary(){if(file)std::fclose(file);if(!path.empty()){std::error_code ec;std::filesystem::remove(path,ec);}} + void write(const std::string& bytes) { + if(std::fwrite(bytes.data(),1,bytes.size(),file)!=bytes.size()||std::fflush(file)!=0)fail("output write failed"); + FILE* closing=file;file=nullptr;if(std::fclose(closing)!=0)fail("output close failed"); + } + void replace(const std::filesystem::path& destination) { +#ifdef _WIN32 + if(!MoveFileExW(path.c_str(),destination.c_str(),MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH))fail("atomic destination replacement failed"); +#else + if(std::rename(path.c_str(),destination.c_str())!=0)fail("atomic destination replacement failed"); +#endif + path.clear(); + } +}; +Model parse_file(const std::filesystem::path& path,bool mps) { + std::ifstream input(path);if(!input)fail("cannot open input: "+path.string());input.imbue(std::locale::classic()); + Model model=mps?read_mps(input):read_lp(input);if(input.bad())fail("input read failed");return model; +} +} + +Model read_model(const std::string& filename) { + return parse_file(std::filesystem::path(filename),format(filename)==".mps"); +} +void write_model(const ModelSnapshot& model,const std::string& filename) { + const bool mps=format(filename)==".mps"; + if(std::any_of(model.globals.begin(),model.globals.end(),[](const auto& item){return item.active;})) + fail("native globals cannot be preserved by linear LP/MPS export"); + if(std::any_of(model.indicators.begin(),model.indicators.end(),[](const auto& item){return item.active;})) + fail("active original indicators require retained logical metadata and domain guards; linear LP/MPS export is unsupported for this model"); + const auto original=compact(model);const auto bytes=serialize(original,mps); + const auto destination=std::filesystem::absolute(std::filesystem::path(filename)); + Temporary output(destination);output.write(bytes); + auto restored=parse_file(output.path,mps);equivalent(original,restored.snapshot());output.replace(destination); +} +}} diff --git a/gecode/optimize/learning_reasons_detail.hpp b/gecode/optimize/learning_reasons_detail.hpp new file mode 100644 index 0000000000..ef5d1f94cf --- /dev/null +++ b/gecode/optimize/learning_reasons_detail.hpp @@ -0,0 +1,125 @@ +/* Private pilot: checked conditional reasons for original integer linear rows. + * No existing propagator, search, SAT interface, or public solve API uses this. + */ +#ifndef GECODE_OPTIMIZE_LEARNING_REASONS_DETAIL_HPP +#define GECODE_OPTIMIZE_LEARNING_REASONS_DETAIL_HPP +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { namespace Detail { namespace Learning { +struct KernelAccess; +struct CompiledData; + +enum class Side { Lower, Upper }; +struct BoundFact { + Variable variable; + Side side=Side::Lower; + std::int64_t value=0; +}; +struct Contradiction {}; +using Conclusion=std::variant; + +/** Exact owned source, never authenticated by model/revision tags alone. */ +class Source final { +public: + ~Source(); + Source(const Source&)=delete; + Source& operator=(const Source&)=delete; + ModelId id() const noexcept {return original_.model_id;} + Revision revision() const noexcept {return original_.revision;} + const ModelSnapshot& original() const noexcept {return original_;} +private: + friend struct KernelAccess; + Source(ModelSnapshot,std::unique_ptr); + ModelSnapshot original_; + std::unique_ptr compiled_; +}; + +/** Untrusted conditional claim. All facts are antecedents, not global truths. + * Facts are strictly ordered by (variable slot, Lower then Upper), with at most + * one per slot/side, and must strengthen the named original domain side. + * Facts and a bound conclusion refer to live variables occurring in this row. + */ +struct Candidate { + std::shared_ptr source; + ModelId model_id=0; + Revision revision=0; + Constraint row; + Side row_side=Side::Lower; + std::vector antecedents; + Conclusion conclusion; +}; + +/** Only a completed checker can construct this immutable owning record. */ +class VerifiedReason final { +public: + VerifiedReason(const VerifiedReason&)=delete; + VerifiedReason& operator=(const VerifiedReason&)=delete; + const Candidate& claim() const noexcept {return candidate_;} +private: + friend struct KernelAccess; + explicit VerifiedReason(Candidate); + Candidate candidate_; +}; + +struct Limits { + /** Original slots include tombstones; nonzeros include active rows only. */ + std::size_t max_variable_slots=100000,max_row_slots=100000,max_nonzeros=1000000; + std::size_t max_facts=100000,max_reasons=200000; + /** Conservative logical slots and element visits, not bytes or CPU time. */ + std::size_t max_retained_slots=8000000,max_work=100000000; +}; +struct Options { + double time_limit_seconds=std::numeric_limits::infinity(); + std::shared_ptr cancellation; + Limits limits; +}; +enum class State { + Complete,Unsupported,InvalidInput,ArithmeticOverflow,ResourceLimit, + Stopped,AllocationFailure,InternalError +}; +struct Work { + std::size_t coordinator_visits=0,retained_slots=0,reasons_checked=0; +}; +struct Report { + State state=State::InvalidInput; + ModelId model_id=0; + Revision revision=0; + std::optional stop_reason; + std::string message; + Work work; + double elapsed_seconds=0; +}; +struct SourceResult : Report {std::shared_ptr source;}; +struct CheckResult : Report {std::shared_ptr reason;}; +struct BatchResult : Report {std::vector> reasons;}; + +/** Copy/admission occurs inside this measured call. Only finite integral + * Integer/Binary domains and ordinary rows with integral data within +/-2^53 + * are admitted. Infinite absent row sides are allowed. Objective is structurally + * validated but has no role in this feasibility-reason utility. + */ +SourceResult compile_source(const ModelSnapshot&,const Options& = {}); + +/** Uses expected_source pointer identity AND tags, then independently reads + * original domains/row data. Antecedents must be consistent before negating a + * strict non-root/non-redundant bound conclusion. Complement/row arithmetic is + * checked int64; overflow is rejection, never an accepted vacuous implication. + * A constant-row contradiction with zero antecedents is a valid explicit claim. + */ +CheckResult check_reason(const std::shared_ptr& expected_source, + const Candidate&,const Options& = {}); + +/** One unchanged box reconstructed from original domains and explicit facts. + * Both finite sides are considered. First pilot retains every row-specific + * input fact in each reason; it does not minimize explanations. Generation and + * every independent verification share one meter. Only a complete verified + * batch is returned; an empty Complete batch means no deduction, not conflict. + */ +BatchResult generate_row_reasons(const std::shared_ptr&,Constraint, + const std::vector&, + const Options& = {}); +}}}} +#endif diff --git a/gecode/optimize/lp_basis.cpp b/gecode/optimize/lp_basis.cpp new file mode 100644 index 0000000000..5a46c5bee7 --- /dev/null +++ b/gecode/optimize/lp_basis.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +void tick(const SolveBudget* budget) { + // Admission does not mutate any backend. The solve wrapper translates this + // finite-work interruption into the shared budget's exact stop reason. + if (budget && budget->expired()) throw ModelError("Basis admission interrupted by solve budget"); +} +void status(LpBasisStatus value,double lower,double upper) { + switch(value) { + case LpBasisStatus::Basic: case LpBasisStatus::NonbasicUnspecified: return; + case LpBasisStatus::Lower: + if(std::isfinite(lower))return; + throw ModelError("Lower basis status requires a finite lower bound"); + case LpBasisStatus::Upper: + if(std::isfinite(upper))return; + throw ModelError("Upper basis status requires a finite upper bound"); + case LpBasisStatus::Zero: + if(!std::isfinite(lower)&&!std::isfinite(upper))return; + throw ModelError("Zero basis status requires a free row or column"); + } + throw ModelError("Unknown original LP basis status"); +} +bool same(Variable a,Variable b){return a.model_id==b.model_id&&a.id==b.id;} +bool same(Constraint a,Constraint b){return a.model_id==b.model_id&&a.id==b.id;} +bool terms(const std::vector& a,const std::vector& b,const SolveBudget& budget){ + if(a.size()!=b.size())return false; + for(std::size_t i=0;i make_lp_basis(const LpBasisData& data){ + return Detail::LpBasisAccess::create(data,LpBasisOrigin::Caller); +} +std::shared_ptr make_lp_basis(const LpObservations& observed){ + if(observed.basis().state!=LpObservationState::Available) + throw ModelError("Cannot construct a basis from an unavailable observation group"); + LpBasisData data;data.source=observed.source(); + data.rows.reserve(observed.rows().size());data.columns.reserve(observed.columns().size()); + for(const auto& row:observed.rows())data.rows.push_back(row.basis); + for(const auto& col:observed.columns())data.columns.push_back(col.basis); + return Detail::LpBasisAccess::create(std::move(data),LpBasisOrigin::Observations); +} +namespace Detail { +void LpBasisAccess::validate_statuses(const ModelSnapshot& model, + const std::vector>& rows, + const std::vector>& columns,const SolveBudget* budget){ + if(rows.size()!=model.rows.size()||columns.size()!=model.variables.size()) + throw ModelError("Basis dimensions must exactly match original row/column slots"); + std::size_t basics=0,active_rows=0; + for(std::size_t i=0;i LpBasisAccess::create(LpBasisData data,LpBasisOrigin origin){ + validate_structure(data.source);validate_statuses(data.source,data.rows,data.columns); + auto basis=std::shared_ptr(new LpBasis);basis->data_=std::move(data);basis->origin_=origin; + return basis; +} +void LpBasisAccess::compatible(const LpBasis& basis,const ModelSnapshot& next,const SolveBudget& budget){ + const auto& old=basis.source(); + auto mismatch=[](){throw ModelError("Basis requires identical original owner, revision and active source content");}; + if(old.model_id!=next.model_id||old.revision!=next.revision||old.variables.size()!=next.variables.size()||old.rows.size()!=next.rows.size())mismatch(); + validate_statuses(next,basis.rows(),basis.columns(),&budget); + for(std::size_t i=0;i + +namespace Gecode { namespace Optimize { +namespace Detail { struct LpBasisAccess; } + +/** Untrusted caller data. Factory copies, validates, and freezes all records. */ +struct LpBasisData { + ModelSnapshot source; + /** Exactly one entry per original slot; inactive slots must be absent. */ + std::vector> rows, columns; +}; +enum class LpBasisOrigin { Caller, Observations }; +class LpBasis { +public: + LpBasis(const LpBasis&) = delete; + LpBasis& operator=(const LpBasis&) = delete; + ModelId id() const noexcept { return data_.source.model_id; } + Revision revision() const noexcept { return data_.source.revision; } + const ModelSnapshot& source() const noexcept { return data_.source; } + const std::vector>& rows() const noexcept { return data_.rows; } + const std::vector>& columns() const noexcept { return data_.columns; } + LpBasisOrigin origin() const noexcept { return origin_; } +private: + LpBasis() = default; + friend struct Detail::LpBasisAccess; + LpBasisData data_; + LpBasisOrigin origin_ = LpBasisOrigin::Caller; +}; +/** Throw ModelError for malformed/unsupported source or status data. */ +std::shared_ptr make_lp_basis(const LpBasisData&); +/** Requires an Available complete original basis; copies historical source. */ +std::shared_ptr make_lp_basis(const LpObservations&); + +enum class LpBasisSubmissionState { + NotAttempted, Accepted, Repaired, Rejected, Interrupted +}; +struct LpBasisSubmission { + LpBasisSubmissionState state = LpBasisSubmissionState::NotAttempted; + bool backend_attempted = false; + /** Absent until timely accepted backend statuses were completely checked. */ + std::optional statuses_changed; + std::string message; +}; +struct LpBasisSolveOptions { + LpObservationOptions observations; + /** Required. Same owner/revision, original IDs/masks and active source content; + * inactive payloads are nonsemantic. Never a relaxation. */ + std::shared_ptr basis; + /** Simultaneous primal_start is rejected; no implicit precedence rule. */ + void validate() const; +}; +struct LpBasisSolveResult { + LpObservedResult observed; + /** Retains submitted source/status lifetime independently of caller/session. */ + std::shared_ptr requested_basis; + LpBasisSubmission submission; +}; +/** + * Numerical HiGHS ordinary continuous LP only; active constant rows unsupported. + * Accepted/Repaired describe setBasis before optimization, not final status. + * Repaired means statuses changed during submission. No faster-solve, checkpoint, + * independent nonsingularity, or certificate claim. A rejected backend submission + * returns without cold fallback, invalidating the session for a clean next load. + * Factorization/repair is cooperatively budgeted and may be uninterruptible. + */ +LpBasisSolveResult solve_lp_with_basis(const ModelSnapshot&, const LpBasisSolveOptions&); +LpBasisSolveResult solve_lp_with_basis(const Model&, const LpBasisSolveOptions&); +}} +#endif diff --git a/gecode/optimize/lp_basis_detail.hpp b/gecode/optimize/lp_basis_detail.hpp new file mode 100644 index 0000000000..96fb654aaf --- /dev/null +++ b/gecode/optimize/lp_basis_detail.hpp @@ -0,0 +1,15 @@ +/* Private validation seam; not installed. */ +#ifndef GECODE_OPTIMIZE_LP_BASIS_DETAIL_HPP +#define GECODE_OPTIMIZE_LP_BASIS_DETAIL_HPP +#include +namespace Gecode { namespace Optimize { namespace Detail { +struct LpBasisAccess { + static std::shared_ptr create(LpBasisData, LpBasisOrigin); + static void validate_statuses(const ModelSnapshot&, + const std::vector>& rows, + const std::vector>& columns, + const SolveBudget* budget = nullptr); + static void compatible(const LpBasis&, const ModelSnapshot&, const SolveBudget&); +}; +}}} +#endif diff --git a/gecode/optimize/lp_evidence.cpp b/gecode/optimize/lp_evidence.cpp new file mode 100644 index 0000000000..b8ca226390 --- /dev/null +++ b/gecode/optimize/lp_evidence.cpp @@ -0,0 +1,366 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +#ifdef GECODE_OPTIMIZE_TEST_LP_EVIDENCE +namespace Detail { +SolveResult lp_evidence_test_solve(LpEvidencePhase,const ModelSnapshot&,const SolveOptions&); +void lp_evidence_test_checkpoint(const char*,std::size_t); +} +#endif +namespace { +using Wide=long double; +using Clock=std::chrono::steady_clock; +constexpr double inf=std::numeric_limits::infinity(); +struct Failure : std::runtime_error { + Termination termination;LpEvidenceReason reason; + Failure(Termination t,LpEvidenceReason r,const char* text):std::runtime_error(text),termination(t),reason(r){} +}; +[[noreturn]] void bad(const char* text){throw Failure(Termination::NumericalFailure,LpEvidenceReason::InvalidBackendData,text);} +[[noreturn]] void unsupported(const char* text){throw Failure(Termination::Unsupported,LpEvidenceReason::Unsupported,text);} +struct Budget { + SolveBudget shared;Clock::time_point started;double seconds; + Budget(const SolveOptions& options,Clock::time_point start):shared(options),started(start),seconds(options.time_limit_seconds){} + double remaining() const {return std::max(0.0,seconds-std::chrono::duration(Clock::now()-started).count());} + std::optional stop() const { + if(shared.cancelled())return Termination::Cancelled; + if(remaining()==0)return Termination::TimeLimit; + if(shared.node_limit_reached())return Termination::NodeLimit; + return {}; + } + void check() const {if(const auto reason=stop())throw Failure(*reason,LpEvidenceReason::Stopped,"Whole LP evidence allowance stopped");} +}; +struct Meter { + Budget& budget;const LpEvidenceLimits& limits;std::size_t work=0,retained=0; + void tick(std::size_t n=1){budget.check();if(n>limits.max_work-work) + throw Failure(Termination::IterationLimit,LpEvidenceReason::ResourceLimit,"LP evidence coordinator work limit reached");work+=n;} + void keep(std::size_t n){tick(0);if(n>limits.max_retained_slots-retained) + throw Failure(Termination::MemoryLimit,LpEvidenceReason::ResourceLimit,"LP evidence retained-slot limit reached");retained+=n;} +}; +void event(const char* point,std::size_t stage) { +#ifdef GECODE_OPTIMIZE_TEST_LP_EVIDENCE + Detail::lp_evidence_test_checkpoint(point,stage); +#else + (void)point;(void)stage; +#endif +} +struct Sum { + Wide sum=0,correction=0; + void add(Wide value){if(!std::isfinite(value))bad("Nonfinite original evidence arithmetic"); + const Wide next=sum+value;if(!std::isfinite(next))bad("Original evidence sum overflow"); + correction+=std::abs(sum)>=std::abs(value)?(sum-next)+value:(value-next)+sum; + if(!std::isfinite(correction))bad("Original evidence compensation overflow");sum=next;} + Wide value() const {const Wide v=sum+correction;if(!std::isfinite(v))bad("Original evidence sum overflow");return v;} +}; +double narrow(Wide value){if(!std::isfinite(value)||std::abs(value)>std::numeric_limits::max())bad("Evidence exceeds finite double representation"); + const double out=static_cast(value);if(value!=0&&out==0)bad("Evidence conversion would erase a nonzero value");return out;} +void range(double value,double cap,const char* text){if(std::isfinite(value)&&std::abs(value)>=cap)unsupported(text);} +std::size_t add(std::size_t a,std::size_t b){if(b>std::numeric_limits::max()-a) + throw Failure(Termination::MemoryLimit,LpEvidenceReason::ResourceLimit,"LP evidence size arithmetic overflow");return a+b;} +void cap(std::size_t n,std::size_t limit,const char* text){if(n>limit)throw Failure(Termination::MemoryLimit,LpEvidenceReason::ResourceLimit,text);} +void visit(const ModelSnapshot& model,Meter& meter,bool retain=false){ + const auto charge=[&](std::size_t n){meter.tick(n);if(retain)meter.keep(n);}; + charge(model.variables.size());charge(model.rows.size());charge(model.objective.terms.size()); + for(const auto& v:model.variables)charge(v.name.size()); + for(const auto& r:model.rows){charge(r.terms.size());charge(r.name.size());} + // Metadata is validated and owned, but active logical semantics are unsupported. + for(const auto& i:model.indicators){charge(1);charge(i.terms.size());charge(i.generated_rows.size());charge(i.domains.size());} + for(const auto& g:model.globals){charge(1);charge(g.name.size()); + if(g.payload.valueless_by_exception())throw ModelError("Global constraint has no payload"); + std::visit([&](const auto& data){using T=std::decay_t; + if constexpr(std::is_same_v||std::is_same_v||std::is_same_v)charge(data.variables.size()); + if constexpr(std::is_same_v)charge(add(data.elements.size(),2)); + if constexpr(std::is_same_v){charge(data.starts.size());charge(data.durations.size());charge(data.heights.size());} + if constexpr(std::is_same_v)charge(data.successors.size()); + if constexpr(std::is_same_v)for(const auto& tuple:data.tuples)charge(tuple.size()); + if constexpr(std::is_same_v){charge(data.transitions.size());charge(data.final_states.size());} + },g.payload);} +} +void admit(const ModelSnapshot& source,const LpEvidenceOptions& options,Meter& meter){ + visit(source,meter);validate_structure(source);meter.tick(0); + if(options.solve.backend==Backend::Native||options.solve.guarantee!=Guarantee::Numerical) + unsupported("LP evidence requires Auto/HiGHS and Numerical guarantee"); + if(!options.solve.primal_start.empty())unsupported("LP evidence does not map caller primal starts to auxiliary models"); + for(const auto& i:source.indicators){meter.tick();if(i.active)unsupported("LP evidence does not relax active indicators");} + for(const auto& g:source.globals){meter.tick();if(g.active)unsupported("LP evidence does not relax active globals");} + for(const auto& v:source.variables){meter.tick();if(!v.active)continue; + if(v.type!=VariableType::Continuous)unsupported("LP evidence requires original Continuous variables"); + range(v.lower,1e20,"Original variable bound exceeds auxiliary backend range");range(v.upper,1e20,"Original variable bound exceeds auxiliary backend range");} + for(const auto& r:source.rows){meter.tick();if(!r.active)continue; + range(r.lower,1e20,"Original row side exceeds auxiliary backend range");range(r.upper,1e20,"Original row side exceeds auxiliary backend range"); + for(const auto& t:r.terms){meter.tick();range(t.coefficient,1e15,"Original matrix coefficient exceeds auxiliary backend range"); + if(std::abs(t.coefficient)<=1e-12)unsupported("Nonzero original matrix coefficients <=1e-12 require rescaling");}} + range(source.objective.offset,1e20,"Original objective offset exceeds supported source range"); + for(const auto& t:source.objective.terms){meter.tick();range(t.coefficient,1e20,"Original objective coefficient exceeds auxiliary backend range");} +} +struct Sizes {std::size_t variables=0,rows=0,nonzeros=0;}; +Sizes sizes(const ModelSnapshot& source,LpEvidencePhase phase,Meter& meter){ + Sizes out; + for(const auto& v:source.variables){meter.tick();if(!v.active)continue; + if(phase==LpEvidencePhase::Farkas){out.rows=add(out.rows,1);out.variables=add(out.variables,std::isfinite(v.lower)+std::isfinite(v.upper)); + out.nonzeros=add(out.nonzeros,2*(std::isfinite(v.lower)+std::isfinite(v.upper)));} + else out.variables=add(out.variables,1);} + for(const auto& r:source.rows){meter.tick();if(!r.active)continue; + if(phase==LpEvidencePhase::Farkas){const auto n=std::isfinite(r.lower)+std::isfinite(r.upper);out.variables=add(out.variables,n); + for(int i=0;i(std::numeric_limits::max()); + if(out.variables>=index_max||out.rows>=index_max||out.nonzeros>=index_max)unsupported("LP evidence auxiliary dimensions exceed backend index range"); + return out; +} +LpEvidenceStage build(const ModelSnapshot& source,LpEvidencePhase phase,Meter& meter){ + const auto dimensions=sizes(source,phase,meter); + // Charge snapshots, copied result values/masks, mappings and construction scratch. + meter.keep(add(add(dimensions.nonzeros,dimensions.rows),add(dimensions.variables,dimensions.variables))); + meter.keep(add(dimensions.variables,dimensions.variables)); + meter.keep(dimensions.variables); // objective terms upper bound + Model model;if(model.id()==source.model_id){Model distinct;model=std::move(distinct);} + LpEvidenceStage stage;stage.phase=phase;stage.nonzeros=dimensions.nonzeros;stage.columns.reserve(dimensions.variables); + std::vector mapping(source.variables.size());meter.tick(mapping.size()); + if(phase!=LpEvidencePhase::Farkas){ + for(const auto& v:source.variables){meter.tick();if(!v.active)continue;double lower=v.lower,upper=v.upper; + if(phase==LpEvidencePhase::Recession){lower=std::isfinite(v.lower)?0:-1;upper=std::isfinite(v.upper)?0:1;} + mapping[v.variable.id]=model.add_continuous(lower,upper);stage.columns.push_back({LpEvidenceColumnKind::SourceVariable,static_cast(v.variable.id),{}});} + for(const auto& r:source.rows){meter.tick();if(!r.active)continue;std::vector terms;terms.reserve(r.terms.size()); + for(const auto& t:r.terms){meter.tick();terms.push_back({mapping[t.variable.id],t.coefficient});} + model.add_row(terms,phase==LpEvidencePhase::Recession?(std::isfinite(r.lower)?0:-inf):r.lower, + phase==LpEvidencePhase::Recession?(std::isfinite(r.upper)?0:inf):r.upper);} + if(phase==LpEvidencePhase::Recession){std::vector terms;terms.reserve(source.objective.terms.size()); + const double sign=source.objective.sense==ObjectiveSense::Minimize?1:-1; + for(const auto& t:source.objective.terms){meter.tick();terms.push_back({mapping[t.variable.id],sign*t.coefficient});}model.minimize(terms);} + } else { + std::vector> stationarity(source.variables.size());std::vector normalization,objective; + normalization.reserve(dimensions.variables);objective.reserve(dimensions.variables); + const auto multiplier=[&](LpEvidenceColumnKind kind,std::size_t slot,LpEvidenceSide side,double endpoint){ + meter.tick();const auto v=model.add_continuous(0,1);stage.columns.push_back({kind,slot,side});normalization.push_back({v,1}); + const double sign=side==LpEvidenceSide::Lower?1:-1;if(endpoint!=0)objective.push_back({v,sign*endpoint});return v;}; + for(const auto& r:source.rows){meter.tick();if(!r.active)continue; + for(const auto side:{LpEvidenceSide::Lower,LpEvidenceSide::Upper}){const double endpoint=side==LpEvidenceSide::Lower?r.lower:r.upper; + if(!std::isfinite(endpoint))continue;const auto v=multiplier(LpEvidenceColumnKind::RowSide,r.constraint.id,side,endpoint); + for(const auto& t:r.terms){meter.tick();stationarity[t.variable.id].push_back({v,(side==LpEvidenceSide::Lower?1:-1)*t.coefficient});}}} + for(const auto& v:source.variables){meter.tick();if(!v.active)continue; + for(const auto side:{LpEvidenceSide::Lower,LpEvidenceSide::Upper}){const double endpoint=side==LpEvidenceSide::Lower?v.lower:v.upper; + if(!std::isfinite(endpoint))continue;const auto multiplier_var=multiplier(LpEvidenceColumnKind::VariableSide,v.variable.id,side,endpoint); + stationarity[v.variable.id].push_back({multiplier_var,side==LpEvidenceSide::Lower?1.0:-1.0});}} + for(const auto& v:source.variables){meter.tick();if(v.active)model.add_row(stationarity[v.variable.id],0,0);} + model.add_row(normalization,-inf,1);model.maximize(objective); + } + meter.tick(dimensions.nonzeros);stage.auxiliary_model=std::make_shared(model.snapshot()); + meter.tick(0);validate_structure(*stage.auxiliary_model);meter.tick(0);return stage; +} +bool known(Termination t){switch(t){case Termination::Unknown:case Termination::Optimal:case Termination::Infeasible:case Termination::Unbounded: + case Termination::InfeasibleOrUnbounded:case Termination::TimeLimit:case Termination::NodeLimit:case Termination::MemoryLimit:case Termination::IterationLimit: + case Termination::SolutionLimit:case Termination::ObjectiveLimit:case Termination::Cancelled:case Termination::NumericalFailure:case Termination::Unsupported: + case Termination::InvalidModel:case Termination::BackendError:return true;}return false;} +bool complete(Termination t){return t==Termination::Optimal||t==Termination::Infeasible;} +void check_stage(LpEvidenceStage& stage,const SolveOptions& options,Meter& meter){ + const auto& model=*stage.auxiliary_model;auto& r=*stage.auxiliary_result; + if(!known(r.termination)||r.guarantee!=Guarantee::Numerical)bad("Invalid auxiliary status/guarantee"); + if(r.model_id!=model.model_id||r.revision!=model.revision)bad("Auxiliary result owner/revision mismatch"); + if(r.active_variables.size()!=model.variables.size())bad("Auxiliary result active-mask dimension mismatch"); + for(std::size_t i=0;i create(const ModelSnapshot& source,const LpEvidenceOptions& options,Meter& meter){ + auto out=std::shared_ptr(new LpEvidence);visit(source,meter,true);out->source_=source; + out->tolerances_=options.checks;out->primal_tolerance_=options.solve.feasibility_tolerance; + if(options.request!=LpEvidenceRequest::Farkas)out->primal_={LpEvidenceState::Unavailable,LpEvidenceReason::NoFeasibleBase,"No checked base point and direction"}; + if(options.request!=LpEvidenceRequest::PrimalRay)out->farkas_={LpEvidenceState::Unavailable,LpEvidenceReason::NoContradiction,"No checked contradiction"}; + return out; + } + static void prepare(LpEvidence& out,const LpEvidenceOptions& options,Meter& meter){ + const auto& source=out.source_; + meter.keep(add(add(source.variables.size(),source.variables.size()),source.rows.size())); + meter.keep(add(source.rows.size(),source.variables.size())); + // Preflight all potentially requested transforms before any backend work. + if(options.request!=LpEvidenceRequest::Farkas){sizes(source,LpEvidencePhase::FeasibleBase,meter);sizes(source,LpEvidencePhase::Recession,meter);} + if(options.request!=LpEvidenceRequest::PrimalRay)sizes(source,LpEvidencePhase::Farkas,meter); + out.stages_.reserve(3); + if(options.request!=LpEvidenceRequest::Farkas){out.stages_.push_back(build(source,LpEvidencePhase::FeasibleBase,meter));out.stages_.push_back(build(source,LpEvidencePhase::Recession,meter));} + if(options.request!=LpEvidenceRequest::PrimalRay)out.stages_.push_back(build(source,LpEvidencePhase::Farkas,meter)); + } + static bool stage(LpEvidence& out,std::size_t index,const LpEvidenceOptions& options,Meter& meter,LpEvidenceResult& result){ + auto& stage=out.stages_[index];event("before_solve",index);meter.tick(0); + if(result.attempted_calls>=options.limits.max_auxiliary_solves)throw Failure(Termination::IterationLimit,LpEvidenceReason::ResourceLimit,"LP evidence auxiliary-solve call limit reached"); + { + auto adjusted=options.solve;adjusted.backend=Backend::Highs;adjusted.guarantee=Guarantee::Numerical; + adjusted.time_limit_seconds=meter.budget.remaining();adjusted.cancellation=meter.budget.shared.cancellation(); + stage.attempted=true;++result.attempted_calls; +#ifdef GECODE_OPTIMIZE_TEST_LP_EVIDENCE + stage.auxiliary_result=lp_evidence_test_solve(stage.phase,*stage.auxiliary_model,adjusted); +#else + stage.auxiliary_result=solve(*stage.auxiliary_model,adjusted); +#endif + event("after_solve",index);meter.tick(0);check_stage(stage,options.solve,meter);event("after_check",index);meter.tick(0); + } + event("stage_cleanup",index);meter.tick(0);return stage.candidate_examined&&stage.auxiliary_check.valid; + } + static void base(LpEvidence& out,const LpEvidenceStage& stage,Meter& meter){ + auto& data=out.primal_data_;const auto& source=out.source_; + std::vector point(source.variables.size(),std::numeric_limits::quiet_NaN());meter.tick(point.size()); + for(std::size_t i=0;ivalues[i];} + visit(source,meter);auto check=validate(source,point,out.primal_tolerance_,1e-6);meter.tick(0); + if(!check.valid)throw Failure(Termination::NumericalFailure,LpEvidenceReason::FailedOriginalChecks,"Auxiliary base fails original source validation"); + data.base_point=std::move(point);data.base_check=std::move(check); + } + static void primal(LpEvidence& out,const LpEvidenceStage& stage,Meter& meter){ + auto& data=out.primal_data_;const auto& source=out.source_; + if(!data.base_check.valid){out.primal_={LpEvidenceState::Unavailable,LpEvidenceReason::NoFeasibleBase,"An improving direction alone does not establish a feasible source"};return;} + Wide scale=0;for(const auto value:stage.auxiliary_result->values){meter.tick();if(!std::isfinite(value))bad("Nonfinite direction candidate");scale=std::max(scale,std::abs(static_cast(value)));} + if(scale==0){data.direction_scale=0;out.primal_={LpEvidenceState::Unavailable,LpEvidenceReason::NoImprovingDirection,"Auxiliary returned the zero direction"};return;} + std::vector direction(source.variables.size(),std::numeric_limits::quiet_NaN());meter.tick(direction.size()); + for(std::size_t i=0;i(stage.auxiliary_result->values[i])/scale);} + Wide variable_error=0,row_error=0;std::vector activity(source.rows.size(),std::numeric_limits::quiet_NaN()); + for(const auto& v:source.variables){meter.tick();if(!v.active)continue;const Wide value=direction[v.variable.id]; + if(std::isfinite(v.lower))variable_error=std::max(variable_error,-value);if(std::isfinite(v.upper))variable_error=std::max(variable_error,value);} + for(const auto& r:source.rows){meter.tick();if(!r.active)continue;Sum sum;for(const auto& t:r.terms){meter.tick();sum.add(static_cast(t.coefficient)*direction[t.variable.id]);} + const Wide value=sum.value();activity[r.constraint.id]=narrow(value);if(std::isfinite(r.lower))row_error=std::max(row_error,-value);if(std::isfinite(r.upper))row_error=std::max(row_error,value);} + Sum slope;const Wide sign=source.objective.sense==ObjectiveSense::Minimize?1:-1; + for(const auto& t:source.objective.terms){meter.tick();slope.add(sign*static_cast(t.coefficient)*direction[t.variable.id]);} + data.direction_scale=narrow(scale);data.normalized_objective_slope=narrow(slope.value()); + data.max_variable_recession_violation=narrow(variable_error);data.max_row_recession_violation=narrow(row_error); + if(variable_error>out.tolerances_.recession||row_error>out.tolerances_.recession) + throw Failure(Termination::NumericalFailure,LpEvidenceReason::FailedOriginalChecks,"Normalized direction fails original recession checks"); + if(slope.value()>=-out.tolerances_.minimum_improvement){out.primal_={LpEvidenceState::Unavailable,LpEvidenceReason::NoImprovingDirection,"No strict normalized objective improvement"};return;} + data.direction=std::move(direction);data.row_direction=std::move(activity);out.primal_={LpEvidenceState::Available,LpEvidenceReason::None,"Checked numerical base point and improving recession direction; not an exact proof"}; + } + static void farkas(LpEvidence& out,const LpEvidenceStage& stage,Meter& meter){ + auto& data=out.farkas_data_;const auto& source=out.source_;std::vector signed_rows(source.rows.size());meter.tick(signed_rows.size()); + for(std::size_t i=0;ivalues[i]);} + Wide scale=0;for(const auto& row:signed_rows){meter.tick();scale=std::max(scale,std::abs(row.value()));} + if(scale==0){data.multiplier_scale=0;out.farkas_={LpEvidenceState::Unavailable,LpEvidenceReason::NoContradiction,"No nonzero signed original row multiplier"};return;} + std::vector rows(source.rows.size()),columns(source.variables.size());std::vector transpose(source.variables.size()); + for(const auto& r:source.rows){meter.tick();auto& entry=rows[r.constraint.id];entry.active=r.active;if(!r.active)continue; + entry.multiplier=narrow(signed_rows[r.constraint.id].value()/scale); + for(const auto& t:r.terms){meter.tick();transpose[t.variable.id].add(static_cast(t.coefficient)*entry.multiplier);}} + Wide max_stationarity=0;for(const auto& v:source.variables){meter.tick();auto& entry=columns[v.variable.id];entry.active=v.active;if(!v.active)continue; + entry.multiplier=narrow(-transpose[v.variable.id].value());Sum residual;residual.add(transpose[v.variable.id].sum);residual.add(transpose[v.variable.id].correction);residual.add(entry.multiplier); + max_stationarity=std::max(max_stationarity,std::abs(residual.value()));} + Sum margin; + const auto contribution=[&](LpFarkasEntry& entry,double lower,double upper){meter.tick();if(!entry.active||entry.multiplier==0)return; + entry.side=entry.multiplier>0?LpEvidenceSide::Lower:LpEvidenceSide::Upper;const double endpoint=entry.multiplier>0?lower:upper; + if(!std::isfinite(endpoint))throw Failure(Termination::NumericalFailure,LpEvidenceReason::FailedOriginalChecks,"Nonzero Farkas multiplier requires an infinite original side"); + const Wide term=static_cast(entry.multiplier)*endpoint;entry.contribution=narrow(term);margin.add(term);}; + data.multiplier_scale=narrow(scale);data.max_stationarity=narrow(max_stationarity); + for(const auto& r:source.rows)contribution(rows[r.constraint.id],r.lower,r.upper); + for(const auto& v:source.variables)contribution(columns[v.variable.id],v.lower,v.upper); + data.contradiction_margin=narrow(margin.value());data.rows=std::move(rows);data.columns=std::move(columns); + if(max_stationarity>out.tolerances_.stationarity)throw Failure(Termination::NumericalFailure,LpEvidenceReason::FailedOriginalChecks,"Published Farkas stationarity exceeds original tolerance"); + if(margin.value()<=out.tolerances_.minimum_contradiction){out.farkas_={LpEvidenceState::Unavailable,LpEvidenceReason::NoContradiction,"No strict positive original contradiction margin"};return;} + out.farkas_={LpEvidenceState::Available,LpEvidenceReason::None,"Checked numerical original-side contradiction; not an exact certificate"}; + if(out.primal_data_.base_check.valid)throw Failure(Termination::NumericalFailure,LpEvidenceReason::InconsistentEvidence,"Accepted original feasible point and positive Farkas margin are numerically inconsistent"); + } + static void fail(LpEvidence& out,LpEvidenceReason reason,const char* message,bool rejected) noexcept { + for(auto* group:{&out.primal_,&out.farkas_})if(group->state!=LpEvidenceState::NotRequested){ + group->state=rejected?LpEvidenceState::Rejected:LpEvidenceState::Unavailable;group->reason=reason;group->message.clear(); + try{group->message=message;}catch(...){} + } + } +}; +} +namespace { +template +LpEvidenceResult run(Snapshot snapshot,ModelId owner,Revision revision,const LpEvidenceOptions& options){ + const auto started=Clock::now();LpEvidenceResult result;result.model_id=owner;result.revision=revision; + std::optional budget;std::optional meter;std::shared_ptr artifact; + const auto fail=[&](Termination termination,LpEvidenceReason reason,const char* message){ + const bool rejected=reason==LpEvidenceReason::InvalidModel||reason==LpEvidenceReason::InvalidBackendData||reason==LpEvidenceReason::FailedOriginalChecks||reason==LpEvidenceReason::InconsistentEvidence||reason==LpEvidenceReason::Unsupported; + result.completion=rejected?LpEvidenceCompletion::Rejected:LpEvidenceCompletion::Interrupted;result.stop_reason=termination; + if(artifact)Detail::LpEvidenceAccess::fail(*artifact,reason,message,rejected); + try{result.message=message;}catch(...){result.message.clear();} + }; + try{ + options.validate();budget.emplace(options.solve,started);meter.emplace(Meter{*budget,options.limits});meter->tick(0); + { + const auto& source=snapshot();event("source_copy",0);meter->tick(0);admit(source,options,*meter); + artifact=Detail::LpEvidenceAccess::create(source,options,*meter);result.evidence=artifact; + Detail::LpEvidenceAccess::prepare(*artifact,options,*meter);event("admission",0);meter->tick(0); +#ifndef GECODE_OPTIMIZE_TEST_LP_EVIDENCE + if(!capabilities(Backend::Highs).available)unsupported("Numerical HiGHS backend is unavailable for LP evidence recovery"); +#endif + result.completion=LpEvidenceCompletion::Complete; + bool base=false; + const auto process=[&](std::size_t index){ + const bool candidate=Detail::LpEvidenceAccess::stage(*artifact,index,options,*meter,result); + const auto& stage=artifact->stages()[index]; + if(candidate){if(stage.phase==LpEvidencePhase::FeasibleBase){Detail::LpEvidenceAccess::base(*artifact,stage,*meter);base=true;} + if(stage.phase==LpEvidencePhase::Recession)Detail::LpEvidenceAccess::primal(*artifact,stage,*meter); + if(stage.phase==LpEvidencePhase::Farkas)Detail::LpEvidenceAccess::farkas(*artifact,stage,*meter);} + event("evidence_check",index);meter->tick(0); + if(!complete(stage.auxiliary_result->termination)){result.completion=LpEvidenceCompletion::Interrupted;result.stop_reason=stage.auxiliary_result->termination;result.message="Auxiliary stage stopped before definitive completion";return false;} + return true; + }; + if(options.request==LpEvidenceRequest::Farkas)process(0); + else if(process(0)){ + if(base){if(process(1)&&options.request==LpEvidenceRequest::Both)process(2);} + else if(options.request==LpEvidenceRequest::Automatic||options.request==LpEvidenceRequest::Both)process(2); + } + event("publication",artifact->stages().size());meter->tick(0); + } + event("source_cleanup",artifact?artifact->stages().size():0);meter->tick(0); + }catch(const Failure& e){fail(e.termination,e.reason,e.what());} + catch(const ModelError& e){fail(Termination::InvalidModel,LpEvidenceReason::InvalidModel,e.what());} + catch(const std::bad_alloc&){fail(Termination::MemoryLimit,LpEvidenceReason::AllocationFailure,"LP evidence allocation failed");} + catch(const std::exception& e){fail(Termination::BackendError,LpEvidenceReason::InvalidBackendData,e.what());} + if(budget)if(const auto stopped=budget->stop())fail(*stopped,LpEvidenceReason::Stopped,"Whole LP evidence budget stopped during final cleanup"); + if(meter)result.work=meter->work; + result.elapsed_seconds=std::chrono::duration(Clock::now()-started).count();return result; +} +std::size_t variable_slot(const LpEvidence& out,Variable variable){ + if(variable.model_id!=out.id()||variable.id>=out.source().variables.size()||!out.source().variables[variable.id].active)throw ModelError("LP evidence variable is foreign, missing or deleted");return variable.id;} +std::size_t row_slot(const LpEvidence& out,Constraint row){ + if(row.model_id!=out.id()||row.id>=out.source().rows.size()||!out.source().rows[row.id].active)throw ModelError("LP evidence row is foreign, missing or deleted");return row.id;} +} +void LpEvidenceTolerances::validate() const {for(double value:{recession,stationarity,minimum_improvement,minimum_contradiction}) + if(!std::isfinite(value)||value<0)throw ModelError("LP evidence tolerances must be finite and nonnegative");} +void LpEvidenceOptions::validate() const {solve.validate();checks.validate();switch(request){case LpEvidenceRequest::Automatic:case LpEvidenceRequest::PrimalRay:case LpEvidenceRequest::Farkas:case LpEvidenceRequest::Both:return;}throw ModelError("Unknown LP evidence request");} +const ModelSnapshot& LpEvidence::source() const noexcept{return source_;} +ModelId LpEvidence::id() const noexcept{return source_.model_id;} +Revision LpEvidence::revision() const noexcept{return source_.revision;} +const LpEvidenceTolerances& LpEvidence::tolerances() const noexcept{return tolerances_;} +double LpEvidence::primal_tolerance() const noexcept{return primal_tolerance_;} +const LpEvidenceGroup& LpEvidence::primal_ray() const noexcept{return primal_;} +const LpEvidenceGroup& LpEvidence::farkas() const noexcept{return farkas_;} +const LpPrimalEvidence& LpEvidence::primal_data() const noexcept{return primal_data_;} +const LpFarkasEvidence& LpEvidence::farkas_data() const noexcept{return farkas_data_;} +const std::vector& LpEvidence::stages() const noexcept{return stages_;} +double LpEvidence::base_value(Variable variable) const {const auto slot=variable_slot(*this,variable);if(!primal_data_.base_check.valid||slot>=primal_data_.base_point.size())throw ModelError("No checked original LP evidence base point");return primal_data_.base_point[slot];} +double LpEvidence::direction_value(Variable variable) const {const auto slot=variable_slot(*this,variable);if(primal_.state!=LpEvidenceState::Available||slot>=primal_data_.direction.size())throw ModelError("No available LP primal-ray evidence");return primal_data_.direction[slot];} +const LpFarkasEntry& LpEvidence::row_multiplier(Constraint row) const {const auto slot=row_slot(*this,row);if(farkas_.state!=LpEvidenceState::Available||slot>=farkas_data_.rows.size())throw ModelError("No available LP Farkas evidence");return farkas_data_.rows[slot];} +const LpFarkasEntry& LpEvidence::column_multiplier(Variable variable) const {const auto slot=variable_slot(*this,variable);if(farkas_.state!=LpEvidenceState::Available||slot>=farkas_data_.columns.size())throw ModelError("No available LP Farkas evidence");return farkas_data_.columns[slot];} +LpEvidenceResult analyze_lp_evidence(const ModelSnapshot& model,const LpEvidenceOptions& options){return run([&]()->const ModelSnapshot&{return model;},model.model_id,model.revision,options);} +LpEvidenceResult analyze_lp_evidence(const Model& model,const LpEvidenceOptions& options){return run([&]{return model.snapshot();},model.id(),model.revision(),options);} +}} diff --git a/gecode/optimize/lp_evidence.hpp b/gecode/optimize/lp_evidence.hpp new file mode 100644 index 0000000000..532a460ad8 --- /dev/null +++ b/gecode/optimize/lp_evidence.hpp @@ -0,0 +1,145 @@ +/* Explicit additional-work numerical LP evidence; never an exact certificate. */ +#ifndef GECODE_OPTIMIZE_LP_EVIDENCE_HPP +#define GECODE_OPTIMIZE_LP_EVIDENCE_HPP +#include +#include + +namespace Gecode { namespace Optimize { +enum class LpEvidenceRequest { Automatic, PrimalRay, Farkas, Both }; +struct LpEvidenceTolerances { + double recession = 1e-7; + double stationarity = 1e-7; + double minimum_improvement = 1e-7; + double minimum_contradiction = 1e-7; + void validate() const; +}; +struct LpEvidenceLimits { + std::size_t max_auxiliary_variables = 1000000; + std::size_t max_auxiliary_rows = 1000000; + std::size_t max_auxiliary_nonzeros = 10000000; + /** Aggregate source/private snapshots, values, maps and evidence vector slots. */ + std::size_t max_retained_slots = 50000000; + /** Deterministic coordinator element visits, excluding solver internals. */ + std::size_t max_work = 100000000; + /** Public solve invocations, including local empty/constant decisions. */ + std::size_t max_auxiliary_solves = 3; +}; +struct LpEvidenceOptions { + SolveOptions solve; + LpEvidenceRequest request = LpEvidenceRequest::Automatic; + LpEvidenceTolerances checks; + LpEvidenceLimits limits; + void validate() const; +}; +enum class LpEvidenceState { NotRequested, Available, Unavailable, Rejected }; +enum class LpEvidenceReason { + None, NotRequested, Unsupported, NoFeasibleBase, NoImprovingDirection, + NoContradiction, Stopped, InvalidBackendData, FailedOriginalChecks, + InconsistentEvidence, InvalidModel, ResourceLimit, AllocationFailure +}; +struct LpEvidenceGroup { + LpEvidenceState state = LpEvidenceState::NotRequested; + LpEvidenceReason reason = LpEvidenceReason::NotRequested; + std::string message; +}; +enum class LpEvidencePhase { FeasibleBase, Recession, Farkas }; +enum class LpEvidenceSide { Lower, Upper }; +enum class LpEvidenceColumnKind { SourceVariable, RowSide, VariableSide }; +struct LpEvidenceColumn { + LpEvidenceColumnKind kind = LpEvidenceColumnKind::SourceVariable; + std::size_t original_slot = 0; + std::optional side; +}; +struct LpEvidenceStage { + LpEvidencePhase phase = LpEvidencePhase::FeasibleBase; + /** Immutable private coordinates; never an original-source SolveResult. */ + std::shared_ptr auxiliary_model; + std::vector columns; + std::size_t nonzeros = 0; + /** The public auxiliary solve primitive was invoked; no vendor-run telemetry. */ + bool attempted = false; + std::optional auxiliary_result; + bool candidate_examined = false; + ValidationReport auxiliary_check; +}; +struct LpPrimalEvidence { + /** Full original-slot vectors; inactive slots are NaN. Empty until checked. */ + std::vector base_point, direction, row_direction; + ValidationReport base_check; + std::optional direction_scale, normalized_objective_slope; + std::optional max_variable_recession_violation, max_row_recession_violation; +}; +struct LpFarkasEntry { + bool active = false; + double multiplier = 0.0; + /** Absent for exactly zero multiplier; contribution is then exactly zero. */ + std::optional side; + double contribution = 0.0; +}; +struct LpFarkasEvidence { + /** Signed y for rows and independently derived z=-A^T*y for columns. + * Positive selects the lower side, negative selects the upper; accepted + * evidence has positive total finite-side contribution. Numerical only. */ + std::vector rows, columns; + std::optional multiplier_scale, contradiction_margin, max_stationarity; +}; +enum class LpEvidenceCompletion { Complete, Interrupted, Rejected }; +namespace Detail { struct LpEvidenceAccess; } +class LpEvidence { +public: + LpEvidence(const LpEvidence&) = delete; + LpEvidence& operator=(const LpEvidence&) = delete; + const ModelSnapshot& source() const noexcept; + ModelId id() const noexcept; + Revision revision() const noexcept; + const LpEvidenceTolerances& tolerances() const noexcept; + double primal_tolerance() const noexcept; + const LpEvidenceGroup& primal_ray() const noexcept; + const LpEvidenceGroup& farkas() const noexcept; + /** Diagnostics can remain on rejection; Available alone denotes acceptance. */ + const LpPrimalEvidence& primal_data() const noexcept; + const LpFarkasEvidence& farkas_data() const noexcept; + const std::vector& stages() const noexcept; + /** Check original owner/index/active status; no solve is triggered. */ + double base_value(Variable) const; + double direction_value(Variable) const; + const LpFarkasEntry& row_multiplier(Constraint) const; + const LpFarkasEntry& column_multiplier(Variable) const; +private: + friend struct Detail::LpEvidenceAccess; + LpEvidence() = default; + ModelSnapshot source_; + LpEvidenceTolerances tolerances_; + double primal_tolerance_ = 0; + LpEvidenceGroup primal_, farkas_; + LpPrimalEvidence primal_data_; + LpFarkasEvidence farkas_data_; + std::vector stages_; +}; +struct LpEvidenceResult { + ModelId model_id = 0; + Revision revision = 0; + LpEvidenceCompletion completion = LpEvidenceCompletion::Rejected; + std::optional stop_reason; + std::string message; + std::shared_ptr evidence; + /** Public auxiliary solve invocations, same unit as max_auxiliary_solves. */ + std::size_t attempted_calls = 0; + std::size_t work = 0; + double elapsed_seconds = 0.0; +}; +/** + * Fresh private auxiliary solves; no input model, session or historical result + * is changed. Numerical continuous LPs only, Auto/HiGHS. Unsupported source is + * never relaxed. Explicit Farkas needs one call; Automatic at most two; Both at + * most three. All share one time/cancel allowance and deterministic work caps. + * Complete describes requested analysis, not source-model optimality/status. + * A checked source base point is required with a primal direction. A feasible + * point plus accepted contradiction rejects both as inconsistent evidence. + * Cleanup/factorization is cooperative; a final expired budget clears evidence + * availability, retaining diagnostics and private-stage provenance only. + */ +LpEvidenceResult analyze_lp_evidence(const ModelSnapshot&, const LpEvidenceOptions& = {}); +LpEvidenceResult analyze_lp_evidence(const Model&, const LpEvidenceOptions& = {}); +}} +#endif diff --git a/gecode/optimize/lp_observations.cpp b/gecode/optimize/lp_observations.cpp new file mode 100644 index 0000000000..be0d81b8b4 --- /dev/null +++ b/gecode/optimize/lp_observations.cpp @@ -0,0 +1,477 @@ +#include +#include + +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +using Wide = long double; +struct Interrupted {}; +struct BadObservation : std::runtime_error { + using std::runtime_error::runtime_error; +}; +void tick(const SolveBudget& budget) { + if (budget.expired()) throw Interrupted{}; +} +void finite(double value, const char* message) { + if (!std::isfinite(value)) throw BadObservation(message); +} +double narrow(Wide value) { + if (!std::isfinite(value) || + std::abs(value) > static_cast(std::numeric_limits::max())) + throw BadObservation("Original observation arithmetic exceeds finite double range"); + const double result = static_cast(value); + if (!std::isfinite(result)) + throw BadObservation("Nonfinite original observation arithmetic"); + return result; +} +struct Sum { + Wide sum = 0, correction = 0; + void add(Wide value) { + if (!std::isfinite(value)) throw BadObservation("Nonfinite observation product"); + const Wide next = sum + value; + if (!std::isfinite(next)) throw BadObservation("Observation sum overflow"); + correction += std::abs(sum) >= std::abs(value) + ? (sum-next)+value : (value-next)+sum; + if (!std::isfinite(correction)) throw BadObservation("Observation compensation overflow"); + sum = next; + } + Wide value() const { + const Wide result = sum+correction; + if (!std::isfinite(result)) throw BadObservation("Observation sum overflow"); + return result; + } +}; +Wide difference(Wide value,double bound,const Sum* accumulated=nullptr) { + Sum result; + if (accumulated) { + result.add(accumulated->sum);result.add(accumulated->correction); + } else result.add(value); + result.add(-static_cast(bound)); + return result.value(); +} +LpObservationGroup group(LpObservationState state, LpObservationReason reason, + const std::string& message) { + return {state,reason,message}; +} +LpObservationGroup available() { + return group(LpObservationState::Available,LpObservationReason::None,""); +} +void not_requested(LpObservationGroup& out) { + out = group(LpObservationState::NotRequested,LpObservationReason::NotRequested,""); +} +void unavailable_group(LpObservationGroup& out, LpObservationReason reason, + const std::string& message) { + if (out.state == LpObservationState::NotRequested) return; + out = group(LpObservationState::Unavailable,reason,message); +} +void rejected_group(LpObservationGroup& out, LpObservationReason reason, + const std::string& message) { + if (out.state == LpObservationState::NotRequested) return; + out = group(LpObservationState::Rejected,reason,message); +} +bool supported_basis(LpBasisStatus value) { + switch (value) { + case LpBasisStatus::Lower: case LpBasisStatus::Basic: + case LpBasisStatus::Upper: case LpBasisStatus::Zero: + case LpBasisStatus::NonbasicUnspecified: return true; + } + return false; +} +void check_basis_position(LpBasisStatus status, Wide value, + double lower, double upper, double tolerance, + const Sum* accumulated=nullptr) { + if (!supported_basis(status)) throw BadObservation("Unknown backend basis status"); + switch (status) { + case LpBasisStatus::Lower: + if (!std::isfinite(lower) || std::abs(difference(value,lower,accumulated)) > tolerance) + throw BadObservation("Lower basis status disagrees with original activity/bound"); + break; + case LpBasisStatus::Upper: + if (!std::isfinite(upper) || std::abs(difference(value,upper,accumulated)) > tolerance) + throw BadObservation("Upper basis status disagrees with original activity/bound"); + break; + case LpBasisStatus::Zero: + if (std::isfinite(lower) || std::isfinite(upper) || std::abs(value) > tolerance) + throw BadObservation("Zero basis status requires a free nonbasic entity at zero"); + break; + case LpBasisStatus::NonbasicUnspecified: + if (!(std::isfinite(lower) && std::abs(difference(value,lower,accumulated)) <= tolerance) && + !(std::isfinite(upper) && std::abs(difference(value,upper,accumulated)) <= tolerance) && + !(!std::isfinite(lower) && !std::isfinite(upper) && std::abs(value) <= tolerance)) + throw BadObservation("Unspecified nonbasic entity is not at an original nonbasic position"); + break; + case LpBasisStatus::Basic: break; + } +} +Wide sign_violation(Wide multiplier, Wide value, double lower, double upper, + double primal_tolerance,const Sum* accumulated) { + const bool at_lower = std::isfinite(lower) && + difference(value,lower,accumulated) <= primal_tolerance; + const bool at_upper = std::isfinite(upper) && + -difference(value,upper,accumulated) <= primal_tolerance; + if (at_lower && at_upper) return 0; + if (at_lower) return std::max(-multiplier,Wide(0)); + if (at_upper) return std::max(multiplier,Wide(0)); + return std::abs(multiplier); +} +void check_result_layout(const ModelSnapshot& model, const SolveResult& result) { + if (result.model_id != model.model_id || result.revision != model.revision) + throw BadObservation("Result identity/revision differs from observation source"); + if (result.active_variables.size() != model.variables.size()) + throw BadObservation("Result active mask has the wrong original dimension"); + for (std::size_t i=0;i= raw.column_slots.size() || raw.column_slots[column++] != i) + throw BadObservation("Backend column map differs from original live slots"); + } + if (column != raw.column_slots.size()) throw BadObservation("Extra backend column map entries"); + for (std::size_t i=0;i= raw.row_slots.size() || raw.row_slots[row++] != i) + throw BadObservation("Backend row map differs from retained original rows"); + } + if (row != raw.row_slots.size()) throw BadObservation("Extra backend row map entries"); +} + +LpKktReport check_duals(const ModelSnapshot& model, const SolveResult& result, + const std::vector& activities, + const Detail::LpBackendObservations& raw, + const LpObservationMetadata& metadata, + const SolveBudget& budget) { + if (raw.column_duals.size() != raw.column_slots.size() || + raw.row_duals.size() != raw.row_slots.size()) + throw BadObservation("Backend dual vector dimension mismatch"); + const auto& tolerance = metadata.checks; + const Wide sense = model.objective.sense == ObjectiveSense::Minimize ? 1 : -1; + std::vector transpose(model.variables.size()); + std::vector costs(model.variables.size(),0); + std::vector row_duals(model.rows.size(),0); + for (const auto& term : model.objective.terms) costs[term.variable.id] = term.coefficient; + for (std::size_t i=0;i 0 ? lower : upper; + if (!std::isfinite(bound)) { finite_dual=false; return; } + dual_terms.add(multiplier*static_cast(bound)); + gap.add(-multiplier*static_cast(bound)); + const Wide complementarity = multiplier*difference(value,bound,accumulated); + if (!std::isfinite(complementarity)) + throw BadObservation("Complementarity product overflow"); + max_complementarity = std::max(max_complementarity,std::abs(complementarity)); + }; + std::size_t work=0; + for (std::size_t i=0;i(costs[i])*value); + } + LpKktReport out; + out.primal_valid=true; + out.max_dual_sign_violation=narrow(max_sign); + out.max_stationarity=narrow(max_stationarity); + out.dual_signs_valid=max_sign <= tolerance.dual_feasibility; + out.stationarity_valid=max_stationarity <= tolerance.stationarity; + if (finite_dual) { + out.max_complementarity=narrow(max_complementarity); + out.complementarity_valid=max_complementarity <= tolerance.complementarity; + Sum objective; + objective.add(model.objective.offset); + objective.add(sense*dual_terms.sum); + objective.add(sense*dual_terms.correction); + out.dual_objective_estimate=narrow(objective.value()); + const Wide normalized_gap=gap.value(); + out.normalized_gap=narrow(normalized_gap); + out.gap_valid=std::abs(normalized_gap) <= tolerance.objective_gap; + } + out.accepted=out.dual_signs_valid && out.stationarity_valid && + out.complementarity_valid && out.gap_valid; + if (!finite_dual) out.message="A nonzero multiplier requires an infinite endpoint"; + else if (!out.accepted) out.message="Original numerical LP KKT checks failed"; + tick(budget); + return out; +} +} + +void LpCheckTolerances::validate() const { + for (double value : {dual_feasibility,stationarity,complementarity,objective_gap}) + if (!std::isfinite(value) || value < 0) + throw ModelError("LP check tolerances must be finite and nonnegative"); +} +void LpObservationOptions::validate() const { solve.validate(); checks.validate(); } +const LpRowObservation& LpObservations::row(Constraint row) const { + if (!id() || row.model_id != id() || row.id >= rows_.size() || !rows_[row.id].active) + throw ModelError("Observation row is foreign, absent or deleted"); + return rows_[row.id]; +} +const LpColumnObservation& LpObservations::column(Variable column) const { + if (!id() || column.model_id != id() || column.id >= columns_.size() || !columns_[column.id].active) + throw ModelError("Observation variable is foreign, absent or deleted"); + return columns_[column.id]; +} +LpObservationCapabilities lp_observation_capabilities() { + const auto backend=capabilities(Backend::Highs); + LpObservationCapabilities out; + out.available=out.duals=out.basis_export=backend.available; + out.backend=backend.name;out.backend_version=backend.version; + out.limitations={"Ordinary Continuous linear models only; no active indicators/globals", + "Numerical observations only; duals require a timely optimal primal/dual point", + "Basis unavailable after adapter constant-row elision or without a vendor basis", + "No basis submission, rays, ranging or sensitivity analysis"}; + return out; +} + +namespace Detail { +std::shared_ptr LpObservationAccess::create( + ModelSnapshot model, const LpObservationOptions& options) { + options.validate(); + validate_structure(model); + auto out=std::shared_ptr(new LpObservations); + out->source_=std::move(model); + out->metadata_.checks=options.checks; + out->metadata_.primal_check_tolerance=options.solve.feasibility_tolerance; + out->rows_.resize(out->source_.rows.size()); + out->columns_.resize(out->source_.variables.size()); + for (std::size_t i=0;irows_.size();++i) out->rows_[i].active=out->source_.rows[i].active; + for (std::size_t i=0;icolumns_.size();++i) out->columns_[i].active=out->source_.variables[i].active; + if (!options.duals) not_requested(out->dual_point_); + if (!options.basis) not_requested(out->basis_); + return out; +} +std::string LpObservationAccess::unsupported(const ModelSnapshot& model, + const SolveOptions& options) { + if (options.backend == Backend::Native) return "LP observations require the HiGHS backend"; + if (options.guarantee != Guarantee::Numerical) return "LP observations support Numerical guarantees only"; + for (const auto& v : model.variables) + if (v.active && v.type != VariableType::Continuous) + return "LP observations require every active variable to be Continuous; no relaxation is performed"; + for (const auto& i : model.indicators) + if (i.active) return "LP observations do not support active original indicators"; + for (const auto& g : model.globals) + if (g.active) return "LP observations do not support active native globals"; + return {}; +} +void LpObservationAccess::unavailable(LpObservations& out,LpObservationReason reason, + const std::string& message) { + for (auto& row : out.rows_) { const bool active=row.active; row={};row.active=active; } + for (auto& col : out.columns_) { const bool active=col.active;col={};col.active=active; } + out.checks_={}; + unavailable_group(out.primal_rows_,reason,message); + unavailable_group(out.dual_point_,reason,message); + unavailable_group(out.basis_,reason,message); +} + +void LpObservationAccess::final_budget(LpObservedResult& out, + std::shared_ptr& observations,const SolveBudget& budget) noexcept { + if (!budget.expired()) return; + out.result.termination=budget.stop_reason().value_or(Termination::Unknown); + try { + out.result.message="Budget expired before LP observations completed"; + if (observations) + unavailable(*observations,LpObservationReason::Interrupted,out.result.message); + } catch (...) { + observations.reset();out.observations.reset();out.result.message.clear(); + } +} + +void LpObservationAccess::finish(LpObservations& out,const SolveResult& result, + const LpBackendObservations& raw, + const SolveBudget& budget) { + out.metadata_.backend=result.backend; + out.metadata_.backend_version=result.backend_version; + auto clear_unpublished = [&]() { + if (out.primal_rows_.state != LpObservationState::Available) + for (auto& row : out.rows_) {row.activity.reset();row.lower_slack.reset();row.upper_slack.reset();} + if (out.dual_point_.state != LpObservationState::Available) { + for (auto& row : out.rows_) {row.dual.reset();row.dual_source=LpDualSource::None;} + for (auto& col : out.columns_) col.reduced_cost.reset(); + } + if (out.basis_.state != LpObservationState::Available) { + for (auto& row : out.rows_) row.basis.reset(); + for (auto& col : out.columns_) col.basis.reset(); + } + }; + auto interrupt_pending = [&]() { + for (auto* item : {&out.primal_rows_,&out.dual_point_,&out.basis_}) + if (item->state == LpObservationState::Unavailable) + unavailable_group(*item,LpObservationReason::Interrupted,"Budget expired before observation group completed"); + clear_unpublished(); + }; + try { + tick(budget); + check_result_layout(out.source_,result); + if (!result.has_solution()) { + unavailable(out,LpObservationReason::NoPrimalPoint,"No validated original primal point"); + return; + } + const auto primal=validate(out.source_,result.values,out.metadata_.primal_check_tolerance); + if (!primal.valid || !primal.objective || !result.objective || + std::abs(static_cast(*primal.objective)-*result.objective) > out.metadata_.checks.objective_gap) + throw BadObservation("Original primal/objective check rejected observation point"); + std::vector activities(out.rows_.size()); + std::size_t work=0; + for (std::size_t i=0;i(term.coefficient)*result.values[term.variable.id]); + } + activities[i]=activity; + out.rows_[i].activity=narrow(activity.value()); + if (std::isfinite(row.lower)) out.rows_[i].lower_slack=narrow(difference(activity.value(),row.lower,&activity)); + if (std::isfinite(row.upper)) out.rows_[i].upper_slack=narrow(-difference(activity.value(),row.upper,&activity)); + } + tick(budget); + out.primal_rows_=available();out.checks_.primal_valid=true; + if (!raw.attempted) { + unavailable_group(out.dual_point_,LpObservationReason::NoBackendSolve,"No backend solve produced duals"); + unavailable_group(out.basis_,LpObservationReason::NoBackendSolve,"No backend solve produced a basis"); + return; + } + if (!raw.timely) throw Interrupted{}; + if (raw.failure != LpCaptureFailure::None) { + const bool allocation=raw.failure == LpCaptureFailure::Allocation; + rejected_group(out.dual_point_,allocation ? LpObservationReason::AllocationFailure : LpObservationReason::InvalidBackendData, + "Backend observation capture failed"); + rejected_group(out.basis_,allocation ? LpObservationReason::AllocationFailure : LpObservationReason::InvalidBackendData, + "Backend observation capture failed"); + return; + } + if (!raw.complete) throw BadObservation("Incomplete backend observation capture"); + check_mapping(out.source_,raw,budget); + for (auto tolerance : {raw.primal_tolerance,raw.dual_tolerance}) + if (tolerance && (!std::isfinite(*tolerance) || *tolerance < 0)) + throw BadObservation("Invalid effective backend tolerance"); + out.metadata_.backend_primal_tolerance=raw.primal_tolerance; + out.metadata_.backend_dual_tolerance=raw.dual_tolerance; + if (result.termination != Termination::Optimal) { + unavailable_group(out.dual_point_,LpObservationReason::NotOptimal,"Dual observations currently require final Optimal status"); + unavailable_group(out.basis_,LpObservationReason::NotOptimal,"Basis observations currently require final Optimal status"); + return; + } + if (!raw.info_valid || !raw.value_valid || !raw.primal_feasible) { + unavailable_group(out.dual_point_,LpObservationReason::NoPrimalPoint,"Backend primal/info validity flags are unavailable"); + unavailable_group(out.basis_,LpObservationReason::NoPrimalPoint,"Backend primal/info validity flags are unavailable"); + return; + } + if (out.dual_point_.state != LpObservationState::NotRequested) { + if (!raw.dual_valid || !raw.dual_feasible) { + unavailable_group(out.dual_point_,LpObservationReason::NoDualPoint,"Backend has no valid feasible dual point"); + } else { + try { + out.checks_=check_duals(out.source_,result,activities,raw,out.metadata_,budget); + if (!out.checks_.accepted) { + rejected_group(out.dual_point_,LpObservationReason::FailedChecks,out.checks_.message); + } else { + for (std::size_t i=0;i +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace Detail { struct LpObservationAccess; } + +enum class LpObservationState { NotRequested, Available, Unavailable, Rejected }; +enum class LpObservationReason { + None, NotRequested, Unsupported, NoBackendSolve, NoPrimalPoint, NotOptimal, + NoDualPoint, NoBasis, ElidedConstantRows, Interrupted, InvalidBackendData, + FailedChecks, AllocationFailure, InvalidModel +}; +enum class LpBasisStatus { Lower, Basic, Upper, Zero, NonbasicUnspecified }; +enum class LpDualSource { None, Backend, DerivedConstantRow }; + +struct LpObservationGroup { + LpObservationState state = LpObservationState::Unavailable; + LpObservationReason reason = LpObservationReason::NoBackendSolve; + std::string message; +}; + +/** Absolute tolerances in original units; each is finite and nonnegative. */ +struct LpCheckTolerances { + double dual_feasibility = 1e-7; + double stationarity = 1e-7; + double complementarity = 1e-6; + double objective_gap = 1e-6; + void validate() const; +}; +struct LpObservationOptions { + SolveOptions solve; + bool duals = true; + bool basis = true; + LpCheckTolerances checks; + void validate() const; +}; + +/** Optional metrics are absent unless their complete computation succeeded. */ +struct LpKktReport { + bool primal_valid = false; + bool dual_signs_valid = false; + bool stationarity_valid = false; + bool complementarity_valid = false; + bool gap_valid = false; + bool accepted = false; + std::optional max_dual_sign_violation; + std::optional max_stationarity; + std::optional max_complementarity; + /** Original objective sense, numerical estimate; never an exact bound. */ + std::optional dual_objective_estimate; + /** Normalized primal-minus-dual, with the common offset cancelled first. */ + std::optional normalized_gap; + std::string message; +}; + +struct LpRowObservation { + bool active = false; + std::optional activity; + /** Absent for an infinite side or unavailable primal observation. */ + std::optional lower_slack, upper_slack; + std::optional dual; + LpDualSource dual_source = LpDualSource::None; + std::optional basis; +}; +struct LpColumnObservation { + bool active = false; + std::optional reduced_cost; + std::optional basis; +}; +struct LpObservationMetadata { + std::string backend, backend_version; + LpCheckTolerances checks; + double primal_check_tolerance = 1e-7; + std::optional backend_primal_tolerance, backend_dual_tolerance; +}; + +/** + * Immutable original-coordinate data; owns the exact historical source model. + * Groups distinguish unavailable data from zero and from empty available arrays. + * Row/column lookups reject foreign handles and original tombstones. Accessors + * perform no solver work and remain usable after model/session destruction. + * Dual values use A^T*pi + reduced_cost = c in the original objective sense. + * Basis status is numerical backend data, not a proof of feasibility/optimality. + */ +class LpObservations { +public: + LpObservations(const LpObservations&) = delete; + LpObservations& operator=(const LpObservations&) = delete; + ModelId id() const noexcept { return source_.model_id; } + Revision revision() const noexcept { return source_.revision; } + const ModelSnapshot& source() const noexcept { return source_; } + const LpObservationMetadata& metadata() const noexcept { return metadata_; } + const LpObservationGroup& primal_rows() const noexcept { return primal_rows_; } + const LpObservationGroup& dual_point() const noexcept { return dual_point_; } + const LpObservationGroup& basis() const noexcept { return basis_; } + const LpKktReport& checks() const noexcept { return checks_; } + const std::vector& rows() const noexcept { return rows_; } + const std::vector& columns() const noexcept { return columns_; } + const LpRowObservation& row(Constraint constraint) const; + const LpColumnObservation& column(Variable variable) const; + +private: + LpObservations() = default; + friend struct Detail::LpObservationAccess; + ModelSnapshot source_; + LpObservationMetadata metadata_; + LpObservationGroup primal_rows_, dual_point_, basis_; + LpKktReport checks_; + std::vector rows_; + std::vector columns_; +}; + +struct LpObservedResult { + SolveResult result; + /** May be null when invalid input or allocation failure prevents capture. */ + std::shared_ptr observations; +}; +struct LpObservationCapabilities { + bool available = false; + bool duals = false; + bool basis_export = false; + std::string backend, backend_version; + std::vector limitations; +}; +LpObservationCapabilities lp_observation_capabilities(); + +/** + * HiGHS Numerical only, on original Continuous linear models without active + * indicators or globals. No automatic relaxation or fallback. The whole-call + * cooperative budget includes snapshot copying, conversion and checking. + * Duals require a timely optimal primal/dual point; basis absence + * does not invalidate a validated primal solution. No ray/ranging work occurs. + */ +LpObservedResult solve_lp_observed(const ModelSnapshot&, + const LpObservationOptions& = {}); +LpObservedResult solve_lp_observed(const Model&, + const LpObservationOptions& = {}); + +}} +#endif diff --git a/gecode/optimize/lp_observations_detail.hpp b/gecode/optimize/lp_observations_detail.hpp new file mode 100644 index 0000000000..39f3109d93 --- /dev/null +++ b/gecode/optimize/lp_observations_detail.hpp @@ -0,0 +1,39 @@ +/* Private collection/checking seam. Not installed or part of the public API. */ +#ifndef GECODE_OPTIMIZE_LP_OBSERVATIONS_DETAIL_HPP +#define GECODE_OPTIMIZE_LP_OBSERVATIONS_DETAIL_HPP +#include + +namespace Gecode { namespace Optimize { namespace Detail { + +enum class LpCaptureFailure { None, Allocation, InvalidData }; +struct LpBackendObservations { + bool requested_duals = true, requested_basis = true; + bool attempted = false, timely = false, complete = false; + bool info_valid = false, value_valid = false, primal_feasible = false; + bool dual_valid = false, dual_feasible = false; + bool basis_valid = false, info_basis_valid = false; + LpCaptureFailure failure = LpCaptureFailure::None; + ModelId model_id = 0; + Revision revision = 0; + std::vector column_slots, row_slots; + std::vector column_duals, row_duals; + std::vector column_basis, row_basis; + std::optional primal_tolerance, dual_tolerance; +}; + +struct LpObservationAccess { + static std::shared_ptr create(ModelSnapshot model, + const LpObservationOptions&); + static std::string unsupported(const ModelSnapshot&, const SolveOptions&); + static void unavailable(LpObservations&, LpObservationReason, + const std::string& message); + /** Pure original-model check of owned raw data; never calls a solver. */ + static void finish(LpObservations&, const SolveResult&, + const LpBackendObservations&, const SolveBudget&); + /** Final gate, called after raw capture destruction; also independently testable. */ + static void final_budget(LpObservedResult&, std::shared_ptr&, + const SolveBudget&) noexcept; +}; + +}}} +#endif diff --git a/gecode/optimize/lp_sensitivity.cpp b/gecode/optimize/lp_sensitivity.cpp new file mode 100644 index 0000000000..c571569732 --- /dev/null +++ b/gecode/optimize/lp_sensitivity.cpp @@ -0,0 +1,420 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +using Wide=long double; +using Clock=std::chrono::steady_clock; +constexpr std::size_t missing=std::numeric_limits::max(); +struct Failure : std::runtime_error { + LpSensitivityReason reason;std::optional stop; + Failure(LpSensitivityReason r,const char* text,std::optional s={}) + :std::runtime_error(text),reason(r),stop(s){} +}; +[[noreturn]] void fail(LpSensitivityReason r,const char* text) {throw Failure(r,text);} +struct Sum { + Wide sum=0,correction=0; + void add(Wide x) { + if(!std::isfinite(x))fail(LpSensitivityReason::FailedLinearSolveChecks,"Nonfinite sensitivity arithmetic"); + Wide n=sum+x;correction+=std::abs(sum)>=std::abs(x)?(sum-n)+x:(x-n)+sum;sum=n; + if(!std::isfinite(sum)||!std::isfinite(correction)) + fail(LpSensitivityReason::FailedLinearSolveChecks,"Sensitivity accumulation overflow"); + } + Wide value() const {return sum+correction;} +}; +double narrow(Wide x,LpSensitivityReason reason=LpSensitivityReason::FailedLinearSolveChecks) { + if(!std::isfinite(x)||std::abs(x)>std::numeric_limits::max())fail(reason,"Finite sensitivity value exceeds double representation"); + const double v=static_cast(x); + if(x!=0&&v==0)fail(reason,"Sensitivity conversion would erase a nonzero value"); + return v; +} +std::size_t plus(std::size_t a,std::size_t b) { + if(b>missing-a)fail(LpSensitivityReason::ResourceLimit,"Sensitivity size overflow");return a+b; +} +SolveOptions budget_options(const LpSensitivityOptions& o) { + SolveOptions s;s.time_limit_seconds=o.time_limit_seconds;s.cancellation=o.cancellation;return s; +} +bool known(Termination t) { + switch(t) { + case Termination::Unknown:case Termination::Optimal:case Termination::Infeasible: + case Termination::Unbounded:case Termination::InfeasibleOrUnbounded:case Termination::TimeLimit: + case Termination::NodeLimit:case Termination::MemoryLimit:case Termination::IterationLimit: + case Termination::SolutionLimit:case Termination::ObjectiveLimit:case Termination::Cancelled: + case Termination::NumericalFailure:case Termination::Unsupported:case Termination::InvalidModel: + case Termination::BackendError:return true; + }return false; +} +struct Inequality {Wide a,b;LpSensitivityLimiter limiter;double tolerance;}; +} +namespace Detail { +#ifdef GECODE_OPTIMIZE_TEST_LP_SENSITIVITY +std::unique_ptr lp_sensitivity_test_factor(const ModelSnapshot&,const LpBasis&,double,const SolveBudget&); +void lp_sensitivity_test_checkpoint(const char*,std::size_t); +#endif +struct LpSensitivityAccess { + const LpSensitivityOptions& opts;Clock::time_point started;SolveBudget budget; + LpSensitivityWork work; + std::shared_ptr out; + std::unique_ptr factor; + std::vector>> matrix; + std::vector entities; + std::vector col_map,row_map,basic,position; + std::vector status; + std::vector lower,upper; + std::vector point,cost,dual,reduced; + Wide sense=1; + LpSensitivityAccess(const LpSensitivityOptions& options,Clock::time_point start) + :opts(options),started(start),budget(budget_options(options)){} + const ModelSnapshot& source() const {return out->original_.observations->source();} + void check() const { + if(budget.cancelled())throw Failure(LpSensitivityReason::Stopped,"LP sensitivity cancelled",Termination::Cancelled); + if(std::chrono::duration(Clock::now()-started).count()>=opts.time_limit_seconds) + throw Failure(LpSensitivityReason::Stopped,"LP sensitivity time limit reached",Termination::TimeLimit); + } + void tick(std::size_t n=1) { + check();if(n>opts.limits.max_work-work.coordinator_visits) + throw Failure(LpSensitivityReason::ResourceLimit,"LP sensitivity coordinator work limit reached",Termination::IterationLimit); + work.coordinator_visits+=n; + } + void keep(std::size_t n) { + tick(0);if(n>opts.limits.max_retained_slots-work.retained_slots) + throw Failure(LpSensitivityReason::ResourceLimit,"LP sensitivity retained-slot limit reached",Termination::MemoryLimit); + work.retained_slots+=n; + } + void cap(std::size_t n,std::size_t maximum,const char* text) { + tick(0);if(n>maximum)throw Failure(LpSensitivityReason::ResourceLimit,text,Termination::MemoryLimit); + if(n>static_cast(std::numeric_limits::max())) + fail(LpSensitivityReason::ResourceLimit,"Sensitivity count exceeds ptrdiff_t"); + } + void event(const char* text,std::size_t index=0) { +#ifdef GECODE_OPTIMIZE_TEST_LP_SENSITIVITY + lp_sensitivity_test_checkpoint(text,index); +#else + (void)text;(void)index; +#endif + check(); + } + std::size_t entity_slot(const LpSensitivityEntity& entity) const { + if(const auto* v=std::get_if(&entity)) { + if(v->model_id!=source().model_id||v->id>=col_map.size()||col_map[v->id]==missing) + fail(LpSensitivityReason::ChangedBasis,"Foreign/deleted factor column");return col_map[v->id]; + } + const auto& r=std::get(entity); + if(r.model_id!=source().model_id||r.id>=row_map.size()||row_map[r.id]==missing) + fail(LpSensitivityReason::ChangedBasis,"Foreign/deleted factor row");return row_map[r.id]; + } + void prepare(const LpObservedResult& original) { + opts.validate();event("before_copy"); + if(!original.observations)fail(LpSensitivityReason::InvalidSource,"Missing owning LP observations"); + const auto& m=original.observations->source(); + cap(opts.parameters.size(),opts.limits.max_requests,"Too many sensitivity requests"); + std::size_t nr=0,nc=0,nz=0,slots=plus(plus(m.variables.size(),m.rows.size()),plus(m.indicators.size(),m.globals.size())); + slots=plus(slots,m.objective.terms.size());tick(slots); + for(const auto& v:m.variables){tick(v.name.size());slots=plus(slots,v.name.size());nc+=v.active;} + for(const auto& r:m.rows){tick(plus(r.name.size(),r.terms.size()));slots=plus(slots,plus(r.name.size(),r.terms.size()));nr+=r.active;if(r.active)nz=plus(nz,r.terms.size());} + for(const auto& g:m.globals){tick();if(g.active)fail(LpSensitivityReason::Unsupported,"Sensitivity does not support original globals");} + for(const auto& i:m.indicators){tick();if(i.active)fail(LpSensitivityReason::Unsupported,"Sensitivity does not support original indicators");} + // Inactive semantic payloads are still copied by the owning basis factory. + for(const auto& i:m.indicators){const auto n=plus(plus(i.terms.size(),i.generated_rows.size()),i.domains.size());tick(n);slots=plus(slots,n);} + for(const auto& g:m.globals){tick(g.name.size());slots=plus(slots,g.name.size()); + std::visit([&](const auto& d){using T=std::decay_t;std::size_t n=0; + if constexpr(std::is_same_v||std::is_same_v||std::is_same_v)n=d.variables.size(); + if constexpr(std::is_same_v)n=plus(d.elements.size(),2); + if constexpr(std::is_same_v)n=plus(plus(d.starts.size(),d.durations.size()),d.heights.size()); + if constexpr(std::is_same_v)n=d.successors.size(); + if constexpr(std::is_same_v){n=plus(n,d.tuples.size());for(const auto& tuple:d.tuples){tick();n=plus(n,tuple.size());}} + if constexpr(std::is_same_v)n=plus(n,plus(d.transitions.size(),d.final_states.size())); + tick(n);slots=plus(slots,n); + },g.payload);} + cap(nr,opts.limits.max_rows,"Too many sensitivity basis rows");cap(nc,opts.limits.max_columns,"Too many sensitivity columns"); + cap(nz,opts.limits.max_nonzeros,"Too many sensitivity nonzeros"); + if(nr&&nr>opts.limits.max_factor_entries/nr)fail(LpSensitivityReason::ResourceLimit,"Sensitivity factor-fill admission exceeded"); + keep(plus(slots,slots));keep(plus(original.result.values.size(),original.result.active_variables.size())); + cap(plus(nr,nc),missing/32,"Sensitivity workspace size overflow");keep(32*plus(nr,nc)); + keep(plus(nz,nz));keep(plus(m.variables.size(),m.rows.size()));keep(opts.parameters.size()); + validate_structure(m);tick(0); + if(opts.backend!=Backend::Auto&&opts.backend!=Backend::Highs) + fail(LpSensitivityReason::Unsupported,"Sensitivity requires the HiGHS numerical factorization backend"); + for(const auto& v:m.variables)if(v.active&&v.type!=VariableType::Continuous) + fail(LpSensitivityReason::Unsupported,"Sensitivity requires original Continuous variables"); + for(const auto& r:m.rows)if(r.active&&r.terms.empty())fail(LpSensitivityReason::NoBasis,"Sensitivity cannot map elided constant rows"); + const auto& r=original.result; + if(!known(r.termination)||r.guarantee!=Guarantee::Numerical||r.model_id!=m.model_id||r.revision!=m.revision) + fail(LpSensitivityReason::InvalidSource,"Invalid LP result status/guarantee/identity"); + if(r.termination!=Termination::Optimal)fail(LpSensitivityReason::NotOptimal,"Sensitivity requires an optimal LP result"); + const auto& o=*original.observations; + if(o.basis().state!=LpObservationState::Available)fail(LpSensitivityReason::NoBasis,"Sensitivity requires an available original basis"); + if(o.primal_rows().state!=LpObservationState::Available||o.dual_point().state!=LpObservationState::Available||!o.checks().accepted) + fail(LpSensitivityReason::FailedReferenceChecks,"Sensitivity requires accepted O1 primal/dual/KKT observations"); + if(!nr||!nc)fail(LpSensitivityReason::NoBasis,"Zero-row/column sensitivity is not implemented"); + if(!r.solution_validated||r.values.size()!=m.variables.size()||r.active_variables.size()!=m.variables.size()||!r.objective||!std::isfinite(*r.objective)) + fail(LpSensitivityReason::InvalidSource,"Missing valid original LP assignment/objective"); + if(!std::isfinite(r.elapsed_seconds)||r.elapsed_seconds<0)fail(LpSensitivityReason::InvalidSource,"Invalid original LP elapsed time"); + for(const auto* scalar:{&r.best_bound,&r.absolute_gap,&r.relative_gap,&r.native_backend_gap}) + if(*scalar&&!std::isfinite(**scalar))fail(LpSensitivityReason::InvalidSource,"Nonfinite original LP scalar"); + if((r.absolute_gap&&*r.absolute_gap<0)||(r.relative_gap&&*r.relative_gap<0)||(r.native_backend_gap&&*r.native_backend_gap<0))fail(LpSensitivityReason::InvalidSource,"Negative original LP gap"); + for(std::size_t i=0;i(*r.objective)-*r.best_bound); + const Wide scalar_rounding=4*std::numeric_limits::epsilon()* + std::max({Wide(1),std::abs(static_cast(*r.objective)),std::abs(static_cast(*r.best_bound))}); + if(gap< -std::max(static_cast(opts.checks.kkt.objective_gap),scalar_rounding)) + fail(LpSensitivityReason::InvalidSource,"Original LP bound is on the wrong side"); + const Wide absolute=std::abs(static_cast(*r.objective)-*r.best_bound); + if(r.absolute_gap&&std::abs(absolute-*r.absolute_gap)>opts.checks.kkt.objective_gap) + fail(LpSensitivityReason::InvalidSource,"Original LP absolute gap is inconsistent"); + if(r.relative_gap&&std::abs(absolute/std::max(Wide(1),std::abs(static_cast(*r.objective)))-*r.relative_gap)>opts.checks.kkt.objective_gap) + fail(LpSensitivityReason::InvalidSource,"Original LP relative gap is inconsistent"); + } + std::set> requested; + for(const auto& p:opts.parameters){tick(); + if(const auto* v=std::get_if(&p)){ + if(v->variable.model_id!=m.model_id||v->variable.id>=m.variables.size()||!m.variables[v->variable.id].active) + fail(LpSensitivityReason::InvalidSource,"Sensitivity variable is foreign/deleted"); + if(!requested.emplace(0,v->variable.id).second)fail(LpSensitivityReason::InvalidSource,"Duplicate sensitivity request"); + }else if(const auto* q=std::get_if(&p)){ + if(q->row.model_id!=m.model_id||q->row.id>=m.rows.size()||!m.rows[q->row.id].active) + fail(LpSensitivityReason::InvalidSource,"Sensitivity row is foreign/deleted"); + const auto& row=m.rows[q->row.id];if(!std::isfinite(row.lower)||row.lower!=row.upper) + fail(LpSensitivityReason::Unsupported,"Only equality common RHS sensitivity is supported"); + if(!requested.emplace(1,q->row.id).second)fail(LpSensitivityReason::InvalidSource,"Duplicate sensitivity request"); + }else fail(LpSensitivityReason::InvalidSource,"Sensitivity request has no payload");} + out=std::shared_ptr(new LpSensitivity);out->original_=original;out->tolerances_=opts.checks; + for(const auto& v:m.variables)out->columns_.push_back(v.active); + for(const auto& row:m.rows)out->rows_.push_back(row.active); + for(const auto& p:opts.parameters)out->entries_.push_back({p,{LpSensitivityState::Unavailable,LpSensitivityReason::NotRequested,"Not yet analyzed"},{}}); + out->basis_=make_lp_basis(o);event("after_copy"); + } + void setup() { + event("before_factor");work.factor_setup_attempted=true; +#ifdef GECODE_OPTIMIZE_TEST_LP_SENSITIVITY + factor=lp_sensitivity_test_factor(source(),*out->basis_,opts.checks.primal_feasibility,budget); +#else + factor=make_lp_sensitivity_factor(source(),*out->basis_,opts.checks.primal_feasibility,budget); +#endif + event("after_factor");if(!factor)fail(LpSensitivityReason::BackendFailure,"Missing private factorization"); + const auto& m=source();col_map.assign(m.variables.size(),missing);row_map.assign(m.rows.size(),missing); + const std::size_t n=factor->columns.size(),r=factor->rows.size(),total=plus(n,r); + std::size_t count=0;for(const auto& v:m.variables)count+=v.active;if(count!=n)fail(LpSensitivityReason::ChangedBasis,"Factor column count mismatch"); + count=0;for(const auto& row:m.rows)count+=row.active;if(count!=r)fail(LpSensitivityReason::ChangedBasis,"Factor row count mismatch"); + for(auto slot:factor->columns){tick();if(slot>=col_map.size()||!m.variables[slot].active||col_map[slot]!=missing) + fail(LpSensitivityReason::ChangedBasis,"Invalid factor column mapping");col_map[slot]=entities.size();entities.push_back(m.variables[slot].variable); + lower.push_back(m.variables[slot].lower);upper.push_back(m.variables[slot].upper);status.push_back(*out->basis_->columns()[slot]);} + for(auto slot:factor->rows){tick();if(slot>=row_map.size()||!m.rows[slot].active||row_map[slot]!=missing) + fail(LpSensitivityReason::ChangedBasis,"Invalid factor row mapping");row_map[slot]=entities.size();entities.push_back(m.rows[slot].constraint); + lower.push_back(-m.rows[slot].upper);upper.push_back(-m.rows[slot].lower);auto s=*out->basis_->rows()[slot]; + status.push_back(s==LpBasisStatus::Lower?LpBasisStatus::Upper:s==LpBasisStatus::Upper?LpBasisStatus::Lower:s);} + matrix.resize(total);for(std::size_t i=0;irows[i]].terms){tick();matrix[col_map[t.variable.id]].push_back({i,t.coefficient});}matrix[n+i].push_back({i,1});} + position.assign(total,missing); + if(factor->order.size()!=r)fail(LpSensitivityReason::ChangedBasis,"Wrong factor basis size"); + for(const auto& entity:factor->order){tick();const auto k=entity_slot(entity); + if(position[k]!=missing||status[k]!=LpBasisStatus::Basic)fail(LpSensitivityReason::ChangedBasis,"Duplicate/nonbasic factor entity"); + position[k]=basic.size();basic.push_back(k);} + for(std::size_t k=0;korder_=factor->order;out->backend_version_=factor->version; + cost.assign(total,0);for(const auto& t:m.objective.terms)cost[col_map[t.variable.id]]=sense*t.coefficient; + point.assign(total,0);for(std::size_t k=0;k& v) { + Sum s;s.add(anchor);for(auto [row,a]:matrix[column]){tick();s.add(-a*v[row]);}return s.value(); + } + std::vector solve_system(const std::vector& rhs,bool transpose) { + event("before_system",work.basis_solves); + if(work.basis_solves>=opts.limits.max_basis_solves)throw Failure(LpSensitivityReason::ResourceLimit,"Basis linear-system call limit reached",Termination::IterationLimit); + std::vector input;for(Wide v:rhs){tick();input.push_back(narrow(v));} + ++work.basis_solves;auto raw=factor->solve(input,transpose);event("after_system",work.basis_solves); + if(raw.size()!=basic.size())fail(LpSensitivityReason::FailedLinearSolveChecks,"Wrong basis solution count"); + std::vector result;for(double v:raw){tick();if(!std::isfinite(v))fail(LpSensitivityReason::FailedLinearSolveChecks,"Nonfinite basis solution");result.push_back(v);} + std::vector residual(basic.size()),magnitudes(basic.size()); + if(transpose){for(std::size_t p=0;popts.checks.system_absolute+opts.checks.system_relative*scale) + fail(LpSensitivityReason::FailedLinearSolveChecks,"Original basis-system residual failed");} + auto& checks=out->checks_;checks.max_system_residual=std::max(checks.max_system_residual.value_or(0),narrow(max_absolute)); + checks.max_scaled_system_residual=std::max(checks.max_scaled_system_residual.value_or(0),narrow(max_scaled));return result; + } + void reference() { + std::vector sums(basic.size()); + for(std::size_t k=0;k rhs;for(const auto& s:sums)rhs.push_back(s.value()); + const auto primal=solve_system(rhs,false);for(std::size_t p=0;p values(source().variables.size(),std::numeric_limits::quiet_NaN()); + Wide difference=0;for(std::size_t j=0;jcolumns.size();++j){tick();values[factor->columns[j]]=narrow(point[j]);difference=std::max(difference,std::abs(point[j]-out->original_.result.values[factor->columns[j]]));} + auto& checks=out->checks_;checks.max_point_difference=narrow(difference);checks.basis_point_matches=difference<=opts.checks.primal_feasibility; + checks.primal=validate(source(),values,opts.checks.primal_feasibility,0); + auto& kkt=checks.kkt;kkt.primal_valid=checks.primal.valid; + if(!checks.primal.valid||!checks.basis_point_matches)fail(LpSensitivityReason::FailedReferenceChecks,"Selected basis point disagrees with original feasible LP point"); + reduced.resize(point.size());Wide max_stationarity=0,max_sign=0,max_comp=0;Sum normalized_gap,dual_terms; + for(std::size_t k=0;k0?lower[k]:upper[k];if(!std::isfinite(side))fail(LpSensitivityReason::FailedReferenceChecks,"Basis dual requires an infinite bound"); + dual_terms.add(value*side);normalized_gap.add(-value*side);max_comp=std::max(max_comp,std::abs(value*(point[k]-side)));} + } + // Public primal activities are independently recomputed by validate; also + // check all retained logical coordinates against A*x, not only B residuals. + std::vector activity(basic.size()); + for(std::size_t k=0;kopts.checks.primal_feasibility) + fail(LpSensitivityReason::FailedReferenceChecks,"Logical basis coordinate disagrees with original row activity"); + kkt.max_stationarity=narrow(max_stationarity);kkt.max_dual_sign_violation=narrow(std::max(Wide(0),max_sign));kkt.max_complementarity=narrow(max_comp); + kkt.normalized_gap=narrow(normalized_gap.value());Sum objective;objective.add(source().objective.offset);objective.add(sense*dual_terms.sum);objective.add(sense*dual_terms.correction);kkt.dual_objective_estimate=narrow(objective.value()); + kkt.stationarity_valid=max_stationarity<=opts.checks.kkt.stationarity;kkt.dual_signs_valid=max_sign<=opts.checks.kkt.dual_feasibility; + kkt.complementarity_valid=max_comp<=opts.checks.kkt.complementarity;kkt.gap_valid=std::abs(normalized_gap.value())<=opts.checks.kkt.objective_gap; + kkt.accepted=kkt.primal_valid&&kkt.stationarity_valid&&kkt.dual_signs_valid&&kkt.complementarity_valid&&kkt.gap_valid; + if(!kkt.accepted)fail(LpSensitivityReason::FailedReferenceChecks,"Selected basis failed original numerical KKT checks");event("after_reference"); + } + LpSensitivityLimiter limiter(std::size_t k,LpSensitivitySide side,bool dual_condition) { + if(k>=factor->columns.size()&&(side==LpSensitivitySide::Lower||side==LpSensitivitySide::Upper)) + side=side==LpSensitivitySide::Lower?LpSensitivitySide::Upper:LpSensitivitySide::Lower; + return {entities[k],side,dual_condition}; + } + LpParameterInterval interval(const LpSensitivityParameter& parameter) { + const std::size_t total=point.size();std::vector inequalities; + inequalities.reserve(2*total);LpParameterInterval output; + if(const auto* p=std::get_if(¶meter)) { + const auto j=col_map[p->variable.id];output.anchor=narrow(sense*cost[j]);output.objective_slope=narrow(point[j]); + std::vector v(basic.size(),0);if(position[j]!=missing){std::vector rhs(basic.size(),0);rhs[position[j]]=sense;v=solve_system(rhs,true);} + for(std::size_t k=0;k(parameter);const auto selected=row_map[q.row.id]; + output.anchor=source().rows[q.row.id].lower;std::vector direction(total,0); + if(position[selected]==missing){std::vector rhs(basic.size(),0);rhs[selected-factor->columns.size()]=1; + const auto v=solve_system(rhs,false);for(std::size_t k=0;kcolumns.size();++j){tick();slope.add(sense*cost[j]*direction[j]);}output.objective_slope=narrow(slope.value()); + if(position[selected]==missing&&std::abs(slope.value()-sense*dual[selected-factor->columns.size()])>opts.checks.kkt.stationarity) + fail(LpSensitivityReason::FailedIntervalChecks,"Equality objective slope disagrees with original row dual"); + for(std::size_t k=0;k::infinity(),hi=std::numeric_limits::infinity(); + for(const auto& q:inequalities){tick();if(!std::isfinite(q.a)||!std::isfinite(q.b))fail(LpSensitivityReason::FailedIntervalChecks,"Nonfinite interval inequality"); + if(q.b==0){if(q.a<0)fail(LpSensitivityReason::FailedIntervalChecks,"Numerical basis has no fixed-basis interval");continue;} + const Wide endpoint=-q.a/q.b;if(!std::isfinite(endpoint))fail(LpSensitivityReason::FailedIntervalChecks,"Finite interval ratio overflowed"); + if(q.b>0&&endpoint>lo){lo=endpoint;output.lower_limiter=q.limiter;} + if(q.b<0&&endpoint0||hi<0||lo>hi)fail(LpSensitivityReason::FailedIntervalChecks,"Numerical interval excludes its source anchor"); + auto end=[&](Wide delta,bool lower_end) { + if(!std::isfinite(delta))return LpRangeEnd{lower_end?LpRangeEndKind::NegativeInfinity:LpRangeEndKind::PositiveInfinity,{}}; + Sum value;value.add(output.anchor);value.add(delta);return LpRangeEnd{LpRangeEndKind::Finite,narrow(value.value(),LpSensitivityReason::FailedIntervalChecks)}; + }; + output.lower=end(lo,true);output.upper=end(hi,false); + // Recheck the published absolute values, including rounding during narrowing. + const Wide published_lo=output.lower.value?static_cast(*output.lower.value)-output.anchor:lo; + const Wide published_hi=output.upper.value?static_cast(*output.upper.value)-output.anchor:hi; + Wide max_violation=0;bool lower_limited=!std::isfinite(lo),upper_limited=!std::isfinite(hi); + for(const auto& q:inequalities){tick(); + if(std::isfinite(published_lo)){Sum v;v.add(q.a);v.add(q.b*published_lo);const Wide x=v.value();max_violation=std::max(max_violation,-x); + if(x< -q.tolerance)fail(LpSensitivityReason::FailedIntervalChecks,"Published lower endpoint fails original affine checks"); + if(q.b>0&&std::abs(x)<=q.tolerance)lower_limited=true; + }else if(q.b>0)fail(LpSensitivityReason::FailedIntervalChecks,"Invalid negative-infinity interval direction"); + if(std::isfinite(published_hi)){Sum v;v.add(q.a);v.add(q.b*published_hi);const Wide x=v.value();max_violation=std::max(max_violation,-x); + if(x< -q.tolerance)fail(LpSensitivityReason::FailedIntervalChecks,"Published upper endpoint fails original affine checks"); + if(q.b<0&&std::abs(x)<=q.tolerance)upper_limited=true; + }else if(q.b<0)fail(LpSensitivityReason::FailedIntervalChecks,"Invalid positive-infinity interval direction");} + if(!lower_limited||!upper_limited)fail(LpSensitivityReason::FailedIntervalChecks,"Finite endpoint has no checked limiting condition"); + output.checks={true,inequalities.size(),narrow(std::max(Wide(0),max_violation)),!std::isfinite(lo),!std::isfinite(hi),"Original affine interval checks accepted numerically"};return output; + } + static void clear_owned(const std::shared_ptr& data,LpSensitivityReason reason,const char* text) noexcept { + if(!data)return; + for(auto& entry:data->entries_){entry.group.state=LpSensitivityState::Unavailable;entry.group.reason=reason;entry.interval.reset();} + try {for(auto& entry:data->entries_)entry.group.message=text;}catch(...){for(auto& entry:data->entries_)entry.group.message.clear();} + } + void clear(LpSensitivityReason reason,const char* text) noexcept {clear_owned(out,reason,text);} + void release() {factor.reset();matrix.clear();entities.clear();col_map.clear();row_map.clear();basic.clear();position.clear();status.clear();lower.clear();upper.clear();point.clear();cost.clear();dual.clear();reduced.clear();event("after_cleanup");} + void run(const LpObservedResult& original,LpSensitivityResult& result) { + try { + prepare(original);result.sensitivity=out;setup();reference();std::size_t accepted=0; + for(std::size_t i=0;ientries_.size();++i){event("before_interval",i);auto& entry=out->entries_[i]; + try {entry.interval=interval(entry.parameter);entry.group={LpSensitivityState::Available,LpSensitivityReason::None,"Fixed-basis numerical interval available"};++accepted;} + catch(const Failure& e){if(e.stop||e.reason==LpSensitivityReason::ResourceLimit||e.reason==LpSensitivityReason::Stopped)throw; + entry.interval.reset();entry.group={LpSensitivityState::Rejected,e.reason,e.what()};} + event("after_interval",i);} + result.completion=accepted==out->entries_.size()?LpSensitivityCompletion::Complete:accepted?LpSensitivityCompletion::Partial:LpSensitivityCompletion::Rejected; + result.reason=result.completion==LpSensitivityCompletion::Complete?LpSensitivityReason::None:LpSensitivityReason::FailedIntervalChecks; + result.message=accepted==out->entries_.size()?"Requested fixed-basis numerical intervals accepted":"Some requested intervals failed numerical checks"; + check(); + } catch(const Failure& e) { + factor.reset();clear(e.reason,e.what());result.completion=e.stop?LpSensitivityCompletion::Interrupted:LpSensitivityCompletion::Rejected; + result.reason=e.reason;result.stop_reason=e.stop;result.message=e.what(); + } catch(const LpSensitivityBackendError& e) { + factor.reset();clear(e.reason,e.what());result.reason=e.reason;result.message=e.what();result.completion=LpSensitivityCompletion::Rejected; + } catch(const ModelError& e) { + factor.reset();clear(LpSensitivityReason::InvalidSource,e.what());result.reason=LpSensitivityReason::InvalidSource;result.message=e.what();result.completion=LpSensitivityCompletion::Rejected; + } + result.sensitivity=out;result.work=work; + } +}; +} +void LpSensitivityTolerances::validate() const { + kkt.validate();for(double v:{primal_feasibility,system_absolute,system_relative}) + if(!std::isfinite(v)||v<0)throw ModelError("LP sensitivity tolerances must be finite and nonnegative"); +} +void LpSensitivityOptions::validate() const { + checks.validate();if(std::isnan(time_limit_seconds)||time_limit_seconds<0)throw ModelError("Invalid sensitivity time limit"); + if(parameters.empty())throw ModelError("Sensitivity requires a nonempty explicit parameter list"); + if(backend!=Backend::Auto&&backend!=Backend::Highs&&backend!=Backend::Native)throw ModelError("Unknown sensitivity backend"); +} +const LpSensitivityEntry* LpSensitivity::objective(Variable v) const { + if(v.model_id!=id()||v.id>=columns_.size()||!columns_[v.id])throw ModelError("Sensitivity variable is foreign, absent or deleted"); + for(const auto& e:entries_)if(const auto* p=std::get_if(&e.parameter))if(p->variable==v)return &e;return nullptr; +} +const LpSensitivityEntry* LpSensitivity::equality_rhs(Constraint r) const { + if(r.model_id!=id()||r.id>=rows_.size()||!rows_[r.id])throw ModelError("Sensitivity row is foreign, absent or deleted"); + for(const auto& e:entries_)if(const auto* p=std::get_if(&e.parameter))if(p->row.model_id==r.model_id&&p->row.id==r.id)return &e;return nullptr; +} +LpSensitivityResult analyze_lp_sensitivity(const LpObservedResult& original,const LpSensitivityOptions& options) { + const auto start=Clock::now();LpSensitivityResult result;result.model_id=original.result.model_id;result.revision=original.result.revision; + std::unique_ptr access;bool options_valid=false; + try {options.validate();options_valid=true;access=std::make_unique(options,start);access->run(original,result);} + catch(const std::bad_alloc&){if(access)access->clear(LpSensitivityReason::AllocationFailure,"LP sensitivity allocation failed"); + result.completion=LpSensitivityCompletion::Interrupted;result.reason=LpSensitivityReason::AllocationFailure;result.stop_reason=Termination::MemoryLimit;result.message.clear();} + catch(const ModelError& e){if(access)access->clear(LpSensitivityReason::InvalidSource,e.what()); + result.completion=LpSensitivityCompletion::Rejected;result.reason=LpSensitivityReason::InvalidSource;try{result.message=e.what();}catch(...){result.message.clear();}} + catch(const std::exception& e){if(access)access->clear(LpSensitivityReason::BackendFailure,e.what()); + result.completion=LpSensitivityCompletion::Rejected;result.reason=LpSensitivityReason::BackendFailure;try{result.message=e.what();}catch(...){result.message.clear();}} + std::shared_ptr owned; + if(access){owned=access->out;result.sensitivity=owned;result.work=access->work; + try{access->release();access->check();}catch(const Failure& e){access->clear(e.reason,e.what());result.completion=LpSensitivityCompletion::Interrupted;result.reason=e.reason;result.stop_reason=e.stop;try{result.message=e.what();}catch(...){result.message.clear();}} + catch(...){access->clear(LpSensitivityReason::BackendFailure,"LP sensitivity cleanup failed");result.completion=LpSensitivityCompletion::Rejected;result.reason=LpSensitivityReason::BackendFailure;result.message.clear();} + access.reset(); + } + // Includes destruction of retained vector capacity, backend state and budget. + std::optional final_stop; + if(options_valid&&options.cancellation&&options.cancellation->cancelled())final_stop=Termination::Cancelled; + else if(options_valid&&std::chrono::duration(Clock::now()-start).count()>=options.time_limit_seconds)final_stop=Termination::TimeLimit; + if(final_stop){Detail::LpSensitivityAccess::clear_owned(owned,LpSensitivityReason::Stopped,"Whole LP sensitivity allowance stopped during cleanup"); + result.completion=LpSensitivityCompletion::Interrupted;result.reason=LpSensitivityReason::Stopped;result.stop_reason=final_stop; + try{result.message="Whole LP sensitivity allowance stopped during cleanup";}catch(...){result.message.clear();} + } + result.elapsed_seconds=std::chrono::duration(Clock::now()-start).count();return result; +} +}} diff --git a/gecode/optimize/lp_sensitivity.hpp b/gecode/optimize/lp_sensitivity.hpp new file mode 100644 index 0000000000..6657ddf982 --- /dev/null +++ b/gecode/optimize/lp_sensitivity.hpp @@ -0,0 +1,163 @@ +/* Owning numerical sensitivity of one specified optimal continuous LP basis. */ +#ifndef GECODE_OPTIMIZE_LP_SENSITIVITY_HPP +#define GECODE_OPTIMIZE_LP_SENSITIVITY_HPP +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace Detail { struct LpSensitivityAccess; } + +struct LpObjectiveParameter { Variable variable; }; +struct LpEqualityRhsParameter { Constraint row; }; +using LpSensitivityParameter=std::variant; +using LpSensitivityEntity=std::variant; + +enum class LpSensitivityState { NotRequested,Available,Unavailable,Rejected }; +enum class LpSensitivityReason { + None,NotRequested,Unsupported,NotOptimal,NoBasis,InvalidSource,InvalidBasis, + ChangedBasis,FailedReferenceChecks,FailedLinearSolveChecks,FailedIntervalChecks, + ResourceLimit,Stopped,AllocationFailure,BackendFailure +}; +struct LpSensitivityGroup { + LpSensitivityState state=LpSensitivityState::Unavailable; + LpSensitivityReason reason=LpSensitivityReason::NotRequested; + std::string message; +}; +struct LpSensitivityTolerances { + double primal_feasibility=1e-7; + LpCheckTolerances kkt; + /** |B*v-rhs| <= absolute + relative*(|B|*|v|+|rhs|), per equation. */ + double system_absolute=1e-9,system_relative=1e-9; + void validate() const; +}; +struct LpSensitivityLimits { + std::size_t max_rows=4096,max_columns=100000,max_nonzeros=1000000; + std::size_t max_requests=4096,max_basis_solves=8194; + /** Checked m*m admission, not an exact backend allocation/RSS bound. */ + std::size_t max_factor_entries=16777216; + /** Logical retained slots and coordinator visits, not bytes or CPU work. */ + std::size_t max_retained_slots=20000000,max_work=100000000; +}; +struct LpSensitivityOptions { + Backend backend=Backend::Auto; + double time_limit_seconds=std::numeric_limits::infinity(); + std::shared_ptr cancellation; + /** Nonempty, unique requests; complete preflight precedes factorization. */ + std::vector parameters; + LpSensitivityTolerances checks; + LpSensitivityLimits limits; + void validate() const; +}; + +enum class LpRangeEndKind { Finite,NegativeInfinity,PositiveInfinity }; +struct LpRangeEnd { + LpRangeEndKind kind=LpRangeEndKind::Finite; + /** In an available interval, present exactly for Finite. Infinity is a + * direction, not a parameter value. Default/unavailable data does not + * describe an interval endpoint. */ + std::optional value; +}; +enum class LpSensitivitySide { Lower,Upper,Fixed,Free }; +struct LpSensitivityLimiter { + LpSensitivityEntity entity; + LpSensitivitySide side=LpSensitivitySide::Lower; + bool dual_condition=false; +}; +struct LpIntervalCheckReport { + bool accepted=false; + std::size_t inequalities=0; + std::optional max_endpoint_violation; + bool lower_direction_checked=false,upper_direction_checked=false; + std::string message; +}; +struct LpParameterInterval { + double anchor=0; + LpRangeEnd lower,upper; + /** Original objective change = slope*(parameter-anchor), no offset. */ + std::optional objective_slope; + std::optional lower_limiter,upper_limiter; + LpIntervalCheckReport checks; +}; +struct LpSensitivityEntry { + LpSensitivityParameter parameter; + LpSensitivityGroup group; + /** Present only for Available; a singleton is distinct from unavailable. */ + std::optional interval; +}; +struct LpSensitivityReferenceChecks { + ValidationReport primal; + LpKktReport kkt; + bool basis_point_matches=false; + std::optional max_point_difference; + std::optional max_system_residual,max_scaled_system_residual; +}; +struct LpSensitivityWork { + bool factor_setup_attempted=false; + /** Attempted private factor-system calls, including calls failing before the + * backend accessor is entered; not optimization iterations or run telemetry. */ + std::size_t basis_solves=0,coordinator_visits=0,retained_slots=0; +}; + +/** Immutable historical source/basis/ranges. Accessors perform no backend work. + * Original-slot masks include tombstones. Lookups reject foreign/tombstone IDs; + * nullptr means the valid historical entity was not requested. A model/session + * edit or destruction never changes this object. All intervals are qualified + * Numerical, for one parameter and this selected basis/status assignment only. + */ +class LpSensitivity { +public: + LpSensitivity(const LpSensitivity&)=delete; + LpSensitivity& operator=(const LpSensitivity&)=delete; + ModelId id() const noexcept {return original_.result.model_id;} + Revision revision() const noexcept {return original_.result.revision;} + const LpObservedResult& original() const noexcept {return original_;} + const std::shared_ptr& basis() const noexcept {return basis_;} + const std::vector& factor_order() const noexcept {return order_;} + const std::vector& entries() const noexcept {return entries_;} + const LpSensitivityEntry* objective(Variable) const; + const LpSensitivityEntry* equality_rhs(Constraint) const; + const std::vector& active_columns() const noexcept {return columns_;} + const std::vector& active_rows() const noexcept {return rows_;} + const LpSensitivityReferenceChecks& checks() const noexcept {return checks_;} + const LpSensitivityTolerances& tolerances() const noexcept {return tolerances_;} + const std::string& backend_version() const noexcept {return backend_version_;} +private: + LpSensitivity()=default; + friend struct Detail::LpSensitivityAccess; + LpObservedResult original_; + std::shared_ptr basis_; + std::vector order_; + std::vector entries_; + std::vector columns_,rows_; + LpSensitivityReferenceChecks checks_; + LpSensitivityTolerances tolerances_; + std::string backend_version_; +}; +enum class LpSensitivityCompletion { Complete,Partial,Interrupted,Rejected }; +struct LpSensitivityResult { + ModelId model_id=0; + Revision revision=0; + LpSensitivityCompletion completion=LpSensitivityCompletion::Rejected; + LpSensitivityReason reason=LpSensitivityReason::InvalidSource; + std::optional stop_reason; + std::string message; + std::shared_ptr sensitivity; + LpSensitivityWork work; + double elapsed_seconds=0; +}; + +/** Additional private factorization/linear algebra, zero optimization runs. + * HiGHS/Auto only; a timely optimal solve_lp_observed() result on a Continuous + * linear source with checked duals and complete basis. Empty row/column systems, + * active indicators/globals, elided constant rows, automatic relaxation, + * replacement bases and stale-revision transplants are unsupported. Only + * objective coefficients and equality common RHS are supported parameter kinds. + * Factorization/triangular solves are cooperatively budgeted. A final whole-call + * limit, cancellation, resource or cleanup failure clears every availability; + * original solve provenance and completed diagnostics remain historical data. + */ +LpSensitivityResult analyze_lp_sensitivity(const LpObservedResult&, + const LpSensitivityOptions&); +}} +#endif diff --git a/gecode/optimize/lp_sensitivity_backend.cpp b/gecode/optimize/lp_sensitivity_backend.cpp new file mode 100644 index 0000000000..63981ccc4b --- /dev/null +++ b/gecode/optimize/lp_sensitivity_backend.cpp @@ -0,0 +1,98 @@ +#include +#include +#include +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +#include +#endif +namespace Gecode { namespace Optimize { namespace Detail { +namespace { +[[noreturn]] void fail(LpSensitivityReason reason,const char* text) { + throw LpSensitivityBackendError(reason,text); +} +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +void check(const SolveBudget& budget) { + if(budget.expired())fail(LpSensitivityReason::Stopped,"LP factorization budget stopped"); +} +void ok(HighsStatus status,const char* text) { + if(status!=HighsStatus::kOk)fail(LpSensitivityReason::BackendFailure,text); +} +HighsBasisStatus status(LpBasisStatus input) { + switch(input) { + case LpBasisStatus::Lower:return HighsBasisStatus::kLower; + case LpBasisStatus::Upper:return HighsBasisStatus::kUpper; + case LpBasisStatus::Basic:return HighsBasisStatus::kBasic; + case LpBasisStatus::Zero:return HighsBasisStatus::kZero; + case LpBasisStatus::NonbasicUnspecified:break; + } + fail(LpSensitivityReason::InvalidBasis,"Sensitivity requires explicit basis statuses"); +} +struct Factor final : LpSensitivityFactor { + Highs backend; + std::vector solve(const std::vector& rhs,bool transpose) override { + if(rhs.size()!=rows.size()||rhs.empty()) + fail(LpSensitivityReason::InvalidBasis,"Invalid basis-system RHS size"); + for(double x:rhs)if(!std::isfinite(x)) + fail(LpSensitivityReason::FailedLinearSolveChecks,"Nonfinite basis-system RHS"); + std::vector values(rows.size(),0); + ok(transpose?backend.getBasisTransposeSolve(rhs.data(),values.data()): + backend.getBasisSolve(rhs.data(),values.data()),"HiGHS basis-system solve failed"); + for(double x:values)if(!std::isfinite(x)) + fail(LpSensitivityReason::FailedLinearSolveChecks,"Nonfinite basis-system solution"); + return values; + } +}; +#endif +} +std::unique_ptr make_lp_sensitivity_factor( + const ModelSnapshot& source,const LpBasis& basis,double tolerance,const SolveBudget& budget) { +#ifndef GECODE_OPTIMIZE_WITH_HIGHS + (void)source;(void)basis;(void)tolerance;(void)budget; + fail(LpSensitivityReason::Unsupported,"This build has no HiGHS LP factorization backend"); +#else + check(budget); + LpBasisAccess::compatible(basis,source,budget); + auto compiled=compile_lp_sensitivity(source,tolerance); + check(budget); + if(compiled.rows.empty())fail(LpSensitivityReason::NoBasis,"Zero-row sensitivity is not implemented"); + auto out=std::make_unique(); + out->columns=std::move(compiled.columns);out->rows=std::move(compiled.rows); + out->version=out->backend.version(); + ok(out->backend.setOptionValue("output_flag",false),"LP factorization log setup failed"); + ok(out->backend.setOptionValue("threads",1),"LP factorization thread setup failed"); + ok(out->backend.setOptionValue("presolve","off"),"LP factorization presolve setup failed"); + ok(out->backend.setOptionValue("time_limit",budget.remaining_seconds()),"LP factorization time setup failed"); + ok(out->backend.passModel(compiled.lp),"LP factorization model load failed or changed input"); + check(budget); + HighsBasis requested;requested.alien=false;requested.valid=true;requested.useful=true; + for(auto slot:out->columns)requested.col_status.push_back(status(*basis.columns()[slot])); + for(auto slot:out->rows)requested.row_status.push_back(status(*basis.rows()[slot])); + ok(out->backend.setBasis(requested,"Gecode original LP sensitivity basis"),"LP sensitivity basis rejected"); + check(budget); + std::vector order(out->rows.size()); + if(out->backend.getBasicVariables(order.data())!=HighsStatus::kOk||!out->backend.hasInvert()) + fail(LpSensitivityReason::InvalidBasis,"Selected LP basis is singular or cannot be factored without repair"); + check(budget); + const auto& actual=out->backend.getBasis(); + if(!actual.valid||actual.col_status!=requested.col_status||actual.row_status!=requested.row_status) + fail(LpSensitivityReason::ChangedBasis,"Backend changed selected sensitivity basis"); + std::vector seen_columns(out->columns.size()),seen_rows(out->rows.size()); + for(HighsInt index:order) { + if(index>=0) { + const auto k=static_cast(index); + if(k>=out->columns.size()||seen_columns[k]||requested.col_status[k]!=HighsBasisStatus::kBasic) + fail(LpSensitivityReason::ChangedBasis,"Invalid structural factor basis mapping"); + seen_columns[k]=true;out->order.push_back(source.variables[out->columns[k]].variable); + } else { + const auto k=static_cast(-(index+1)); + if(k>=out->rows.size()||seen_rows[k]||requested.row_status[k]!=HighsBasisStatus::kBasic) + fail(LpSensitivityReason::ChangedBasis,"Invalid logical factor basis mapping"); + seen_rows[k]=true;out->order.push_back(source.rows[out->rows[k]].constraint); + } + } + // The private model remains unsolved: no optimization run or status is invented. + if(out->backend.getModelStatus()!=HighsModelStatus::kNotset||out->backend.getInfo().valid) + fail(LpSensitivityReason::BackendFailure,"Unexpected optimization state during factor-only analysis"); + check(budget);return out; +#endif +} +}}} diff --git a/gecode/optimize/lp_sensitivity_backend.hpp b/gecode/optimize/lp_sensitivity_backend.hpp new file mode 100644 index 0000000000..2e63fd0c6b --- /dev/null +++ b/gecode/optimize/lp_sensitivity_backend.hpp @@ -0,0 +1,22 @@ +/* Private factorization interface: never installed. No optimization operation. */ +#ifndef GECODE_OPTIMIZE_LP_SENSITIVITY_BACKEND_HPP +#define GECODE_OPTIMIZE_LP_SENSITIVITY_BACKEND_HPP +#include +namespace Gecode { namespace Optimize { namespace Detail { +struct LpSensitivityFactor { + std::vector columns,rows; + std::vector order; + std::string version; + virtual ~LpSensitivityFactor()=default; + virtual std::vector solve(const std::vector&,bool transpose)=0; +}; +class LpSensitivityBackendError : public std::runtime_error { +public: + LpSensitivityReason reason; + LpSensitivityBackendError(LpSensitivityReason r,const char* message) + :std::runtime_error(message),reason(r){} +}; +std::unique_ptr make_lp_sensitivity_factor( + const ModelSnapshot&,const LpBasis&,double primal_tolerance,const SolveBudget&); +}}} +#endif diff --git a/gecode/optimize/lp_sensitivity_highs_detail.hpp b/gecode/optimize/lp_sensitivity_highs_detail.hpp new file mode 100644 index 0000000000..0ba5aedf08 --- /dev/null +++ b/gecode/optimize/lp_sensitivity_highs_detail.hpp @@ -0,0 +1,13 @@ +/* Private existing-adapter bridge. Deliberately excluded from installation. */ +#ifndef GECODE_OPTIMIZE_LP_SENSITIVITY_HIGHS_DETAIL_HPP +#define GECODE_OPTIMIZE_LP_SENSITIVITY_HIGHS_DETAIL_HPP +#include +#include +namespace Gecode { namespace Optimize { namespace Detail { +struct LpSensitivityCompiled { + HighsLp lp; + std::vector columns,rows; +}; +LpSensitivityCompiled compile_lp_sensitivity(const ModelSnapshot&,double primal_tolerance); +}}} +#endif diff --git a/gecode/optimize/model.cpp b/gecode/optimize/model.cpp new file mode 100644 index 0000000000..f4f928f2be --- /dev/null +++ b/gecode/optimize/model.cpp @@ -0,0 +1,494 @@ +/* Sparse numerical model implementation. */ +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { + +ModelId allocate_model_id() { + static std::atomic next{1}; + ModelId candidate = next.load(std::memory_order_relaxed); + for (;;) { + if (candidate == std::numeric_limits::max()) + throw ModelError("Model identity space exhausted"); + if (next.compare_exchange_weak(candidate, candidate + 1, + std::memory_order_relaxed)) + return candidate; + } +} + +void check_bounds(double lower, double upper) { + if (std::isnan(lower) || std::isnan(upper) || + lower == std::numeric_limits::infinity() || + upper == -std::numeric_limits::infinity() || lower > upper) + throw ModelError("Invalid lower/upper bounds"); +} + +void check_variable_bounds(VariableType type, double lower, double upper) { + check_bounds(lower, upper); + switch (type) { + case VariableType::Continuous: + case VariableType::Integer: + break; + case VariableType::Binary: + if (lower < 0.0 || upper > 1.0) + throw ModelError("Binary bounds must be within [0,1]"); + break; + case VariableType::SemiContinuous: + case VariableType::SemiInteger: + if (!std::isfinite(lower) || lower <= 0.0) + throw ModelError("Semi-variable nonzero interval must have a positive finite lower bound"); + break; + default: + throw ModelError("Unknown variable type"); + } +} + +void check_finite(double value, const char* message) { + if (!std::isfinite(value)) + throw ModelError(message); +} + +void check_sense(ObjectiveSense sense) { + if (sense != ObjectiveSense::Minimize && sense != ObjectiveSense::Maximize) + throw ModelError("Unknown objective sense"); +} + +bool references(const std::vector& terms, Variable variable) { + return std::any_of(terms.begin(), terms.end(), [variable](const Term& term) { + return term.variable == variable; + }); +} + +std::vector replaced(const std::vector& terms, Variable variable, + double coefficient) { + std::vector result; + result.reserve(terms.size() + 1); + for (const Term& term : terms) + if (term.variable != variable) + result.push_back(term); + if (coefficient != 0.0) + result.push_back({variable, coefficient}); + return result; +} + +} // namespace + +Model::Model() : model_id_(allocate_model_id()) {} + +Model::Model(Model&& other) noexcept + : model_id_(std::exchange(other.model_id_, 0)), + revision_(std::exchange(other.revision_, 0)), + variables_(std::move(other.variables_)), rows_(std::move(other.rows_)), + objective_(std::move(other.objective_)), indicators_(std::move(other.indicators_)), + globals_(std::move(other.globals_)) {} + +Model& Model::operator=(Model&& other) noexcept { + if (this != &other) { + model_id_ = std::exchange(other.model_id_, 0); + revision_ = std::exchange(other.revision_, 0); + variables_ = std::move(other.variables_); + rows_ = std::move(other.rows_); + objective_ = std::move(other.objective_); + indicators_ = std::move(other.indicators_); + globals_ = std::move(other.globals_); + } + return *this; +} + +void Model::require_live() const { + if (model_id_ == 0) + throw ModelError("Cannot use a moved-from model"); +} + +void Model::require_revision_capacity() const { + require_live(); + if (revision_ == std::numeric_limits::max()) + throw ModelError("Model revision space exhausted"); +} + +const VariableData& Model::variable(Variable handle) const { + require_live(); + if (handle.model_id != model_id_ || handle.id >= variables_.size() || + !variables_[static_cast(handle.id)].active) + throw ModelError("Variable handle is foreign, invalid, or deleted"); + return variables_[static_cast(handle.id)]; +} + +const RowData& Model::row(Constraint handle) const { + require_live(); + if (handle.model_id != model_id_ || handle.id >= rows_.size() || + !rows_[static_cast(handle.id)].active) + throw ModelError("Constraint handle is foreign, invalid, or deleted"); + return rows_[static_cast(handle.id)]; +} + +std::vector Model::normalize(const std::vector& terms, + const std::vector* additions) const { + require_live(); + for (const Term& term : terms) { + if (term.variable.id < variables_.size() || !additions) { + (void) variable(term.variable); + } else if (term.variable.model_id != model_id_ || + term.variable.id - variables_.size() >= additions->size() || + !(*additions)[static_cast(term.variable.id - variables_.size())].active) { + throw ModelError("Variable handle is foreign, invalid, or deleted"); + } + check_finite(term.coefficient, "Linear coefficients must be finite"); + } + std::vector ordered = terms; + // Sorting duplicate coefficients as well as IDs gives a fixed summation order + // independent of insertion order. This is numerical, not exact arithmetic. + std::sort(ordered.begin(), ordered.end(), [](const Term& a, const Term& b) { + return a.variable.id != b.variable.id ? a.variable.id < b.variable.id : + a.coefficient < b.coefficient; + }); + std::vector result; + result.reserve(ordered.size()); + for (std::size_t i = 0; i < ordered.size();) { + const Variable handle = ordered[i].variable; + long double sum = 0.0L, correction = 0.0L; + do { + const long double value = static_cast(ordered[i].coefficient); + const long double next = sum + value; + if (!std::isfinite(next)) + throw ModelError("Linear coefficient coalescing overflow"); + // Neumaier compensation also helps targets where long double is double. + correction += std::abs(sum) >= std::abs(value) ? + (sum - next) + value : (value - next) + sum; + sum = next; + if (!std::isfinite(correction)) + throw ModelError("Linear coefficient coalescing overflow"); + ++i; + } while (i < ordered.size() && ordered[i].variable == handle); + sum += correction; + if (!std::isfinite(sum)) + throw ModelError("Linear coefficient coalescing overflow"); + if (sum < -static_cast(std::numeric_limits::max()) || + sum > static_cast(std::numeric_limits::max())) + throw ModelError("Coalesced coefficient exceeds the numerical range"); + const double coefficient = static_cast(sum); + if (coefficient != 0.0) + result.push_back({handle, coefficient}); + } + return result; +} + +ModelSnapshot Model::snapshot() const { + require_live(); + return {model_id_, revision_, variables_, rows_, objective_, indicators_, globals_}; +} + +Variable Model::add_variable(VariableType type, double lower, double upper, + std::string name) { + require_revision_capacity(); + check_variable_bounds(type, lower, upper); + if (variables_.size() >= std::numeric_limits::max()) + throw ModelError("Variable slot space exhausted"); + Variable handle{model_id_, static_cast(variables_.size())}; + variables_.push_back({handle, type, lower, upper, std::move(name), true, std::nullopt}); + ++revision_; + return handle; +} + +Variable Model::add_continuous(double lower, double upper, std::string name) { + return add_variable(VariableType::Continuous, lower, upper, std::move(name)); +} + +Variable Model::add_integer(double lower, double upper, std::string name) { + return add_variable(VariableType::Integer, lower, upper, std::move(name)); +} + +Variable Model::add_binary(std::string name) { + return add_variable(VariableType::Binary, 0.0, 1.0, std::move(name)); +} + +Constraint Model::add_row(const std::vector& terms, double lower, + double upper, std::string name) { + require_revision_capacity(); + check_bounds(lower, upper); + auto normalized = normalize(terms); + if (rows_.size() >= std::numeric_limits::max()) + throw ModelError("Constraint slot space exhausted"); + Constraint handle{model_id_, static_cast(rows_.size())}; + rows_.push_back({handle, std::move(normalized), lower, upper, std::move(name), true, std::nullopt}); + ++revision_; + return handle; +} + +namespace { +template +void check_bulk_capacity(const std::vector& target, std::size_t additions) { + if (additions > target.max_size() - target.size() || + additions > std::numeric_limits::max() - target.size()) + throw ModelError("Bulk addition exceeds the model slot capacity"); +} +template +void append_prepared(std::vector& target, std::vector& prepared) { + static_assert(std::is_nothrow_move_constructible::value, + "Atomic bulk commit requires noexcept entity moves"); + // A failed reserve preserves both the old values and their addresses. All + // subsequent moves are nonthrowing and fit within the reserved allocation. + const auto required = target.size() + prepared.size(); + if (required > target.capacity()) { + const auto growth = std::min(target.capacity(), target.max_size() - target.capacity()); + target.reserve(std::max(required, target.capacity() + growth)); + } + for (auto& item : prepared) target.push_back(std::move(item)); +} +} + +std::vector Model::add_variables(const std::vector& input) { + require_live(); + if (input.empty()) return {}; + require_revision_capacity(); + check_bulk_capacity(variables_, input.size()); + std::vector prepared; + std::vector handles; + prepared.reserve(input.size()); handles.reserve(input.size()); + for (std::size_t i = 0; i < input.size(); ++i) { + const auto& item = input[i]; + check_variable_bounds(item.type, item.lower, item.upper); + const Variable handle{model_id_, static_cast(variables_.size() + i)}; + prepared.push_back({handle, item.type, item.lower, item.upper, item.name, true, std::nullopt}); + handles.push_back(handle); + } + append_prepared(variables_, prepared); + ++revision_; + return handles; +} + +std::vector Model::add_rows(const std::vector& input) { + require_live(); + if (input.empty()) return {}; + require_revision_capacity(); + check_bulk_capacity(rows_, input.size()); + std::vector prepared; + std::vector handles; + prepared.reserve(input.size()); handles.reserve(input.size()); + for (std::size_t i = 0; i < input.size(); ++i) { + const auto& item = input[i]; + check_bounds(item.lower, item.upper); + const Constraint handle{model_id_, static_cast(rows_.size() + i)}; + prepared.push_back({handle, normalize(item.terms), item.lower, item.upper, item.name, true, std::nullopt}); + handles.push_back(handle); + } + append_prepared(rows_, prepared); + ++revision_; + return handles; +} + +std::vector Model::add_rows_sparse(const SparseRowBatch& input) { + require_live(); + const auto count = input.lower.size(), nonzeros = input.coefficient.size(); + if (input.row_start.empty() || input.row_start.size() - 1 != count || + input.upper.size() != count || input.column.size() != nonzeros || + (!input.names.empty() && input.names.size() != count) || + input.row_start.front() != 0 || input.row_start.back() != nonzeros) + throw ModelError("Invalid sparse row-batch dimensions or endpoints"); + for (std::size_t i = 0; i < count; ++i) + if (input.row_start[i] > input.row_start[i + 1] || input.row_start[i + 1] > nonzeros) + throw ModelError("Sparse row offsets must be monotone and within nonzeros"); + // Reject stale/foreign/duplicate column handles even when a column is unused. + std::vector seen; + seen.reserve(input.columns.size()); + for (const auto handle : input.columns) { (void) variable(handle); seen.push_back(handle.id); } + std::sort(seen.begin(), seen.end()); + if (std::adjacent_find(seen.begin(), seen.end()) != seen.end()) + throw ModelError("Sparse row-batch column mapping contains duplicate variables"); + for (const auto column : input.column) + if (column >= input.columns.size()) throw ModelError("Sparse row-batch column index is out of range"); + if (!count) return {}; + require_revision_capacity(); + check_bulk_capacity(rows_, count); + std::vector prepared; + std::vector handles; + prepared.reserve(count); handles.reserve(count); + for (std::size_t i = 0; i < count; ++i) { + check_bounds(input.lower[i], input.upper[i]); + std::vector terms; + terms.reserve(input.row_start[i + 1] - input.row_start[i]); + for (auto k = input.row_start[i]; k < input.row_start[i + 1]; ++k) + terms.push_back({input.columns[input.column[k]], input.coefficient[k]}); + const Constraint handle{model_id_, static_cast(rows_.size() + i)}; + prepared.push_back({handle, normalize(terms), input.lower[i], input.upper[i], + input.names.empty() ? std::string{} : input.names[i], true, std::nullopt}); + handles.push_back(handle); + } + append_prepared(rows_, prepared); + ++revision_; + return handles; +} + +void Model::set_objective(const std::vector& terms, ObjectiveSense sense, + double offset) { + require_revision_capacity(); + check_sense(sense); + check_finite(offset, "Objective offset must be finite"); + auto normalized = normalize(terms); + objective_.terms.swap(normalized); + objective_.offset = offset; + objective_.sense = sense; + ++revision_; +} + +void Model::minimize(const std::vector& terms, double offset) { + set_objective(terms, ObjectiveSense::Minimize, offset); +} + +void Model::maximize(const std::vector& terms, double offset) { + set_objective(terms, ObjectiveSense::Maximize, offset); +} + +void Model::set_bounds(Variable handle, double lower, double upper) { + const VariableType type = variable(handle).type; + require_revision_capacity(); + check_variable_bounds(type, lower, upper); + for (const auto& indicator : indicators_) { + if (!indicator.active) continue; + if (indicator.inactive_gate && *indicator.inactive_gate == handle && + (lower != 0.0 || upper != 1.0)) + throw ModelError("Cannot change an active indicator gate's bounds; remove_indicator first"); + for (const auto& domain : indicator.domains) { + if (domain.variable != handle) continue; + const double effective_lower = type == VariableType::SemiContinuous || + type == VariableType::SemiInteger ? 0.0 : lower; + if (effective_lower < domain.lower || upper > domain.upper) + throw ModelError("Bound widening invalidates an indicator formulation; remove and rebuild it first"); + } + } + auto& data = variables_[static_cast(handle.id)]; + data.lower = lower; + data.upper = upper; + ++revision_; +} + +void Model::set_bounds(Constraint handle, double lower, double upper) { + (void) row(handle); + require_unprotected(handle); + require_revision_capacity(); + check_bounds(lower, upper); + auto& data = rows_[static_cast(handle.id)]; + data.lower = lower; + data.upper = upper; + ++revision_; +} + +void Model::set_coefficient(Constraint constraint, Variable handle, + double coefficient) { + (void) variable(handle); + const auto& data = row(constraint); + require_unprotected(constraint); + require_revision_capacity(); + check_finite(coefficient, "Linear coefficients must be finite"); + auto normalized = normalize(replaced(data.terms, handle, coefficient)); + rows_[static_cast(constraint.id)].terms.swap(normalized); + ++revision_; +} + +void Model::set_objective_coefficient(Variable handle, double coefficient) { + (void) variable(handle); + require_revision_capacity(); + check_finite(coefficient, "Objective coefficients must be finite"); + auto normalized = normalize(replaced(objective_.terms, handle, coefficient)); + objective_.terms.swap(normalized); + ++revision_; +} + +void Model::set_objective_offset(double offset) { + require_revision_capacity(); + check_finite(offset, "Objective offset must be finite"); + objective_.offset = offset; + ++revision_; +} + +void Model::set_name(Variable handle, std::string name) { + (void) variable(handle); + require_revision_capacity(); + variables_[static_cast(handle.id)].name.swap(name); + ++revision_; +} + +void Model::set_name(Constraint handle, std::string name) { + (void) row(handle); + require_revision_capacity(); + rows_[static_cast(handle.id)].name.swap(name); + ++revision_; +} + +void Model::remove(Variable handle) { + (void) variable(handle); + require_revision_capacity(); + for (const auto& record : globals_) if (record.active) + for (const auto variable : Detail::global_variables(record.payload)) + if (variable == handle) throw ModelError("Cannot remove a variable referenced by an active global constraint"); + for (const auto& indicator : indicators_) { + if (!indicator.active) continue; + if (indicator.activator == handle || + (indicator.inactive_gate && *indicator.inactive_gate == handle) || + references(indicator.terms, handle)) + throw ModelError("Cannot remove an active indicator variable; remove_indicator first"); + } + if (references(objective_.terms, handle)) + throw ModelError("Cannot remove a variable referenced by the objective"); + for (const RowData& data : rows_) + if (data.active && references(data.terms, handle)) + throw ModelError("Cannot remove a variable referenced by an active constraint"); + variables_[static_cast(handle.id)].active = false; + ++revision_; +} + +void Model::remove(Constraint handle) { + (void) row(handle); + require_unprotected(handle); + require_revision_capacity(); + auto& data = rows_[static_cast(handle.id)]; + data.active = false; + data.terms.clear(); + ++revision_; +} + +void Model::require_unprotected(Constraint handle) const { + for (const auto& indicator : indicators_) { + if (!indicator.active) continue; + for (const auto& generated : indicator.generated_rows) + if (generated.model_id == handle.model_id && generated.id == handle.id) + throw ModelError("Cannot edit an indicator's generated row; remove_indicator first"); + } +} + +GlobalConstraint Model::add_global(GlobalPayload payload, std::string name) { + require_revision_capacity(); + Detail::validate_global_payload(payload, model_id_, variables_, true); + if (globals_.size() >= std::numeric_limits::max()) + throw ModelError("Global constraint slot space exhausted"); + GlobalConstraint handle{model_id_, static_cast(globals_.size())}; + globals_.push_back({handle, std::move(payload), std::move(name), true}); + ++revision_; + return handle; +} +const GlobalData& Model::global(GlobalConstraint handle) const { + require_live(); + if (handle.model_id != model_id_ || handle.id >= globals_.size() || !globals_[handle.id].active) + throw ModelError("Global constraint handle is foreign, invalid, or deleted"); + return globals_[handle.id]; +} +void Model::remove(GlobalConstraint handle) { + (void) global(handle); require_revision_capacity(); + globals_[handle.id].active = false; + ++revision_; +} +void Model::set_name(GlobalConstraint handle, std::string name) { + (void) global(handle); require_revision_capacity(); + globals_[handle.id].name.swap(name); + ++revision_; +} + +}} diff --git a/gecode/optimize/model.hpp b/gecode/optimize/model.hpp new file mode 100644 index 0000000000..c1b5f8d087 --- /dev/null +++ b/gecode/optimize/model.hpp @@ -0,0 +1,244 @@ +/* Sparse numerical model for the additive optimization API. */ +#ifndef GECODE_OPTIMIZE_MODEL_HPP +#define GECODE_OPTIMIZE_MODEL_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { + +struct Term { + Variable variable; + double coefficient = 0.0; +}; + +struct VariableSpec { + VariableType type = VariableType::Continuous; + double lower = 0.0; + double upper = std::numeric_limits::infinity(); + std::string name; +}; +struct RowSpec { + std::vector terms; + double lower = -std::numeric_limits::infinity(); + double upper = std::numeric_limits::infinity(); + std::string name; +}; +/** + * CSR row input with an explicit unique live-variable column mapping. + * Row starts have rows+1 entries, begin at zero and end at coefficients.size(). + * Column indices may be unsorted/repeated within a row; normal coalescing applies. + * Names are empty or have exactly one entry per row. No dense matrix is created. + */ +struct SparseRowBatch { + std::vector columns; + std::vector row_start{0}, column; + std::vector coefficient, lower, upper; + std::vector names; +}; + +struct Indicator { + ModelId model_id = 0; + std::uint64_t id = 0; +}; + +struct VariableData { + Variable variable; + VariableType type = VariableType::Continuous; + double lower = 0.0; + double upper = std::numeric_limits::infinity(); + std::string name; + bool active = true; + std::optional indicator_origin; +}; + +struct RowData { + Constraint constraint; + std::vector terms; + double lower = -std::numeric_limits::infinity(); + double upper = std::numeric_limits::infinity(); + std::string name; + bool active = true; + std::optional indicator_origin; +}; + +struct ObjectiveData { + std::vector terms; + double offset = 0.0; + ObjectiveSense sense = ObjectiveSense::Minimize; +}; + +/** A domain used to justify a bounded indicator's inactive relaxation. */ +struct IndicatorDomain { + Variable variable; + double lower = 0.0; + double upper = 0.0; +}; + +/** Original logical meaning and the complete, guarded linear lowering. */ +struct IndicatorData { + Indicator indicator; + Variable activator; + bool active_value = true; + std::vector terms; + double lower = -std::numeric_limits::infinity(); + double upper = std::numeric_limits::infinity(); + std::optional inactive_gate; + std::optional lower_m; + std::optional upper_m; + std::vector generated_rows; + std::vector domains; + bool active = true; +}; + +struct GlobalConstraint { ModelId model_id = 0; std::uint64_t id = 0; }; +struct AllDifferentData { std::vector variables; }; +struct ElementData { + Variable index; + std::vector elements; + Variable result; + std::int64_t index_base = 0; +}; +struct TableData { + std::vector variables; + std::vector> tuples; +}; +struct CumulativeData { + std::vector starts; + std::vector durations; + std::vector heights; + std::int64_t capacity = 0; +}; +struct CircuitData { + std::vector successors; + std::int64_t index_base = 0; +}; +struct RegularTransition { + std::uint64_t from = 0; + std::int64_t symbol = 0; + std::uint64_t to = 0; +}; +struct RegularData { + std::vector variables; + std::uint64_t state_count = 1; + std::uint64_t initial_state = 0; + std::vector transitions; + std::vector final_states; +}; +using GlobalPayload = std::variant; +struct GlobalData { + GlobalConstraint global; + GlobalPayload payload; + std::string name; + bool active = true; +}; + +/** An owning historical snapshot. Public fields are untrusted at API boundaries. */ +struct ModelSnapshot { + ModelId model_id = 0; + Revision revision = 0; + std::vector variables; + std::vector rows; + ObjectiveData objective; + std::vector indicators; + std::vector globals; +}; + +namespace Detail { class ConstraintBatch; } + +/** + * An owning sparse model with a linear objective and retained logical and + * global constraints. + * + * Handles identify a model and a never-reused slot. Successful mutations advance + * the revision, including assignments of unchanged values. Failed mutations leave + * the model unchanged. Snapshots own their data and remain usable after edits. + * + * Copying is disabled. Moving preserves the identity and all existing handles; + * a moved-from model can only be destroyed, assigned another model, or queried + * for its zero id/revision. Mutations and snapshot() reject a moved-from object. + * Mutation is not thread-safe; independent models can be created concurrently. + */ +class Model { +public: + Model(); + Model(const Model&) = delete; + Model& operator=(const Model&) = delete; + Model(Model&& other) noexcept; + Model& operator=(Model&& other) noexcept; + + ModelId id() const noexcept { return model_id_; } + Revision revision() const noexcept { return revision_; } + ModelSnapshot snapshot() const; + + Variable add_variable(VariableType type, double lower, double upper, + std::string name = {}); + Variable add_continuous(double lower = 0.0, + double upper = std::numeric_limits::infinity(), + std::string name = {}); + Variable add_integer(double lower = 0.0, + double upper = std::numeric_limits::infinity(), + std::string name = {}); + Variable add_binary(std::string name = {}); + Constraint add_row(const std::vector& terms, double lower, double upper, + std::string name = {}); + + /** Atomic bulk additions; one revision per nonempty batch, no reused slots. + * Validation/allocation failure leaves entities, revision and existing views + * unchanged. Empty valid batches are no-ops. Rows refer to existing variables. + */ + std::vector add_variables(const std::vector& variables); + std::vector add_rows(const std::vector& rows); + std::vector add_rows_sparse(const SparseRowBatch& rows); + + void set_objective(const std::vector& terms, ObjectiveSense sense, + double offset = 0.0); + void minimize(const std::vector& terms, double offset = 0.0); + void maximize(const std::vector& terms, double offset = 0.0); + + void set_bounds(Variable variable, double lower, double upper); + void set_bounds(Constraint constraint, double lower, double upper); + void set_coefficient(Constraint constraint, Variable variable, + double coefficient); + void set_objective_coefficient(Variable variable, double coefficient); + void set_objective_offset(double offset); + void set_name(Variable variable, std::string name); + void set_name(Constraint constraint, std::string name); + + /** Reject removal while an active row or the objective references variable. */ + void remove(Variable variable); + /** Remove a row, retaining its slot as a tombstone. */ + void remove(Constraint constraint); + + const VariableData& variable(Variable variable) const; + const RowData& row(Constraint constraint) const; + GlobalConstraint add_global(GlobalPayload payload, std::string name = {}); + const GlobalData& global(GlobalConstraint constraint) const; + void remove(GlobalConstraint constraint); + void set_name(GlobalConstraint constraint, std::string name); + +private: + friend class Detail::ConstraintBatch; + ModelId model_id_; + Revision revision_ = 0; + std::vector variables_; + std::vector rows_; + ObjectiveData objective_; + std::vector indicators_; + std::vector globals_; + + void require_live() const; + void require_revision_capacity() const; + void require_unprotected(Constraint constraint) const; + std::vector normalize(const std::vector& terms, + const std::vector* additions = nullptr) const; +}; + +}} +#endif diff --git a/gecode/optimize/native.cpp b/gecode/optimize/native.cpp new file mode 100644 index 0000000000..cafaf7d10d --- /dev/null +++ b/gecode/optimize/native.cpp @@ -0,0 +1,2496 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef GECODE_OPTIMIZE_WITH_NATIVE +#include +#include +#endif + +#if defined(GECODE_OPTIMIZE_WITH_NATIVE) && defined(GECODE_OPTIMIZE_WITH_HIGHS) && \ + defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) +#define GECODE_OPTIMIZE_NATIVE_LP_ENABLED 1 +#include +#include +#endif + +namespace Gecode { namespace Optimize { +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS +// Coordinator-only fault injection; no production callback or ABI surface. +void native_search_test_event(const char* event); +#endif +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +void native_root_cut_test_event(const char* event, NativeRootCoverCompletion& completion); +#endif +#ifdef GECODE_NATIVE_START_TEST_HOOKS +void native_start_test_event(const char* event); +#endif +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS +void native_branching_test_event(const char* event, std::size_t slot, double& down, double& up); +#endif +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS +void native_neighborhood_test_event(const char*, std::size_t, int, int, std::vector*); +#endif +namespace { +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED +namespace LP = Gecode::Experimental::LpRelaxation; +#endif +class Unsupported : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; +struct Interrupted { Termination reason; }; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE +void neighborhood_event(const char* event, std::size_t slot=0, int lower=0, int upper=0, + std::vector* values=nullptr) { +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS + native_neighborhood_test_event(event,slot,lower,upper,values); +#else + (void)event;(void)slot;(void)lower;(void)upper;(void)values; +#endif +} +void checkpoint(const SolveBudget& budget) { + if (const auto reason = budget.stop_reason()) throw Interrupted{*reason}; +} + +using NeighborhoodCompletion = NativeNeighborhoodCompletion; +struct NeighborhoodStopped { NeighborhoodCompletion reason; }; +class NeighborhoodBudget { + const NativeNeighborhoodSettings& settings; + NativeNeighborhoodStatistics& statistics; + const SolveBudget& shared; + const double started; +public: + NeighborhoodBudget(const NativeNeighborhoodSettings& settings0, + NativeNeighborhoodStatistics& statistics0,const SolveBudget& shared0) + :settings(settings0),statistics(statistics0),shared(shared0),started(shared0.elapsed_seconds()) {} + void check(const char* event="neighborhood_checkpoint") const { + neighborhood_event(event); + if(shared.cancelled()) throw Interrupted{Termination::Cancelled}; + if(shared.time_limit_reached()) throw Interrupted{Termination::TimeLimit}; + if(shared.elapsed_seconds()-started>=settings.time_limit_seconds) + throw NeighborhoodStopped{NeighborhoodCompletion::LocalTimeLimit}; + } + void work(std::size_t count=1) { + check(); + if(count>settings.max_coordinator_work-statistics.coordinator_work) + throw NeighborhoodStopped{NeighborhoodCompletion::WorkLimit}; + statistics.coordinator_work+=count; + } + void source(std::size_t count=1) { + check(); + if(count>settings.max_source_entries-statistics.source_entries) + throw NeighborhoodStopped{NeighborhoodCompletion::SourceLimit}; + work(count); statistics.source_entries+=count; + } + void finish() noexcept {statistics.elapsed_seconds=shared.elapsed_seconds()-started;} + double start_seconds() const noexcept {return started;} +}; + +void construction_checkpoint(const SolveBudget& budget,NeighborhoodBudget* local, + const char* event="neighborhood_construction") { + if(local) local->check(event); else checkpoint(budget); +} + +constexpr std::int64_t exact_double_integer = INT64_C(9007199254740992); + +int integer(double value, const char* kind) { + if (!std::isfinite(value) || value != std::trunc(value) || + value < Int::Limits::min || value > Int::Limits::max) + throw Unsupported(std::string(kind) + " must be integral and within native Gecode Int::Limits"); + return static_cast(value); +} +std::optional finite_bound(double value) { + return std::isfinite(value) ? std::optional(integer(value, "Row bound")) : std::nullopt; +} +struct NativeVariable { + std::size_t slot; + int lower; + int upper; + bool semi; +}; +struct NativeTerm { int column; int coefficient; }; +struct NativeRow { + std::vector terms; + std::optional lower; + std::optional upper; +}; +struct NativeIndicator { + int activator; + bool active_value; + std::optional gate; + NativeRow row; +}; +struct NativeRegular { + int initial = 0; + bool accepts_empty = false; + std::vector transitions; // Includes explicit native sentinel. + std::vector finals; // Deduplicated, with final -1. +}; +NativeRegular prepare_regular(const RegularData& data,const SolveBudget& budget) { + std::map states;states.emplace(data.initial_state,0); + std::set finals; + std::set symbols; + for(const auto& edge:data.transitions){ + checkpoint(budget); + if(edge.symbolInt::Limits::max) + throw Unsupported("Regular alphabet symbol exceeds native Gecode limits"); + symbols.insert(static_cast(edge.symbol)); + states.emplace(edge.from,0);states.emplace(edge.to,0); + } + for(auto state:data.final_states){checkpoint(budget);states.emplace(state,0);finals.insert(state);} + const bool short_symbols=symbols.empty()||(*symbols.begin()>=std::numeric_limits::min()&&*symbols.rbegin()<=std::numeric_limits::max()); + if(const char* error=Detail::native_regular_size_error(data.variables.size(),states.size(),data.transitions.size(),symbols.size(),short_symbols)) + throw Unsupported(error); + // Original state IDs need not be small or dense. Unreferenced declared states + // have no transitions or accepting role and never require native storage. + int next=0;for(auto& entry:states){checkpoint(budget);entry.second=next++;} + NativeRegular result;result.initial=states.at(data.initial_state); + result.accepts_empty=finals.count(data.initial_state)!=0; + result.transitions.reserve(data.transitions.size()+1);result.finals.reserve(finals.size()+1); + for(const auto& edge:data.transitions){checkpoint(budget);result.transitions.emplace_back(states.at(edge.from),static_cast(edge.symbol),states.at(edge.to));} + result.transitions.emplace_back(-1,0,0); + for(auto state:finals){checkpoint(budget);result.finals.push_back(states.at(state));} + result.finals.push_back(-1);checkpoint(budget);return result; +} +struct Compiled { + std::vector variables; + std::vector rows; + std::vector indicators; + std::vector objective; + std::vector columns; + std::vector globals; + std::map regulars; + int cost_lower = 0; + int cost_upper = 0; + std::int64_t offset = 0; + bool minimize = true; + bool binary_domains = true; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + std::shared_ptr relaxation; + // Keep exact original-source cut attribution for every live native clone. + std::shared_ptr root_cover_evidence; + LP::IntegerOptions relaxation_options; +#endif +}; + +Compiled compile(const ModelSnapshot& model, const SolveBudget& budget) { + Compiled result; + std::vector column(model.variables.size(), -1); + for (const auto& variable : model.variables) { + neighborhood_event("compile_variable",static_cast(variable.variable.id)); + checkpoint(budget); + if (!variable.active) continue; + result.binary_domains = result.binary_domains && + variable.type == VariableType::Binary && variable.lower == 0 && variable.upper == 1; + if (variable.type != VariableType::Integer && variable.type != VariableType::Binary && + variable.type != VariableType::SemiInteger) + throw Unsupported("Native bridge supports Integer, Binary and SemiInteger variables only"); + if (result.variables.size() >= static_cast(Int::Limits::max)) + throw Unsupported("Too many variables for a native IntVarArray"); + column[variable.variable.id] = static_cast(result.variables.size()); + result.variables.push_back({static_cast(variable.variable.id), + integer(variable.lower, "Variable lower bound"), + integer(variable.upper, "Variable upper bound"), + variable.type == VariableType::SemiInteger}); + } + const auto terms = [&](const std::vector& original, std::int64_t limit, + int* minimum = nullptr, int* maximum = nullptr) { + std::vector converted; + std::int64_t magnitude = 0, lower = 0, upper = 0; + for (const auto& term : original) { + checkpoint(budget); + const int coefficient = integer(term.coefficient, "Linear coefficient"); + const int index = column[term.variable.id]; + const auto& variable = result.variables[static_cast(index)]; + const std::int64_t a = static_cast(coefficient) * (variable.semi ? 0 : variable.lower); + const std::int64_t b = static_cast(coefficient) * variable.upper; + const auto absolute = std::max(std::abs(a), std::abs(b)); + if (absolute > limit - magnitude) + throw Unsupported("Native linear activity exceeds conservative exact propagation limits; tighten bounds or rescale with exact integers"); + magnitude += absolute; + lower += std::min(a, b); upper += std::max(a, b); + converted.push_back({index, coefficient}); + } + if (minimum) *minimum = static_cast(lower); + if (maximum) *maximum = static_cast(upper); + return converted; + }; + const auto row = [&](const std::vector& original, double lower, double upper) { + return NativeRow{terms(original, Int::Limits::max), finite_bound(lower), finite_bound(upper)}; + }; + for (const auto& original : model.rows) { + checkpoint(budget); + if (!original.active || original.indicator_origin) continue; + result.rows.push_back(row(original.terms, original.lower, original.upper)); + } + for (const auto& original : model.indicators) { + checkpoint(budget); + if (!original.active) continue; + NativeIndicator indicator{column[original.activator.id], original.active_value, {}, + row(original.terms, original.lower, original.upper)}; + if (original.inactive_gate) indicator.gate = column[original.inactive_gate->id]; + result.indicators.push_back(std::move(indicator)); + } + // The cost equality includes a cost variable in addition to its expression. + // Reserving half the native range bounds that complete equality's activity. + result.objective = terms(model.objective.terms, Int::Limits::max / 2, + &result.cost_lower, &result.cost_upper); + if (model.objective.offset != std::trunc(model.objective.offset) || + std::abs(model.objective.offset) > static_cast(exact_double_integer - + std::max(std::abs(result.cost_lower), std::abs(result.cost_upper)))) + throw Unsupported("Native objective offset and all attainable objective values must be exact double integers (magnitude <= 2^53)"); + result.offset = static_cast(model.objective.offset); + result.minimize = model.objective.sense == ObjectiveSense::Minimize; + const auto native_constant=[](std::int64_t value) { + if(valueInt::Limits::max) + throw Unsupported("Global integer constant exceeds native Gecode limits"); + }; + for(const auto& global:model.globals) if(global.active) { + checkpoint(budget); + if(Detail::global_variables(global.payload).size()>static_cast(Int::Limits::max)) + throw Unsupported("Too many global arguments for native arrays"); + std::visit([&](const auto& data) { + using T=std::decay_t; + if constexpr(std::is_same_v || std::is_same_v) { + const auto count=[&]() {if constexpr(std::is_same_v) return data.elements.size();else return data.successors.size();}(); + native_constant(data.index_base); + if(count) native_constant(data.index_base+static_cast(count-1)); + } else if constexpr(std::is_same_v) { + if(data.tuples.size()>static_cast(Int::Limits::max)) throw Unsupported("Too many native table tuples"); + for(const auto& tuple:data.tuples) {checkpoint(budget);for(const auto value:tuple) native_constant(value);} + } else if constexpr(std::is_same_v) { + native_constant(data.capacity); + constexpr auto limit=std::numeric_limits::max(); + std::int64_t widths=0,energy=0,count=0,time_magnitude=0; + std::int64_t min_height=Int::Limits::max; + bool overloaded_task=false; + for(std::size_t i=0;i(variable.upper)+data.durations[i]; + native_constant(end); + time_magnitude=std::max({time_magnitude,std::abs(start),std::abs(end)}); + min_height=std::min(min_height,data.heights[i]); + overloaded_task=overloaded_task || data.heights[i]>data.capacity; + const std::int64_t width=static_cast(variable.upper)-start+1; + const auto task_energy=data.durations[i]*data.heights[i]; // factors <= native int max + if(width>limit-widths || task_energy>limit-energy) + throw Unsupported("Native cumulative arithmetic exceeds exact int64 accumulation"); + widths+=width;energy+=task_energy;++count; + } + // Zero/singleton task sets and an individually overloaded mandatory + // task are resolved directly when posting; they need no resource tree. + if(count<=1 || overloaded_task) return; + if(data.capacity && (widths>limit/data.capacity || + data.capacity*widths>limit/count)) + throw Unsupported("Native cumulative propagation energy range exceeds int64"); + // cumulative/edge-finding.hpp indexes an int update[count*unique_heights] + // array; count^2 is a conservative bound and also protects task-tree + // node/event counts and next-power-of-two arithmetic. + if(count>Int::Limits::max/count) + throw Unsupported("Native cumulative task-count product exceeds integer array limits"); + // In either time direction all task endpoints have magnitude <= B. + // Omega/Lambda subtree energies are <= E, and their envelopes are + // bounded by C*B+E. Edge finding subtracts (C-height)*lct, so its + // numerator has magnitude <= 2*C*B+E. It then divides by height and + // casts to int. Require 2*C*B+E <= native_max*min_height, protecting + // that cast as well as every int64 envelope/difference intermediate. + // This also implies 2*B+sum(duration)<=native_max, bounding unary + // tree arithmetic when all task pairs must run disjointly. + // Products here fit int64: every factor is within native int limits. + const std::int64_t time_product=data.capacity*time_magnitude; + const std::int64_t difference_limit=static_cast(Int::Limits::max)*min_height; + if(energy>difference_limit || time_product>(difference_limit-energy)/2) + throw Unsupported("Native cumulative envelope/difference exceeds exact propagation limits; reduce the time range, durations or resource scale"); + } else if constexpr(std::is_same_v) { + result.regulars.emplace(&global.payload,prepare_regular(data,budget)); + } + },global.payload); + result.globals.push_back(&global.payload); + } + result.columns=std::move(column); + return result; +} + +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED +LP::BoundedIntegerModel relaxation_model(const Compiled& compiled, + const SolveBudget& budget) { + LP::BoundedIntegerModel result; + result.linear.c.resize(compiled.variables.size(), 0); + for (const auto& variable : compiled.variables) { + checkpoint(budget); + result.lower.push_back(variable.semi ? 0 : variable.lower); + result.upper.push_back(variable.upper); + } + for (const auto& term : compiled.objective) { + checkpoint(budget); + result.linear.c[term.column] = compiled.minimize ? term.coefficient : -term.coefficient; + } + const auto side = [&](const NativeRow& row, int bound, int sign) { + checkpoint(budget); + for (const auto& term : row.terms) { + checkpoint(budget); + result.linear.column.push_back(static_cast(term.column)); + result.linear.a.push_back(static_cast(sign) * term.coefficient); + } + result.linear.b.push_back(static_cast(sign) * bound); + result.linear.row_start.push_back(result.linear.a.size()); + }; + for (const auto& row : compiled.rows) { + if (row.lower) side(row, *row.lower, 1); + if (row.upper) side(row, *row.upper, -1); + } + try { LP::validate_integer_model(result); } + catch (const std::invalid_argument& error) { + throw Unsupported(std::string("Native LP relaxation: ") + error.what()); + } + return result; +} + +struct RelaxationState { + std::shared_ptr backend; + std::shared_ptr root_cover_evidence; + LP::Stats handoff; + NativeRootCoverStatistics root; +}; + +void root_cut_event(const char* event, NativeRootCoverCompletion& completion) { +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS + native_root_cut_test_event(event, completion); +#else + (void)event; (void)completion; +#endif +} + +NativeRootCoverCompletion root_completion(LP::Cuts::RootLoopCompletion value) { + using From=LP::Cuts::RootLoopCompletion;using To=NativeRootCoverCompletion; + switch(value) { + case From::NoNewCuts:return To::NoNewCuts; + case From::RoundLimit:return To::RoundLimit; + case From::WorkLimit:return To::WorkLimit; + case From::StorageLimit:return To::StorageLimit; + case From::SeparationLimit:return To::SeparationLimit; + case From::Cancelled:return To::Cancelled; + case From::TimeLimit:return To::TimeLimit; + case From::NoPrimalSuggestion:return To::NoPrimalSuggestion; + case From::InvalidSuggestion:return To::InvalidSuggestion; + case From::CallbackError:return To::CallbackError; + case From::BackendError:return To::BackendError; + case From::AllocationFailure:return To::AllocationFailure; + } + throw std::runtime_error("Unknown root cover loop completion"); +} + +void prepare_relaxation(Compiled& compiled,const NativeLpSettings& settings, + const SolveBudget& budget,RelaxationState& state) { + auto original=relaxation_model(compiled,budget); + if (settings.root_cover_cuts) { + const auto& limits=*settings.root_cover_cuts; + LP::Cuts::RootLoopOptions options; + options.max_rounds=limits.max_rounds;options.max_work=limits.max_work; + options.pool.max_cuts=limits.max_cuts;options.pool.max_nonzeros=limits.max_cut_nonzeros; + options.max_columns=limits.max_model_columns;options.max_rows=limits.max_model_rows; + options.max_nonzeros=limits.max_model_nonzeros; + options.separation.max_rows=limits.max_separation_rows; + options.separation.max_terms_per_row=limits.max_terms_per_row; + options.denominator=limits.denominator; + options.stop_requested=[&budget](){return budget.expired();}; + using Clock=std::chrono::steady_clock; + const auto now=Clock::now();const double remaining=budget.remaining_seconds(); + // Very large finite/infinite solve budgets need no representable absolute + // deadline: the shared predicate still checks their original budget. + const auto available=std::chrono::duration(Clock::time_point::max()-now).count(); + if (std::isfinite(remaining) && static_cast(remaining)(std::chrono::duration(remaining)); + root_cut_event("before_loop",state.root.completion);checkpoint(budget); + auto loop=LP::Cuts::root_cover_loop(LP::Cuts::SourceModel(std::move(original)),options); + const auto& stats=loop.stats; + state.root.completion=root_completion(loop.completion); + if (state.root.completion==NativeRootCoverCompletion::Cancelled && + !budget.cancelled() && budget.time_limit_reached()) + state.root.completion=NativeRootCoverCompletion::TimeLimit; + state.root.rounds=stats.rounds;state.root.augmentations=stats.augmentations; + state.root.cuts=loop.cuts.size();state.root.work=stats.work; + for (const auto& cut:loop.cuts) state.root.nonzeros+=cut.inequality().column.size(); + state.root.projected_coordinates=stats.projected_coordinates; + state.root.unsupported_rows=stats.unsupported_rows;state.root.oversized_rows=stats.oversized_rows; + state.root.separated_cuts=stats.separated_cuts;state.root.duplicate_cuts=stats.duplicate_cuts; + state.root.arithmetic_rejections=stats.arithmetic_rejections; + state.root.lp_calls=stats.lp_calls;state.root.lp_seconds=stats.lp_seconds; + state.root.valid_bounds=stats.valid_bounds;state.root.rejected_bounds=stats.rejected_bounds; + state.root.numerical_infeasibility_reports=stats.floating_infeasible_reports; + state.backend=loop.backend; + if (state.backend) state.handoff=state.backend->statistics(); + state.root_cover_evidence=std::make_shared(std::move(loop)); + root_cut_event("after_loop",state.root.completion); + checkpoint(budget); // Recover the precise outer time/cancel/node reason. + switch(state.root.completion) { + case NativeRootCoverCompletion::Cancelled:throw Interrupted{Termination::Cancelled}; + case NativeRootCoverCompletion::TimeLimit:throw Interrupted{Termination::TimeLimit}; + case NativeRootCoverCompletion::AllocationFailure:throw std::bad_alloc(); + case NativeRootCoverCompletion::CallbackError: + case NativeRootCoverCompletion::BackendError: + throw std::runtime_error("Native root cover loop failed before native search"); + case NativeRootCoverCompletion::NoNewCuts: + case NativeRootCoverCompletion::RoundLimit: + case NativeRootCoverCompletion::WorkLimit: + case NativeRootCoverCompletion::StorageLimit: + case NativeRootCoverCompletion::SeparationLimit: + case NativeRootCoverCompletion::NoPrimalSuggestion: + case NativeRootCoverCompletion::InvalidSuggestion:break; + default:throw std::runtime_error("Native root cover loop returned no completion"); + } + // Root cut limits bound this optional preprocessing only. If no backend was + // constructed, ordinary checked native LP solving can still proceed. + if (!state.backend) { + state.backend=std::make_shared(state.root_cover_evidence->model.model()); + state.handoff=state.backend->statistics(); + } + } else { + state.backend=std::make_shared(std::move(original)); + } + compiled.relaxation=state.backend; + compiled.root_cover_evidence=state.root_cover_evidence; + compiled.relaxation_options.frequency=settings.frequency==NativeLpFrequency::Root + ? LP::Frequency::Root:LP::Frequency::EveryNode; + compiled.relaxation_options.bound_tightening=settings.bound_tightening; + compiled.relaxation_options.bound_change_interval=settings.bound_change_interval; + root_cut_event("prepared",state.root.completion);checkpoint(budget); +} + +NativeLpStatistics relaxation_statistics(const RelaxationState& state) { + NativeLpStatistics result;result.root_cover=state.root; + const auto after=state.backend?state.backend->statistics():LP::Stats{}; + const auto& before=state.handoff; + result.lp_calls=state.root.lp_calls+(after.lp_calls-before.lp_calls); + result.lp_seconds=state.root.lp_seconds+(after.lp_ms-before.lp_ms)/1000.0; + result.valid_bounds=state.root.valid_bounds+(after.valid_bounds-before.valid_bounds); + result.rejected_bounds=state.root.rejected_bounds+(after.rejected-before.rejected); + result.numerical_infeasibility_reports=state.root.numerical_infeasibility_reports+ + (after.infeasible_status-before.infeasible_status); + result.certificate_evaluations=after.certificate_evaluations-before.certificate_evaluations; + result.conditional_checks=after.conditional_checks-before.conditional_checks; + result.variable_fixings=after.variable_fixings-before.variable_fixings; + result.variable_bound_tightenings=after.variable_bound_tightenings-before.variable_bound_tightenings; + return result; +} +#endif + +struct KnapsackBound { + int objective; + std::shared_ptr> witness; +}; + +struct KnapsackData { + std::size_t capacity; + std::vector weights, costs; +}; + +// Shared exact admission for both automatic routing and DP construction. +std::optional prepare_knapsack(const Compiled& model, + const SolveBudget& budget) { + const auto n = model.variables.size(); + if (!model.binary_domains || !n || model.rows.size() != 1 || + !model.indicators.empty() || !model.globals.empty()) return {}; + const auto& row = model.rows.front(); + if (row.terms.size() != n) return {}; + const bool positive = row.terms.front().coefficient > 0; + if (positive ? (!row.upper || (row.lower && *row.lower > 0)) + : (!row.lower || (row.upper && *row.upper < 0))) return {}; + const std::int64_t capacity = positive ? *row.upper : -std::int64_t(*row.lower); + constexpr std::size_t max_transitions = 32000000; + constexpr std::size_t max_payload_bytes = 8 * 1024 * 1024; + if (capacity < 0 || capacity > 65536) return {}; + const auto width = static_cast(capacity) + 1; + // Admit work and storage separately. Division protects every later product; + // packed decisions need one bit per recurrence, not an int64 value per cell. + if (n > max_transitions / width) return {}; + const auto transitions = n * width; + const auto decision_words = transitions / 64 + (transitions % 64 != 0); + std::size_t available = max_payload_bytes; + const auto account = [&](std::size_t count, std::size_t bytes) { + if (count > available / bytes) return false; + available -= count * bytes; + return true; + }; + if (!account(width, sizeof(std::int64_t)) || + !account(width, sizeof(std::int64_t)) || + !account(decision_words, sizeof(std::uint64_t)) || + !account(n, sizeof(std::int64_t)) || // weights + !account(n, sizeof(std::int64_t)) || // normalized costs + !account(n, sizeof(unsigned char))) return {}; // reconstructed witness + checkpoint(budget); + std::vector weights(n, 0), costs(n, 0); + for (const auto& term : row.terms) { + checkpoint(budget); + const auto weight = positive ? std::int64_t(term.coefficient) + : -std::int64_t(term.coefficient); + if (weight <= 0 || term.column < 0 || static_cast(term.column) >= n || + weights[static_cast(term.column)] != 0) return {}; + weights[static_cast(term.column)] = weight; + } + bool improves_zero = false; + for (const auto& term : model.objective) { + checkpoint(budget); + costs[static_cast(term.column)] = model.minimize + ? std::int64_t(term.coefficient) : -std::int64_t(term.coefficient); + improves_zero = improves_zero || costs[static_cast(term.column)] < 0; + } + // Otherwise all-zero is already optimal and the ordinary minimum-first + // brancher and original objective box provide the same preference and bound. + if (!improves_zero) return {}; + return KnapsackData{static_cast(capacity),std::move(weights),std::move(costs)}; +} + +// Exact root strengthening for one bounded binary capacity row. A missing +// result means the original native search should run without this optional work. +std::optional knapsack_bound(const Compiled& model, + const SolveBudget& budget) { + const auto started = std::chrono::steady_clock::now(); + const auto within_budget = [&] { + checkpoint(budget); + // This optional preprocessing may stop without producing any evidence. + // Original search keeps the remainder of the unchanged shared solve budget. + return std::chrono::steady_clock::now() - started < std::chrono::milliseconds(250); + }; + const auto admitted = prepare_knapsack(model,budget); + if (!admitted || !within_budget()) return {}; + const auto n = model.variables.size(), capacity = admitted->capacity, width = capacity+1; + const auto& weights = admitted->weights; + const auto& costs = admitted->costs; + // previous[c] minimizes normalized cost using the preceding items and at most + // c capacity. Empty selection is feasible, so the base row is zero everywhere. + // Each entry is a feasible subset cost. The compiler's absolute objective + // activity bound protects every partial sum, including signed costs. + std::vector previous(width, 0), current(width, 0); + const auto transitions = n * width; // checked by shared admission + std::vector take(transitions / 64 + (transitions % 64 != 0), 0); + if (!within_budget()) return {}; + for (std::size_t i = 0; i < n; ++i) { + const auto row_start = i * width; + for (std::size_t c = 0; c < width; ++c) { + if ((c & 255) == 0 && !within_budget()) return {}; + auto value = previous[c]; + if (weights[i] <= static_cast(c)) { + const auto included = costs[i] + previous[c - static_cast(weights[i])]; + if (included < value) { + value = included; + const auto bit = row_start + c; + take[bit / 64] |= std::uint64_t{1} << (bit % 64); + } + } + current[c] = value; + } + previous.swap(current); +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS + native_search_test_event("knapsack_row_completed"); +#endif + if (!within_budget()) return {}; + } + const auto normalized = previous[capacity]; + auto witness = std::make_shared>(n, 0); + auto remaining = static_cast(capacity); + for (std::size_t i = n; i > 0; --i) { + if (!within_budget()) return {}; + // Each bit belongs to its original item row, so overwritten rolling values + // cannot corrupt reconstruction. A tie consistently excludes the item. + const auto bit = (i - 1) * width + remaining; + if ((take[bit / 64] >> (bit % 64)) & std::uint64_t{1}) { + if (weights[i - 1] > static_cast(remaining)) + throw std::runtime_error("Native knapsack reconstruction exceeds capacity"); + (*witness)[i - 1] = 1; + remaining -= static_cast(weights[i - 1]); + } + } + std::int64_t load = 0, checked_cost = 0; + for (std::size_t i = 0; i < n; ++i) { + if (!within_budget()) return {}; + if ((*witness)[i]) { load += weights[i]; checked_cost += costs[i]; } + } + const auto raw = model.minimize ? normalized : -normalized; + if (load > capacity || checked_cost != normalized || + raw < model.cost_lower || raw > model.cost_upper) + throw std::runtime_error("Native knapsack witness failed exact reconstruction checks"); + if (!within_budget()) return {}; + return KnapsackBound{static_cast(raw), std::move(witness)}; +} + +class NativeSpace final : public Space { +public: + IntVarArray variables; + IntVar cost; + bool minimize; + std::shared_ptr> knapsack_witness; + + NativeSpace(const Compiled& model, const SolveBudget& budget, + NeighborhoodBudget* local=nullptr, bool root_knapsack=true, + bool depth_first_knapsack=false) + : variables(*this, static_cast(model.variables.size())), + cost(*this, model.cost_lower, model.cost_upper), minimize(model.minimize) { + for (std::size_t i = 0; i < model.variables.size(); ++i) { + construction_checkpoint(budget,local); + const auto& variable = model.variables[i]; + if (variable.semi) { + const int ranges[2][2] = {{0, 0}, {variable.lower, variable.upper}}; + variables[static_cast(i)] = IntVar(*this, IntSet(ranges, 2)); + } else { + variables[static_cast(i)] = IntVar(*this, variable.lower, variable.upper); + } + } + for (const auto& row : model.rows) { + construction_checkpoint(budget,local); post(row); + if(local) local->check("neighborhood_row_posted"); + } + for (const auto& indicator : model.indicators) { + construction_checkpoint(budget,local); + BoolVar enabled(*this, 0, 1); + rel(*this, variables[indicator.activator], IRT_EQ, + indicator.active_value ? 1 : 0, Reify(enabled, RM_EQV)); + post(indicator.row, enabled); + if (indicator.gate) { + IntArgs coefficients(2); IntVarArgs vars(2); + coefficients[0] = indicator.active_value ? 1 : -1; + coefficients[1] = 1; + vars[0] = variables[indicator.activator]; vars[1] = variables[*indicator.gate]; + linear(*this, coefficients, vars, IRT_EQ, indicator.active_value ? 1 : 0); + } + } + for(const auto* global:model.globals) { + construction_checkpoint(budget,local);post_global(*global,model,budget,local); + if(local) local->check("neighborhood_global_posted"); + } + IntArgs coefficients(static_cast(model.objective.size())); + IntVarArgs vars(static_cast(model.objective.size())); + for (std::size_t i = 0; i < model.objective.size(); ++i) { + if(local) local->check(); + coefficients[static_cast(i)] = model.objective[i].coefficient; + vars[static_cast(i)] = variables[model.objective[i].column]; + } + linear(*this, coefficients, vars, IRT_EQ, cost); +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (model.relaxation && !local) { + checkpoint(budget); + IntVar lp_cost = cost; + if (!minimize) { + lp_cost = IntVar(*this, -model.cost_upper, -model.cost_lower); + IntVarArgs pair(2); pair[0] = cost; pair[1] = lp_cost; + linear(*this, pair, IRT_EQ, 0); + } + LP::integer_linear_minimize(*this, variables, lp_cost, + model.relaxation, model.relaxation_options); + } +#endif + bool strengthen = root_knapsack && !local; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + strengthen = strengthen && !model.relaxation; +#endif + const auto knapsack = strengthen ? knapsack_bound(model, budget) + : std::optional{}; + if (knapsack) { + checkpoint(budget); + knapsack_witness = knapsack->witness; + // A valid objective-side bound preserves every original feasible point. + // The witness only orders choices; it never fixes the original model. + rel(*this, cost, minimize ? IRT_GQ : IRT_LQ, knapsack->objective); + branch(*this, variables, INT_VAR_SIZE_MIN(), + INT_VAL([witness=knapsack->witness,depth_first_knapsack] + (const Space&, IntVar variable, int column) { + const int bit = (*witness)[static_cast(column)]; + const int value = depth_first_knapsack ? 1 - bit : bit; + return variable.in(value) ? value : variable.min(); + })); + } else { + branch(*this, variables, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + } + if(local) local->check("neighborhood_constructed"); + } + NativeSpace(NativeSpace& other) + : Space(other), minimize(other.minimize), knapsack_witness(other.knapsack_witness) { + variables.update(*this, other.variables); cost.update(*this, other.cost); + } + Space* copy() override { return new NativeSpace(*this); } + void constrain(const Space& best) override { + const auto& incumbent = static_cast(best); + rel(*this, cost, minimize ? IRT_LE : IRT_GR, incumbent.cost.val()); + } +private: + void post_global(const GlobalPayload& payload,const Compiled& model,const SolveBudget& budget, + NeighborhoodBudget* local=nullptr) { + const auto variable=[&](Variable handle) {return variables[model.columns[handle.id]];}; + const auto args=[&](const std::vector& handles) { + IntVarArgs out(static_cast(handles.size())); + for(std::size_t i=0;icheck();out[static_cast(i)]=variable(handles[i]); + } + // Some propagators reject repeated variable objects. Equal fresh views + // preserve aliases without weakening their mathematical meaning. + unshare(*this,out); + return out; + }; + const auto false_constraint=[&]() {rel(*this,IntVar(*this,0,0),IRT_EQ,1);}; + const auto position=[&](Variable handle,std::int64_t base,std::size_t size) { + IntVar index(*this,0,static_cast(size-1)); + IntVarArgs vars(2);vars[0]=variable(handle);vars[1]=index; + IntArgs coefficients(2);coefficients[0]=1;coefficients[1]=-1; + linear(*this,coefficients,vars,IRT_EQ,static_cast(base)); + return index; + }; + std::visit([&](const auto& data) { + using T=std::decay_t; + if constexpr(std::is_same_v) { + if(data.variables.size()>1) distinct(*this,args(data.variables),IPL_DOM); + } else if constexpr(std::is_same_v) { + if(data.elements.empty()) {false_constraint();return;} + element(*this,args(data.elements),position(data.index,data.index_base,data.elements.size()),variable(data.result),IPL_DOM); + } else if constexpr(std::is_same_v) { + if(data.tuples.empty()) {false_constraint();return;} + if(data.variables.empty()) return; // At least one empty tuple is true. + TupleSet tuples(static_cast(data.variables.size())); + for(const auto& tuple:data.tuples) { + construction_checkpoint(budget,local);IntArgs entry(static_cast(tuple.size())); + for(std::size_t i=0;i(i)]=static_cast(tuple[i]); + tuples.add(entry); + } + tuples.finalize();extensional(*this,args(data.variables),tuples,IPL_DOM); + } else if constexpr(std::is_same_v) { + std::vector starts;std::vector durations,heights; + for(std::size_t i=0;icheck(); + starts.push_back(data.starts[i]);durations.push_back(static_cast(data.durations[i])); + heights.push_back(static_cast(data.heights[i])); + } + // Mandatory positive-duration demand above capacity is independently + // infeasible. A singleton within capacity imposes no restriction on + // its start. Handle both before native cumulative's min-capacity + // calculation (whose second minimum uses an INT_MAX sentinel). + if(std::any_of(heights.begin(),heights.end(),[&](int h){return h>data.capacity;})) { + false_constraint();return; + } + if(starts.size()<=1) return; + IntArgs p(static_cast(starts.size())),h(static_cast(starts.size())); + for(std::size_t i=0;i(i)]=durations[i];h[static_cast(i)]=heights[i];} + // Select the same disjunctive case with wide addition. Native + // cumulative's int min_height+second_height can overflow for large + // resource units, even though both individual heights are supported. + std::int64_t first=Int::Limits::max,second=Int::Limits::max; + for(const auto height:heights) { + if(height(height)); + } + const auto level=static_cast(IPL_BASIC|IPL_ADVANCED); + if(first+second>data.capacity) unary(*this,args(starts),p,level); + else cumulative(*this,static_cast(data.capacity),args(starts),p,h,level); + } else if constexpr(std::is_same_v) { + const auto& prepared=model.regulars.at(&payload); + if(data.variables.empty()){if(!prepared.accepts_empty)false_constraint();return;} + if(data.transitions.empty()||data.final_states.empty()){false_constraint();return;} + // DFA's constructor may normalize the supplied arrays. Keep each copy + // private, disable optional minimization, and checkpoint both sides of + // the non-interruptible native construction/posting calls. + auto transitions=prepared.transitions;auto finals=prepared.finals; + construction_checkpoint(budget,local);DFA automaton(prepared.initial,transitions.data(),finals.data(),false);construction_checkpoint(budget,local); + extensional(*this,args(data.variables),automaton,IPL_DOM);construction_checkpoint(budget,local); + } else { + IntVarArgs successors(static_cast(data.successors.size())); + for(std::size_t i=0;icheck(); + successors[static_cast(i)]=position(data.successors[i],data.index_base,data.successors.size()); + } + circuit(*this,successors,IPL_DOM); + } + },payload); + } + void post(const NativeRow& row, std::optional enabled = {}) { + IntArgs coefficients(static_cast(row.terms.size())); + IntVarArgs vars(static_cast(row.terms.size())); + for (std::size_t i = 0; i < row.terms.size(); ++i) { + coefficients[static_cast(i)] = row.terms[i].coefficient; + vars[static_cast(i)] = variables[row.terms[i].column]; + } + const auto side = [&](IntRelType relation, int bound) { + if (enabled) linear(*this, coefficients, vars, relation, bound, Reify(*enabled, RM_IMP)); + else linear(*this, coefficients, vars, relation, bound); + }; + if (row.lower && row.upper && *row.lower == *row.upper) side(IRT_EQ, *row.lower); + else { + if (row.lower) side(IRT_GQ, *row.lower); + if (row.upper) side(IRT_LQ, *row.upper); + } + } +}; + +// Only assignment infeasibility has this type. Allocation/indexing/internal +// errors must never be relabelled as an invalid user start. +class ExactWitnessFailure : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; +void start_event(const char* event) { +#ifdef GECODE_NATIVE_START_TEST_HOOKS + native_start_test_event(event); +#else + (void)event; +#endif +} +void start_checkpoint(const SolveBudget& budget, const char* event) { + start_event(event); checkpoint(budget); +} +bool exact_domain(const VariableData& variable, double value) { + return std::isfinite(value) && value == std::trunc(value) && + ((variable.type == VariableType::SemiInteger && value == 0) || + (value >= variable.lower && value <= variable.upper)); +} + +// This checker reads the original snapshot and original slots, independently +// of NativeSpace's column mapping, propagation and cost variable. All casts and +// sums are justified by compile's integer and absolute-activity preconditions. +// Start-only checkpoints leave ordinary candidate/no-start scheduling unchanged. +std::int64_t check_exact(const ModelSnapshot& model, const std::vector& values, + const SolveBudget* start_budget = nullptr, NeighborhoodBudget* local=nullptr) { + const auto check = [&](const char* event) { + if (start_budget) start_checkpoint(*start_budget, event); + if(local) local->check(event); + }; + for (const auto& variable : model.variables) { + check("exact_variable"); + if (!variable.active) continue; + const double value = values.at(static_cast(variable.variable.id)); + if (!exact_domain(variable, value)) + throw ExactWitnessFailure("Native witness failed exact original variable check"); + } + const auto activity = [&](const std::vector& terms) { + std::int64_t sum = 0; + for (const auto& term : terms) { + check("exact_term"); + sum += static_cast(term.coefficient) * + static_cast(values.at(static_cast(term.variable.id))); + } + return sum; + }; + const auto row = [&](const std::vector& terms, double lower, double upper) { + const auto sum = activity(terms); + if ((std::isfinite(lower) && sum < static_cast(lower)) || + (std::isfinite(upper) && sum > static_cast(upper))) + throw ExactWitnessFailure("Native witness failed exact original row check"); + }; + for (const auto& original : model.rows) { + check("exact_row"); + if (original.active && !original.indicator_origin) + row(original.terms, original.lower, original.upper); + } + for (const auto& indicator : model.indicators) { + check("exact_indicator"); + if (!indicator.active) continue; + const bool enabled = values[indicator.activator.id] == (indicator.active_value ? 1 : 0); + if (enabled) row(indicator.terms, indicator.lower, indicator.upper); + if (indicator.inactive_gate && values[indicator.inactive_gate->id] != (enabled ? 0 : 1)) + throw ExactWitnessFailure("Native witness failed exact indicator gate check"); + } + for (const auto& global : model.globals) if (global.active) { + check("exact_global"); + std::string reason; + if (!Detail::global_satisfied(global.payload, values, 0, reason)) + throw ExactWitnessFailure("Native witness failed exact global check: " + reason); + check("after_exact_global"); + } + check("exact_objective"); + return static_cast(model.objective.offset) + activity(model.objective.terms); +} + +struct PreparedStart { + std::vector values; + std::vector active; + std::int64_t objective = 0; + int cost = 0; +}; +PreparedStart prepare_start(const ModelSnapshot& model, const Compiled& compiled, + const SolveOptions& options, const SolveBudget& budget) { + start_checkpoint(budget, "before_start"); + PreparedStart result; + result.values.assign(model.variables.size(), std::numeric_limits::quiet_NaN()); + result.active.reserve(model.variables.size()); + std::vector known; + known.reserve(model.variables.size()); + for (const auto& entry : options.primal_start) { + start_checkpoint(budget, "map_entry"); + const auto handle = entry.variable; + if (handle.model_id != model.model_id || handle.id >= model.variables.size() || + !model.variables[handle.id].active) + throw ModelError("Native primal start contains a foreign, invalid or deleted variable"); + auto& value = result.values[handle.id]; + if (!std::isnan(value)) throw ModelError("Native primal start contains a duplicate variable"); + if (!exact_domain(model.variables[handle.id], entry.value)) + throw ModelError("Native primal start violates an exact integer variable domain (no rounding is performed)"); + value = entry.value; known.push_back(static_cast(handle.id)); + } + // Only live original indicator equations determine omitted helper slots. + // A slot is queued once, and each dependency is visited once, including + // chains/reordered metadata. Unseeded cycles and removed gates stay unknown. + std::vector> dependents(model.variables.size()); + for (std::size_t i = 0; i < model.indicators.size(); ++i) { + start_checkpoint(budget, "gate_dependency"); + const auto& indicator = model.indicators[i]; + if (indicator.active && indicator.inactive_gate) + dependents[indicator.activator.id].push_back(i); + } + for (std::size_t i = 0; i < known.size(); ++i) { + start_checkpoint(budget, "known_slot"); + for (auto index : dependents[known[i]]) { + start_checkpoint(budget, "derive_gate"); + const auto& indicator = model.indicators[index]; + const double gate = result.values[indicator.activator.id] == (indicator.active_value ? 1 : 0) ? 0 : 1; + auto& value = result.values[indicator.inactive_gate->id]; + if (std::isnan(value)) { + value = gate; known.push_back(static_cast(indicator.inactive_gate->id)); + } else if (value != gate) { + throw ModelError("Native primal start contradicts a live indicator inactivity gate"); + } + } + } + for (const auto& variable : model.variables) { + start_checkpoint(budget, "start_completeness"); + result.active.push_back(variable.active); + if (variable.active && std::isnan(result.values[variable.variable.id])) + throw Unsupported("Native primal start must determine every active variable; only live indicator inactivity gates are completed automatically"); + } + start_checkpoint(budget, "before_exact_start"); + try { result.objective = check_exact(model, result.values, &budget); } + catch (const ExactWitnessFailure& error) { + throw ModelError(std::string("Complete native primal start is infeasible: ") + error.what()); + } + start_checkpoint(budget, "after_exact_start"); + // compile bounds both quantities by +/-2^53, so this int64 subtraction is + // exact and cannot overflow. The native cost must fit its preflighted range. + const auto cost = result.objective - compiled.offset; + if (cost < compiled.cost_lower || cost > compiled.cost_upper) + throw std::runtime_error("Native primal start cost disagrees with compiled objective bounds"); + result.cost = static_cast(cost); + start_checkpoint(budget, "before_numerical_start"); + const auto checked = validate(model, result.values, options.feasibility_tolerance, options.integrality_tolerance); + if (!checked.valid || !checked.objective || *checked.objective != static_cast(result.objective)) + throw ModelError("Complete native primal start failed independent original-model numerical check: " + checked.message); + start_checkpoint(budget, "after_numerical_start"); + return result; +} +void publish_start(PreparedStart&& start, SolveResult& result, const SolveBudget& budget) { + start_checkpoint(budget, "before_start_publication"); + result.values = std::move(start.values); result.active_variables = std::move(start.active); + result.objective = static_cast(start.objective); + result.solution_validated = result.start_submitted = true; + // Callers install their scalar incumbent before the next hook/checkpoint. +} +void start_cutoff(NativeSpace& root, int cost, const SolveBudget& budget) { + start_checkpoint(budget, "before_start_cutoff"); + rel(root, root.cost, root.minimize ? IRT_LE : IRT_GR, cost); + start_checkpoint(budget, "after_start_cutoff"); +} + +// All live search and LP ownership is released before this cooperative gate. +// Return true for a semantic failure requiring a conservative bound fallback. +bool finish_start(SolveResult& result, const SolveBudget& budget) { + bool failure = false; + try { start_event("after_start_release"); } + catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; result.message = "Native start cleanup allocation failed"; + } catch (const MemoryExhausted& error) { + result.termination = Termination::MemoryLimit; result.message = error.what(); + } catch (const std::exception& error) { + result.termination = Termination::BackendError; result.message = error.what(); failure = true; + } + if (budget.cancelled() || budget.time_limit_reached()) { + result.termination = budget.cancelled() ? Termination::Cancelled : Termination::TimeLimit; + result.message = "Native start solve time/cancellation budget stopped before return"; + } + return failure; +} + +class BudgetStop final : public Search::Stop { + SolveBudget budget_; + std::uint64_t observed_ = 0; +public: + explicit BudgetStop(SolveBudget budget) : budget_(std::move(budget)) {} + void observe(const Search::Statistics& statistics) { + const auto nodes = static_cast(statistics.node); + if (nodes > observed_) budget_.add_nodes(nodes - observed_); + observed_ = std::max(observed_, nodes); + } + bool stop(const Search::Statistics& statistics, const Search::Options&) override { + observe(statistics); return budget_.expired(); + } +}; +#endif +} // namespace + +BackendCapabilities native_capabilities() { + BackendCapabilities result; + result.name = "Gecode native"; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + result.available = result.mixed_integer_linear = result.exact_solving = true; + result.version = GECODE_VERSION; +#else + result.limitations.push_back("Built without the native Gecode bridge"); +#endif + result.limitations.push_back("Finite Integer/Binary/SemiInteger linear subset; integral bounds, coefficients and objective offset"); + result.limitations.push_back("Conservative native integer activity limits and exact double objective range; no continuous variables"); + result.limitations.push_back("Native reified indicators and all-different/element/table/cumulative/circuit/regular globals; scoped FlatZinc compilation is available separately"); + result.limitations.push_back("One deterministic worker; complete exact starts with live indicator gate completion; no partial starts, certificates or interrupted global bounds"); + result.limitations.push_back("Time/cancellation is cooperative; native propagation and recomputation cannot be interrupted"); + return result; +} + +namespace { +SolveResult solve_native_impl(const ModelSnapshot& model, const SolveOptions& options, + const NativeLpOptions* lp_options, + NativeLpStatistics* lp_statistics, + const SolveBudget* inherited_budget = nullptr) { + const auto started = std::chrono::steady_clock::now(); + SolveResult result; + result.model_id = model.model_id; result.revision = model.revision; + result.backend = lp_options ? "Gecode native + checked LP" : "Gecode native"; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + RelaxationState relaxation; +#else + (void) lp_statistics; +#endif + if (lp_statistics && lp_options && lp_options->root_cover_cuts) { + lp_statistics->root_cover.requested=true; + lp_statistics->root_cover.completion=NativeRootCoverCompletion::NotStarted; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + relaxation.root=lp_statistics->root_cover; +#endif + } + std::optional shared_budget; + try { + if (inherited_budget) shared_budget.emplace(*inherited_budget); + else shared_budget.emplace(options); + [[maybe_unused]] const auto& budget = *shared_budget; + result.guarantee=options.guarantee; + if (lp_options) lp_options->validate(); + validate_structure(model); + if (options.backend != Backend::Auto && options.backend != Backend::Native) + throw Unsupported("Native solve requires backend Auto or Native"); + if (options.guarantee == Guarantee::Certified) + throw Unsupported("Native bridge does not produce independently checkable proof certificates"); + if (options.threads != 1 || options.random_seed != 0) + throw Unsupported("Native bridge currently uses one deterministic worker and seed 0"); +#ifndef GECODE_OPTIMIZE_WITH_NATIVE + throw Unsupported("Built without the native Gecode bridge"); +#else + result.backend_version = GECODE_VERSION; +#ifndef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (lp_options) + throw Unsupported("Native checked LP requires HiGHS and compiler support for checked 128-bit integer arithmetic"); +#endif + checkpoint(budget); + auto compiled = compile(model, budget); + std::optional start_cost; + if (!options.primal_start.empty()) { + auto start = prepare_start(model, compiled, options, budget); + start_cost = start.cost; + publish_start(std::move(start), result, budget); + start_checkpoint(budget, "after_start_publication"); + } +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (lp_options) { + prepare_relaxation(compiled,*lp_options,budget,relaxation); + result.backend_version += std::string("; HiGHS ") + Highs().version(); + checkpoint(budget); + } +#endif + result.guarantee = options.guarantee; + std::vector active; + for (const auto& variable : model.variables) active.push_back(variable.active); + BudgetStop stop(budget); + Search::Options search_options; + search_options.threads = 1; search_options.clone = true; search_options.stop = &stop; + if (start_cost) start_checkpoint(budget, "start_root_alloc"); + auto root = std::make_unique(compiled, budget, nullptr, !lp_options); + if (start_cost) start_cutoff(*root, *start_cost, budget); + checkpoint(budget); + BAB search(root.get(), search_options); + root.reset(); + if (start_cost) start_checkpoint(budget, "start_search_ready"); + for (;;) { + checkpoint(budget); + if (start_cost) start_checkpoint(budget, "before_start_search_next"); + std::unique_ptr candidate(search.next()); + stop.observe(search.statistics()); + checkpoint(budget); + if (!candidate) { + if (search.stopped()) throw std::runtime_error("Native search stopped without a shared-budget reason"); + result.termination = result.has_solution() ? Termination::Optimal : Termination::Infeasible; + if (result.has_solution()) { + result.best_bound = result.objective; result.update_gaps(model.objective.sense); + } + result.message = "Native finite integer search exhausted; original integer semantics preserved"; + break; + } + std::vector values(model.variables.size(), std::numeric_limits::quiet_NaN()); + for (std::size_t i = 0; i < compiled.variables.size(); ++i) + values[compiled.variables[i].slot] = candidate->variables[static_cast(i)].val(); + if (start_cost) start_checkpoint(budget, "before_start_candidate_validation"); + const auto exact_objective = check_exact(model, values); + if (exact_objective != compiled.offset + candidate->cost.val()) + throw std::runtime_error("Native cost does not match exact original objective"); + const auto checked = validate(model, values, options.feasibility_tolerance, options.integrality_tolerance); + if (!checked.valid || !checked.objective || *checked.objective != static_cast(exact_objective)) + throw std::runtime_error("Native witness failed independent original-model numerical check: " + checked.message); + if (result.objective && (compiled.minimize ? exact_objective >= *result.objective : exact_objective <= *result.objective)) + throw std::runtime_error("Native search returned a non-improving incumbent"); + auto mask = active; // Allocate before replacing an earlier validated start. + if (start_cost) start_checkpoint(budget, "before_start_candidate_publication"); + checkpoint(budget); + result.values = std::move(values); result.active_variables = std::move(mask); + result.objective = static_cast(exact_objective); result.solution_validated = true; + } +#endif + } catch (const Unsupported& e) { + result.termination = Termination::Unsupported; result.message = e.what(); + } catch (const Interrupted& e) { + result.termination = e.reason; result.message = "Native shared solve budget exhausted"; + } catch (const ModelError& e) { + result.termination = Termination::InvalidModel; result.message = e.what(); + } catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; result.message = "Native bridge allocation failed"; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + } catch (const MemoryExhausted& e) { + result.termination = Termination::MemoryLimit; result.message = e.what(); +#endif + } catch (const std::exception& e) { + result.termination = Termination::BackendError; result.message = e.what(); + } +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (lp_statistics) *lp_statistics=relaxation_statistics(relaxation); +#endif +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + if (result.start_submitted && shared_budget) { +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + relaxation = RelaxationState{}; +#endif + (void) finish_start(result, *shared_budget); + if (result.termination != Termination::Optimal) { + result.best_bound.reset(); result.absolute_gap.reset(); result.relative_gap.reset(); + } + } +#endif + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + return result; +} +} // namespace + +SolveResult solve_native(const ModelSnapshot& model, const SolveOptions& options) { + return solve_native_impl(model, options, nullptr, nullptr); +} + +void NativeRootCoverSettings::validate() const { + if (!denominator || denominator>1048576 || (denominator&(denominator-1))) + throw ModelError("Native root cover denominator must be a power of two in [1,1048576]"); +} + +void NativeLpSettings::validate() const { + if (!bound_change_interval || + (frequency != NativeLpFrequency::Root && frequency != NativeLpFrequency::AfterBoundChanges)) + throw ModelError("Invalid native LP frequency or bound-change interval"); + if (root_cover_cuts) root_cover_cuts->validate(); +} + +void NativeLpOptions::validate() const { + solve.validate(); NativeLpSettings::validate(); +} + +BackendCapabilities native_lp_capabilities() { + auto result = native_capabilities(); + result.name = "Gecode native + checked LP"; +#ifndef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + result.available = result.mixed_integer_linear = result.exact_solving = false; + result.limitations.push_back("Requires native Gecode, HiGHS and checked 128-bit compiler arithmetic"); +#else + result.version += std::string("; HiGHS ") + Highs().version(); +#endif + result.limitations.push_back("Explicit LP API or conservative automatic native selection; sparse ordinary linear rows with coefficients and bounds of magnitude <= 1e9"); + result.limitations.push_back("Global constraints and indicators are enforced natively and omitted from the LP relaxation"); + result.limitations.push_back("LP attempt limits are cooperative (0.2 seconds / 10000 simplex iterations); no interrupted frontier bound"); + result.limitations.push_back("Root covers are verified only against original ordinary rows and original LP boxes; explicit LP defaults omit them, automatic native selection may enable them"); + return result; +} + +NativeLpResult solve_native_lp(const ModelSnapshot& model, const NativeLpOptions& options) { + NativeLpResult result; + result.result = solve_native_impl(model, options.solve, &options, &result.relaxation); + return result; +} + +NativeLpResult solve_native_lp(const Model& model, const NativeLpOptions& options) { + const auto started = std::chrono::steady_clock::now(); + NativeLpResult result; + result.result.model_id = model.id(); result.result.revision = model.revision(); + result.result.backend = "Gecode native + checked LP"; + result.result.guarantee=options.solve.guarantee; + if(options.root_cover_cuts) { + result.relaxation.root_cover.requested=true; + result.relaxation.root_cover.completion=NativeRootCoverCompletion::NotStarted; + } + try { + options.validate(); + auto snapshot = model.snapshot(); + auto remaining = options; + if (std::isfinite(remaining.solve.time_limit_seconds)) + remaining.solve.time_limit_seconds = std::max(0.0, remaining.solve.time_limit_seconds - + std::chrono::duration(std::chrono::steady_clock::now() - started).count()); + result = solve_native_lp(snapshot, remaining); + } catch (const ModelError& error) { + result.result.termination = Termination::InvalidModel; result.result.message = error.what(); + } catch (const std::bad_alloc&) { + result.result.termination = Termination::MemoryLimit; + result.result.message = "Native LP model snapshot allocation failed"; + } + result.result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + return result; +} + +SolveResult solve_native(const Model& model, const SolveOptions& options) { + const auto started = std::chrono::steady_clock::now(); + SolveResult result; + result.model_id = model.id(); result.revision = model.revision(); result.backend = "Gecode native"; + try { + options.validate(); + auto snapshot = model.snapshot(); + auto remaining = options; + if (std::isfinite(remaining.time_limit_seconds)) + remaining.time_limit_seconds = std::max(0.0, remaining.time_limit_seconds - + std::chrono::duration(std::chrono::steady_clock::now() - started).count()); + result = solve_native(snapshot, remaining); + } catch (const ModelError& e) { + result.termination = Termination::InvalidModel; result.message = e.what(); + } catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; result.message = "Native model snapshot allocation failed"; + } + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + return result; +} + +void NativeBranchingSettings::validate() const { + if (policy != NativeBranchingPolicy::BinaryReliability) + throw ModelError("Unknown native branching policy"); + if (!reliability_samples) throw ModelError("Native branching reliability_samples must be positive"); +} + +void NativeSearchOptions::validate() const { + solve.validate(); + if (order != NativeSearchOrder::DepthFirst && order != NativeSearchOrder::BestBound) + throw ModelError("Unknown native frontier search order"); + if (relaxation) relaxation->validate(); + if (branching) branching->validate(); +} + +namespace { +#ifdef GECODE_OPTIMIZE_WITH_NATIVE +void frontier_event(const char* event) { +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS + native_search_test_event(event); +#else + (void)event; +#endif +} +// An admitted node may finish at its node quota. Only time/cancellation can +// interrupt that work; the complete budget is checked before the next admission. +void frontier_checkpoint(const SolveBudget& budget) { + if (budget.cancelled()) throw Interrupted{Termination::Cancelled}; + if (budget.time_limit_reached()) throw Interrupted{Termination::TimeLimit}; +} +struct FrontierNode { + std::unique_ptr space; + int bound; + std::uint64_t serial; + bool contains_knapsack_witness = false; +}; +struct FrontierCompare { + bool operator()(const FrontierNode& a, const FrontierNode& b) const noexcept { + if (a.bound != b.bound) return a.bound > b.bound; + if (a.contains_knapsack_witness != b.contains_knapsack_witness) + return !a.contains_knapsack_witness; + return a.serial > b.serial; + } +}; + +void branching_event(const char* event, std::size_t slot, double down=0, double up=0) { +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS + native_branching_test_event(event,slot,down,up); +#else + (void)event; (void)slot; (void)down; (void)up; +#endif +} +void count_branching(std::uint64_t& value, std::uint64_t amount=1) { + if (amount > std::numeric_limits::max()-value) + throw Interrupted{Termination::MemoryLimit}; + value+=amount; +} +// Ranking state belongs to the coordinator, never a Space/Choice/certificate. +class BinaryReliability { + struct History { + int column; + std::uint64_t pairs=0; + double down=0,up=0; + }; + struct Candidate { + int column; + std::size_t slot; + std::optional history; + }; + struct Observation { bool failed=false; double gain=0; }; + const NativeSearchOptions& options; + const ModelSnapshot& source; + const Compiled& compiled; + SolveBudget& budget; + NativeBranchingStatistics& stats; + std::vector history; + + bool charge(std::size_t amount=1) { + frontier_checkpoint(budget); + if (amount>options.branching->max_branching_work-stats.work) return false; + stats.work+=amount; return true; + } + static void split(NativeSpace& space,int column,unsigned int direction) { + // Both arms partition the actual domain; no relaxation hull is posted. + const auto variable=space.variables[column]; + if (variable.min()!=0 || variable.max()!=1 || variable.size()!=2 || direction>1) + throw std::runtime_error("Invalid native binary branching split"); + rel(space,variable,direction ? IRT_GQ:IRT_LQ,direction ? 1:0); + } + Observation probe(const NativeSpace& parent,const Candidate& candidate, + unsigned int direction,int baseline,NativeFrontierStatistics& frontier, + std::size_t resident) { + checkpoint(budget); + frontier.peak_open_nodes=std::max(frontier.peak_open_nodes,resident+1); + branching_event("probe_clone",candidate.slot); + frontier_checkpoint(budget); + std::unique_ptr child(static_cast(parent.clone())); + branching_event("probe_cloned",candidate.slot); + frontier_checkpoint(budget); + split(*child,candidate.column,direction); + branching_event("probe_posted",candidate.slot); + checkpoint(budget); + if (budget.nodes()==std::numeric_limits::max()) + throw Interrupted{Termination::MemoryLimit}; + count_branching(stats.probe_status_calls); budget.add_nodes(); + StatusStatistics observed; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + const auto before=compiled.relaxation ? compiled.relaxation->statistics():LP::Stats{}; + const auto observe_lp=[&] { + const auto after=compiled.relaxation ? compiled.relaxation->statistics():LP::Stats{}; + count_branching(stats.probe_lp_calls,after.lp_calls-before.lp_calls); + stats.probe_lp_seconds+=(after.lp_ms-before.lp_ms)/1000.0; + }; +#endif + SpaceStatus status; + try { + branching_event("probe_before_status",candidate.slot); + frontier_checkpoint(budget); + status=child->status(observed); + } catch (...) { + count_branching(stats.probe_propagations,observed.propagate); +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + observe_lp(); +#endif + throw; + } + count_branching(stats.probe_propagations,observed.propagate); +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + observe_lp(); +#endif + branching_event("probe_after_status",candidate.slot); + frontier_checkpoint(budget); + Observation result; + if (status==SS_FAILED) result.failed=true; + else { + if (status!=SS_BRANCH && status!=SS_SOLVED) + throw std::runtime_error("Unexpected native branching probe status"); + const std::int64_t bound=compiled.minimize ? child->cost.min():-child->cost.max(); + result.gain=static_cast(std::max(0,bound-baseline)); + } + child.reset(); + branching_event("probe_destroyed",candidate.slot); + frontier_checkpoint(budget); + return result; + } +public: + BinaryReliability(const NativeSearchOptions& o,const ModelSnapshot& m, + const Compiled& c,SolveBudget& b,NativeBranchingStatistics& s) + :options(o),source(m),compiled(c),budget(b),stats(s) {} + + static void commit(NativeSpace& child,int column,unsigned int direction) { + split(child,column,direction); + } + + std::optional select(const NativeSpace& parent,int baseline, + NativeFrontierStatistics& frontier,std::size_t resident) { + count_branching(stats.decisions); + const auto& settings=*options.branching; + const auto fallback=[&]() -> std::optional { + branching_event("branch_fallback",std::numeric_limits::max()); + frontier_checkpoint(budget); count_branching(stats.fallback_decisions); return {}; + }; + if (!settings.max_candidates_per_decision || !settings.max_history_entries || + !settings.max_nonimproving_pairs || !settings.max_branching_work) + return fallback(); + branching_event("candidate_scan",std::numeric_limits::max()); + std::vector candidates; + const auto capacity=std::min(settings.max_candidates_per_decision,compiled.variables.size()); + if (!charge(capacity)) return fallback(); + candidates.reserve(capacity); + for (std::size_t column=0;column(column)]; + if (source.variables[slot].type!=VariableType::Binary || source.variables[slot].indicator_origin || variable.min()!=0 || + variable.max()!=1 || variable.size()!=2) continue; + bool exhausted=false; + Candidate candidate{static_cast(column),slot,{}}; + for (std::size_t i=0;i best; + std::size_t best_slot=std::numeric_limits::max(),nonimproving=0; + unsigned int best_failed=0; + double best_min=0,best_max=0; + std::uint64_t decision_calls=0; + for (const auto& candidate:candidates) { + if (!charge()) break; + double down=0,up=0; unsigned int failed=0; + bool completed=false; + if (candidate.history && history[*candidate.history].pairs>=settings.reliability_samples) { + const auto& old=history[*candidate.history];down=old.down;up=old.up; + count_branching(stats.reliable_candidates); + } else { + // Preserve capacity for a complete pair and two ordinary child admissions. + const auto nodes=budget.nodes(); + const bool room=!options.solve.node_limit || (nodes<=*options.solve.node_limit && *options.solve.node_limit-nodes>=4); + if (!room || resident>=options.max_open_nodes || + settings.max_probe_status_calls-stats.probe_status_calls<2 || + settings.max_probe_status_calls_per_decision-decision_calls<2 || + (!candidate.history && history.size()>=settings.max_history_entries) || !charge(16)) continue; + branching_event("pair_begin",candidate.slot); + frontier_checkpoint(budget); + const auto first=probe(parent,candidate,0,baseline,frontier,resident); + const auto second=probe(parent,candidate,1,baseline,frontier,resident); + decision_calls+=2; + count_branching(stats.completed_pairs); + down=first.gain;up=second.gain;failed=unsigned(first.failed)+unsigned(second.failed); + branching_event("pair_before_publication",candidate.slot,down,up); + frontier_checkpoint(budget); + if (!failed) { + const auto previous=candidate.history ? history[*candidate.history]:History{candidate.column}; + if (previous.pairs==std::numeric_limits::max()) + throw Interrupted{Termination::MemoryLimit}; + auto next=previous;++next.pairs; + next.down+=(down-next.down)/static_cast(next.pairs); + next.up+=(up-next.up)/static_cast(next.pairs); + if (!std::isfinite(next.down) || !std::isfinite(next.up)) + throw std::runtime_error("Nonfinite native branching history"); + if (candidate.history) history[*candidate.history]=next; + else history.push_back(next); + stats.history_entries=history.size(); + count_branching(stats.published_pairs);count_branching(stats.finite_samples,2); + count_branching(stats.zero_gain_samples,unsigned(down==0)+unsigned(up==0)); + } + count_branching(stats.failed_directions,failed); + branching_event("pair_published",candidate.slot,down,up); + frontier_checkpoint(budget); completed=true; + } +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS + native_branching_test_event("candidate_score",candidate.slot,down,up); + frontier_checkpoint(budget); +#endif + // Scores never carry evidence. Invalid experimental scores lose priority. + if (!std::isfinite(down) || !std::isfinite(up) || down<0 || up<0) down=up=0; + const double low=std::min(down,up),high=std::max(down,up); + const bool better=(failed || high>0) && (!best || failed>best_failed || + (failed==best_failed && (low>best_min || (low==best_min && + (high>best_max || (high==best_max && candidate.slot=settings.max_nonimproving_pairs) break; + } + if (!best) return fallback(); + branching_event("branch_selected",best_slot,best_min,best_max); + frontier_checkpoint(budget);count_branching(stats.manual_splits);return best; + } +}; +#endif + +#ifdef GECODE_OPTIMIZE_WITH_NATIVE +// Source-size accounting counts logical fields, not bytes or propagation work. +// The preflight never allocates a flattened global argument/payload copy. +void neighborhood_source(const ModelSnapshot& model,NeighborhoodBudget& local) { + local.source(3); // Objective marker, offset, sense. + for(const auto& term:model.objective.terms) {(void)term;local.source();} + for(const auto& row:model.rows) { + local.work(); if(!row.active) continue; + local.source(3); // Row marker and bounds. + for(const auto& term:row.terms) {(void)term;local.source();} + } + for(const auto& indicator:model.indicators) { + local.work();if(!indicator.active) continue; + local.source(8); // Identity, activation, bounds, gate, and M fields. + for(const auto& term:indicator.terms) {(void)term;local.source();} + for(const auto& row:indicator.generated_rows) {(void)row;local.source();} + for(const auto& domain:indicator.domains) {(void)domain;local.source(3);} + } + for(const auto& global:model.globals) { + local.work();if(!global.active) continue;local.source(); + std::visit([&](const auto& data) { + using T=std::decay_t; + if constexpr(std::is_same_v) { + for(auto v:data.variables) {(void)v;local.source();} + } else if constexpr(std::is_same_v) { + local.source(3);for(auto v:data.elements) {(void)v;local.source();} + } else if constexpr(std::is_same_v) { + for(auto v:data.variables) {(void)v;local.source();} + for(const auto& row:data.tuples) {local.source();for(auto v:row) {(void)v;local.source();}} + } else if constexpr(std::is_same_v) { + local.source();for(auto v:data.starts) {(void)v;local.source(3);} + } else if constexpr(std::is_same_v) { + local.source();for(auto v:data.successors) {(void)v;local.source();} + } else { + static_assert(std::is_same_v,"Count every original global payload"); + local.source(2); + for(auto v:data.variables) {(void)v;local.source();} + for(const auto& edge:data.transitions) {(void)edge;local.source(3);} + for(auto state:data.final_states) {(void)state;local.source();} + } + },global.payload); + } +} + +struct NeighborhoodWitness { + std::vector values; + std::vector active; + std::int64_t objective=0; + int raw_cost=0; + double started_seconds=0; +}; +struct NeighborhoodPublicationTiming { + const SolveBudget& budget; + NativeNeighborhoodStatistics& statistics; + double started; + ~NeighborhoodPublicationTiming() {statistics.elapsed_seconds=budget.elapsed_seconds()-started;} +}; +struct NeighborhoodFrame { + std::unique_ptr space; + std::unique_ptr choice; + unsigned int next=0; +}; + +std::optional binary_neighborhood(const ModelSnapshot& source, + const Compiled& compiled,const NativeSearchOptions& search, + const NativeNeighborhoodSettings& settings,NativeNeighborhoodStatistics& statistics, + SolveBudget& shared,const std::vector& reference,int reference_normalized, + std::size_t main_resident) { + NeighborhoodBudget local(settings,statistics,shared); + std::vector stack; + std::unique_ptr current; + std::optional candidate; + const auto release=[&] {current.reset();stack.clear();}; + try { + local.check("before_neighborhood"); + if(!settings.max_status_calls) throw NeighborhoodStopped{NeighborhoodCompletion::StatusLimit}; + const auto room=[&] { + local.check();checkpoint(shared); + if(shared.nodes()==std::numeric_limits::max()) + throw Interrupted{Termination::MemoryLimit}; + if(search.solve.node_limit) { + const auto limit=*search.solve.node_limit; + if(shared.nodes()>limit || limit-shared.nodes()<3) + throw NeighborhoodStopped{NeighborhoodCompletion::SharedNodeReserve}; + } + }; + const auto reserve=[&] { + local.check(); + const auto resident=stack.size()+(current?1U:0U); + if(resident>=settings.max_local_spaces || main_resident>=search.max_open_nodes || + resident>=search.max_open_nodes-main_resident) + throw NeighborhoodStopped{NeighborhoodCompletion::LocalStorageLimit}; + statistics.peak_local_spaces=std::max(statistics.peak_local_spaces,resident+1); + statistics.peak_total_spaces=std::max(statistics.peak_total_spaces,main_resident+resident+1); + }; + room(); + std::vector columns; + for(const auto& variable:source.variables) { + local.work();if(!variable.active) continue;local.source(); + if(variable.type!=VariableType::Binary || variable.indicator_origin || + variable.lower!=0 || variable.upper!=1) continue; + if(statistics.eligible_variables==std::numeric_limits::max()) + throw NeighborhoodStopped{NeighborhoodCompletion::FormulationLimit}; + ++statistics.eligible_variables; + if(statistics.eligible_variables>settings.max_distance_variables || + statistics.eligible_variables>static_cast(Int::Limits::max)) + throw NeighborhoodStopped{NeighborhoodCompletion::FormulationLimit}; + columns.push_back(compiled.columns[variable.variable.id]); + } + if(columns.empty()) throw NeighborhoodStopped{NeighborhoodCompletion::NoEligibleBinary}; + if(settings.radius>=columns.size()) throw NeighborhoodStopped{NeighborhoodCompletion::NonrestrictingRadius}; + neighborhood_source(source,local); + // radius < size <= native limit; both RHS subtraction and total absolute + // activity are therefore within the conservative ordinary linear envelope. + IntArgs coefficients(static_cast(columns.size())); + int rhs=static_cast(settings.radius); + for(std::size_t i=0;i(i)]=value==1?-1:1; + if(value==1) --rhs; + } + reserve();room(); + statistics.attempts=1; + local.check("neighborhood_root_alloc"); + // The local budget parameter also suppresses LP attachment, without editing + // compiled data or the main search's backend/evidence/scheduling state. + current=std::make_unique(compiled,shared,&local); + IntVarArgs variables(static_cast(columns.size())); + for(std::size_t i=0;i(i)]=current->variables[columns[i]]; + } + local.check("before_neighborhood_distance"); + linear(*current,coefficients,variables,IRT_LQ,rhs); + local.check("before_neighborhood_cutoff"); + const int reference_raw=compiled.minimize?reference_normalized:-reference_normalized; + rel(*current,current->cost,compiled.minimize?IRT_LE:IRT_GR,reference_raw); + local.check("after_neighborhood_cutoff"); + for(;;) { + local.work();room(); + if(statistics.status_attempts>=settings.max_status_calls) + throw NeighborhoodStopped{NeighborhoodCompletion::StatusLimit}; + shared.add_nodes();++statistics.status_attempts; + local.check("before_neighborhood_status"); + const auto status=current->status(); + ++statistics.completed_status_calls; + local.check("after_neighborhood_status"); + if(status==SS_SOLVED) { + ++statistics.feasible_candidates; + NeighborhoodWitness staged; + staged.started_seconds=local.start_seconds(); + staged.values.assign(source.variables.size(),std::numeric_limits::quiet_NaN()); + staged.active.reserve(source.variables.size()); + for(const auto& variable:source.variables) {local.work();staged.active.push_back(variable.active);} + for(std::size_t i=0;ivariables[static_cast(i)].val(); + } + neighborhood_event("before_neighborhood_validation",0,0,0,&staged.values); + local.check(); + staged.objective=check_exact(source,staged.values,nullptr,&local); + staged.raw_cost=current->cost.val(); + if(staged.objective!=compiled.offset+staged.raw_cost) + throw std::runtime_error("Neighborhood cost disagrees with exact original objective"); + const auto checked=validate(source,staged.values,search.solve.feasibility_tolerance, + search.solve.integrality_tolerance); + local.check("after_neighborhood_validation"); + if(!checked.valid || !checked.objective || *checked.objective!=static_cast(staged.objective)) + throw std::runtime_error("Neighborhood original-model numerical validation failed: "+checked.message); + std::size_t distance=0; + for(int column:columns) { + local.work();const auto slot=compiled.variables[column].slot; + if(staged.values[slot]!=reference[slot]) ++distance; + } + const int normalized=compiled.minimize?staged.raw_cost:-staged.raw_cost; + if(distance>settings.radius || normalized>=reference_normalized) + throw std::runtime_error("Neighborhood witness violates its distance or strict improvement restriction"); + candidate=std::move(staged);statistics.completion=NeighborhoodCompletion::Improved;break; + } + if(status==SS_FAILED) {++statistics.failed_nodes;current.reset();} + else if(status==SS_BRANCH) { + local.work();local.check("neighborhood_choice"); + std::unique_ptr choice(current->choice()); + if(!choice || choice->alternatives()!=2) + throw std::runtime_error("Neighborhood requires the ordinary two-alternative brancher"); + stack.push_back({std::move(current),std::move(choice),0}); + } else throw std::runtime_error("Unexpected neighborhood Space status"); + while(!stack.empty() && stack.back().next==stack.back().choice->alternatives()) { + local.work();stack.pop_back(); + } + if(stack.empty()) {statistics.completion=NeighborhoodCompletion::NoImprovement;break;} + local.work();room();reserve(); + auto& frame=stack.back(); + local.check("neighborhood_child_clone"); + current.reset(static_cast(frame.space->clone())); + current->commit(*frame.choice,frame.next++); + local.check("neighborhood_child_committed"); + } + } catch(const NeighborhoodStopped& stop) { + statistics.completion=stop.reason;candidate.reset(); + } catch(const Interrupted& stop) { + statistics.completion=NeighborhoodCompletion::GlobalStop;statistics.stop_reason=stop.reason; + release();local.finish();throw; + } catch(...) { + statistics.completion=NeighborhoodCompletion::Error; + release();local.finish();throw; + } + release(); + try {local.check("after_neighborhood_release");} + catch(const NeighborhoodStopped& stop) {statistics.completion=stop.reason;candidate.reset();} + catch(const Interrupted& stop) { + statistics.completion=NeighborhoodCompletion::GlobalStop;statistics.stop_reason=stop.reason; + local.finish();throw; + } catch(...) {statistics.completion=NeighborhoodCompletion::Error;local.finish();throw;} + local.finish();return candidate; +} +#endif + +NativeSearchResult native_frontier_impl(const ModelSnapshot& model, + const NativeSearchOptions& options, SolveBudget& budget, + const NativeNeighborhoodSettings* neighborhoods=nullptr, + NativeNeighborhoodStatistics* neighborhood_statistics=nullptr) { + NativeSearchResult output; + auto& result = output.result; + auto& statistics = output.frontier; + result.model_id = model.model_id; result.revision = model.revision; + result.backend = options.relaxation ? "Gecode native frontier + checked LP" : "Gecode native frontier"; + if(neighborhoods) result.backend += " + BinaryHamming"; + output.branching.requested=bool(options.branching); +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + std::vector frontier; + std::unique_ptr parent; + std::optional active_bound, initial_bound, incumbent; + std::int64_t offset = 0; + bool minimize = true, fallback_bound = false; + std::uint64_t serial = 0; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + RelaxationState relaxation; +#endif +#else + (void)statistics; +#endif + if (options.relaxation && options.relaxation->root_cover_cuts) { + output.relaxation.root_cover.requested=true; + output.relaxation.root_cover.completion=NativeRootCoverCompletion::NotStarted; +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + relaxation.root=output.relaxation.root_cover; +#endif + } + try { + options.validate();if(neighborhoods) neighborhoods->validate();result.guarantee = options.solve.guarantee; + validate_structure(model); + if (options.solve.backend != Backend::Auto && options.solve.backend != Backend::Native) + throw Unsupported("Native frontier requires backend Auto or Native"); + if (options.solve.guarantee == Guarantee::Certified) + throw Unsupported("Native frontier does not export independently checkable solve certificates"); + if (options.solve.threads != 1 || options.solve.random_seed != 0) + throw Unsupported("Native frontier supports one worker and seed zero"); +#ifndef GECODE_OPTIMIZE_WITH_NATIVE + throw Unsupported("Built without the native Gecode bridge"); +#else + result.backend_version = GECODE_VERSION; +#ifndef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (options.relaxation) + throw Unsupported("Native frontier checked LP requires HiGHS and checked 128-bit compiler arithmetic"); +#endif + checkpoint(budget); + auto compiled = compile(model, budget); + minimize = compiled.minimize; offset = compiled.offset; + initial_bound = minimize ? compiled.cost_lower : -compiled.cost_upper; + active_bound = initial_bound; // The entire original region is represented. + if (!options.solve.primal_start.empty()) { + auto start = prepare_start(model, compiled, options.solve, budget); + const int normalized = minimize ? start.cost : -start.cost; + publish_start(std::move(start), result, budget); + incumbent = normalized; + start_checkpoint(budget, "after_start_publication"); + } +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + if (options.relaxation) { + prepare_relaxation(compiled,*options.relaxation,budget,relaxation); + result.backend_version += std::string("; HiGHS ") + Highs().version(); + checkpoint(budget); + } +#endif + const auto reserve_space = [&] { + const auto resident = frontier.size() + (active_bound ? 1U : 0U); + // The root's reservation is made separately, before construction. + if (resident >= options.max_open_nodes) throw Interrupted{Termination::MemoryLimit}; + statistics.peak_open_nodes = std::max(statistics.peak_open_nodes, resident + 1); + }; + const auto enqueue = [&](std::unique_ptr& space, int bound) { + if (serial == std::numeric_limits::max()) + throw Interrupted{Termination::MemoryLimit}; + bool contains_witness = options.order == NativeSearchOrder::BestBound && + bool(space->knapsack_witness); + for (std::size_t i = 0; contains_witness && i < space->knapsack_witness->size(); ++i) { + frontier_checkpoint(budget); + contains_witness = space->variables[static_cast(i)].in((*space->knapsack_witness)[i]); + } + // Compute preference once on the stable space. The comparator never + // scans domains, and the exact objective bound remains the primary key. + frontier.push_back({std::move(space), bound, serial++, contains_witness}); + if (options.order == NativeSearchOrder::BestBound) + std::push_heap(frontier.begin(), frontier.end(), FrontierCompare{}); + }; + const auto evaluate = [&](NativeSpace& space, int& inherited) { + checkpoint(budget); + if (budget.nodes()==std::numeric_limits::max()) + throw Interrupted{Termination::MemoryLimit}; + budget.add_nodes(); ++statistics.admitted_nodes; + frontier_event("before_propagation"); + frontier_checkpoint(budget); + const auto status = space.status(); + frontier_event("after_propagation"); + frontier_checkpoint(budget); + if (status == SS_FAILED) { ++statistics.failed_nodes; return false; } + inherited = std::max(inherited, minimize ? space.cost.min() : -space.cost.max()); + if (incumbent && inherited >= *incumbent) { + ++statistics.bound_pruned_nodes; return false; + } + if (status == SS_SOLVED) { + std::vector values(model.variables.size(), std::numeric_limits::quiet_NaN()); + std::vector mask; + for (const auto& variable : model.variables) mask.push_back(variable.active); + for (std::size_t i = 0; i < compiled.variables.size(); ++i) { + frontier_checkpoint(budget); + values[compiled.variables[i].slot] = space.variables[static_cast(i)].val(); + } + frontier_event("before_validation"); + const auto objective = check_exact(model, values); + if (objective != offset + space.cost.val()) + throw std::runtime_error("Native frontier cost disagrees with the exact original objective"); + const auto checked = validate(model, values, options.solve.feasibility_tolerance, + options.solve.integrality_tolerance); + if (!checked.valid || !checked.objective || *checked.objective != static_cast(objective)) + throw std::runtime_error("Native frontier original-model witness validation failed: " + checked.message); + frontier_event("after_validation"); + frontier_checkpoint(budget); + const int value = minimize ? space.cost.val() : -space.cost.val(); + // All allocating validation/copy work precedes this publication gate. + result.values = std::move(values); result.active_variables = std::move(mask); + result.objective = static_cast(objective); result.solution_validated = true; + incumbent = value; ++statistics.feasible_leaves; + return false; + } + if (status != SS_BRANCH) throw std::runtime_error("Unexpected native frontier space status"); + return true; + }; + if (!options.max_open_nodes) throw Interrupted{Termination::MemoryLimit}; + statistics.peak_open_nodes = 1; + frontier_event("root_alloc"); + parent = std::make_unique(compiled, budget, nullptr, + !options.relaxation, options.order == NativeSearchOrder::DepthFirst); + if (incumbent) start_cutoff(*parent, minimize ? *incumbent : -*incumbent, budget); + if (evaluate(*parent, *active_bound)) enqueue(parent, *active_bound); + parent.reset(); active_bound.reset(); + BinaryReliability branching(options,model,compiled,budget,output.branching); + while (!frontier.empty()) { + frontier_checkpoint(budget); + if (options.order == NativeSearchOrder::BestBound) + std::pop_heap(frontier.begin(), frontier.end(), FrontierCompare{}); + active_bound = frontier.back().bound; + parent = std::move(frontier.back().space); frontier.pop_back(); + if (incumbent && *active_bound >= *incumbent) { + ++statistics.bound_pruned_nodes; parent.reset(); active_bound.reset(); continue; + } + if(neighborhoods && incumbent && neighborhood_statistics->completion==NeighborhoodCompletion::NotStarted) { +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS + for(std::size_t i=0;ivariables[static_cast(i)].min(),parent->variables[static_cast(i)].max()); +#endif + auto improvement=binary_neighborhood(model,compiled,options,*neighborhoods,*neighborhood_statistics, + budget,result.values,*incumbent,frontier.size()+1); + if(improvement) { + NeighborhoodPublicationTiming timing{budget,*neighborhood_statistics,improvement->started_seconds}; + // Local owners are already released. Complete nonthrowing publication + // precedes the next hook/checkpoint, including scalar cost installation. + frontier_checkpoint(budget); + neighborhood_event("before_neighborhood_publication"); + frontier_checkpoint(budget); + neighborhood_statistics->elapsed_seconds=budget.elapsed_seconds()-improvement->started_seconds; + if(neighborhood_statistics->elapsed_seconds>=neighborhoods->time_limit_seconds) { + neighborhood_statistics->completion=NeighborhoodCompletion::LocalTimeLimit; + improvement.reset(); + } else { + const int normalized=minimize?improvement->raw_cost:-improvement->raw_cost; + result.values=std::move(improvement->values);result.active_variables=std::move(improvement->active); + result.objective=static_cast(improvement->objective);result.solution_validated=true; + incumbent=normalized;++neighborhood_statistics->accepted_improvements; + neighborhood_event("after_neighborhood_publication"); + frontier_checkpoint(budget); + } + } + if(incumbent && *active_bound>=*incumbent) { + ++statistics.bound_pruned_nodes;parent.reset();active_bound.reset();continue; + } + } + // The stable parent remains represented until every alternative is + // evaluated and safely enqueued or discharged. Child failure cannot + // erase an unvisited sibling from the global-bound calculation. + const auto manual=options.branching ? branching.select(*parent,*active_bound,statistics,frontier.size()+1):std::optional{}; + std::unique_ptr choice; + if (!manual) choice.reset(parent->choice()); + if (!manual && (!choice || !choice->alternatives())) throw std::runtime_error("Native branch has no alternatives"); + const auto alternatives=manual ? 2U:choice->alternatives(); + ++statistics.expanded_nodes; + for (unsigned int alternative = 0; alternative < alternatives; ++alternative) { + checkpoint(budget); + reserve_space(); + frontier_event("child_clone"); + std::unique_ptr child(static_cast(parent->clone())); + if (manual) BinaryReliability::commit(*child,*manual,alternative); + else child->commit(*choice, alternative); + frontier_event("child_committed"); + if (incumbent) + rel(*child, child->cost, minimize ? IRT_LE : IRT_GR, minimize ? *incumbent : -*incumbent); + int child_bound = *active_bound; + if (evaluate(*child, child_bound)) { + enqueue(child, child_bound); + frontier_event("child_enqueued"); + frontier_checkpoint(budget); + } + } + parent.reset(); active_bound.reset(); + frontier_event("parent_discharged"); + } + frontier_checkpoint(budget); + result.termination = result.has_solution() ? Termination::Optimal : Termination::Infeasible; + result.message = "All native frontier regions exhausted or pruned by exact incumbent bounds"; + if(neighborhood_statistics && neighborhood_statistics->completion==NeighborhoodCompletion::NotStarted) + neighborhood_statistics->completion=incumbent?NeighborhoodCompletion::ProofCompletedBeforeAttempt:NeighborhoodCompletion::NoIncumbent; +#endif + } catch (const Unsupported& error) { + result.termination = Termination::Unsupported; result.message = error.what(); + } catch (const Interrupted& error) { + result.termination = error.reason; + result.message = error.reason == Termination::MemoryLimit ? "Native frontier open-node storage limit reached" + : "Native frontier shared solve budget stopped"; + } catch (const ModelError& error) { + result.termination = Termination::InvalidModel; result.message = error.what(); + } catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; result.message = "Native frontier allocation failed"; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + } catch (const MemoryExhausted& error) { + result.termination = Termination::MemoryLimit; result.message = error.what(); +#endif + } catch (const std::exception& error) { + result.termination = Termination::BackendError; result.message = error.what(); +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + fallback_bound = true; +#endif + } +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + output.branching.budget_nodes=budget.nodes(); + statistics.unresolved_regions = frontier.size() + (active_bound ? 1U : 0U); + std::optional global = incumbent; + const auto include = [&](int value) { global = global ? std::min(*global, value) : value; }; + for (const auto& node : frontier) include(node.bound); + if (active_bound) include(*active_bound); + // A semantic implementation failure cannot authorize propagated evidence. + if (fallback_bound) global = initial_bound; + if (result.termination != Termination::Infeasible && global) { + result.best_bound = static_cast(offset + (minimize ? *global : -*global)); + result.update_gaps(model.objective.sense); + } +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + output.relaxation=relaxation_statistics(relaxation); +#endif + // Charge release of the owning frontier to the same end-to-end deadline. + frontier.clear(); parent.reset(); + if (result.start_submitted) { +#ifdef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + relaxation = RelaxationState{}; +#endif + if (finish_start(result, budget)) { + result.best_bound = initial_bound ? std::optional(static_cast(offset + (minimize ? *initial_bound : -*initial_bound))) : std::nullopt; + result.update_gaps(model.objective.sense); + } + } + if (budget.cancelled() || budget.time_limit_reached()) { + result.termination = budget.cancelled() ? Termination::Cancelled : Termination::TimeLimit; + result.message = "Native frontier time/cancellation budget stopped before return"; + } +#endif + result.elapsed_seconds = budget.elapsed_seconds(); + if(neighborhood_statistics) { + neighborhood_statistics->budget_nodes=budget.nodes(); + neighborhood_statistics->peak_total_spaces=std::max(neighborhood_statistics->peak_total_spaces, + statistics.peak_open_nodes); + if(neighborhood_statistics->completion==NativeNeighborhoodCompletion::Error) + neighborhood_statistics->stop_reason=result.termination; + else if(neighborhood_statistics->completion==NativeNeighborhoodCompletion::Improved && + !neighborhood_statistics->accepted_improvements) { + neighborhood_statistics->completion=result.termination==Termination::BackendError + ?NativeNeighborhoodCompletion::Error:NativeNeighborhoodCompletion::GlobalStop; + neighborhood_statistics->stop_reason=result.termination; + } + else if(neighborhood_statistics->completion==NativeNeighborhoodCompletion::NotStarted && + result.termination!=Termination::Optimal && result.termination!=Termination::Infeasible) { + neighborhood_statistics->completion=NativeNeighborhoodCompletion::GlobalStop; + neighborhood_statistics->stop_reason=result.termination; + } + } + return output; +} +NativeSearchResult frontier_failure(ModelId id, Revision revision, const NativeSearchOptions& options, + Termination termination, const std::string& message) { + NativeSearchResult output; auto& result = output.result; + result.model_id = id; result.revision = revision; result.guarantee = options.solve.guarantee; + result.backend = options.relaxation ? "Gecode native frontier + checked LP" : "Gecode native frontier"; + output.branching.requested=bool(options.branching); + if(options.relaxation && options.relaxation->root_cover_cuts) { + output.relaxation.root_cover.requested=true; + output.relaxation.root_cover.completion=NativeRootCoverCompletion::NotStarted; + } + result.termination = termination; result.message = message; return output; +} +} // namespace + +NativeSearchResult solve_native_search(const ModelSnapshot& model, const NativeSearchOptions& options) { + try { + SolveBudget budget(options.solve); + return native_frontier_impl(model, options, budget); + } catch (const ModelError& error) { + return frontier_failure(model.model_id, model.revision, options, Termination::InvalidModel, error.what()); + } catch (const std::bad_alloc&) { + return frontier_failure(model.model_id, model.revision, options, Termination::MemoryLimit, "Native frontier allocation failed"); + } +} +NativeSearchResult solve_native_search(const Model& model, const NativeSearchOptions& options) { + try { + SolveBudget budget(options.solve); + return native_frontier_impl(model.snapshot(), options, budget); + } catch (const ModelError& error) { + return frontier_failure(model.id(), model.revision(), options, Termination::InvalidModel, error.what()); + } catch (const std::bad_alloc&) { + return frontier_failure(model.id(), model.revision(), options, Termination::MemoryLimit, "Native frontier snapshot allocation failed"); + } +} + +void NativeNeighborhoodSettings::validate() const { + if(policy!=NativeNeighborhoodPolicy::BinaryHamming) + throw ModelError("Unknown native neighborhood policy"); + if(!std::isfinite(time_limit_seconds) || time_limit_seconds<0) + throw ModelError("Native neighborhood time limit must be finite and nonnegative"); +} +void NativeNeighborhoodOptions::validate() const { + search.validate();neighborhood.validate(); +} +namespace { +NativeNeighborhoodResult neighborhood_failure(ModelId id,Revision revision, + const NativeNeighborhoodOptions& options,Termination reason,const std::string& message) { + NativeNeighborhoodResult out; + out.search=frontier_failure(id,revision,options.search,reason,message); + out.search.result.backend+=" + BinaryHamming"; + out.neighborhood.requested=true; + out.neighborhood.completion=NativeNeighborhoodCompletion::GlobalStop; + out.neighborhood.stop_reason=reason; + return out; +} +} +NativeNeighborhoodResult solve_native_neighborhoods(const ModelSnapshot& model, + const NativeNeighborhoodOptions& options) { + try { + NativeNeighborhoodResult out;out.neighborhood.requested=true; + SolveBudget budget(options.search.solve); + out.search=native_frontier_impl(model,options.search,budget,&options.neighborhood,&out.neighborhood); + return out; + } catch(const ModelError& error) { + return neighborhood_failure(model.model_id,model.revision,options,Termination::InvalidModel,error.what()); + } catch(const std::bad_alloc&) { + return neighborhood_failure(model.model_id,model.revision,options,Termination::MemoryLimit,"Native neighborhood allocation failed"); + } +} +NativeNeighborhoodResult solve_native_neighborhoods(const Model& model, + const NativeNeighborhoodOptions& options) { + try { + NativeNeighborhoodResult out;out.neighborhood.requested=true; + SolveBudget budget(options.search.solve); + out.search=native_frontier_impl(model.snapshot(),options.search,budget,&options.neighborhood,&out.neighborhood); + return out; + } catch(const ModelError& error) { + return neighborhood_failure(model.id(),model.revision(),options,Termination::InvalidModel,error.what()); + } catch(const std::bad_alloc&) { + return neighborhood_failure(model.id(),model.revision(),options,Termination::MemoryLimit,"Native neighborhood snapshot allocation failed"); + } +} + +namespace { +enum class AutomaticNativeRoute { Native, RootLp, UpdatedLp, ReliabilityLp }; +struct AutomaticNativeSelection { + AutomaticNativeRoute route = AutomaticNativeRoute::Native; + const char* reason = "ordinary native search"; + bool covers = false; +}; + +AutomaticNativeSelection select_native_route(const ModelSnapshot& model, + const SolveOptions& options, const SolveBudget& budget) { + // Optional routes must never change acceptance of an explicit native option. + if ((options.backend != Backend::Auto && options.backend != Backend::Native) || + options.guarantee == Guarantee::Certified || options.threads != 1 || options.random_seed != 0) + return {AutomaticNativeRoute::Native,"native option compatibility"}; +#ifndef GECODE_OPTIMIZE_NATIVE_LP_ENABLED + (void)model; (void)budget; + return {AutomaticNativeRoute::Native,"checked LP unavailable"}; +#else + // Bound selection's extra work before calling the full native validator or + // compiler. The ordinary route still validates every uninspected input. + constexpr std::size_t max_columns = 4096, max_rows = 4096, max_nonzeros = 65536; + if (model.variables.size() > max_columns || model.rows.size() > max_rows || + model.objective.terms.size() > max_nonzeros) + return {AutomaticNativeRoute::Native,"structural inspection cap"}; + if (!model.globals.empty() || !model.indicators.empty()) + return {AutomaticNativeRoute::Native,"global or indicator structure"}; + std::size_t nonzeros = model.objective.terms.size(), active_variables = 0; + for (const auto& variable : model.variables) { + checkpoint(budget); + if (!variable.active) continue; + ++active_variables; + if (variable.type != VariableType::Binary) + return {AutomaticNativeRoute::Native,"nonbinary variables"}; + } + if (active_variables <= 4) + return {AutomaticNativeRoute::Native,"tiny model"}; + for (const auto& row : model.rows) { + checkpoint(budget); + if (row.terms.size() > max_nonzeros-nonzeros) + return {AutomaticNativeRoute::Native,"structural inspection cap"}; + nonzeros += row.terms.size(); + } + validate_structure(model); + checkpoint(budget); + const auto compiled = compile(model,budget); + if (!compiled.binary_domains || compiled.rows.empty()) + return {AutomaticNativeRoute::Native,"binary domain or row structure"}; + if (prepare_knapsack(compiled,budget)) + return {AutomaticNativeRoute::Native,"eligible exact knapsack DP"}; + // Use the same checked-LP numeric admission as the explicit LP API, without + // constructing an LP backend or solving a relaxation during selection. + try { (void)relaxation_model(compiled,budget); } + catch (const Unsupported&) { + return {AutomaticNativeRoute::Native,"checked LP numeric admission"}; + } + bool unit = true, nonnegative = true; + for (const auto& row : compiled.rows) for (const auto& term : row.terms) { + checkpoint(budget); + unit = unit && (term.coefficient == 1 || term.coefficient == -1); + nonnegative = nonnegative && term.coefficient >= 0; + } + if (unit && nonnegative) + return {AutomaticNativeRoute::RootLp,"root checked LP for nonnegative unit rows"}; + if (unit) + return {AutomaticNativeRoute::UpdatedLp,"updated checked LP for signed unit rows"}; + if (options.relative_gap != 0 || options.absolute_gap != 0) + return {AutomaticNativeRoute::UpdatedLp,"updated checked LP with covers; gap-compatible BAB",true}; + return {AutomaticNativeRoute::ReliabilityLp,"updated checked LP, covers and binary reliability",true}; +#endif +} + +SolveResult native_auto_impl(const ModelSnapshot& model, const SolveOptions& options, + SolveBudget& budget) { + SolveResult result; + result.model_id=model.model_id; result.revision=model.revision; + result.backend="Gecode native"; result.guarantee=options.guarantee; + AutomaticNativeSelection selected; + try { + selected=select_native_route(model,options,budget); + if (selected.route == AutomaticNativeRoute::Native) { + result=solve_native_impl(model,options,nullptr,nullptr,&budget); + } else { + NativeLpOptions lp; lp.solve=options; + if (selected.route != AutomaticNativeRoute::RootLp) { + lp.frequency=NativeLpFrequency::AfterBoundChanges; + lp.bound_change_interval=4; + } + if (selected.covers) lp.root_cover_cuts=NativeRootCoverSettings{}; + if (selected.route == AutomaticNativeRoute::ReliabilityLp) { + NativeSearchOptions search; search.solve=options; + search.order=NativeSearchOrder::DepthFirst; + search.relaxation=static_cast(lp); + search.branching=NativeBranchingSettings{}; + search.branching->max_probe_status_calls=128; + // Keep the public search default's frontier storage allowance. + result=native_frontier_impl(model,search,budget).result; + } else { + NativeLpStatistics statistics; + result=solve_native_impl(model,options,&lp,&statistics,&budget); + } + } + } catch (const Interrupted& error) { + // Preserve native structural-error precedence even if bounded inspection + // observes a stop before reaching validate_structure. No search can start + // because the same exhausted/cancelled budget reaches the native bridge. + (void)error; + result=solve_native_impl(model,options,nullptr,nullptr,&budget); + } catch (const Unsupported& error) { + result.termination=Termination::Unsupported; result.message=error.what(); + } catch (const ModelError& error) { + result.termination=Termination::InvalidModel; result.message=error.what(); + } catch (const std::bad_alloc&) { + result.termination=Termination::MemoryLimit; result.message="Native automatic selection allocation failed"; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + } catch (const MemoryExhausted& error) { + result.termination=Termination::MemoryLimit; result.message=error.what(); +#endif + } catch (const std::exception& error) { + result.termination=Termination::BackendError; result.message=error.what(); + } + result.message=std::string("Automatic native policy: ")+selected.reason+"; "+result.message; + result.elapsed_seconds=budget.elapsed_seconds(); + return result; +} + +// Transformations are internal and single-pass. Explicit native APIs retain +// their original behavior; all callbacks keep the same global budget. +SolveResult native_auto_pipeline(const ModelSnapshot& model, const SolveOptions& options, + SolveBudget& budget) { +#ifndef GECODE_OPTIMIZE_WITH_NATIVE + return native_auto_impl(model,options,budget); +#else + const auto fallback=[&]{return native_auto_impl(model,options,budget);}; + if (!options.primal_start.empty() || options.guarantee==Guarantee::Certified || + (options.backend!=Backend::Auto && options.backend!=Backend::Native) || + options.threads!=1 || options.random_seed!=0 || + !model.globals.empty() || !model.indicators.empty() || + model.variables.size()>4096 || model.rows.size()>4096 || + model.objective.terms.size()>65536) return fallback(); + std::size_t nonzeros=model.objective.terms.size(); + for(const auto& v:model.variables) if(v.active && + v.type!=VariableType::Integer && v.type!=VariableType::Binary)return fallback(); + for(const auto& row:model.rows){ + if(row.terms.size()>65536-nonzeros)return fallback(); + nonzeros+=row.terms.size(); + } + try { + // Preserve original native numeric/structural admission before reductions + // could erase an unsupported term or contradiction. + validate_structure(model);checkpoint(budget); + const auto compiled=compile(model,budget); + if(prepare_knapsack(compiled,budget))return fallback(); + const Detail::NativeSolveContinuation leaf=[](const ModelSnapshot& m, + const SolveOptions& o,SolveBudget& b){return native_auto_impl(m,o,b);}; + const Detail::NativeSolveContinuation symmetric=[&](const ModelSnapshot& m, + const SolveOptions& o,SolveBudget& b){ + // A reduced/component model can itself become a DP candidate. + try { + if(prepare_knapsack(compile(m,b),b))return leaf(m,o,b); + } catch(const Unsupported&) { + // Let the ordinary leaf report admission rather than throwing through + // the presolve coordinator, which can then retain the original model. + return leaf(m,o,b); + } + if(auto result=Detail::native_symmetry(m,o,b,leaf))return *result; + return leaf(m,o,b); + }; + const Detail::NativeSolveContinuation components=[&](const ModelSnapshot& m, + const SolveOptions& o,SolveBudget& b){ + if(auto result=Detail::native_components(m,o,b,symmetric))return *result; + return symmetric(m,o,b); + }; + auto result=Detail::native_presolve(model,options,budget,components); + auto solved=result ? std::move(*result):components(model,options,budget); + solved.message="Automatic native policy: preprocessing; "+solved.message; + solved.elapsed_seconds=budget.elapsed_seconds(); + return solved; + } catch(const Interrupted&) {return fallback();} + catch(const Unsupported&) {return fallback();} + catch(const ModelError&) {return fallback();} + catch(const std::bad_alloc&) { + SolveResult result;result.model_id=model.model_id;result.revision=model.revision; + result.backend="Gecode native";result.guarantee=options.guarantee; + result.termination=Termination::MemoryLimit; + result.message="Automatic native policy: preprocessing allocation failed"; + result.elapsed_seconds=budget.elapsed_seconds();return result; + } +#endif +} + +template +SolveResult native_auto_entry(const Source& source, const SolveOptions& options, + ModelId id, Revision revision) { + const auto started=std::chrono::steady_clock::now(); + SolveResult result; result.model_id=id; result.revision=revision; + result.backend="Gecode native"; result.guarantee=options.guarantee; + try { + SolveBudget budget(options); + if constexpr (std::is_same_v) + result=native_auto_pipeline(source.snapshot(),options,budget); + else result=native_auto_pipeline(source,options,budget); + // Include transformation/artifact cleanup in the publication deadline. + // Ordinary timed incumbents and the explicit-start path retain their existing + // capture semantics; a newly completed preprocessing proof must be timely. + if (result.message.find("Automatic native policy: preprocessing;")==0 && + (result.termination==Termination::Optimal || result.termination==Termination::Infeasible) && + (budget.cancelled() || budget.time_limit_reached())) { + result=SolveResult{};result.model_id=id;result.revision=revision; + result.backend="Gecode native";result.guarantee=options.guarantee; + result.termination=budget.cancelled()?Termination::Cancelled:Termination::TimeLimit; + result.message="Automatic native policy: preprocessing cleanup exhausted deadline"; + } + } catch (const ModelError& error) { + result.termination=Termination::InvalidModel; + result.message=std::string("Automatic native policy: native validation; ")+error.what(); + } catch (const std::bad_alloc&) { + result.termination=Termination::MemoryLimit; + result.message="Automatic native policy: native preparation allocation failed"; + } + result.elapsed_seconds=std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return result; +} +} + +SolveResult solve_native_auto(const ModelSnapshot& model, const SolveOptions& options) { + return native_auto_entry(model,options,model.model_id,model.revision); +} +SolveResult solve_native_auto(const Model& model, const SolveOptions& options) { + return native_auto_entry(model,options,model.id(),model.revision()); +} + +void NativeRaceOptions::validate() const { + solve.validate(); + if (!std::isfinite(exploration_seconds) || exploration_seconds<0.0) + throw ModelError("native race exploration time must be nonnegative and finite"); + if (!probe_node_limit) + throw ModelError("native race probe node allowance must be positive"); +} + +namespace { +SolveResult native_race_impl(const ModelSnapshot& model,const NativeRaceOptions& options, + SolveBudget& budget) { + const auto& solve=options.solve; + // Never reinterpret incompatible options or disturb supplied-start semantics. + if (options.exploration_seconds==0 || !solve.primal_start.empty() || + !model.globals.empty() || !model.indicators.empty() || + solve.guarantee==Guarantee::Certified || solve.threads!=1 || solve.random_seed!=0 || + (solve.backend!=Backend::Auto && solve.backend!=Backend::Native) || + !native_capabilities().available) { + auto result=native_auto_pipeline(model,solve,budget); + result.message="Native race skipped (disabled or direct-path compatibility); "+result.message; + return result; + } + const bool minimize=model.objective.sense==ObjectiveSense::Minimize; + const auto better_value=[&](double a,double b){return minimize ? ab;}; + const auto better_bound=[&](double a,double b){return minimize ? a>b:a incumbent; + std::optional bound; + unsigned probes=0; + auto observe=[&](const SolveResult& result){ + // Each candidate solves this same original model; preprocessing restores and + // checks original coordinates before returning. Never compare partial points. + if(result.has_solution() && (!incumbent || better_value(*result.objective,*incumbent->objective))) + incumbent=result; + if(result.best_bound && !std::isnan(*result.best_bound) && + (!bound || better_bound(*result.best_bound,*bound)))bound=result.best_bound; + }; + const auto run=[&](bool automatic,SolveBudget& allowance){ + auto result=automatic ? native_auto_pipeline(model,solve,allowance): + solve_native_impl(model,solve,nullptr,nullptr,&allowance); + // A completed proof is only published after destruction of candidate-local + // artifacts. Reaching a node cap on the final admitted node is permitted. + if((result.termination==Termination::Optimal || result.termination==Termination::Infeasible) && + (allowance.cancelled() || allowance.time_limit_reached())) { + result=SolveResult{};result.model_id=model.model_id;result.revision=model.revision; + result.backend="Gecode native";result.guarantee=solve.guarantee; + result.termination=allowance.cancelled()?Termination::Cancelled:Termination::TimeLimit; + result.message="Native race candidate cleanup exhausted deadline"; + } + return result; + }; + const auto complete=[](const SolveResult& r){return r.termination==Termination::Optimal || + r.termination==Termination::Infeasible;}; + const auto failed=[](const SolveResult& r){return r.termination==Termination::InvalidModel || + r.termination==Termination::Unsupported || r.termination==Termination::BackendError || + r.termination==Termination::MemoryLimit || r.termination==Termination::NumericalFailure;}; + const auto finish=[&](SolveResult result,const char* selected){ + if(!complete(result)) { + if(incumbent && (!result.has_solution() || better_value(*incumbent->objective,*result.objective))) { + result.values=std::move(incumbent->values); + result.active_variables=std::move(incumbent->active_variables); + result.objective=incumbent->objective;result.solution_validated=true; + } + if(bound && (!result.best_bound || better_bound(*bound,*result.best_bound)))result.best_bound=bound; + if(auto reason=budget.stop_reason())result.termination=*reason; + result.update_gaps(model.objective.sense); + } + result.message="Native sequential race: "+std::to_string(probes)+" probes; selected "+selected+ + "; cumulative nodes="+std::to_string(budget.nodes())+ + "; exploration/restart may increase CPU work and solve time; "+result.message; + result.elapsed_seconds=budget.elapsed_seconds();return result; + }; + // Budget slices share the original clock/cancellation/node counter. Reserve + // most of a finite deadline for exploitation; no hidden fresh solve budget. + const auto exploration=std::min(options.exploration_seconds,budget.remaining_seconds()*0.25); + auto automatic_budget=budget.slice(exploration/2,options.probe_node_limit); + auto automatic=run(true,automatic_budget);++probes;observe(automatic); + if(complete(automatic) || failed(automatic) || budget.expired())return finish(std::move(automatic),"automatic"); + auto plain_budget=budget.slice(exploration/2,options.probe_node_limit); + auto plain=run(false,plain_budget);++probes;observe(plain); + if(complete(plain) || budget.expired())return finish(std::move(plain),"ordinary native"); + bool use_automatic=true; + if(!failed(plain)) { + if(plain.has_solution() != automatic.has_solution())use_automatic=automatic.has_solution(); + else if(plain.has_solution() && plain.objective!=automatic.objective) + use_automatic=!better_value(*plain.objective,*automatic.objective); + else if(plain.best_bound && (!automatic.best_bound || better_bound(*plain.best_bound,*automatic.best_bound))) + use_automatic=false; + } + // Intentionally restart: these engines do not export resumable search state. + // Keep probe incumbents separately so an unproductive restart cannot lose them. + auto result=run(use_automatic,budget);observe(result); + return finish(std::move(result),use_automatic?"automatic":"ordinary native"); +} + +template +SolveResult native_race_entry(const Source& source,const NativeRaceOptions& options, + ModelId id,Revision revision) { + const auto started=std::chrono::steady_clock::now(); + SolveResult result;result.model_id=id;result.revision=revision; + result.backend="Gecode native";result.guarantee=options.solve.guarantee; + try { + SolveBudget budget(options.solve);options.validate(); + if constexpr(std::is_same_v)result=native_race_impl(source.snapshot(),options,budget); + else result=native_race_impl(source,options,budget); + if((result.termination==Termination::Optimal || result.termination==Termination::Infeasible) && + (budget.cancelled() || budget.time_limit_reached())) { + result=SolveResult{};result.model_id=id;result.revision=revision; + result.backend="Gecode native";result.guarantee=options.solve.guarantee; + result.termination=budget.cancelled()?Termination::Cancelled:Termination::TimeLimit; + result.message="Native race publication cleanup exhausted deadline"; + } + } catch(const ModelError& error) { + result.termination=Termination::InvalidModel;result.message=error.what(); + } catch(const std::bad_alloc&) { + result.termination=Termination::MemoryLimit;result.message="Native race allocation failed"; + } catch(const std::exception& error) { + result.termination=Termination::BackendError;result.message=error.what(); + } + result.elapsed_seconds=std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return result; +} +} + +SolveResult solve_native_race(const ModelSnapshot& model,const NativeRaceOptions& options) { + return native_race_entry(model,options,model.model_id,model.revision); +} +SolveResult solve_native_race(const Model& model,const NativeRaceOptions& options) { + return native_race_entry(model,options,model.id(),model.revision()); +} + +}} diff --git a/gecode/optimize/native.hpp b/gecode/optimize/native.hpp new file mode 100644 index 0000000000..6839a1cc51 --- /dev/null +++ b/gecode/optimize/native.hpp @@ -0,0 +1,79 @@ +/* Optional bridge from the sparse integer model to native Gecode search. */ +#ifndef GECODE_OPTIMIZE_NATIVE_HPP +#define GECODE_OPTIMIZE_NATIVE_HPP + +#include + +namespace Gecode { namespace Optimize { + +BackendCapabilities native_capabilities(); + +/** + * Solve the supported finite integer subset with native Gecode propagation/BAB. + * Original indicators use native reification, not their numerical big-M rows. + * Exact requests use integer arithmetic checks; Certified is unsupported. + * Interrupted results have no global bound. See NATIVE.md for numeric limits. + * This explicit entry point accepts backend Auto or Native. Complete exact + * starts are supported, including deterministic completion of omitted live + * indicator inactivity gates. Unresolved partial starts, multiple workers and + * nonzero random seeds are unsupported. The Model overload includes snapshotting + * in its deadline and translates moved-from model errors to InvalidModel. + */ +SolveResult solve_native(const ModelSnapshot& model, + const SolveOptions& options = {}); +SolveResult solve_native(const Model& model, const SolveOptions& options = {}); + +/** + * Conservatively select a native algorithm from bounded model structure. + * Globals, indicators, nonbinary/tiny/large models, unsupported optional-route + * options and unavailable checked LP retain ordinary native propagation/BAB. + * Eligible binary knapsack models retain their exact DP strengthening. Other + * moderate binary linear models may use checked root/updated LP, verified + * covers and bounded binary reliability branching. No problem-family metadata, + * reference objective or external start is inferred. Bounded exact presolve, + * independent-component solving and duplicate-column symmetry are automatic + * for compatible ordinary integer models without supplied starts. Actual backend identity + * and a policy explanation are returned in the ordinary SolveResult. + * Selection, compilation, search, validation and Model snapshotting share the + * solve deadline. Explicit solve_native/LP/search entry points are unchanged. + */ +SolveResult solve_native_auto(const ModelSnapshot& model, + const SolveOptions& options = {}); +SolveResult solve_native_auto(const Model& model, + const SolveOptions& options = {}); + +/** Opt-in sequential probe-and-select policy for native Gecode optimization. + * Racing can INCREASE total CPU work and solve time: probes and restarting the + * selected strategy repeat work. Several seconds (or longer when configured) + * can nevertheless discover a substantially better search route. Early progress + * is a heuristic, not a prediction or a guarantee of eventual speedup. + * No MiniZinc/FlatZinc option is exposed by this C++ entry point yet. + */ +struct NativeRaceOptions { + SolveOptions solve; + /** Total nominal exploration time, shared equally by two sequential probes. + * Finite solve limits reserve at least 75% for the selected restart. Zero + * disables exploration and runs solve_native_auto directly. Cooperative + * propagation/LP calls can overrun a probe's local deadline. + */ + double exploration_seconds = 2.0; + /** Per-probe node allowance; all probe/restart nodes also count globally. */ + std::uint64_t probe_node_limit = 4096; + void validate() const; +}; + +/** Compare automatic preprocessing/LP policy with ordinary native BAB, preserving + * eligible exact knapsack DP in both. Return immediately on a complete proof; + * otherwise restart the candidate with the best original validated incumbent, + * then strongest valid bound, preferring automatic policy on ties. Validated + * incumbents and original-model bounds from probes are retained. Search trees + * are not resumed. All phases share one wall/node/cancellation budget. + * Globals, indicators and incompatible options retain the automatic direct path. + */ +SolveResult solve_native_race(const ModelSnapshot& model, + const NativeRaceOptions& options = {}); +SolveResult solve_native_race(const Model& model, + const NativeRaceOptions& options = {}); + +}} +#endif diff --git a/gecode/optimize/native_components.cpp b/gecode/optimize/native_components.cpp new file mode 100644 index 0000000000..85fcf56cd4 --- /dev/null +++ b/gecode/optimize/native_components.cpp @@ -0,0 +1,149 @@ +/* Exact additive decomposition; components share the original solve budget. */ +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { namespace Detail { +namespace { +bool integral(double value) { return std::isfinite(value) && std::floor(value)==value; } +struct Disjoint { + std::vector parent, size; + explicit Disjoint(std::size_t n):parent(n),size(n,1) {std::iota(parent.begin(),parent.end(),0);} + std::size_t root(std::size_t x) { + while(parent[x]!=x) {parent[x]=parent[parent[x]];x=parent[x];}return x; + } + void join(std::size_t a,std::size_t b) { + a=root(a);b=root(b);if(a==b)return; + if(size[a] native_components(const ModelSnapshot& model, + const SolveOptions& options,SolveBudget& budget,const NativeSolveContinuation& continuation) { + // Original native validation/compilation is the caller's admission gate. + // These additional checks keep decomposition finite and its arithmetic exact. + constexpr std::size_t columns_cap=4096, rows_cap=4096, nonzeros_cap=65536, components_cap=64; + if(!options.primal_start.empty() || options.guarantee==Guarantee::Certified || + (options.backend!=Backend::Native && options.backend!=Backend::Auto) || + options.threads!=1 || options.random_seed!=0 || !model.globals.empty() || !model.indicators.empty() || + model.variables.size()>columns_cap || model.rows.size()>rows_cap || + model.objective.terms.size()>nonzeros_cap || !integral(model.objective.offset)) return {}; + auto result=[&](Termination reason,const std::string& message) { + SolveResult out;out.model_id=model.model_id;out.revision=model.revision; + out.backend="Gecode native components";out.guarantee=options.guarantee; + out.termination=reason;out.message=message;out.elapsed_seconds=budget.elapsed_seconds();return out; + }; + auto stopped=[&]() -> std::optional { + if(auto reason=budget.stop_reason())return result(*reason,"Independent components stopped by shared budget"); + return {}; + }; + if(auto stop=stopped())return stop; + std::size_t nonzeros=model.objective.terms.size(),active=0; + for(const auto& v:model.variables) { + if(auto stop=stopped())return stop; + if(!v.active)continue; + ++active; + if(v.indicator_origin || (v.type!=VariableType::Integer && v.type!=VariableType::Binary) || + !integral(v.lower) || !integral(v.upper))return {}; + } + if(active<2)return {}; + for(const auto& t:model.objective.terms)if(!integral(t.coefficient))return {}; + for(const auto& row:model.rows) { + if(auto stop=stopped())return stop; + if(!row.active)continue; + if(row.indicator_origin || row.terms.size()>nonzeros_cap-nonzeros || + (std::isfinite(row.lower) && !integral(row.lower)) || + (std::isfinite(row.upper) && !integral(row.upper)))return {}; + nonzeros+=row.terms.size(); + for(const auto& t:row.terms)if(!integral(t.coefficient))return {}; + } + // The function is internal, but reject corrupt slot references before indexing. + validate_structure(model); + Disjoint sets(model.variables.size()); + for(const auto& row:model.rows)if(row.active && !row.terms.empty()) { + for(const auto& term:row.terms) { + if(auto stop=stopped())return stop; + sets.join(row.terms.front().variable.id,term.variable.id); + } + } + const auto missing=std::numeric_limits::max(); + std::vector component(model.variables.size(),missing),root_component(model.variables.size(),missing); + std::vector> slots; + for(std::size_t i=0;i> row_ids(slots.size()); + std::vector> objective(slots.size()); + for(std::size_t i=0;i assembled(model.variables.size(),std::numeric_limits::quiet_NaN()); + std::vector mapped(model.variables.size()); + std::string backend_version; + for(std::size_t c=0;c terms;terms.reserve(row.terms.size()); + for(const auto& t:row.terms)terms.push_back({mapped[t.variable.id],t.coefficient}); + submodel.add_row(terms,row.lower,row.upper); + } + std::vector terms;terms.reserve(objective[c].size()); + for(const auto& t:objective[c])terms.push_back({mapped[t.variable.id],t.coefficient}); + // The original offset is included only in the final original evaluation. + submodel.set_objective(terms,model.objective.sense,0); + const auto snapshot=submodel.snapshot(); + if(auto stop=stopped())return stop; + const auto solved=continuation(snapshot,options,budget); + if(budget.cancelled() || budget.time_limit_reached())return stopped(); + if(solved.model_id!=snapshot.model_id || solved.revision!=snapshot.revision || + solved.guarantee!=options.guarantee) + return result(Termination::BackendError,"Independent component result identity or guarantee differs"); + if(solved.termination==Termination::Infeasible) + return result(Termination::Infeasible,"An independent component proved the original model infeasible"); + if(solved.termination!=Termination::Optimal) + return result(solved.termination,"Independent component stopped; no complete original incumbent assembled"); + if(!solved.has_solution() || solved.best_bound!=solved.objective || + solved.values.size()!=slots[c].size() || solved.active_variables.size()!=slots[c].size()) + return result(Termination::BackendError,"Incomplete independent component optimum"); + const auto checked=validate(snapshot,solved.values,0,0); + if(!checked.valid || checked.objective!=solved.objective) + return result(Termination::BackendError,"Independent component witness failed exact validation"); + for(auto slot:slots[c])assembled[slot]=solved.values[mapped[slot].id]; + if(backend_version.empty())backend_version=solved.backend_version; + } + const auto checked=validate(model,assembled,0,0); + if(budget.cancelled() || budget.time_limit_reached())return stopped(); + if(!checked.valid || !checked.objective) + return result(Termination::BackendError,"Assembled original witness failed exact validation"); + auto out=result(Termination::Optimal,"Exact independent components: "+std::to_string(slots.size())); + out.backend_version=std::move(backend_version);out.values=std::move(assembled); + for(const auto& v:model.variables)out.active_variables.push_back(v.active); + out.objective=checked.objective;out.best_bound=checked.objective; + out.solution_validated=true;out.update_gaps(model.objective.sense); + if(budget.cancelled() || budget.time_limit_reached())return stopped(); + out.elapsed_seconds=budget.elapsed_seconds();return out; +} + +}}} diff --git a/gecode/optimize/native_lp.hpp b/gecode/optimize/native_lp.hpp new file mode 100644 index 0000000000..081fa07c43 --- /dev/null +++ b/gecode/optimize/native_lp.hpp @@ -0,0 +1,97 @@ +/* Explicit native search with independently checked integer LP deductions. */ +#ifndef GECODE_OPTIMIZE_NATIVE_LP_HPP +#define GECODE_OPTIMIZE_NATIVE_LP_HPP + +#include + +namespace Gecode { namespace Optimize { + +enum class NativeLpFrequency { Root, AfterBoundChanges }; + +/** Optional root strengthening limits, independent of the native search limits. + * Zero work/round/storage caps are valid and preserve the original solve. + */ +struct NativeRootCoverSettings { + std::size_t max_rounds = 4, max_work = 4000000; + std::size_t max_cuts = 64, max_cut_nonzeros = 4096; + std::size_t max_model_columns = 200000, max_model_rows = 200000; + std::size_t max_model_nonzeros = 2000000; + std::size_t max_separation_rows = 256, max_terms_per_row = 512; + unsigned int denominator = 1048576; + void validate() const; +}; + +enum class NativeRootCoverCompletion { + NotRequested, NotStarted, NoNewCuts, RoundLimit, WorkLimit, StorageLimit, + SeparationLimit, Cancelled, TimeLimit, NoPrimalSuggestion, InvalidSuggestion, + CallbackError, BackendError, AllocationFailure +}; + +struct NativeRootCoverStatistics { + bool requested = false; + NativeRootCoverCompletion completion = NativeRootCoverCompletion::NotRequested; + std::size_t rounds = 0, augmentations = 0, cuts = 0, nonzeros = 0, work = 0; + std::size_t projected_coordinates = 0, unsupported_rows = 0, oversized_rows = 0; + std::size_t separated_cuts = 0, duplicate_cuts = 0, arithmetic_rejections = 0; + // Root-loop totals, including intermediate backend instances. Already included + // in the enclosing NativeLpStatistics totals, not additional calls to add. + std::uint64_t lp_calls = 0, valid_bounds = 0, rejected_bounds = 0; + std::uint64_t numerical_infeasibility_reports = 0; + double lp_seconds = 0; +}; + +struct NativeLpSettings { + NativeLpFrequency frequency = NativeLpFrequency::Root; + bool bound_tightening = true; + /** Reoptimize after this many observed interval changes; always try at root. */ + unsigned int bound_change_interval = 1; + /** Absent by default. Adds verified global covers of original ordinary rows. */ + std::optional root_cover_cuts; + void validate() const; +}; + +struct NativeLpOptions : NativeLpSettings { + SolveOptions solve; + void validate() const; +}; + +struct NativeLpStatistics { + std::uint64_t lp_calls = 0; + double lp_seconds = 0; + std::uint64_t valid_bounds = 0; + std::uint64_t rejected_bounds = 0; + /** Diagnostic LP reports, never sufficient to prune native search. */ + std::uint64_t numerical_infeasibility_reports = 0; + std::uint64_t certificate_evaluations = 0; + std::uint64_t conditional_checks = 0; + std::uint64_t variable_fixings = 0; + std::uint64_t variable_bound_tightenings = 0; + NativeRootCoverStatistics root_cover; +}; + +struct NativeLpResult { + SolveResult result; + NativeLpStatistics relaxation; +}; + +BackendCapabilities native_lp_capabilities(); + +/** + * Explicit opt-in: ordinary solve()/Auto/Native defaults are unchanged. + * Native propagation enforces every original constraint. Only ordinary linear + * rows enter the sparse relaxation; semivariables use their convex-hull box. + * LP bounds and interval cuts require checked integer certificates. This is + * exact discrete solving, not a complete independently checkable solve proof. + * Missing native/HiGHS/checked-wide-integer support is Unsupported, never a + * fallback. Original identities, limits and native arithmetic guards apply. + * Deadlines are cooperative: an LP attempt has a 0.2-second/10,000-iteration + * backend limit, but neither that limit nor native propagation is preemptive. + * See NATIVE-LP.md for scope, scheduling and interrupted-bound semantics. + */ +NativeLpResult solve_native_lp(const ModelSnapshot& model, + const NativeLpOptions& options = {}); +NativeLpResult solve_native_lp(const Model& model, + const NativeLpOptions& options = {}); + +}} +#endif diff --git a/gecode/optimize/native_neighborhoods.hpp b/gecode/optimize/native_neighborhoods.hpp new file mode 100644 index 0000000000..065379e286 --- /dev/null +++ b/gecode/optimize/native_neighborhoods.hpp @@ -0,0 +1,81 @@ +/* Explicit bounded primal neighborhoods alongside the native proof frontier. */ +#ifndef GECODE_OPTIMIZE_NATIVE_NEIGHBORHOODS_HPP +#define GECODE_OPTIMIZE_NATIVE_NEIGHBORHOODS_HPP + +#include + +namespace Gecode { namespace Optimize { + +enum class NativeNeighborhoodPolicy { BinaryHamming }; + +/** Limits apply to one optional attempt, sharing the ordinary solve budget. + * Finite provisional settings for this explicit experimental API. Zero caps + * skip optional work; no existing solve route enables neighborhoods implicitly. + */ +struct NativeNeighborhoodSettings { + NativeNeighborhoodPolicy policy = NativeNeighborhoodPolicy::BinaryHamming; + std::size_t radius = 1; + std::uint64_t max_status_calls = 128; + std::size_t max_distance_variables = 4096; + std::size_t max_source_entries = 100000; + std::size_t max_coordinator_work = 100000; + std::size_t max_local_spaces = 64; + double time_limit_seconds = 0.05; + void validate() const; +}; + +enum class NativeNeighborhoodCompletion { + NotStarted, NoIncumbent, ProofCompletedBeforeAttempt, NoEligibleBinary, + NonrestrictingRadius, FormulationLimit, SourceLimit, WorkLimit, StatusLimit, + SharedNodeReserve, LocalStorageLimit, LocalTimeLimit, NoImprovement, Improved, + GlobalStop, Error +}; + +struct NativeNeighborhoodStatistics { + bool requested = false; + NativeNeighborhoodCompletion completion = NativeNeighborhoodCompletion::NotStarted; + std::optional stop_reason; + std::uint64_t attempts = 0; + std::size_t eligible_variables = 0, source_entries = 0, coordinator_work = 0; + // An admitted status attempt can be stopped before propagation actually runs. + std::uint64_t status_attempts = 0, completed_status_calls = 0; + std::uint64_t failed_nodes = 0, feasible_candidates = 0, accepted_improvements = 0; + std::size_t peak_local_spaces = 0, peak_total_spaces = 0; + // Shared total, not another component to add to frontier/probe/local counts. + std::uint64_t budget_nodes = 0; + // Includes eligibility, construction, checking, and release; no local LP work. + double elapsed_seconds = 0; +}; + +struct NativeNeighborhoodOptions { + NativeSearchOptions search; + NativeNeighborhoodSettings neighborhood; + void validate() const; +}; + +struct NativeNeighborhoodResult { + NativeSearchResult search; + NativeNeighborhoodStatistics neighborhood; +}; + +/** Run at most one global BinaryHamming improvement attempt after a checked + * incumbent, at a stable main-parent boundary. Distance counts active nonfixed + * original Binary slots without indicator_origin; all other original variables + * and native constraints remain in the isolated subproblem. There is no partial + * start repair, current-node LP suggestion, local proof sharing or recursive + * heuristic. Only a timely exact original-model-validated improvement is shared. + * + * Shared node attempts = ordinary frontier admissions + reliability probe + * attempts + neighborhood status attempts. Optional admissions reserve two ordinary + * child slots. Local caps end only the heuristic; global limits stop the solve. + * Main queued/active regions continue to define any interrupted global bound. + * Native propagation/posting/checking is cooperative, not hard-preemptible. + * Existing NativeSearch option/result layouts and existing APIs are unchanged. + */ +NativeNeighborhoodResult solve_native_neighborhoods( + const ModelSnapshot&, const NativeNeighborhoodOptions& = {}); +NativeNeighborhoodResult solve_native_neighborhoods( + const Model&, const NativeNeighborhoodOptions& = {}); + +}} +#endif diff --git a/gecode/optimize/native_preprocess.hpp b/gecode/optimize/native_preprocess.hpp new file mode 100644 index 0000000000..cf18ed5f8a --- /dev/null +++ b/gecode/optimize/native_preprocess.hpp @@ -0,0 +1,17 @@ +/* Internal bounded, exact transformations in the automatic native pipeline. */ +#ifndef GECODE_OPTIMIZE_NATIVE_PREPROCESS_HPP +#define GECODE_OPTIMIZE_NATIVE_PREPROCESS_HPP +#include +#include +#include +namespace Gecode { namespace Optimize { namespace Detail { +using NativeSolveContinuation = std::function; +std::optional native_presolve(const ModelSnapshot&, const SolveOptions&, + SolveBudget&, const NativeSolveContinuation&); +std::optional native_components(const ModelSnapshot&, const SolveOptions&, + SolveBudget&, const NativeSolveContinuation&); +std::optional native_symmetry(const ModelSnapshot&, const SolveOptions&, + SolveBudget&, const NativeSolveContinuation&); +}}} +#endif diff --git a/gecode/optimize/native_presolve.cpp b/gecode/optimize/native_presolve.cpp new file mode 100644 index 0000000000..22ae693a3d --- /dev/null +++ b/gecode/optimize/native_presolve.cpp @@ -0,0 +1,154 @@ +/* Exact, bounded presolve composition for the automatic native coordinator. */ +#include +#include + +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { namespace Detail { +namespace { +std::optional deadline_stop(const SolveBudget& budget) { + if (budget.cancelled()) return Termination::Cancelled; + if (budget.time_limit_reached()) return Termination::TimeLimit; + return {}; +} + +SolveResult original_result(const ModelSnapshot& model, const SolveOptions& options) { + SolveResult result; + result.model_id=model.model_id; result.revision=model.revision; + result.guarantee=options.guarantee; + result.backend="Gecode native exact presolve"; + return result; +} +} + +std::optional native_presolve(const ModelSnapshot& model, + const SolveOptions& options, SolveBudget& budget, + const NativeSolveContinuation& continuation) { + // A previously supplied original start must remain available even when the + // global deadline leaves no time for reconstruction. The existing native + // start path owns that publication contract, so composition skips starts. + if (!options.primal_start.empty() || options.guarantee==Guarantee::Certified || + (options.backend!=Backend::Auto && options.backend!=Backend::Native) || + options.threads!=1 || options.random_seed!=0 || + !model.globals.empty() || !model.indicators.empty()) return {}; + constexpr std::size_t max_columns=4096, max_rows=4096, max_nonzeros=65536; + if (model.variables.size()>max_columns || model.rows.size()>max_rows || + model.objective.terms.size()>max_nonzeros) return {}; + + auto result=original_result(model,options); + const auto finish=[&](SolveResult value) -> std::optional { + // A reduced incumbent is not an original incumbent until exact postsolve + // finishes. Never publish a newly reconstructed point or proof too late. + // Node quotas intentionally do not enter this check: the final admitted + // node may complete, and its timely result remains valid at the quota. + if (const auto stop=deadline_stop(budget)) { + auto stopped=original_result(model,options); + stopped.backend=std::move(value.backend); + stopped.backend_version=std::move(value.backend_version); + stopped.termination=*stop; + stopped.message="Exact integer presolve composition stopped before original-result publication"; + value=std::move(stopped); + } + value.elapsed_seconds=budget.elapsed_seconds(); + return value; + }; + const auto stopped=[&](Termination reason) { + result.termination=reason; + result.message="Exact integer presolve composition budget stopped"; + return finish(std::move(result)); + }; + try { + if (const auto reason=budget.stop_reason()) return stopped(*reason); + for (const auto& variable:model.variables) { + if (const auto reason=deadline_stop(budget)) return stopped(*reason); + if (variable.active && variable.type!=VariableType::Integer && + variable.type!=VariableType::Binary) return {}; + } + std::size_t nonzeros=model.objective.terms.size(); + for (const auto& row:model.rows) { + if (const auto reason=deadline_stop(budget)) return stopped(*reason); + if (row.terms.size()>max_nonzeros-nonzeros) return {}; + nonzeros+=row.terms.size(); + } + PresolveOptions settings; + settings.time_limit_seconds=budget.remaining_seconds(); + settings.cancellation=budget.cancellation(); + settings.max_passes=4; settings.max_row_visits=65536; + const auto prepared=presolve_integer(model,settings); + if (const auto reason=deadline_stop(budget)) return stopped(*reason); + if (prepared.model_id!=model.model_id || prepared.revision!=model.revision || + prepared.guarantee!=Guarantee::Exact) + throw std::runtime_error("Exact presolve returned foreign identity or guarantee"); + if (prepared.status==PresolveStatus::Infeasible && + prepared.termination==Termination::Infeasible) { + result.termination=Termination::Infeasible; + result.message="Exact integer presolve proved an original-model contradiction"; + return finish(std::move(result)); + } + // Only finalized artifacts carry the equivalence contract. Work-limited + // artifacts are valid; a deadline-interrupted partial working state is not. + if (!prepared.model || + !((prepared.status==PresolveStatus::Fixpoint && prepared.termination==Termination::Optimal) || + (prepared.status==PresolveStatus::Incomplete && prepared.termination==Termination::IterationLimit))) + return {}; + if (!prepared.fixed_variables && !prepared.removed_rows && prepared.changes.empty()) return {}; + const auto& artifact=*prepared.model; + if (artifact.original().model_id!=model.model_id || artifact.original().revision!=model.revision) + throw std::runtime_error("Exact presolve artifact has foreign original identity"); + const auto& reduced=artifact.reduced(); + auto exact_options=options; + exact_options.guarantee=Guarantee::Exact; + exact_options.time_limit_seconds=budget.remaining_seconds(); + exact_options.cancellation=budget.cancellation(); + auto solved=continuation(reduced,exact_options,budget); + result.backend=solved.backend; result.backend_version=solved.backend_version; + if (const auto reason=deadline_stop(budget)) return stopped(*reason); + if (solved.model_id!=reduced.model_id || solved.revision!=reduced.revision || + solved.guarantee!=Guarantee::Exact || solved.start_submitted) + throw std::runtime_error("Reduced native solve returned inconsistent identity, guarantee or start"); + // Reduction can produce row sides outside a narrower optional/native + // compiler's admission range. Preserve the original route's acceptance. + if (solved.termination==Termination::Unsupported) return {}; + if (solved.termination==Termination::InvalidModel) + throw std::runtime_error("Reduced native model was rejected as invalid"); + if (solved.has_solution()) { + auto restored=artifact.postsolve(solved,0); + if (!restored.exact_witness_validated || !restored.solution.has_solution() || + restored.solution.objective!=solved.objective) + throw std::runtime_error("Reduced native witness failed exact original postsolve: "+restored.solution.message); + result=std::move(restored.solution); + result.guarantee=options.guarantee; + } + if ((solved.termination==Termination::Optimal && !result.has_solution()) || + (solved.termination==Termination::Infeasible && result.has_solution()) || + solved.termination==Termination::Unbounded || solved.termination==Termination::InfeasibleOrUnbounded) + throw std::runtime_error("Reduced finite native solve returned inconsistent proof status"); + // PresolveBuilder folds fixed costs into the reduced objective offset; + // original and reduced FULL objective values are identical, including for + // maximization. Bounds therefore transfer unchanged, never with a second + // offset correction. Only the actual Exact native result supplies a proof; + // PresolveStatus::Fixpoint's Optimal termination is not used here. + result.termination=solved.termination; + if (solved.best_bound && !std::isfinite(*solved.best_bound)) + throw std::runtime_error("Reduced native solve returned a nonfinite bound"); + if (solved.termination!=Termination::Infeasible) result.best_bound=solved.best_bound; + if (solved.termination==Termination::Optimal) result.best_bound=result.objective; + result.update_gaps(model.objective.sense); + result.message=std::string("Exact integer presolve (")+ + (prepared.status==PresolveStatus::Fixpoint ? "fixpoint reduction" : "partial reduction")+ + "): "+solved.message; + return finish(std::move(result)); + } catch (const std::bad_alloc&) { + result=original_result(model,options); result.termination=Termination::MemoryLimit; + result.message="Exact integer presolve composition allocation failed"; + } catch (const std::exception& error) { + result=original_result(model,options); result.termination=Termination::BackendError; + result.message=std::string("Exact integer presolve composition: ")+error.what(); + } + return finish(std::move(result)); +} + +}}} diff --git a/gecode/optimize/native_regular_limits.hpp b/gecode/optimize/native_regular_limits.hpp new file mode 100644 index 0000000000..ae8b6dddf6 --- /dev/null +++ b/gecode/optimize/native_regular_limits.hpp @@ -0,0 +1,29 @@ +// Private native storage admission, shared only with its arithmetic tests. +#ifndef GECODE_OPTIMIZE_NATIVE_REGULAR_LIMITS_HPP +#define GECODE_OPTIMIZE_NATIVE_REGULAR_LIMITS_HPP +#include +#include +namespace Gecode { namespace Optimize { namespace Detail { +inline const char* native_regular_size_error(std::uint64_t words,std::uint64_t states, + std::uint64_t transitions,std::uint64_t symbols, + bool short_symbols) noexcept { + constexpr auto imax=static_cast(std::numeric_limits::max()); + constexpr auto umax=static_cast(std::numeric_limits::max()); + // DFA init and layer allocation both need signed-int count+1 sentinels. + if(words>=imax||!states||states>=imax||transitions>=imax) + return "Native regular word/state/transition count exceeds signed array limits"; + // LayeredGraph::initialize initializes int(max_states)*(word_length+1). + if(states>imax/(words+1)) + return "Native regular layer-state product exceeds signed integer limits"; + if(words&&transitions>umax/words) + return "Native regular layer-edge total exceeds unsigned integer limits"; + // DFA::fill allocates 1<=((imax/2)+1)) + return "Native regular alphabet hash exceeds positive signed power-of-two limits"; + // The short-valued graph stores its per-layer support count in ushort. + if(short_symbols&&symbols>std::numeric_limits::max()) + return "Native regular short-symbol support count exceeds native storage"; + return nullptr; +} +}}} +#endif diff --git a/gecode/optimize/native_search.hpp b/gecode/optimize/native_search.hpp new file mode 100644 index 0000000000..110e8775ce --- /dev/null +++ b/gecode/optimize/native_search.hpp @@ -0,0 +1,101 @@ +/* Explicit bounded native frontier search with conservative global bounds. */ +#ifndef GECODE_OPTIMIZE_NATIVE_SEARCH_HPP +#define GECODE_OPTIMIZE_NATIVE_SEARCH_HPP + +#include + +namespace Gecode { namespace Optimize { + +enum class NativeSearchOrder { DepthFirst, BestBound }; + +enum class NativeBranchingPolicy { BinaryReliability }; + +/** Experimental binary directional propagation gains; not LP pseudocosts. + * Resource caps may be zero to skip optional work. The sample threshold must + * be positive. Only completed finite probe pairs update solve-local history. + */ +struct NativeBranchingSettings { + NativeBranchingPolicy policy = NativeBranchingPolicy::BinaryReliability; + std::size_t max_candidates_per_decision = 8; + std::uint64_t max_probe_status_calls = 128; + std::uint64_t max_probe_status_calls_per_decision = 8; + std::size_t max_branching_work = 100000; + std::uint64_t reliability_samples = 2; + std::size_t max_nonimproving_pairs = 2; + std::size_t max_history_entries = 4096; + void validate() const; +}; + +struct NativeBranchingStatistics { + bool requested = false; + std::uint64_t decisions = 0, manual_splits = 0, fallback_decisions = 0; + // Admitted attempts: a final pre-status stop can consume a slot without + // executing propagation, just as for ordinary frontier admissions. + std::uint64_t probe_status_calls = 0, completed_pairs = 0; + std::uint64_t published_pairs = 0, finite_samples = 0, zero_gain_samples = 0; + std::uint64_t failed_directions = 0, reliable_candidates = 0; + std::uint64_t probe_propagations = 0; + // Shared total: ordinary admissions plus probe status attempts. The explicit + // neighborhood wrapper additionally charges its local status attempts here. + // This repeats SolveBudget::nodes(), not another component to add to it. + std::uint64_t budget_nodes = 0; + std::size_t work = 0, history_entries = 0; + // Subsets of the solve-wide relaxation totals, not additional calls to add. + std::uint64_t probe_lp_calls = 0; + double probe_lp_seconds = 0; +}; + +struct NativeSearchOptions { + SolveOptions solve; + NativeSearchOrder order = NativeSearchOrder::BestBound; + // Counts queued spaces + expanding parent + in-flight child, not bytes. + std::size_t max_open_nodes = 100000; + // Absent means native propagation only, with no LP dependency or attempt. + std::optional relaxation; + // Absent preserves the existing native brancher and admission accounting. + std::optional branching; + void validate() const; +}; + +struct NativeFrontierStatistics { + std::uint64_t admitted_nodes = 0; + std::uint64_t expanded_nodes = 0; + std::uint64_t failed_nodes = 0; + std::uint64_t bound_pruned_nodes = 0; + std::uint64_t feasible_leaves = 0; + std::size_t peak_open_nodes = 0; + // Queued nodes plus any parent/root whose region remains unresolved. + std::size_t unresolved_regions = 0; +}; + +struct NativeSearchResult { + SolveResult result; + NativeLpStatistics relaxation; + NativeFrontierStatistics frontier; + NativeBranchingStatistics branching; +}; + +/** + * Explicit opt-in; solve(), solve_native() and solve_native_lp() are unchanged. + * Existing finite native integer/global/indicator semantics and limits apply. + * Stable propagated nodes use normalized minimization bounds. Every unfinished + * region remains represented, including a parent during partial expansion. + * Interrupted global bounds aggregate all unresolved regions and an incumbent; + * they are absent if compilation did not establish the initial objective box. + * max_open_nodes exhaustion returns MemoryLimit; this is not a byte guarantee. + * Node quotas restrict admission, allowing the final admitted node to finish + * when time/cancellation permits. Complete exact starts are supported; no + * partial starts, parallel workers or gap stopping. + * An optional relaxation requires native checked LP capability explicitly. + * BinaryReliability charges probe status attempts to the shared node quota, + * separately reported from admitted frontier nodes. Probes select a split; + * they never publish incumbents or pruning evidence. Limits are cooperative + * around native propagation, which itself runs to fixpoint or failure. + */ +NativeSearchResult solve_native_search(const ModelSnapshot& model, + const NativeSearchOptions& options = {}); +NativeSearchResult solve_native_search(const Model& model, + const NativeSearchOptions& options = {}); + +}} +#endif diff --git a/gecode/optimize/native_symmetry.cpp b/gecode/optimize/native_symmetry.cpp new file mode 100644 index 0000000000..fc9730c087 --- /dev/null +++ b/gecode/optimize/native_symmetry.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { namespace Detail { +std::optional native_symmetry(const ModelSnapshot& model, + const SolveOptions& options, SolveBudget& budget, + const NativeSolveContinuation& continuation) { + // Exact duplicate columns only: arbitrary permutation of each group must + // preserve every original row, domain, variable type and objective coefficient. + if (!options.primal_start.empty() || !model.globals.empty() || !model.indicators.empty() || + model.variables.size()>4096 || model.rows.size()>4096 || model.objective.terms.size()>65536) + return {}; + const auto stopped=[&]{return budget.cancelled() || budget.time_limit_reached();}; + if(stopped())return {}; + std::size_t nonzeros=model.objective.terms.size(); + for(const auto& row:model.rows){ + if(row.terms.size()>65536-nonzeros)return {}; + nonzeros+=row.terms.size(); + } + for(const auto& v:model.variables)if(v.active && + (v.type!=VariableType::Integer && v.type!=VariableType::Binary))return {}; + validate_structure(model); + using Column=std::vector>; + std::vector columns(model.variables.size()); + std::vector costs(model.variables.size(),0); + for(const auto& t:model.objective.terms)costs[t.variable.id]=t.coefficient; + for(std::size_t i=0;i; + std::map last; + std::vector> order; + for(std::size_t i=0;i500000000)continue; + Key key{v.type,v.lower,v.upper,costs[i],std::move(columns[i])}; + auto added=last.emplace(std::move(key),i); + if(!added.second){order.push_back({added.first->second,i});added.first->second=i;} + } + if(order.empty())return {}; + auto reduced=model; // Private derived snapshot; original handles remain stable. + for(auto pair:order){ + if(stopped())return {}; + RowData row;row.constraint={model.model_id,reduced.rows.size()}; + row.terms={{model.variables[pair.first].variable,1},{model.variables[pair.second].variable,-1}}; + row.upper=0;row.name="automatic interchangeable-column order"; + reduced.rows.push_back(std::move(row)); + } + auto result=continuation(reduced,options,budget); + if(result.has_solution()){ + // The outer native admission bounds all integer row/objective activities; + // tolerance-zero original evaluation is exact within that admitted range. + const auto checked=validate(model,result.values,0,0); + if(!checked.valid || checked.objective!=result.objective){ + SolveResult failed;failed.model_id=model.model_id;failed.revision=model.revision; + failed.backend=result.backend;failed.guarantee=options.guarantee; + failed.termination=Termination::BackendError; + failed.message="Automatic symmetry original-model validation failed"; + return failed; + } + result.solution_validated=true; + } + if(stopped()){ + const auto why=budget.cancelled()?Termination::Cancelled:Termination::TimeLimit; + const auto backend=result.backend; + result=SolveResult{};result.model_id=model.model_id;result.revision=model.revision; + result.backend=backend;result.guarantee=options.guarantee;result.termination=why; + } + result.message="Automatic duplicate-column symmetry: "+std::to_string(order.size())+ + " ordering constraints; "+result.message; + result.elapsed_seconds=budget.elapsed_seconds(); + return result; +} +}}} diff --git a/gecode/optimize/pool.cpp b/gecode/optimize/pool.cpp new file mode 100644 index 0000000000..9def2802a1 --- /dev/null +++ b/gecode/optimize/pool.cpp @@ -0,0 +1,311 @@ +#include +#include + +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +constexpr std::int64_t exact_limit = INT64_C(9007199254740992); +class UnsupportedPool : public std::runtime_error { using std::runtime_error::runtime_error; }; +class InvalidPool : public std::runtime_error { using std::runtime_error::runtime_error; }; +struct Interrupted { Termination reason; }; +void checkpoint(const SolveBudget& budget) { + if (auto reason = budget.stop_reason()) throw Interrupted{*reason}; +} +struct Domain { Variable variable; std::int64_t lower, upper; }; + +std::vector projection(const ModelSnapshot& source, const PoolOptions& options) { + for (const auto& indicator : source.indicators) + if (indicator.active) throw UnsupportedPool("Pools with active indicators are not yet supported"); + for (const auto& global : source.globals) + if (global.active) throw UnsupportedPool("Pools with active globals are not yet supported"); + std::size_t active = 0; + std::vector variables; + for (const auto& variable : source.variables) if (variable.active) { + ++active; + if (variable.type == VariableType::SemiContinuous || variable.type == VariableType::SemiInteger) + throw UnsupportedPool("Pools with semi-variable domains are not yet supported"); + if (!options.projection && variable.type != VariableType::Continuous) + variables.push_back(variable.variable); + } + if (options.projection) variables = *options.projection; + if (variables.empty() && active != 0) + throw UnsupportedPool("A pool requires a nonempty finite discrete projection; continuous-only enumeration is undefined"); + std::set seen; + std::vector domains; + for (auto handle : variables) { + if (handle.model_id != source.model_id || handle.id >= source.variables.size() || + !source.variables[handle.id].active) throw ModelError("Pool projection contains a foreign, absent, or deleted variable"); + if (!seen.insert(handle.id).second) throw ModelError("Pool projection repeats a variable"); + const auto& data = source.variables[handle.id]; + if (data.type != VariableType::Integer && data.type != VariableType::Binary) + throw UnsupportedPool("Projected variables must be Integer or Binary"); + if (!std::isfinite(data.lower) || !std::isfinite(data.upper)) + throw UnsupportedPool("Projected variables require finite bounds"); + const double lower = std::ceil(data.lower), upper = std::floor(data.upper); + if (std::fabs(lower) > exact_limit || std::fabs(upper) > exact_limit) + throw UnsupportedPool("Projected integer endpoints exceed exact double representation"); + const auto lo = static_cast(lower), hi = static_cast(upper); + if (hi >= lo && hi - lo > exact_limit) + throw UnsupportedPool("Projected domain width exceeds exact no-good coefficient representation"); + domains.push_back({handle, lo, hi}); + } + return domains; +} + +void layout(const SolveResult& result, const ModelSnapshot& model) { + if (result.model_id != model.model_id || result.revision != model.revision || + result.values.size() != model.variables.size() || result.active_variables.size() != model.variables.size()) + throw InvalidPool("Pool oracle returned inconsistent identity or slot layout"); + for (std::size_t i = 0; i < model.variables.size(); ++i) + if (result.active_variables[i] != model.variables[i].active) + throw InvalidPool("Pool oracle returned an inconsistent active-variable mask"); +} + +std::vector canonical(const SolveResult& result, const ModelSnapshot& model, + const SolveOptions& options) { + layout(result, model); + auto values = result.values; + if (!validate(model, values, options.feasibility_tolerance, options.integrality_tolerance).valid) + throw InvalidPool("Pool candidate failed independent remaining-model validation"); + for (const auto& variable : model.variables) if (variable.active && variable.type != VariableType::Continuous) { + auto& value = values[variable.variable.id]; + if (std::fabs(value) > exact_limit) + throw UnsupportedPool("Integer pool values exceed exact canonical representation"); + value = std::round(value); + if (value < variable.lower || value > variable.upper) + throw InvalidPool("Canonical integer pool value is outside its exact original interval"); + } + if (!validate(model, values, options.feasibility_tolerance, 0).valid) + throw InvalidPool("Rounded pool candidate violates hard constraints or no-good exclusions"); + return values; +} + +double allowance(double a, double b, const SolveOptions& options) { + if (options.guarantee == Guarantee::Exact) return 0; + return std::max(options.feasibility_tolerance, 64 * std::numeric_limits::epsilon() * + std::max({1.0, std::fabs(a), std::fabs(b)})); +} +void optimum(const SolveResult& result, double objective, ObjectiveSense sense, + const SolveOptions& options) { + if (result.guarantee != options.guarantee || !result.best_bound || !std::isfinite(*result.best_bound)) + throw InvalidPool("Pool rank lacks a matching guarantee and finite global bound"); + if (!result.objective || std::fabs(*result.objective - objective) > allowance(*result.objective, objective, options)) + throw InvalidPool("Pool objective disagrees with the independently recomputed original objective"); + auto checked = result; + checked.objective = objective; + try { checked.update_gaps(sense); } + catch (const ModelError&) { throw InvalidPool("Pool global bound has inconsistent ordering"); } + if (!checked.absolute_gap || !std::isfinite(*checked.absolute_gap) || + *checked.absolute_gap > allowance(objective, *checked.best_bound, options)) + throw InvalidPool("Pool rank lacks a closed independently recomputed gap"); +} + +void exclude(ModelSnapshot& model, const std::vector& domains, + const std::vector& values) { + std::vector witnesses; + auto witness = [&](const Domain& domain, std::int64_t coefficient, bool below) { + if (coefficient <= 0 || coefficient > exact_limit) + throw UnsupportedPool("No-good coefficient is not a positive exactly representable integer"); + if (model.variables.size() >= std::numeric_limits::max() || + model.rows.size() >= std::numeric_limits::max()) + throw UnsupportedPool("Pool no-good exceeds handle capacity"); + VariableData binary; + binary.variable = {model.model_id, static_cast(model.variables.size())}; + binary.type = VariableType::Binary; binary.lower = 0; binary.upper = 1; + binary.name = "__pool_witness_" + std::to_string(binary.variable.id); + model.variables.push_back(binary); + RowData row; + row.constraint = {model.model_id, static_cast(model.rows.size())}; + row.terms = {{domain.variable, 1}, {binary.variable, below ? double(coefficient) : -double(coefficient)}}; + if (below) row.upper = double(domain.upper); + else row.lower = double(domain.lower); + row.name = "__pool_implication_" + std::to_string(row.constraint.id); + model.rows.push_back(std::move(row)); + witnesses.push_back({binary.variable, 1}); + }; + for (std::size_t i = 0; i < domains.size(); ++i) { + const auto& domain = domains[i]; const auto value = values[i]; + if (value < domain.lower || value > domain.upper) + throw InvalidPool("Canonical projection value is outside its original integer domain"); + if (value > domain.lower) witness(domain, domain.upper - value + 1, true); + if (value < domain.upper) witness(domain, value + 1 - domain.lower, false); + } + if (model.rows.size() >= std::numeric_limits::max()) + throw UnsupportedPool("Pool no-good exceeds row capacity"); + RowData disjunction; + disjunction.constraint = {model.model_id, static_cast(model.rows.size())}; + disjunction.terms = std::move(witnesses); disjunction.lower = 1; + disjunction.name = "__pool_exclusion_" + std::to_string(disjunction.constraint.id); + model.rows.push_back(std::move(disjunction)); + validate_structure(model); +} + +PoolResult run(const ModelSnapshot& original, const PoolOptions& options, SolveBudget& budget) { + PoolResult output; + output.model_id = original.model_id; output.revision = original.revision; + output.guarantee = options.solve.guarantee; + auto finish = [&]() { + if (auto reason = budget.stop_reason()) { + output.termination = *reason; output.completion = PoolCompletion::Incomplete; + output.message = "Shared pool budget stopped; previously accepted entries remain historical results"; + } + output.elapsed_seconds = budget.elapsed_seconds(); return std::move(output); + }; + try { + validate_structure(original); + if (options.max_solutions == 0) throw ModelError("Pool max_solutions must be positive"); + if (options.solve.guarantee == Guarantee::Certified) + throw UnsupportedPool("Certified pool enumeration is not implemented"); + if (options.solve.guarantee == Guarantee::Exact && options.solve.backend != Backend::Native) + throw UnsupportedPool("Exact pool enumeration requires the explicit Native backend"); + if (options.max_solutions > 1 && options.solve.node_limit) + throw UnsupportedPool("Multi-solve pool node budgets require cumulative consumed-node reporting"); + const auto domains = projection(original, options); + for (const auto& domain : domains) output.projection.push_back(domain.variable); + checkpoint(budget); + auto working = original; + std::set> seen; + for (;;) { + checkpoint(budget); + auto solve_options = options.solve; + solve_options.cancellation = budget.cancellation(); + solve_options.time_limit_seconds = budget.remaining_seconds(); + solve_options.relative_gap = solve_options.absolute_gap = 0; + if (!output.attempts.empty()) solve_options.primal_start.clear(); + auto result = solve(working, solve_options); + output.attempts.push_back({result.termination, result.guarantee, result.objective, result.best_bound, false, false}); + checkpoint(budget); + auto& attempt = output.attempts.back(); + if (result.model_id != working.model_id || result.revision != working.revision) + throw InvalidPool("Pool oracle result belongs to a different model or revision"); + if ((result.objective && !std::isfinite(*result.objective)) || + (result.best_bound && std::isnan(*result.best_bound))) + throw InvalidPool("Pool oracle returned non-finite objective or NaN bound evidence"); + if (result.solution_validated && !result.has_solution()) + throw InvalidPool("Pool oracle claimed a malformed validated solution"); + ValidationReport raw_check; + if ((output.ranked_prefix != 0 || result.termination == Termination::Infeasible) && + result.values.size() == working.variables.size()) + raw_check = validate(working, result.values, options.solve.feasibility_tolerance, + options.solve.integrality_tolerance); + if (raw_check.valid && raw_check.objective && output.ranked_prefix != 0) { + const auto previous = *output.entries.back().solution.objective; + const auto improvement = original.objective.sense == ObjectiveSense::Minimize + ? previous - *raw_check.objective : *raw_check.objective - previous; + if (improvement > allowance(previous, *raw_check.objective, options.solve)) { + for (auto& entry : output.entries) entry.rank_established = false; + for (auto& prior : output.attempts) prior.rank_established = false; + output.ranked_prefix = 0; + throw InvalidPool("An independently feasible raw witness disproves earlier pool ranks"); + } + } + if (result.termination == Termination::Infeasible) { + if (result.has_solution() || raw_check.valid || result.guarantee != options.solve.guarantee) + throw InvalidPool("Pool infeasibility conflicts with an independently feasible raw candidate or requested evidence guarantee"); + output.termination = Termination::Optimal; + output.completion = PoolCompletion::Exhausted; + output.message = "All feasible discrete projection classes exhausted under the requested evidence guarantee"; + return finish(); + } + if (result.has_solution()) { + if (result.guarantee != options.solve.guarantee) + throw InvalidPool("Pool candidate does not provide the requested evidence guarantee"); + auto values = canonical(result, working, options.solve); + std::vector original_values(values.begin(), values.begin() + original.variables.size()); + auto checked = validate(original, original_values, options.solve.feasibility_tolerance, 0); + if (!checked.valid || !checked.objective || !std::isfinite(*checked.objective)) + throw InvalidPool("Pool candidate failed independent original-model validation"); + std::vector key; + for (const auto& domain : domains) key.push_back(static_cast(values[domain.variable.id])); + if (seen.count(key)) throw InvalidPool("Pool oracle repeated an already excluded projection"); + const bool ranked = result.termination == Termination::Optimal; + if (output.ranked_prefix != 0) { + const auto previous = *output.entries.back().solution.objective; + const auto tolerance = allowance(previous, *checked.objective, options.solve); + const auto improvement = original.objective.sense == ObjectiveSense::Minimize + ? previous - *checked.objective : *checked.objective - previous; + if (improvement > tolerance) { + // A feasible better remaining point disproves prior ranking even + // when this new solve is interrupted. Retain feasible values only. + for (auto& entry : output.entries) entry.rank_established = false; + for (auto& prior : output.attempts) prior.rank_established = false; + output.ranked_prefix = 0; + throw InvalidPool("A later feasible pool candidate disproves earlier rank evidence"); + } + } + if (ranked) { + optimum(result, *checked.objective, original.objective.sense, options.solve); + } else if (result.termination != Termination::TimeLimit && result.termination != Termination::NodeLimit && + result.termination != Termination::MemoryLimit && result.termination != Termination::IterationLimit && result.termination != Termination::SolutionLimit && + result.termination != Termination::ObjectiveLimit && result.termination != Termination::Cancelled) { + output.termination = result.termination; output.message = result.message; + return finish(); + } + SolveResult historical = result; + historical.model_id = original.model_id; historical.revision = original.revision; + historical.values = std::move(original_values); + historical.active_variables.resize(original.variables.size()); + historical.objective = checked.objective; historical.solution_validated = true; + historical.best_bound.reset(); historical.absolute_gap.reset(); historical.relative_gap.reset(); + historical.native_backend_gap.reset(); historical.termination = Termination::Unknown; + historical.message = "Validated original-model pool representative; see its pool rank evidence"; + checkpoint(budget); + seen.insert(key); + output.entries.push_back({std::move(historical), key, ranked}); + if (budget.expired()) { output.entries.pop_back(); checkpoint(budget); } + attempt.candidate_accepted = true; attempt.rank_established = ranked; + if (ranked) ++output.ranked_prefix; + if (!ranked) { + output.termination = result.termination; + output.message = "A timely validated final candidate is unranked because its solve did not establish optimality"; + return finish(); + } + if (output.entries.size() == options.max_solutions) { + output.termination = Termination::SolutionLimit; output.completion = PoolCompletion::RequestedLimit; + output.message = "Requested number of ranked projection representatives reached; exhaustion was not tested"; + return finish(); + } + exclude(working, domains, key); + } else { + if (result.termination == Termination::Optimal) + throw InvalidPool("Pool optimum lacks a validated candidate"); + output.termination = result.termination; output.message = result.message; + return finish(); + } + } + } catch (const Interrupted& stopped) { + output.termination = stopped.reason; + } catch (const UnsupportedPool& error) { + output.termination = Termination::Unsupported; output.message = error.what(); + } catch (const InvalidPool& error) { + output.termination = Termination::NumericalFailure; output.message = error.what(); + } catch (const ModelError& error) { + output.termination = Termination::InvalidModel; output.message = error.what(); + } catch (const std::bad_alloc&) { + output.termination = Termination::MemoryLimit; output.message = "Pool allocation failed"; + } catch (const std::exception& error) { + output.termination = Termination::BackendError; output.message = error.what(); + } + return finish(); +} +PoolResult failure(ModelId id, Revision revision, Guarantee guarantee, Termination reason, const std::string& message) { + PoolResult output; output.model_id = id; output.revision = revision; + output.guarantee = guarantee; output.termination = reason; output.message = message; return output; +} +} +PoolResult solve_pool(const ModelSnapshot& model, const PoolOptions& options) { + try { SolveBudget budget(options.solve); return run(model, options, budget); } + catch (const ModelError& error) { return failure(model.model_id, model.revision, options.solve.guarantee, Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.model_id, model.revision, options.solve.guarantee, Termination::MemoryLimit, "Allocation failed"); } +} +PoolResult solve_pool(const Model& model, const PoolOptions& options) { + try { SolveBudget budget(options.solve); return run(model.snapshot(), options, budget); } + catch (const ModelError& error) { return failure(model.id(), model.revision(), options.solve.guarantee, Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.id(), model.revision(), options.solve.guarantee, Termination::MemoryLimit, "Allocation failed"); } +} +}} diff --git a/gecode/optimize/pool.hpp b/gecode/optimize/pool.hpp new file mode 100644 index 0000000000..30f5a012b6 --- /dev/null +++ b/gecode/optimize/pool.hpp @@ -0,0 +1,65 @@ +/* Ranked solutions over a finite discrete projection. */ +#ifndef GECODE_OPTIMIZE_POOL_HPP +#define GECODE_OPTIMIZE_POOL_HPP +#include + +namespace Gecode { namespace Optimize { + +enum class PoolCompletion { Incomplete, RequestedLimit, Exhausted }; +struct PoolOptions { + SolveOptions solve; + std::size_t max_solutions = 10; + // Default: every active Integer/Binary variable. Explicit projections retain + // caller order, contain no duplicate handles, and must be finite and nonempty + // unless the original model has no active variables. + std::optional> projection; +}; +struct PoolEntry { + // Original historical identity/slots, independently validated. Its scalar + // objective is original; bounds/status are cleared because later pool solves + // optimize a restricted feasible set, not the entire original model. + SolveResult solution; + std::vector projection_values; + bool rank_established = false; +}; +struct PoolAttempt { + Termination termination = Termination::Unknown; + Guarantee guarantee = Guarantee::Numerical; + std::optional objective; + std::optional remaining_bound; + bool candidate_accepted = false; + bool rank_established = false; +}; +struct PoolResult { + ModelId model_id = 0; + Revision revision = 0; + Termination termination = Termination::Unknown; + PoolCompletion completion = PoolCompletion::Incomplete; + Guarantee guarantee = Guarantee::Numerical; + std::string message; + std::vector projection; + std::vector entries; + std::vector attempts; + std::size_t ranked_prefix = 0; + double elapsed_seconds = 0; + bool exhausted() const noexcept { return completion == PoolCompletion::Exhausted; } +}; + +/** + * Repeated optimization plus safe no-good exclusions. Returns one representative + * per finite Integer/Binary projection assignment, ranked by its best original + * objective when each remaining-model solve completes. Continuous and unbounded + * non-projected Integer recourse are allowed by the HiGHS backend. Real-valued + * completions of a projection are not enumerated. Ties have unspecified order. + * An interrupted timely candidate may be a final unranked entry. Only definite + * infeasibility of the remaining model establishes projection exhaustion. + * Exhaustion is a workflow Optimal status; the last oracle attempt is Infeasible. + * RequestedLimit uses SolutionLimit and never asserts exhaustion. Numerical + * completion is tolerance-qualified; Exact requires explicit Native support. + * Semis, active indicators/globals, Certified, and multistage node budgets are + * explicitly Unsupported. No original model edits occur. See POOLS.md. + */ +PoolResult solve_pool(const ModelSnapshot& model, const PoolOptions& options = {}); +PoolResult solve_pool(const Model& model, const PoolOptions& options = {}); +}} +#endif diff --git a/gecode/optimize/presolve.cpp b/gecode/optimize/presolve.cpp new file mode 100644 index 0000000000..032c2235d9 --- /dev/null +++ b/gecode/optimize/presolve.cpp @@ -0,0 +1,356 @@ +#include +#include + +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +using Integer = std::int64_t; +constexpr Integer minimum = std::numeric_limits::min(); +constexpr Integer maximum = std::numeric_limits::max(); +constexpr Integer exact_limit = INT64_C(9007199254740992); +constexpr double infinity = std::numeric_limits::infinity(); +class Unsupported : public std::runtime_error { using std::runtime_error::runtime_error; }; +class InvalidWitness : public std::runtime_error { using std::runtime_error::runtime_error; }; +struct Interrupted { Termination reason; }; +struct Contradiction { Constraint row; std::optional variable; }; +void checkpoint(const SolveBudget& budget) { + if (auto reason = budget.stop_reason()) throw Interrupted{*reason}; +} +Integer add(Integer a, Integer b) { + if ((b > 0 && a > maximum-b) || (b < 0 && a < minimum-b)) + throw Unsupported("Exact presolve addition exceeds int64 range"); + return a+b; +} +Integer subtract(Integer a, Integer b) { + if ((b > 0 && a < minimum+b) || (b < 0 && a > maximum+b)) + throw Unsupported("Exact presolve subtraction exceeds int64 range"); + return a-b; +} +Integer multiply(Integer a, Integer b) { + if (a && b && ((a > 0 && ((b > 0 && a > maximum/b) || (b < 0 && b < minimum/a))) || + (a < 0 && ((b > 0 && a < minimum/b) || (b < 0 && a < maximum/b))))) + throw Unsupported("Exact presolve multiplication exceeds int64 range"); + return a*b; +} +Integer divide(Integer value, Integer divisor, bool ceiling) { + if (!divisor || (value == minimum && divisor == -1)) + throw Unsupported("Exact presolve division exceeds int64 range"); + Integer quotient = value/divisor, remainder = value%divisor; + if (remainder && ((remainder > 0) == (divisor > 0))) { + if (ceiling) quotient = add(quotient, 1); + } else if (remainder && !ceiling) quotient = subtract(quotient, 1); + return quotient; +} +Integer integer(double value) { + if (!std::isfinite(value) || value != std::trunc(value) || std::fabs(value) > exact_limit) + throw Unsupported("Exact presolve requires integral data of magnitude at most 2^53"); + return static_cast(value); +} +double exported(Integer value) { + if (value < -exact_limit || value > exact_limit) + throw Unsupported("Reduced model or reconstructed objective exceeds exact double integer range"); + return static_cast(value); +} +struct IntegerTerm { std::size_t slot; Integer coefficient; }; +struct IntegerRow { + Constraint original; + std::vector terms; + std::optional lower, upper; + bool active = false, redundant = false; +}; +struct Data { + std::vector lower, upper; + std::vector active; + std::vector rows; + std::vector objective; + Integer offset = 0; +}; +Data parse(const ModelSnapshot& source, const SolveBudget* budget = nullptr) { + validate_structure(source); + for (const auto& indicator : source.indicators) + if (indicator.active) throw Unsupported("Exact presolve does not yet map active indicators"); + for (const auto& global : source.globals) + if (global.active) throw Unsupported("Exact presolve does not yet map active globals"); + Data data; + data.lower.resize(source.variables.size()); data.upper.resize(source.variables.size()); + for (const auto& variable : source.variables) { + if (budget) checkpoint(*budget); + data.active.push_back(variable.active); + if (!variable.active) continue; + if (variable.type != VariableType::Integer && variable.type != VariableType::Binary) + throw Unsupported("Exact presolve requires bounded Integer/Binary variables"); + data.lower[variable.variable.id] = integer(variable.lower); + data.upper[variable.variable.id] = integer(variable.upper); + } + for (const auto& original : source.rows) { + if (budget) checkpoint(*budget); + IntegerRow row; row.original = original.constraint; row.active = original.active; + if (row.active) { + if (std::isfinite(original.lower)) row.lower = integer(original.lower); + if (std::isfinite(original.upper)) row.upper = integer(original.upper); + for (const auto& term : original.terms) row.terms.push_back({static_cast(term.variable.id), integer(term.coefficient)}); + } + data.rows.push_back(std::move(row)); + } + data.offset = integer(source.objective.offset); + for (const auto& term : source.objective.terms) + data.objective.push_back({static_cast(term.variable.id), integer(term.coefficient)}); + return data; +} + +bool propagate(Data& data, const PresolveOptions& options, PresolveResult& output, const SolveBudget& budget) { + for (std::size_t pass = 0; pass < options.max_passes; ++pass) { + bool changed = false; + for (auto& row : data.rows) { + checkpoint(budget); + if (!row.active || row.redundant) continue; + if (options.max_row_visits && output.row_visits >= *options.max_row_visits) return false; + if (output.row_visits == std::numeric_limits::max()) + throw Unsupported("Presolve row-visit counter exhausted"); + ++output.row_visits; + if (!row.lower && !row.upper) { row.redundant = true; continue; } + Integer lo = 0, hi = 0; + std::vector minima, maxima; + for (const auto& term : row.terms) { + checkpoint(budget); + const auto a = multiply(term.coefficient, data.lower[term.slot]); + const auto b = multiply(term.coefficient, data.upper[term.slot]); + minima.push_back(std::min(a,b)); maxima.push_back(std::max(a,b)); + lo = add(lo, minima.back()); hi = add(hi, maxima.back()); + } + if ((row.lower && hi < *row.lower) || (row.upper && lo > *row.upper)) + throw Contradiction{row.original, {}}; + if ((!row.lower || lo >= *row.lower) && (!row.upper || hi <= *row.upper)) { + row.redundant = true; continue; + } + struct Proposal { std::size_t slot; Integer lower, upper; }; + std::vector proposals; + // Every proposal uses the unchanged box seen at the beginning of this row. + for (std::size_t i = 0; i < row.terms.size(); ++i) { + checkpoint(budget); + const auto& term = row.terms[i]; + Integer lower = data.lower[term.slot], upper = data.upper[term.slot]; + if (row.lower) { + const auto rhs = subtract(*row.lower, subtract(hi, maxima[i])); + if (term.coefficient > 0) lower = std::max(lower, divide(rhs, term.coefficient, true)); + else upper = std::min(upper, divide(rhs, term.coefficient, false)); + } + if (row.upper) { + const auto rhs = subtract(*row.upper, subtract(lo, minima[i])); + if (term.coefficient > 0) upper = std::min(upper, divide(rhs, term.coefficient, false)); + else lower = std::max(lower, divide(rhs, term.coefficient, true)); + } + if (lower > upper) throw Contradiction{row.original, Variable{row.original.model_id, term.slot}}; + proposals.push_back({term.slot, lower, upper}); + } + for (const auto& proposal : proposals) { + checkpoint(budget); + const Variable variable{row.original.model_id, proposal.slot}; + if (proposal.lower != data.lower[proposal.slot]) { + output.changes.push_back({variable, row.original, PresolveBoundSide::Lower, + data.lower[proposal.slot], proposal.lower, pass}); + data.lower[proposal.slot] = proposal.lower; changed = true; + } + if (proposal.upper != data.upper[proposal.slot]) { + output.changes.push_back({variable, row.original, PresolveBoundSide::Upper, + data.upper[proposal.slot], proposal.upper, pass}); + data.upper[proposal.slot] = proposal.upper; changed = true; + } + } + } + ++output.passes; + if (!changed) return true; + } + return false; +} + +Integer exact_check(const ModelSnapshot& model, const std::vector& values) { + const auto data = parse(model); + if (values.size() != model.variables.size()) throw InvalidWitness("Postsolve assignment has incorrect slot count"); + std::vector point(values.size()); + for (std::size_t i = 0; i < values.size(); ++i) if (data.active[i]) { + point[i] = integer(values[i]); + if (point[i] < data.lower[i] || point[i] > data.upper[i]) + throw InvalidWitness("Postsolve assignment violates an exact original variable interval"); + } + for (const auto& row : data.rows) if (row.active) { + Integer value = 0; + for (const auto& term : row.terms) value = add(value, multiply(term.coefficient, point[term.slot])); + if ((row.lower && value < *row.lower) || (row.upper && value > *row.upper)) + throw InvalidWitness("Postsolve assignment violates an exact original linear row"); + } + Integer objective = data.offset; + for (const auto& term : data.objective) objective = add(objective, multiply(term.coefficient, point[term.slot])); + return objective; +} +SolveOptions budget_options(const PresolveOptions& options) { + SolveOptions result; result.time_limit_seconds = options.time_limit_seconds; + result.cancellation = options.cancellation; return result; +} +} + +namespace Detail { +struct PresolveBuilder { + static std::shared_ptr build(const ModelSnapshot& source, const Data& data, + PresolveResult& output, const SolveBudget& budget) { + Model reduced; + if (reduced.id() == source.model_id) reduced = Model{}; + std::vector variables; + std::vector rows; + for (std::size_t i = 0; i < source.variables.size(); ++i) { + checkpoint(budget); + const auto& original = source.variables[i]; + PresolveVariableMap mapping; + mapping.original = original.variable; mapping.active = original.active; + if (original.active) { + mapping.lower = data.lower[i]; mapping.upper = data.upper[i]; + if (mapping.lower == mapping.upper) { mapping.fixed_value = mapping.lower; ++output.fixed_variables; } + else mapping.reduced = reduced.add_variable(original.type, exported(mapping.lower), exported(mapping.upper), original.name); + } + variables.push_back(mapping); + } + for (std::size_t i = 0; i < data.rows.size(); ++i) { + checkpoint(budget); + const auto& row = data.rows[i]; + PresolveRowMap mapping; mapping.original = row.original; mapping.active = row.active; + if (row.active) { + if (row.redundant) { mapping.redundant = true; ++output.removed_rows; } + else { + Integer shift = 0; + std::vector terms; + for (const auto& term : row.terms) { + checkpoint(budget); + if (variables[term.slot].fixed_value) shift = add(shift, multiply(term.coefficient, *variables[term.slot].fixed_value)); + else terms.push_back({*variables[term.slot].reduced, exported(term.coefficient)}); + } + const auto lower = row.lower ? std::optional(subtract(*row.lower, shift)) : std::nullopt; + const auto upper = row.upper ? std::optional(subtract(*row.upper, shift)) : std::nullopt; + mapping.substituted_constant = shift; + if (terms.empty()) { + if ((lower && *lower > 0) || (upper && *upper < 0)) throw Contradiction{row.original, {}}; + mapping.redundant = true; ++output.removed_rows; + } else { + mapping.reduced = reduced.add_row(terms, lower ? exported(*lower) : -infinity, + upper ? exported(*upper) : infinity, source.rows[i].name); + } + } + } + rows.push_back(mapping); + } + Integer offset = data.offset; + std::vector objective; + for (const auto& term : data.objective) { + checkpoint(budget); + if (variables[term.slot].fixed_value) offset = add(offset, multiply(term.coefficient, *variables[term.slot].fixed_value)); + else objective.push_back({*variables[term.slot].reduced, exported(term.coefficient)}); + } + reduced.set_objective(objective, source.objective.sense, exported(offset)); + auto snapshot = reduced.snapshot(); + validate_structure(snapshot); + checkpoint(budget); + return std::shared_ptr(new PresolvedModel(source, std::move(snapshot), std::move(variables), std::move(rows))); + } +}; +} + +PresolvedModel::PresolvedModel(ModelSnapshot original, ModelSnapshot reduced, + std::vector variables, std::vector rows) + : original_(std::move(original)), reduced_(std::move(reduced)), variables_(std::move(variables)), rows_(std::move(rows)) {} + +PostsolveResult PresolvedModel::postsolve(const SolveResult& candidate, double tolerance) const { + PostsolveResult output; + auto& result = output.solution; + result.model_id = original_.model_id; result.revision = original_.revision; + try { + if (!std::isfinite(tolerance) || tolerance < 0 || tolerance >= 0.5) + throw ModelError("Postsolve integer tolerance must be finite and in [0,0.5)"); + if (candidate.model_id != reduced_.model_id || candidate.revision != reduced_.revision || + candidate.values.size() != reduced_.variables.size() || candidate.active_variables.size() != reduced_.variables.size()) + throw ModelError("Postsolve candidate has foreign identity, stale revision, or incorrect slot layout"); + if (candidate.guarantee == Guarantee::Certified) + throw Unsupported("Postsolve does not transfer certificate guarantees"); + if (candidate.guarantee != Guarantee::Numerical && candidate.guarantee != Guarantee::Exact) + throw ModelError("Unknown postsolve input guarantee"); + auto values = candidate.values; + for (std::size_t i = 0; i < values.size(); ++i) { + if (candidate.active_variables[i] != reduced_.variables[i].active) + throw ModelError("Postsolve candidate has an inconsistent active mask"); + if (!std::isfinite(values[i]) || std::fabs(values[i]) > exact_limit || + std::fabs(values[i]-std::round(values[i])) > tolerance) + throw InvalidWitness("Postsolve candidate is not a finite integer assignment within tolerance"); + values[i] = std::round(values[i]); + } + const auto reduced_objective = exact_check(reduced_, values); + std::vector original_values(original_.variables.size(), std::numeric_limits::quiet_NaN()); + for (const auto& mapping : variables_) if (mapping.active) + original_values[mapping.original.id] = mapping.fixed_value ? exported(*mapping.fixed_value) : values[mapping.reduced->id]; + const auto original_objective = exact_check(original_, original_values); + if (original_objective != reduced_objective) throw InvalidWitness("Postsolve objective does not agree under the owned transformation"); + result.objective = exported(original_objective); + result.values = std::move(original_values); + for (const auto& variable : original_.variables) result.active_variables.push_back(variable.active); + result.guarantee = candidate.guarantee; result.backend = candidate.backend; result.backend_version = candidate.backend_version; + result.solution_validated = true; result.termination = Termination::Unknown; + result.message = "Exact original feasible witness reconstructed; no scalar optimum status or global bound transferred"; + output.exact_witness_validated = true; + } catch (const Unsupported& error) { result.termination = Termination::Unsupported; result.message = error.what(); } + catch (const InvalidWitness& error) { result.termination = Termination::NumericalFailure; result.message = error.what(); } + catch (const ModelError& error) { result.termination = Termination::InvalidModel; result.message = error.what(); } + catch (const std::bad_alloc&) { result.termination = Termination::MemoryLimit; result.message = "Allocation failed"; } + if (!output.exact_witness_validated) result.solution_validated = false; + return output; +} + +namespace { +PresolveResult run(const ModelSnapshot& source, const PresolveOptions& options, SolveBudget& budget) { + PresolveResult output; output.model_id = source.model_id; output.revision = source.revision; + try { + checkpoint(budget); + auto data = parse(source, &budget); + const bool fixed = propagate(data, options, output, budget); + auto model = Detail::PresolveBuilder::build(source, data, output, budget); + checkpoint(budget); + output.model = std::move(model); + output.status = fixed ? PresolveStatus::Fixpoint : PresolveStatus::Incomplete; + output.termination = fixed ? Termination::Optimal : Termination::IterationLimit; + output.message = fixed ? "Exact propagation reached its fixpoint; the owned reduction preserves the integer feasible set" + : "Propagation work limit reached; the finalized partial reduction is exactly equivalent"; + } catch (const Contradiction& proof) { + output.status = PresolveStatus::Infeasible; output.termination = Termination::Infeasible; + output.infeasible_row = proof.row; output.infeasible_variable = proof.variable; + output.message = "Exact integer interval arithmetic establishes an original-model contradiction"; + } catch (const Interrupted& stopped) { output.status = PresolveStatus::Incomplete; output.termination = stopped.reason; } + catch (const Unsupported& error) { output.status = PresolveStatus::Unsupported; output.termination = Termination::Unsupported; output.message = error.what(); } + catch (const ModelError& error) { output.status = PresolveStatus::InvalidModel; output.termination = Termination::InvalidModel; output.message = error.what(); } + catch (const std::bad_alloc&) { output.status = PresolveStatus::Error; output.termination = Termination::MemoryLimit; output.message = "Allocation failed"; } + catch (const std::exception& error) { output.status = PresolveStatus::Error; output.termination = Termination::BackendError; output.message = error.what(); } + if (output.status != PresolveStatus::Fixpoint && + !(output.status == PresolveStatus::Incomplete && output.termination == Termination::IterationLimit)) + output.model.reset(); + if (auto reason = budget.stop_reason()) { + output.model.reset(); output.infeasible_row.reset(); output.infeasible_variable.reset(); + output.status = PresolveStatus::Incomplete; output.termination = *reason; + output.message = "Presolve budget stopped; no new reduction or infeasibility result was published"; + } + output.elapsed_seconds = budget.elapsed_seconds(); return output; +} +PresolveResult failure(ModelId id, Revision revision, Termination reason, const std::string& message) { + PresolveResult output; output.model_id = id; output.revision = revision; + output.status = reason == Termination::InvalidModel ? PresolveStatus::InvalidModel : PresolveStatus::Error; + output.termination = reason; output.message = message; return output; +} +} +PresolveResult presolve_integer(const ModelSnapshot& model, const PresolveOptions& options) { + try { SolveBudget budget(budget_options(options)); return run(model, options, budget); } + catch (const ModelError& error) { return failure(model.model_id, model.revision, Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.model_id, model.revision, Termination::MemoryLimit, "Allocation failed"); } +} +PresolveResult presolve_integer(const Model& model, const PresolveOptions& options) { + try { SolveBudget budget(budget_options(options)); return run(model.snapshot(), options, budget); } + catch (const ModelError& error) { return failure(model.id(), model.revision(), Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.id(), model.revision(), Termination::MemoryLimit, "Allocation failed"); } +} +}} diff --git a/gecode/optimize/presolve.hpp b/gecode/optimize/presolve.hpp new file mode 100644 index 0000000000..223363f213 --- /dev/null +++ b/gecode/optimize/presolve.hpp @@ -0,0 +1,88 @@ +/* Explicit exact bounded-integer reductions and owning reconstruction. */ +#ifndef GECODE_OPTIMIZE_PRESOLVE_HPP +#define GECODE_OPTIMIZE_PRESOLVE_HPP +#include +#include + +namespace Gecode { namespace Optimize { +enum class PresolveStatus { Fixpoint, Incomplete, Infeasible, Unsupported, InvalidModel, Error }; +enum class PresolveBoundSide { Lower, Upper }; +struct PresolveOptions { + double time_limit_seconds = std::numeric_limits::infinity(); + std::shared_ptr cancellation; + std::size_t max_passes = 100; + // Counts propagation row visits, excluding structural checks/finalization. + std::optional max_row_visits; +}; +struct PresolveBoundChange { + Variable variable; + Constraint row; + PresolveBoundSide side = PresolveBoundSide::Lower; + std::int64_t before = 0, after = 0; + std::size_t pass = 0; +}; +struct PresolveVariableMap { + Variable original; + bool active = false; + std::optional reduced; + std::optional fixed_value; + std::int64_t lower = 0, upper = 0; +}; +struct PresolveRowMap { + Constraint original; + bool active = false; + std::optional reduced; + bool redundant = false; + // Exact fixed-variable contribution subtracted from retained row bounds. + std::optional substituted_constant; +}; +struct PostsolveResult { + SolveResult solution; + bool exact_witness_validated = false; +}; +namespace Detail { struct PresolveBuilder; } +class PresolvedModel { +public: + const ModelSnapshot& original() const noexcept { return original_; } + const ModelSnapshot& reduced() const noexcept { return reduced_; } + const std::vector& variables() const noexcept { return variables_; } + const std::vector& rows() const noexcept { return rows_; } + // An original historical feasible solution only: scalar optimum status, + // global bounds and gaps are not transferred. Integer values may be rounded + // within tolerance, then both models are checked with exact integer arithmetic. + PostsolveResult postsolve(const SolveResult& candidate, + double integrality_tolerance = 1e-6) const; +private: + friend struct Detail::PresolveBuilder; + PresolvedModel(ModelSnapshot original, ModelSnapshot reduced, + std::vector variables, + std::vector rows); + ModelSnapshot original_, reduced_; + std::vector variables_; + std::vector rows_; +}; +struct PresolveResult { + ModelId model_id = 0; + Revision revision = 0; + PresolveStatus status = PresolveStatus::Incomplete; + // Optimal means propagation reached its fixpoint, not a solved optimization. + Termination termination = Termination::Unknown; + Guarantee guarantee = Guarantee::Exact; + std::string message; + std::shared_ptr model; + std::vector changes; + std::optional infeasible_row; + std::optional infeasible_variable; + std::size_t passes = 0, row_visits = 0, fixed_variables = 0, removed_rows = 0; + double elapsed_seconds = 0; +}; + +// Finite Integer/Binary variables and integral ordinary linear data only. +// Checked int64 arithmetic; exported integer doubles have magnitude <=2^53. +// Unsupported arithmetic/data never authorize a reduction or infeasibility. +// Explicit utility; automatic Native solving uses a separate bounded exact +// composition. The postsolve() feasible-witness-only contract is unchanged. +PresolveResult presolve_integer(const ModelSnapshot& model, const PresolveOptions& options = {}); +PresolveResult presolve_integer(const Model& model, const PresolveOptions& options = {}); +}} +#endif diff --git a/gecode/optimize/quadratic.cpp b/gecode/optimize/quadratic.cpp new file mode 100644 index 0000000000..477b80cb8e --- /dev/null +++ b/gecode/optimize/quadratic.cpp @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include +#include +namespace Gecode { namespace Optimize { +struct QuadraticSnapshot::Data { + ModelSnapshot core; + std::vector squares; +}; +QuadraticSnapshot::QuadraticSnapshot(ModelSnapshot core, std::vector squares) + : data_(std::make_shared(Data{std::move(core), std::move(squares)})) {} +ModelId QuadraticSnapshot::id() const noexcept { return data_->core.model_id; } +Revision QuadraticSnapshot::revision() const noexcept { return data_->core.revision; } +const std::vector& QuadraticSnapshot::variables() const noexcept { return data_->core.variables; } +const std::vector& QuadraticSnapshot::rows() const noexcept { return data_->core.rows; } +const ObjectiveData& QuadraticSnapshot::linear_part() const noexcept { return data_->core.objective; } +const std::vector& QuadraticSnapshot::squares() const noexcept { return data_->squares; } +const ModelSnapshot& Detail::QuadraticAccess::core(const QuadraticSnapshot& q) { return q.data_->core; } +namespace { +void finite_box(double l, double u) { + if (!std::isfinite(l) || !std::isfinite(u) || l > u) + throw ModelError("Quadratic variables require finite ordered bounds"); +} +class Sum { + long double sum_ = 0, correction_ = 0; +public: + void add(long double x) { + const auto next = sum_ + x; + correction_ += std::abs(sum_) >= std::abs(x) ? (sum_-next)+x : (x-next)+sum_; + sum_ = next; + } + long double value() const { return sum_ + correction_; } +}; +double finite_value(long double x) { + const double d = static_cast(x); + if (!std::isfinite(x) || !std::isfinite(d)) throw ModelError("Quadratic evaluation overflow"); + return d; +} +} +Variable QuadraticModel::add_continuous(double l, double u, std::string name) { + finite_box(l,u); return core_.add_continuous(l,u,std::move(name)); +} +Constraint QuadraticModel::add_row(const std::vector& terms, double l, double u, std::string name) { + return core_.add_row(terms,l,u,std::move(name)); +} +void QuadraticModel::set_bounds(Variable v, double l, double u) { finite_box(l,u); core_.set_bounds(v,l,u); } +void QuadraticModel::set_bounds(Constraint r, double l, double u) { core_.set_bounds(r,l,u); } +void QuadraticModel::set_coefficient(Constraint r, Variable v, double a) { core_.set_coefficient(r,v,a); } +void QuadraticModel::remove(Constraint r) { core_.remove(r); } +void QuadraticModel::remove(Variable v) { + core_.variable(v); + for (const auto& square : squares_) + for (const auto& t : square.terms) + if (t.variable == v) throw ModelError("Variable is referenced by a square"); + core_.remove(v); +} +void QuadraticModel::objective(const std::vector& squares, + const std::vector& linear, double offset, ObjectiveSense sense) { + if (!core_.id()) throw ModelError("Moved-from quadratic model"); + auto staged = squares; + for (auto& square : staged) { + if (!std::isfinite(square.weight) || square.weight <= 0 || !std::isfinite(square.offset)) + throw ModelError("Square requires finite positive weight and finite offset"); + for (const auto& t : square.terms) { + core_.variable(t.variable); + if (!std::isfinite(t.coefficient)) throw ModelError("Nonfinite square coefficient"); + } + std::stable_sort(square.terms.begin(), square.terms.end(), [](const Term& a, const Term& b) { + return a.variable.id < b.variable.id; + }); + std::vector canonical; + for (std::size_t i=0; i& s, const std::vector& l, double o) { + objective(s,l,o,ObjectiveSense::Minimize); +} +void QuadraticModel::maximize_concave_squares(const std::vector& s, const std::vector& l, double o) { + objective(s,l,o,ObjectiveSense::Maximize); +} +QuadraticSnapshot QuadraticModel::snapshot() const { return QuadraticSnapshot(core_.snapshot(),squares_); } +void QuadraticOptions::validate() const { + solve.validate(); + for (double t : {stationarity_tolerance,complementarity_tolerance,optimality_tolerance}) + if (!std::isfinite(t) || t < 0) throw ModelError("QP checking tolerances must be finite and nonnegative"); +} +QuadraticValidation validate_quadratic(const QuadraticSnapshot& model, + const std::vector& values, double tolerance) { + QuadraticValidation out; + try { + const auto& core = Detail::QuadraticAccess::core(model); + const auto linear = validate(core,values,tolerance); + out.primal_valid = linear.valid; + if (!linear.valid) { out.message = linear.message; return out; } + const int sign = core.objective.sense == ObjectiveSense::Minimize ? 1 : -1; + Sum objective; + objective.add(core.objective.offset); + std::vector gradient(core.variables.size()); + for (const auto& t : core.objective.terms) { + objective.add(static_cast(t.coefficient)*values[t.variable.id]); + gradient[t.variable.id].add(t.coefficient); + } + for (const auto& square : model.squares()) { + Sum residual; residual.add(square.offset); + for (const auto& t : square.terms) + residual.add(static_cast(t.coefficient)*values[t.variable.id]); + const auto r = residual.value(); + out.square_values.push_back(finite_value(r)); + objective.add(sign*static_cast(square.weight)*r*r); + for (const auto& t : square.terms) + gradient[t.variable.id].add(2*sign*static_cast(square.weight)*r*t.coefficient); + } + out.original_objective = finite_value(objective.value()); + out.original_gradient.resize(core.variables.size(),0); + for (const auto& v : core.variables) if (v.active) + out.original_gradient[v.variable.id] = finite_value(gradient[v.variable.id].value()); + out.objective_valid = true; + } catch (const ModelError& e) { out.message = e.what(); } + return out; +} +}} diff --git a/gecode/optimize/quadratic.hpp b/gecode/optimize/quadratic.hpp new file mode 100644 index 0000000000..642d7e48b4 --- /dev/null +++ b/gecode/optimize/quadratic.hpp @@ -0,0 +1,100 @@ +/* Explicit bounded convex/concave continuous quadratic optimization. */ +#ifndef GECODE_OPTIMIZE_QUADRATIC_HPP +#define GECODE_OPTIMIZE_QUADRATIC_HPP +#include +#include +namespace Gecode { namespace Optimize { +namespace Detail { struct QuadraticAccess; } +struct WeightedSquare { + std::vector terms; + double offset = 0; + double weight = 1; + std::string name; +}; +/** Immutable, owning, distinct snapshot; no conversion to a linear model. */ +class QuadraticSnapshot { +public: + QuadraticSnapshot(const QuadraticSnapshot&) noexcept = default; + QuadraticSnapshot& operator=(const QuadraticSnapshot&) noexcept = default; + // Moving a snapshot preserves a usable historical view in both objects. + QuadraticSnapshot(QuadraticSnapshot&& other) noexcept : data_(other.data_) {} + QuadraticSnapshot& operator=(QuadraticSnapshot&& other) noexcept { data_=other.data_; return *this; } + ModelId id() const noexcept; + Revision revision() const noexcept; + const std::vector& variables() const noexcept; + const std::vector& rows() const noexcept; + const ObjectiveData& linear_part() const noexcept; + const std::vector& squares() const noexcept; +private: + struct Data; + std::shared_ptr data_; + explicit QuadraticSnapshot(ModelSnapshot, std::vector); + friend class QuadraticModel; + friend struct Detail::QuadraticAccess; +}; +/** f = linear + offset + sum(w*r^2) for min, minus sum(w*r^2) for max. */ +class QuadraticModel { +public: + QuadraticModel() = default; + QuadraticModel(QuadraticModel&&) noexcept = default; + QuadraticModel& operator=(QuadraticModel&&) noexcept = default; + QuadraticModel(const QuadraticModel&) = delete; + QuadraticModel& operator=(const QuadraticModel&) = delete; + ModelId id() const noexcept { return core_.id(); } + Revision revision() const noexcept { return core_.revision(); } + Variable add_continuous(double lower, double upper, std::string name = {}); + Constraint add_row(const std::vector&, double lower, double upper, + std::string name = {}); + void set_bounds(Variable, double lower, double upper); + void set_bounds(Constraint, double lower, double upper); + void set_coefficient(Constraint, Variable, double); + void remove(Variable); + void remove(Constraint); + void minimize_squares(const std::vector&, + const std::vector& linear = {}, double offset = 0); + void maximize_concave_squares(const std::vector&, + const std::vector& linear = {}, double offset = 0); + QuadraticSnapshot snapshot() const; +private: + Model core_; + std::vector squares_; + void objective(const std::vector&, const std::vector&, + double, ObjectiveSense); +}; +struct QuadraticOptions { + SolveOptions solve; + std::uint64_t iteration_limit = 100000; + std::size_t max_auxiliary_variables = 100000; + std::size_t max_lifted_nonzeros = 2000000; + double stationarity_tolerance = 1e-7; + double complementarity_tolerance = 1e-7; + /** Absolute original objective units; no relaxation by objective constants. */ + double optimality_tolerance = 1e-6; + void validate() const; +}; +struct QuadraticValidation { + bool primal_valid = false, objective_valid = false; + bool kkt_available = false, kkt_valid = false, bound_valid = false; + double max_stationarity = 0, max_complementarity = 0; + std::optional original_objective, normalized_lower_bound; + /** Outward upper bound on original normalized primal minus dual, offset free. */ + std::optional gap_upper_bound; + std::vector square_values, original_gradient; + std::string message; +}; +struct QuadraticResult { + SolveResult result; + QuadraticValidation checks; + std::optional vendor_objective, vendor_dual_estimate; + std::uint64_t qp_iterations = 0; + double regularization = 0; +}; +/** Independent original primal/objective/gradient check; no optimality claim. */ +QuadraticValidation validate_quadratic(const QuadraticSnapshot&, + const std::vector&, + double feasibility_tolerance = 1e-7); +QuadraticResult solve_quadratic(const QuadraticSnapshot&, const QuadraticOptions& = {}); +QuadraticResult solve_quadratic(const QuadraticModel&, const QuadraticOptions& = {}); +BackendCapabilities quadratic_capabilities(); +}} +#endif diff --git a/gecode/optimize/quadratic_bound.cpp b/gecode/optimize/quadratic_bound.cpp new file mode 100644 index 0000000000..bb9e7cc4a4 --- /dev/null +++ b/gecode/optimize/quadratic_bound.cpp @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include +#include +namespace Gecode { namespace Optimize { namespace Detail { +namespace { +void finite(QpInterval v) { + if (!std::isfinite(v.lower) || !std::isfinite(v.upper) || v.lower > v.upper) + throw std::overflow_error("Unavailable QP enclosure"); +} +QpInterval widen(double lower, double upper) { + QpInterval r{std::nextafter(lower,-std::numeric_limits::infinity()), + std::nextafter(upper,std::numeric_limits::infinity())}; + finite(r); return r; +} +void checkpoint(const SolveBudget* b) { + if (b && b->expired()) throw std::overflow_error("QP bound budget exhausted"); +} +QpInterval affine(const std::vector& terms, double offset, const std::vector& x) { + auto r = qp_point(offset); + for (const auto& t : terms) r = qp_add(r,qp_multiply(qp_point(t.coefficient),qp_point(x.at(t.variable.id)))); + return r; +} +} +bool quadratic_arithmetic_supported() noexcept { +#if defined(__FAST_MATH__) || (defined(__FINITE_MATH_ONLY__) && __FINITE_MATH_ONLY__ != 0) + return false; +#else + if (!std::numeric_limits::is_iec559 || FLT_RADIX != 2 || DBL_MANT_DIG != 53 || + sizeof(double) != 8 || std::fegetround() != FE_TONEAREST) return false; + // Reject flush-to-zero/denormals-are-zero environments as well as other formats. + volatile double tiny = std::numeric_limits::denorm_min(); + volatile double two = 2.0; + volatile double preserved = tiny * two; + return preserved == std::numeric_limits::denorm_min()*2 && preserved != 0; +#endif +} +QpInterval qp_point(double x) { QpInterval r{x,x}; finite(r); return r; } +QpInterval qp_negate(QpInterval x) { finite(x); return {-x.upper,-x.lower}; } +QpInterval qp_add(QpInterval a, QpInterval b) { + finite(a); finite(b); + if (a.lower == 0 && a.upper == 0) return b; + if (b.lower == 0 && b.upper == 0) return a; + volatile double lo = a.lower+b.lower, hi = a.upper+b.upper; + return widen(lo,hi); +} +QpInterval qp_multiply(QpInterval a, QpInterval b) { + finite(a); finite(b); + if ((a.lower == 0 && a.upper == 0) || (b.lower == 0 && b.upper == 0)) return {0,0}; + if (a.lower == 1 && a.upper == 1) return b; + if (b.lower == 1 && b.upper == 1) return a; + if (a.lower == -1 && a.upper == -1) return qp_negate(b); + if (b.lower == -1 && b.upper == -1) return qp_negate(a); + volatile double p0 = a.lower*b.lower, p1 = a.lower*b.upper; + volatile double p2 = a.upper*b.lower, p3 = a.upper*b.upper; + const double lo = std::min(std::min(double(p0),double(p1)),std::min(double(p2),double(p3))); + const double hi = std::max(std::max(double(p0),double(p1)),std::max(double(p2),double(p3))); + return widen(lo,hi); +} +QuadraticBound quadratic_bound(const QuadraticSnapshot& q, const std::vector& x, + const std::vector& tangents, + const std::vector& duals, const SolveBudget* budget) { + QuadraticBound out; + if (!quadratic_arithmetic_supported()) return out; + try { + checkpoint(budget); + if (tangents.size() != q.squares().size() || duals.size() != q.rows().size()) return out; + const double sign = q.linear_part().sense == ObjectiveSense::Minimize ? 1 : -1; + std::vector r(q.variables().size(),{0,0}); + for (const auto& t : q.linear_part().terms) r[t.variable.id] = qp_point(sign*t.coefficient); + auto k = qp_point(0); + for (std::size_t i=0; i= 0 ? row.lower : row.upper; + if (!std::isfinite(side)) d = 0; + if (!d) continue; + k = qp_add(k,qp_multiply(qp_point(d),qp_point(side))); + for (const auto& a : row.terms) + r[a.variable.id] = qp_add(r[a.variable.id],qp_negate(qp_multiply(qp_point(d),qp_point(a.coefficient)))); + } + auto centered = k; + for (const auto& v : q.variables()) if (v.active) { + checkpoint(budget); + const auto product = qp_multiply(r[v.variable.id],{v.lower,v.upper}); + // Only this minimum's lower endpoint is used in the proof. + centered = qp_add(centered,qp_point(product.lower)); + } + out.normalized_lower = qp_add(centered,qp_point(sign*q.linear_part().offset)).lower; + if (x.size() == q.variables().size()) { + auto p = affine(q.linear_part().terms,0,x); + if (sign < 0) p = qp_negate(p); + for (const auto& sq : q.squares()) { + checkpoint(budget); + const auto residual = affine(sq.terms,sq.offset,x); + p = qp_add(p,qp_multiply(qp_point(sq.weight),qp_multiply(residual,residual))); + } + // Offsets cancel algebraically before enclosure, even when huge. + out.gap_upper = qp_add(p,qp_negate(qp_point(centered.lower))).upper; + } + checkpoint(budget); + } catch (const std::overflow_error&) { return {}; } + catch (const std::out_of_range&) { return {}; } + return out; +} +}}} diff --git a/gecode/optimize/quadratic_bound.hpp b/gecode/optimize/quadratic_bound.hpp new file mode 100644 index 0000000000..599d65a077 --- /dev/null +++ b/gecode/optimize/quadratic_bound.hpp @@ -0,0 +1,41 @@ +/* Private QP compilation/checking helpers. Not a supported public model API. */ +#ifndef GECODE_OPTIMIZE_QUADRATIC_BOUND_HPP +#define GECODE_OPTIMIZE_QUADRATIC_BOUND_HPP +#include +namespace Gecode { namespace Optimize { namespace Detail { +struct QuadraticAccess { + static const ModelSnapshot& core(const QuadraticSnapshot&); +}; +struct QpInterval { double lower, upper; }; +bool quadratic_arithmetic_supported() noexcept; +QpInterval qp_add(QpInterval, QpInterval); +QpInterval qp_multiply(QpInterval, QpInterval); +QpInterval qp_negate(QpInterval); +QpInterval qp_point(double); +struct QuadraticBound { + std::optional normalized_lower; + std::optional gap_upper; +}; +QuadraticBound quadratic_bound(const QuadraticSnapshot&, const std::vector& values, + const std::vector& tangents, + const std::vector& row_duals, + const SolveBudget* = nullptr); +struct QuadraticRaw { + ModelId model_id = 0; + Revision revision = 0; + Termination termination = Termination::Unknown; + bool value_valid = false, dual_valid = false; + std::vector values, residual_values, row_duals, column_duals; + std::vector active_variables; + std::optional objective, dual_estimate; + std::uint64_t iterations = 0; + double regularization = 0; + std::string message; +}; +#ifdef GECODE_QUADRATIC_TEST_HOOKS +bool quadratic_test_oracle(const QuadraticSnapshot&, const QuadraticOptions&, QuadraticRaw&); +void quadratic_test_event(const char*); +extern double quadratic_test_regularization; +#endif +}}} +#endif diff --git a/gecode/optimize/quadratic_solve.cpp b/gecode/optimize/quadratic_solve.cpp new file mode 100644 index 0000000000..0e199d4920 --- /dev/null +++ b/gecode/optimize/quadratic_solve.cpp @@ -0,0 +1,383 @@ +#include +#include +#include +#include +#include +#include +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +#include +#endif +namespace Gecode { namespace Optimize { +namespace { +using Detail::QuadraticRaw; +struct Unsupported : std::runtime_error { using std::runtime_error::runtime_error; }; +struct Stopped { Termination reason; }; +void checkpoint(const SolveBudget& budget) { + if (auto reason = budget.stop_reason()) throw Stopped{*reason}; +} +void event(const char* name) { +#ifdef GECODE_QUADRATIC_TEST_HOOKS + Detail::quadratic_test_event(name); +#else + (void)name; +#endif +} +void support(const QuadraticOptions& o) { + if (o.solve.backend != Backend::Auto && o.solve.backend != Backend::Highs) + throw Unsupported("QP requires the HiGHS backend"); + if (o.solve.guarantee != Guarantee::Numerical) + throw Unsupported("QP supports Numerical guarantees only"); + if (o.solve.threads != 1 || o.solve.random_seed != 0 || o.solve.node_limit || !o.solve.primal_start.empty()) + throw Unsupported("QP supports one worker, zero seed, no node quota or primal start"); + if (!Detail::quadratic_arithmetic_supported()) + throw Unsupported("QP requires IEEE binary64 nearest rounding without fast-math or flush-to-zero"); +} +class Sum { + long double s_=0,c_=0; +public: + void add(long double x) { const auto n=s_+x; c_+=std::abs(s_)>=std::abs(x)?(s_-n)+x:(x-n)+s_; s_=n; } + long double value() const { return s_+c_; } +}; +long double activity(const std::vector& terms, const std::vector& x, double offset=0) { + Sum sum; sum.add(offset); + for (const auto& t : terms) sum.add(static_cast(t.coefficient)*x[t.variable.id]); + return sum.value(); +} +void check_kkt(const QuadraticSnapshot& q, const QuadraticRaw& raw, + const QuadraticOptions& o, QuadraticValidation& checked, const SolveBudget& budget) { + if (!raw.dual_valid || raw.row_duals.size()!=q.rows().size() || + raw.column_duals.size()!=q.variables().size()) return; + for (const auto& row : q.rows()) if (row.active && !std::isfinite(raw.row_duals[row.constraint.id])) return; + for (const auto& v : q.variables()) if (v.active && !std::isfinite(raw.column_duals[v.variable.id])) return; + checked.kkt_available = true; + bool valid = true; + const int sign = q.linear_part().sense == ObjectiveSense::Minimize ? 1 : -1; + std::vector residual(q.variables().size()); + std::vector scales(q.variables().size(),1); + for (const auto& v : q.variables()) if (v.active) { + const auto j=v.variable.id; + residual[j].add(sign*checked.original_gradient[j]); + residual[j].add(-raw.column_duals[j]); + scales[j]+=std::abs(checked.original_gradient[j])+std::abs(raw.column_duals[j]); + } + auto complementary = [&](long double d, long double slack, bool side_finite) { + if (d==0) return; + if (!side_finite) { valid=false; return; } + const auto magnitude=std::abs(d*slack); + if (!std::isfinite(magnitude)) { valid=false; return; } + checked.max_complementarity=std::max(checked.max_complementarity,static_cast(magnitude)); + if (magnitude>o.complementarity_tolerance) valid=false; + }; + for (const auto& row : q.rows()) if (row.active) { + checkpoint(budget); + const double d=raw.row_duals[row.constraint.id]; + const double side=d>=0?row.lower:row.upper; + complementary(d,std::isfinite(side)?activity(row.terms,raw.values,-side):0,std::isfinite(side)); + for (const auto& t : row.terms) { + const auto value=static_cast(t.coefficient)*d; + residual[t.variable.id].add(-value); + scales[t.variable.id]+=std::abs(value); + } + } + for (const auto& v : q.variables()) if (v.active) { + checkpoint(budget); + const auto j=v.variable.id; + const double d=raw.column_duals[j], side=d>=0?v.lower:v.upper; + complementary(d,static_cast(raw.values[j])-side,true); + const auto magnitude=std::abs(residual[j].value()); + if (!std::isfinite(magnitude) || !std::isfinite(scales[j])) { valid=false; continue; } + checked.max_stationarity=std::max(checked.max_stationarity,static_cast(magnitude)); + if (magnitude>o.stationarity_tolerance*scales[j]) valid=false; + } + checked.kkt_valid=valid; +} +void accept(const QuadraticSnapshot& q, const QuadraticOptions& o, const QuadraticRaw& raw, + QuadraticResult& out, const SolveBudget& budget) { + checkpoint(budget); + auto& result=out.result; + result.termination=raw.termination; + result.message=raw.message; + out.qp_iterations=raw.iterations; + out.regularization=raw.regularization; + if ((raw.objective && !std::isfinite(*raw.objective)) || + (raw.dual_estimate && !std::isfinite(*raw.dual_estimate))) { + result.termination=Termination::NumericalFailure; result.message="Nonfinite vendor objective evidence"; return; + } + out.vendor_objective=raw.objective; out.vendor_dual_estimate=raw.dual_estimate; + if (raw.model_id!=q.id() || raw.revision!=q.revision() || raw.active_variables!=result.active_variables) { + result.termination=Termination::NumericalFailure; result.message="QP raw result identity or layout mismatch"; return; + } + // Even an oracle declining value_valid cannot conceal a contradictory feasible witness. + if (raw.values.size()==q.variables().size()) out.checks=validate_quadratic(q,raw.values,o.solve.feasibility_tolerance); + const bool original_valid=out.checks.primal_valid && out.checks.objective_valid; + if (raw.termination==Termination::Infeasible) { + if (original_valid) { result.termination=Termination::NumericalFailure; result.message="Infeasibility contradicted by original primal witness"; } + else result.message="HiGHS numerical infeasibility conclusion; no independently checked certificate"; + return; + } + if (raw.termination==Termination::Unbounded || raw.termination==Termination::InfeasibleOrUnbounded) { + result.termination=Termination::NumericalFailure; result.message="Finite-box QP cannot be unbounded"; return; + } + if (!raw.value_valid || !original_valid || raw.residual_values.size()!=q.squares().size() || !raw.objective) { + if (raw.termination==Termination::Optimal) result.termination=Termination::NumericalFailure; + result.message="No independently validated original QP candidate"; return; + } + const int sign=q.linear_part().sense==ObjectiveSense::Minimize?1:-1; + for (std::size_t i=0;i(t.coefficient)*raw.values[t.variable.id]); + const auto mismatch=difference.value(); + if (!std::isfinite(raw.residual_values[i]) || !std::isfinite(mismatch) || + std::abs(mismatch)>o.solve.feasibility_tolerance) { + result.termination=Termination::NumericalFailure; result.message="Lifted residual disagrees with original square"; return; + } + } + // Vendor objective is normalized. Its agreement cannot establish optimality. + const long double mismatch=static_cast(*raw.objective)-sign*(*out.checks.original_objective); + if (std::abs(mismatch)>o.optimality_tolerance || !std::isfinite(mismatch)) { + result.termination=Termination::NumericalFailure; result.message="Vendor objective disagrees with original quadratic objective"; return; + } + check_kkt(q,raw,o,out.checks,budget); + std::vector duals(q.rows().size(),0); + if (raw.dual_valid && raw.row_duals.size()==duals.size()) { + bool finite=true; + for (const auto& row:q.rows()) if(row.active) finite &= std::isfinite(raw.row_duals[row.constraint.id]); + if (finite) duals=raw.row_duals; + } + const auto bound=Detail::quadratic_bound(q,raw.values,out.checks.square_values,duals,&budget); + out.checks.normalized_lower_bound=bound.normalized_lower; + out.checks.gap_upper_bound=bound.gap_upper; + out.checks.bound_valid=bound.normalized_lower.has_value(); + event("after_validation"); checkpoint(budget); + result.values=raw.values; result.objective=out.checks.original_objective; + result.solution_validated=true; + if (bound.normalized_lower) { + result.best_bound=sign*(*bound.normalized_lower); + try { result.update_gaps(q.linear_part().sense); } + catch (const ModelError&) { + result.best_bound.reset(); out.checks.bound_valid=false; + result.termination=Termination::NumericalFailure; + result.message="Verified feasible-set bound contradicts numerical primal objective"; return; + } + } + if (raw.termination==Termination::Optimal && + (!out.checks.kkt_valid || !out.checks.bound_valid || !bound.gap_upper || + *bound.gap_upper<0 || *bound.gap_upper>o.optimality_tolerance)) { + result.termination=Termination::NumericalFailure; + result.message="Original KKT or offset-independent verified gap did not close"; + } +} +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +void ok(HighsStatus s, const char* what) { + if (s!=HighsStatus::kOk) throw Unsupported(std::string("HiGHS rejected/modified QP input: ")+what); +} +void range(double x, double maximum, bool matrix=false) { + if (std::isfinite(x) && (std::abs(x)>=maximum || (matrix && x!=0 && std::abs(x)<=1e-12))) + throw Unsupported("QP data exceeds supported HiGHS coefficient/bound range; rescale explicitly"); +} +Termination termination(HighsModelStatus s) { + switch(s) { + case HighsModelStatus::kOptimal: case HighsModelStatus::kModelEmpty:return Termination::Optimal; + case HighsModelStatus::kInfeasible:return Termination::Infeasible; + case HighsModelStatus::kUnbounded:return Termination::Unbounded; + case HighsModelStatus::kUnboundedOrInfeasible:return Termination::InfeasibleOrUnbounded; + case HighsModelStatus::kTimeLimit:return Termination::TimeLimit; + case HighsModelStatus::kIterationLimit:return Termination::IterationLimit; + case HighsModelStatus::kMemoryLimit:return Termination::MemoryLimit; + case HighsModelStatus::kInterrupt: case HighsModelStatus::kHighsInterrupt:return Termination::Cancelled; + default:return Termination::BackendError; + } +} +QuadraticRaw backend(const QuadraticSnapshot& q, const QuadraticOptions& o, const SolveBudget& budget) { + QuadraticRaw raw; raw.model_id=q.id(); raw.revision=q.revision(); + for(const auto& v:q.variables()) raw.active_variables.push_back(v.active); + const auto max=static_cast(std::numeric_limits::max()); + if (q.squares().size()>o.max_auxiliary_variables || q.squares().size()>max || + o.iteration_limit>static_cast(std::numeric_limits::max())) + throw Unsupported("QP auxiliary/iteration capacity exceeds supported range"); + HighsModel model; + auto& lp=model.lp_; + lp.sense_=ObjSense::kMinimize; + const int sign=q.linear_part().sense==ObjectiveSense::Minimize?1:-1; + lp.offset_=sign*q.linear_part().offset; range(lp.offset_,1e20); + std::vector columns(q.variables().size(),-1); + std::vector slots, rows; + for(const auto& v:q.variables()) if(v.active) { + checkpoint(budget); + if(slots.size()+q.squares().size()>=max) throw Unsupported("QP dimension exceeds HiGHS range"); + range(v.lower,1e20);range(v.upper,1e20); + columns[v.variable.id]=static_cast(slots.size());slots.push_back(v.variable.id); + lp.col_lower_.push_back(v.lower);lp.col_upper_.push_back(v.upper);lp.col_cost_.push_back(0); + } + for(const auto& t:q.linear_part().terms) { range(t.coefficient,1e20);lp.col_cost_[columns[t.variable.id]]=sign*t.coefficient; } + const auto originals=slots.size(); + for(std::size_t k=0;k=o.max_lifted_nonzeros || a.value_.size()>=max) throw Unsupported("QP nonzero capacity exceeded"); + range(value,1e15,true);a.index_.push_back(column);a.value_.push_back(value); + }; + for(const auto& row:q.rows()) if(row.active) { + checkpoint(budget); + range(row.lower,1e20);range(row.upper,1e20); + if(rows.size()+q.squares().size()>=max) throw Unsupported("QP row capacity exceeded"); + rows.push_back(row.constraint.id);lp.row_lower_.push_back(row.lower);lp.row_upper_.push_back(row.upper); + for(const auto& t:row.terms) add_entry(columns[t.variable.id],t.coefficient); + a.start_.push_back(static_cast(a.value_.size())); + } + for(std::size_t k=0;k(originals+k),1);a.start_.push_back(static_cast(a.value_.size())); + } + lp.num_col_=static_cast(lp.col_cost_.size());lp.num_row_=static_cast(lp.row_lower_.size()); + a.num_col_=lp.num_col_;a.num_row_=lp.num_row_; + auto& h=model.hessian_; + h.dim_=lp.num_col_;h.format_=HessianFormat::kTriangular;h.start_.assign(1,0); + for(HighsInt j=0;j(j)::quiet_NaN()); + raw.value_valid=true;raw.dual_valid=true;raw.row_duals.assign(q.rows().size(),0); + raw.column_duals.assign(q.variables().size(),0);raw.objective=lp.offset_; + raw.termination=Termination::Optimal; + for(const auto& row:q.rows()) if(row.active && (row.lower>0 || row.upper<0)) { raw.termination=Termination::Infeasible;raw.values.clear();raw.value_valid=false; } + return raw; + } + Highs highs; + ok(highs.setOptionValue("output_flag",false),"output"); + ok(highs.setOptionValue("threads",1),"threads"); + ok(highs.setOptionValue("random_seed",0),"seed"); + ok(highs.setOptionValue("solver","qpasm"),"solver"); + ok(highs.setOptionValue("small_matrix_value",1e-12),"matrix threshold"); + double regularization=0; +#ifdef GECODE_QUADRATIC_TEST_HOOKS + regularization=Detail::quadratic_test_regularization; +#endif + raw.regularization=regularization; + ok(highs.setOptionValue("qp_regularization_value",regularization),"regularization"); + ok(highs.setOptionValue("qp_iteration_limit",static_cast(o.iteration_limit)),"iterations"); + ok(highs.setOptionValue("primal_feasibility_tolerance",o.solve.feasibility_tolerance),"primal tolerance"); + ok(highs.setOptionValue("dual_feasibility_tolerance",std::max(1e-10,o.stationarity_tolerance)),"dual tolerance"); + ok(highs.passModel(model),"upload"); + const auto& loaded=highs.getModel(); + const auto& p=loaded.lp_; + if(p.num_col_!=lp.num_col_ || p.num_row_!=lp.num_row_ || p.offset_!=lp.offset_ || + p.sense_!=lp.sense_ || p.col_cost_!=lp.col_cost_ || p.col_lower_!=lp.col_lower_ || p.col_upper_!=lp.col_upper_ || + p.row_lower_!=lp.row_lower_ || p.row_upper_!=lp.row_upper_ || p.a_matrix_.value_.size()!=a.value_.size()) + throw Unsupported("HiGHS changed lifted QP model on upload"); + for(HighsInt i=0;i::quiet_NaN()); + if(solution.col_value.size()==lp.col_cost_.size()) { + for(std::size_t j=0;j(originals),solution.col_value.end()); + } else { raw.values.clear();raw.value_valid=false; } + if(solution.col_dual.size()==lp.col_cost_.size() && solution.row_dual.size()==lp.row_lower_.size()) { + raw.column_duals.assign(q.variables().size(),0);raw.row_duals.assign(q.rows().size(),0); + for(std::size_t j=0;j(std::max(HighsInt{0},info.qp_iteration_count)); + } + double dual=0; + if(solution.dual_valid && highs.getDualObjectiveValue(dual)==HighsStatus::kOk) raw.dual_estimate=dual; + return raw; +} +#endif +QuadraticResult run(const QuadraticSnapshot& q,const QuadraticOptions& o,const SolveBudget& budget) { + QuadraticResult out; + auto& r=out.result;r.model_id=q.id();r.revision=q.revision();r.backend="HiGHS QP";r.guarantee=o.solve.guarantee; + for(const auto& v:q.variables()) r.active_variables.push_back(v.active); + try { + o.validate();support(o);checkpoint(budget); + validate_structure(Detail::QuadraticAccess::core(q)); + event("after_preflight");checkpoint(budget); + QuadraticRaw raw; + bool supplied=false; +#ifdef GECODE_QUADRATIC_TEST_HOOKS + supplied=Detail::quadratic_test_oracle(q,o,raw); +#endif + if(!supplied) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + r.backend_version=Highs{}.version();raw=backend(q,o,budget); +#else + throw Unsupported("HiGHS quadratic backend is not available in this build"); +#endif + } + checkpoint(budget);accept(q,o,raw,out,budget);checkpoint(budget); + } catch(const Stopped& s) { + // Candidates checked/published after a deadline are excluded completely. + r.termination=s.reason;r.solution_validated=false;r.values.clear();r.objective.reset();r.best_bound.reset(); + r.absolute_gap.reset();r.relative_gap.reset();out.checks={};r.message="QP shared budget exhausted before publication"; + } catch(const Unsupported& e) {r.termination=Termination::Unsupported;r.message=e.what();} + catch(const ModelError& e) {r.termination=Termination::InvalidModel;r.message=e.what();} + catch(const std::bad_alloc&) {r.termination=Termination::MemoryLimit;r.message="QP allocation failed";} + catch(const std::exception& e) {r.termination=Termination::BackendError;r.message=e.what();} + if (auto reason=budget.stop_reason(); reason && r.termination!=Termination::Unsupported && r.termination!=Termination::InvalidModel) { + r.termination=*reason;r.solution_validated=false;r.values.clear();r.objective.reset();r.best_bound.reset(); + r.absolute_gap.reset();r.relative_gap.reset();out.checks={}; + } + r.elapsed_seconds=budget.elapsed_seconds();return out; +} +QuadraticResult failure(ModelId id,Revision rev,const QuadraticOptions& o,Termination t,const char* msg) { + QuadraticResult out;out.result.model_id=id;out.result.revision=rev;out.result.guarantee=o.solve.guarantee; + out.result.termination=t;out.result.message=msg;return out; +} +} +QuadraticResult solve_quadratic(const QuadraticSnapshot& q,const QuadraticOptions& o) { + try {o.validate();SolveBudget b(o.solve);return run(q,o,b);} + catch(const ModelError& e) {return failure(q.id(),q.revision(),o,Termination::InvalidModel,e.what());} + catch(const std::bad_alloc&) {return failure(q.id(),q.revision(),o,Termination::MemoryLimit,"QP allocation failed");} +} +QuadraticResult solve_quadratic(const QuadraticModel& q,const QuadraticOptions& o) { + try {o.validate();support(o);SolveBudget b(o.solve);checkpoint(b);return run(q.snapshot(),o,b);} + catch(const Unsupported& e) {return failure(q.id(),q.revision(),o,Termination::Unsupported,e.what());} + catch(const Stopped& s) {return failure(q.id(),q.revision(),o,s.reason,"QP budget exhausted before snapshot");} + catch(const ModelError& e) {return failure(q.id(),q.revision(),o,Termination::InvalidModel,e.what());} + catch(const std::bad_alloc&) {return failure(q.id(),q.revision(),o,Termination::MemoryLimit,"QP allocation failed");} +} +BackendCapabilities quadratic_capabilities() { + BackendCapabilities c;c.name="HiGHS QP"; +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + c.available=Detail::quadratic_arithmetic_supported();c.quadratic_programming=c.available;c.version=Highs{}.version(); +#endif + c.limitations={"Explicit finite-box continuous quadratic wrapper only", "Positive affine squares: convex min or concave max", "Numerical guarantee; checked original KKT and outward finite-box bound", "Requires IEEE binary64 nearest rounding without fast-math or flush-to-zero", "No arbitrary Hessian, MIQP, QCP, starts, session, native or Exact support", "Cooperative time limit; active-set cancellation checked before/after backend"}; + return c; +} +}} diff --git a/gecode/optimize/relaxation.cpp b/gecode/optimize/relaxation.cpp new file mode 100644 index 0000000000..337e3d1c1d --- /dev/null +++ b/gecode/optimize/relaxation.cpp @@ -0,0 +1,392 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +constexpr double infinity = std::numeric_limits::infinity(); +class UnsupportedRepair : public std::runtime_error { using std::runtime_error::runtime_error; }; +class InvalidRepair : public std::runtime_error { using std::runtime_error::runtime_error; }; + +class Sum { + long double sum_ = 0.0L, correction_ = 0.0L; +public: + void add(long double value) { + const long double next = sum_ + value; + if (!std::isfinite(value) || !std::isfinite(next)) + throw UnsupportedRepair("Repair arithmetic exceeds supported precision"); + correction_ += std::fabs(sum_) >= std::fabs(value) + ? (sum_ - next) + value : (value - next) + sum_; + sum_ = next; + } + long double value() const { + const auto result = sum_ + correction_; + if (!std::isfinite(result)) throw UnsupportedRepair("Repair accumulation exceeds supported precision"); + return result; + } +}; + +double finite(long double value) { + if (!std::isfinite(value) || std::fabs(value) > std::numeric_limits::max()) + throw UnsupportedRepair("Repair value cannot be represented as a finite double"); + return static_cast(value); +} + +long double evaluate(const std::vector& terms, const std::vector& values, + double offset = 0.0) { + Sum sum; + sum.add(offset); + for (const auto& term : terms) sum.add(static_cast(term.coefficient) * values.at(term.variable.id)); + return sum.value(); +} + +void check_penalty(RelaxationSide side, double penalty) { + if (side != RelaxationSide::Lower && side != RelaxationSide::Upper) + throw ModelError("Unknown relaxation side"); + if (!std::isfinite(penalty) || penalty <= 0) + throw ModelError("Relaxation penalties must be positive and finite"); +} + +bool indicator_variable(const ModelSnapshot& model, Variable variable) { + for (const auto& indicator : model.indicators) if (indicator.active) { + if (indicator.activator == variable || + (indicator.inactive_gate && *indicator.inactive_gate == variable)) return true; + for (const auto& term : indicator.terms) if (term.variable == variable) return true; + } + return false; +} + +struct Construction { + ModelSnapshot model; + std::vector mapping; + std::vector items; + ObjectiveData penalty; +}; + +Construction construct(const ModelSnapshot& source, const RelaxationOptions& options) { + Construction built; + std::set> seen; + for (const auto& selected : options.rows) { + check_penalty(selected.side, selected.penalty); + if (selected.row.model_id != source.model_id || selected.row.id >= source.rows.size() || + !source.rows[selected.row.id].active) throw ModelError("Relaxed row is foreign, absent, or deleted"); + if (!seen.emplace(false, selected.row.id, selected.side).second) + throw ModelError("A row side was selected more than once"); + const auto& row = source.rows[selected.row.id]; + if (row.indicator_origin) throw UnsupportedRepair("Generated indicator rows cannot be relaxed; original indicators remain hard"); + RelaxationItem item; + item.source_row = selected.row; item.side = selected.side; item.penalty = selected.penalty; + item.original_bound = selected.side == RelaxationSide::Lower ? row.lower : row.upper; + item.name = row.name.empty() ? "row " + std::to_string(selected.row.id) : row.name; + if (!std::isfinite(item.original_bound)) throw ModelError("Selected row side has no finite bound"); + built.items.push_back(std::move(item)); + } + for (const auto& selected : options.bounds) { + check_penalty(selected.side, selected.penalty); + if (selected.variable.model_id != source.model_id || selected.variable.id >= source.variables.size() || + !source.variables[selected.variable.id].active) throw ModelError("Relaxed variable is foreign, absent, or deleted"); + if (!seen.emplace(true, selected.variable.id, selected.side).second) + throw ModelError("A variable bound was selected more than once"); + const auto& variable = source.variables[selected.variable.id]; + if (variable.type == VariableType::SemiContinuous || variable.type == VariableType::SemiInteger) + throw UnsupportedRepair("Selected semi-variable bounds need a typed disjunctive relaxation; their zero domain remains hard"); + if (indicator_variable(source, selected.variable)) + throw UnsupportedRepair("Indicator-participating variable bounds cannot be relaxed without rebuilding the guarded formulation"); + RelaxationItem item; + item.source_variable = selected.variable; item.side = selected.side; item.penalty = selected.penalty; + item.original_bound = selected.side == RelaxationSide::Lower ? variable.lower : variable.upper; + item.name = variable.name.empty() ? "variable " + std::to_string(selected.variable.id) : variable.name; + if (!std::isfinite(item.original_bound)) throw ModelError("Selected variable side has no finite bound"); + built.items.push_back(std::move(item)); + } + std::sort(built.items.begin(), built.items.end(), [](const RelaxationItem& a, const RelaxationItem& b) { + return std::make_tuple(a.source_variable.has_value(), a.source_row ? a.source_row->id : a.source_variable->id, a.side) < + std::make_tuple(b.source_variable.has_value(), b.source_row ? b.source_row->id : b.source_variable->id, b.side); + }); + Model identity; + // Public snapshots can carry an arbitrary otherwise well-formed owner. + if (identity.id() == source.model_id) identity = Model{}; + built.model = source; + auto& model = built.model; + model.model_id = identity.id(); + model.revision = 1; + // Active globals were rejected before construction. Inactive records have no + // semantic effect and no live constraints refer to their global handles. + model.globals.clear(); + auto variable = [&](Variable& handle) { handle.model_id = model.model_id; }; + auto row = [&](Constraint& handle) { handle.model_id = model.model_id; }; + auto indicator = [&](Indicator& handle) { handle.model_id = model.model_id; }; + auto terms = [&](std::vector& expression) { for (auto& term : expression) variable(term.variable); }; + for (auto& data : model.variables) { + variable(data.variable); + if (data.indicator_origin) indicator(*data.indicator_origin); + built.mapping.push_back(data.variable); + } + for (auto& data : model.rows) { + row(data.constraint); terms(data.terms); + if (data.indicator_origin) indicator(*data.indicator_origin); + } + terms(model.objective.terms); + for (auto& data : model.indicators) { + indicator(data.indicator); variable(data.activator); terms(data.terms); + if (data.inactive_gate) variable(*data.inactive_gate); + for (auto& handle : data.generated_rows) row(handle); + for (auto& domain : data.domains) variable(domain.variable); + } + for (auto& item : built.items) { + if (model.variables.size() >= std::numeric_limits::max() || + model.rows.size() >= std::numeric_limits::max()) + throw UnsupportedRepair("Private repair model exceeds handle capacity"); + item.slack = {model.model_id, static_cast(model.variables.size())}; + item.penalty_row = {model.model_id, static_cast(model.rows.size())}; + VariableData slack; + slack.variable = item.slack; slack.lower = 0; slack.upper = infinity; + slack.name = "__repair_slack_" + std::to_string(item.slack.id); + model.variables.push_back(std::move(slack)); + RowData penalty_row; + penalty_row.constraint = item.penalty_row; + penalty_row.name = "__repair_side_" + std::to_string(item.penalty_row.id); + if (item.source_row) { + auto& original_row = model.rows[item.source_row->id]; + penalty_row.terms = original_row.terms; + if (item.side == RelaxationSide::Lower) original_row.lower = -infinity; + else original_row.upper = infinity; + } else { + auto& original_variable = model.variables[item.source_variable->id]; + penalty_row.terms.push_back({original_variable.variable, 1.0}); + if (item.side == RelaxationSide::Lower) + original_variable.lower = original_variable.type == VariableType::Binary ? 0.0 : -infinity; + else original_variable.upper = original_variable.type == VariableType::Binary ? 1.0 : infinity; + } + penalty_row.terms.push_back({item.slack, item.side == RelaxationSide::Lower ? 1.0 : -1.0}); + if (item.side == RelaxationSide::Lower) penalty_row.lower = item.original_bound; + else penalty_row.upper = item.original_bound; + model.rows.push_back(std::move(penalty_row)); + built.penalty.terms.push_back({item.slack, item.penalty}); + } + validate_structure(model); + return built; +} + +long double residuals(const ModelSnapshot& source, const std::vector& values, + std::vector& items) { + Sum total; + for (auto& item : items) { + const long double activity = item.source_row ? evaluate(source.rows[item.source_row->id].terms, values) + : values.at(item.source_variable->id); + // Include the bound before reducing the compensated sum: activity itself + // can round to the bound and erase a small but material original residual. + Sum residual; + const long double sign = item.side == RelaxationSide::Lower ? -1.0L : 1.0L; + residual.add(-sign * item.original_bound); + if (item.source_row) { + for (const auto& term : source.rows[item.source_row->id].terms) + residual.add(sign * term.coefficient * values.at(term.variable.id)); + } else { + residual.add(sign * activity); + } + const long double violation = std::max(0.0L, residual.value()); + const long double weighted = static_cast(item.penalty) * violation; + item.activity = finite(activity); item.violation = finite(violation); + item.weighted_violation = finite(weighted); item.slack_value = values.at(item.slack.id); + total.add(weighted); + } + return total.value(); +} + +long double allowance(long double a, long double b, double feasibility, long double multiplier = 1) { + const auto roundoff = 64.0L * std::numeric_limits::epsilon() * + std::max({1.0L, std::fabs(a), std::fabs(b)}); + return std::max(static_cast(feasibility) * multiplier, roundoff); +} + +void verify_layout(const SolveResult& result, const ModelSnapshot& model) { + if (result.model_id != model.model_id || result.revision != model.revision || + result.values.size() != model.variables.size() || result.active_variables.size() != model.variables.size()) + throw InvalidRepair("Repair candidate has inconsistent model identity or slot layout"); + for (std::size_t i = 0; i < model.variables.size(); ++i) + if (result.active_variables[i] != model.variables[i].active) + throw InvalidRepair("Repair candidate active mask does not match its private model"); +} + +double verify_optimum(const SolveResult& result, const ObjectiveData& objective, + const ModelSnapshot& model, double feasibility) { + verify_layout(result, model); + if (!result.has_solution() || result.termination != Termination::Optimal || + result.guarantee != Guarantee::Numerical || !result.best_bound || !std::isfinite(*result.best_bound)) + throw InvalidRepair("Completed repair stage lacks a validated candidate and finite numerical bound"); + const double actual = finite(evaluate(objective.terms, result.values, objective.offset)); + if (std::fabs(static_cast(actual) - *result.objective) > + allowance(actual, *result.objective, feasibility)) + throw InvalidRepair("Repair stage objective disagrees with independently recomputed activity"); + auto checked = result; + checked.objective = actual; + try { checked.update_gaps(objective.sense); } + catch (const ModelError&) { throw InvalidRepair("Repair stage global bound has inconsistent ordering"); } + if (!checked.absolute_gap || !std::isfinite(*checked.absolute_gap) || + *checked.absolute_gap > allowance(actual, *checked.best_bound, feasibility)) + throw InvalidRepair("Repair stage has not closed its independently recomputed numerical gap"); + return actual; +} + +RelaxationResult run(const ModelSnapshot& source, const RelaxationOptions& options, SolveBudget& budget) { + RelaxationResult output; + output.source_model_id = source.model_id; output.source_revision = source.revision; + auto finish = [&]() { + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + output.message = "Shared repair budget stopped; no newly checked repair is promoted"; + output.repair_validated = output.minimum_violation_established = output.original_objective_optimized = false; + output.minimum_weighted_violation.reset(); + } + output.elapsed_seconds = budget.elapsed_seconds(); + return std::move(output); + }; + try { + validate_structure(source); + for (std::size_t i = 0; i < source.globals.size(); ++i) { + if (source.globals[i].global.model_id != source.model_id || source.globals[i].global.id != i) + throw ModelError("Global metadata identity does not match its source model"); + if (source.globals[i].active) throw UnsupportedRepair("Feasibility relaxation of models with active globals is not supported"); + } + if (options.solve.guarantee != Guarantee::Numerical) + throw UnsupportedRepair("Weighted feasibility relaxation provides Numerical evidence only"); + if (!options.solve.primal_start.empty()) + throw UnsupportedRepair("Repair primal starts require explicit private slack mapping and are not yet supported"); + if (options.optimize_original_objective && options.solve.node_limit) + throw UnsupportedRepair("Lexicographic repair node budgets need cumulative consumed-node reporting"); + if (budget.expired()) return finish(); + auto built = construct(source, options); + const auto penalty = std::move(built.penalty); + output.private_model = std::move(built.model); + output.private_variables = std::move(built.mapping); + output.items = std::move(built.items); + std::vector objectives; + objectives.push_back({penalty, 0.0, 0.0, "minimum weighted violation"}); + if (options.optimize_original_objective) + objectives.push_back({output.private_model->objective, 0.0, 0.0, "original objective among minimum-violation repairs"}); + auto solve_options = options.solve; + // Source-model starts lack the private owner/slacks and may be infeasible. + solve_options.primal_start.clear(); + solve_options.cancellation = budget.cancellation(); + solve_options.time_limit_seconds = budget.remaining_seconds(); + output.workflow = solve_lexicographic(*output.private_model, objectives, solve_options); + output.termination = output.workflow.termination; output.message = output.workflow.message; + if (budget.expired()) return finish(); + for (const auto& stage : output.workflow.stages) + if (stage.result.has_solution()) verify_layout(stage.result, *output.private_model); + if (output.workflow.completed_stages >= 1) { + const auto& stage = output.workflow.stages.at(0); + if (!stage.completed || !validate(*output.private_model, stage.result.values, + options.solve.feasibility_tolerance, options.solve.integrality_tolerance).valid) + throw InvalidRepair("Minimum-violation stage failed independent private-model validation"); + const double optimum = verify_optimum(stage.result, penalty, *output.private_model, options.solve.feasibility_tolerance); + if (optimum < 0) throw InvalidRepair("Nonnegative weighted violation has a negative reported optimum"); + auto first_items = output.items; + const auto first_residual = residuals(source, stage.result.values, first_items); + Sum weights; for (const auto& item : output.items) weights.add(item.penalty); + const auto multiplier = std::max(1.0L, weights.value()); + if (std::fabs(first_residual - optimum) > allowance(first_residual, optimum, + options.solve.feasibility_tolerance, multiplier)) + throw InvalidRepair("Minimum penalty does not agree with original-unit violations"); + output.minimum_weighted_violation = optimum; + output.minimum_violation_established = true; + if (options.optimize_original_objective) { + const auto exact_activity = evaluate(penalty.terms, stage.result.values); + double lock = finite(exact_activity); + if (static_cast(lock) > exact_activity) lock = std::nextafter(lock, -infinity); + RowData row; + row.constraint = {output.private_model->model_id, static_cast(output.private_model->rows.size())}; + row.terms = penalty.terms; row.upper = lock; row.name = "__repair_minimum_violation"; + output.violation_lock = row.constraint; + output.private_model->rows.push_back(std::move(row)); + } + } + if (output.workflow.has_solution()) { + const auto& result = output.workflow.final_solution; + verify_layout(result, *output.private_model); + const auto checked = validate(*output.private_model, result.values, + options.solve.feasibility_tolerance, options.solve.integrality_tolerance); + if (!checked.valid || result.model_id != output.private_model->model_id || + result.revision != output.private_model->revision) + throw InvalidRepair("Candidate failed independent validation of hard constraints, penalty rows, or the minimum lock"); + auto items = output.items; + const auto weighted = residuals(source, result.values, items); + if (output.minimum_violation_established) { + Sum weights; for (const auto& item : items) weights.add(item.penalty); + if (std::fabs(weighted - *output.minimum_weighted_violation) > allowance(weighted, + *output.minimum_weighted_violation, options.solve.feasibility_tolerance, std::max(1.0L, weights.value()))) + throw InvalidRepair("Final repair does not retain the established minimum violation"); + } + std::vector original(result.values.begin(), result.values.begin() + source.variables.size()); + auto original_check = validate(source, original, options.solve.feasibility_tolerance, + options.solve.integrality_tolerance); + for (const auto& item : items) { + auto& maximum = item.source_row ? original_check.max_row_violation : original_check.max_bound_violation; + maximum = std::max(maximum, *item.violation); + if (*item.violation > options.solve.feasibility_tolerance) { + original_check.valid = false; + if (original_check.message.empty()) original_check.message = "Selected original sides remain violated"; + } + } + output.weighted_violation = finite(weighted); + output.original_objective = original_check.objective; + output.original_values = std::move(original); + output.original_validation = std::move(original_check); + output.items = std::move(items); + output.repair_validated = true; + } + if (options.optimize_original_objective && output.workflow.completed_numerically() && + output.workflow.completed_stages == 2) { + if (!output.minimum_violation_established || !output.has_repair()) + throw InvalidRepair("Original-objective completion lacks a validated minimum-violation repair"); + verify_optimum(output.workflow.stages.at(1).result, output.private_model->objective, + *output.private_model, options.solve.feasibility_tolerance); + output.original_objective_optimized = true; + } + if (output.termination == Termination::Optimal && output.minimum_violation_established) + output.message = output.original_objective_optimized + ? "Minimum weighted violation and the original objective within that repair region were established numerically" + : "Minimum weighted violation established numerically; original feasibility is reported separately"; + } catch (const UnsupportedRepair& error) { + output.termination = Termination::Unsupported; output.message = error.what(); + } catch (const InvalidRepair& error) { + output.termination = Termination::NumericalFailure; output.message = error.what(); + output.minimum_violation_established = output.original_objective_optimized = false; + output.minimum_weighted_violation.reset(); + } catch (const ModelError& error) { + output.termination = Termination::InvalidModel; output.message = error.what(); + } catch (const std::bad_alloc&) { + output.termination = Termination::MemoryLimit; output.message = "Repair allocation failed"; + } catch (const std::exception& error) { + output.termination = Termination::BackendError; output.message = error.what(); + } + return finish(); +} + +RelaxationResult failure(ModelId id, Revision revision, Termination reason, const std::string& message) { + RelaxationResult result; + result.source_model_id = id; result.source_revision = revision; + result.termination = reason; result.message = message; + return result; +} +} + +RelaxationResult relax_feasibility(const ModelSnapshot& model, const RelaxationOptions& options) { + try { SolveBudget budget(options.solve); return run(model, options, budget); } + catch (const ModelError& error) { return failure(model.model_id, model.revision, Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.model_id, model.revision, Termination::MemoryLimit, "Repair allocation failed"); } +} +RelaxationResult relax_feasibility(const Model& model, const RelaxationOptions& options) { + try { SolveBudget budget(options.solve); return run(model.snapshot(), options, budget); } + catch (const ModelError& error) { return failure(model.id(), model.revision(), Termination::InvalidModel, error.what()); } + catch (const std::bad_alloc&) { return failure(model.id(), model.revision(), Termination::MemoryLimit, "Repair allocation failed"); } +} + +}} diff --git a/gecode/optimize/relaxation.hpp b/gecode/optimize/relaxation.hpp new file mode 100644 index 0000000000..48e431a860 --- /dev/null +++ b/gecode/optimize/relaxation.hpp @@ -0,0 +1,95 @@ +/* Explicit weighted L1 repairs on a distinct private model. */ +#ifndef GECODE_OPTIMIZE_RELAXATION_HPP +#define GECODE_OPTIMIZE_RELAXATION_HPP + +#include +#include + +namespace Gecode { namespace Optimize { + +enum class RelaxationSide { Lower, Upper }; + +struct RowRelaxation { + Constraint row; + RelaxationSide side = RelaxationSide::Lower; + double penalty = 1.0; +}; +struct BoundRelaxation { + Variable variable; + RelaxationSide side = RelaxationSide::Lower; + double penalty = 1.0; +}; +struct RelaxationOptions { + SolveOptions solve; + std::vector rows; + std::vector bounds; + bool optimize_original_objective = false; +}; + +struct RelaxationItem { + // Exactly one source handle is set. Private slack/row handles have a distinct + // model owner and cannot be passed back to the original model as its handles. + std::optional source_row; + std::optional source_variable; + RelaxationSide side = RelaxationSide::Lower; + std::string name; + double original_bound = 0.0; + double penalty = 1.0; + Variable slack; + Constraint penalty_row; + // Absent until a repaired candidate passes independent checks. Violations + // are recomputed in original units, rather than inferred from slack values. + std::optional activity; + std::optional violation; + std::optional weighted_violation; + std::optional slack_value; +}; + +struct RelaxationResult { + ModelId source_model_id = 0; + Revision source_revision = 0; + Termination termination = Termination::Unknown; + Guarantee guarantee = Guarantee::Numerical; + std::string message; + double elapsed_seconds = 0.0; + std::optional private_model; + // One private handle per original variable slot, including tombstones. + std::vector private_variables; + std::vector items; + // Present when phase two was requested and a minimum-violation lock was + // established. The returned private model includes this additional hard row. + std::optional violation_lock; + // All workflow results belong to private_model, never the original model. + LexicographicResult workflow; + bool repair_validated = false; + bool minimum_violation_established = false; + // Optimal only among repairs with minimum weighted violation, not an + // unconstrained optimum of the original objective or original feasible set. + bool original_objective_optimized = false; + std::optional minimum_weighted_violation; + std::optional weighted_violation; + std::optional original_objective; + std::vector original_values; + ValidationReport original_validation; + + bool has_repair() const noexcept { return repair_validated && workflow.has_solution(); } +}; + +/** + * Minimize the sum of positive finite penalties times selected side violations. + * Unselected sides, integrality and intrinsic binary/semi domains remain hard. + * Binary bound selection relaxes a narrower stored bound only as far as [0,1]. + * Selected semi bounds, generated indicator rows, indicator-participating + * variable bounds, active globals and primal starts are explicitly Unsupported. + * Optional phase two optimizes the original objective with zero requested + * degradation of minimum weighted violation. All completion is numerical and + * tolerance-qualified; no original feasible SolveResult is manufactured. + * The original model is not mutated. See RELAXATION.md for support/limits. + */ +RelaxationResult relax_feasibility(const ModelSnapshot& model, + const RelaxationOptions& options = {}); +RelaxationResult relax_feasibility(const Model& model, + const RelaxationOptions& options = {}); + +}} +#endif diff --git a/gecode/optimize/result.cpp b/gecode/optimize/result.cpp new file mode 100644 index 0000000000..f1a7e447fe --- /dev/null +++ b/gecode/optimize/result.cpp @@ -0,0 +1,221 @@ +#include "result.hpp" + +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { + +const char* to_string(Termination termination) noexcept { + switch (termination) { + case Termination::Unknown: return "unknown"; + case Termination::Optimal: return "optimal"; + case Termination::Infeasible: return "infeasible"; + case Termination::Unbounded: return "unbounded"; + case Termination::InfeasibleOrUnbounded: return "infeasible_or_unbounded"; + case Termination::TimeLimit: return "time_limit"; + case Termination::NodeLimit: return "node_limit"; + case Termination::MemoryLimit: return "memory_limit"; + case Termination::IterationLimit: return "iteration_limit"; + case Termination::SolutionLimit: return "solution_limit"; + case Termination::ObjectiveLimit: return "objective_limit"; + case Termination::Cancelled: return "cancelled"; + case Termination::NumericalFailure: return "numerical_failure"; + case Termination::Unsupported: return "unsupported"; + case Termination::InvalidModel: return "invalid_model"; + case Termination::BackendError: return "backend_error"; + } + return "unknown"; +} + +void CancellationToken::cancel() noexcept { + cancelled_.store(true, std::memory_order_release); +} + +bool CancellationToken::cancelled() const noexcept { + return cancelled_.load(std::memory_order_acquire); +} + +namespace { +void require_nonnegative_finite(double value, const char* name) { + if (!std::isfinite(value) || value < 0.0) + throw ModelError(std::string(name) + " must be nonnegative and finite"); +} + +double nonnegative_double(long double value) noexcept { + if (value > static_cast(std::numeric_limits::max())) + return std::numeric_limits::infinity(); + return static_cast(value); +} +} + +void SolveOptions::validate() const { + switch (backend) { + case Backend::Auto: + case Backend::Highs: + case Backend::Native: + break; + default: + throw ModelError("invalid backend option"); + } + switch (guarantee) { + case Guarantee::Numerical: + case Guarantee::Exact: + case Guarantee::Certified: + break; + default: + throw ModelError("invalid guarantee option"); + } + if (std::isnan(time_limit_seconds) || time_limit_seconds < 0.0) + throw ModelError("time limit must be nonnegative or positive infinity"); + if (threads < 1) + throw ModelError("threads must be positive"); + if (random_seed < 0) + throw ModelError("random seed must be nonnegative"); + require_nonnegative_finite(relative_gap, "relative gap"); + require_nonnegative_finite(absolute_gap, "absolute gap"); + if (!std::isfinite(feasibility_tolerance) || feasibility_tolerance <= 0.0) + throw ModelError("feasibility tolerance must be positive and finite"); + if (!std::isfinite(integrality_tolerance) || integrality_tolerance <= 0.0 || + integrality_tolerance >= 0.5) + throw ModelError("integrality tolerance must be finite and between 0 and 0.5"); + for (const auto& entry : primal_start) + if (!std::isfinite(entry.value)) + throw ModelError("primal start values must be finite"); +} + +struct SolveBudget::State { + using Clock = std::chrono::steady_clock; + const Clock::time_point start; + const double time_limit; + const std::optional node_limit; + const std::shared_ptr cancellation; + std::atomic nodes{0}; + + State(const SolveOptions& options, Clock::time_point started) + : start(started), time_limit(options.time_limit_seconds), node_limit(options.node_limit), + cancellation(options.cancellation ? options.cancellation + : std::make_shared()) {} +}; + +SolveBudget::SolveBudget(const SolveOptions& options) { + const auto started = State::Clock::now(); + options.validate(); + state_ = std::make_shared(options, started); +} + +SolveBudget SolveBudget::slice(double seconds, std::uint64_t node_allowance) const { + if (std::isnan(seconds) || seconds < 0.0) + throw ModelError("budget slice time must be nonnegative or positive infinity"); + auto result=*this; + result.local_deadline_=std::min(local_deadline_,elapsed_seconds()+seconds); + const auto used=nodes(), maximum=std::numeric_limits::max(); + const auto limit=node_allowance>maximum-used ? maximum:used+node_allowance; + result.local_node_limit_=local_node_limit_ ? std::min(*local_node_limit_,limit):limit; + return result; +} + +double SolveBudget::elapsed_seconds() const noexcept { + return std::max(0.0, std::chrono::duration( + State::Clock::now() - state_->start).count()); +} + +double SolveBudget::remaining_seconds() const noexcept { + return std::max(0.0, std::min(state_->time_limit,local_deadline_) - elapsed_seconds()); +} + +bool SolveBudget::cancelled() const noexcept { + return state_->cancellation->cancelled(); +} + +bool SolveBudget::time_limit_reached() const noexcept { + return elapsed_seconds() >= std::min(state_->time_limit,local_deadline_); +} + +bool SolveBudget::node_limit_reached() const noexcept { + const auto used=nodes(); + return (state_->node_limit && used >= *state_->node_limit) || + (local_node_limit_ && used >= *local_node_limit_); +} + +bool SolveBudget::expired() const noexcept { + return stop_reason().has_value(); +} + +std::optional SolveBudget::stop_reason() const noexcept { + if (cancelled()) return Termination::Cancelled; + if (time_limit_reached()) return Termination::TimeLimit; + if (node_limit_reached()) return Termination::NodeLimit; + return std::nullopt; +} + +void SolveBudget::add_nodes(std::uint64_t count) noexcept { + auto old = state_->nodes.load(std::memory_order_relaxed); + const auto maximum = std::numeric_limits::max(); + for (;;) { + const auto next = count > maximum - old ? maximum : old + count; + if (state_->nodes.compare_exchange_weak(old, next, std::memory_order_relaxed)) + return; + } +} + +std::uint64_t SolveBudget::nodes() const noexcept { + return state_->nodes.load(std::memory_order_relaxed); +} + +std::shared_ptr SolveBudget::cancellation() const noexcept { + return state_->cancellation; +} + +bool SolveResult::has_solution() const noexcept { + if (!solution_validated || !objective || !std::isfinite(*objective) || + values.size() != active_variables.size()) + return false; + for (std::size_t i = 0; i < values.size(); ++i) + if (active_variables[i] && !std::isfinite(values[i])) + return false; + return true; +} + +double SolveResult::value(Variable variable) const { + if (variable.model_id != model_id) + throw ModelError("variable belongs to a different model than this result"); + if (variable.id >= active_variables.size() || !active_variables[variable.id]) + throw ModelError("variable is absent or deleted in this result snapshot"); + if (!has_solution()) + throw ModelError("result has no validated solution"); + return values[variable.id]; +} + +void SolveResult::update_gaps(ObjectiveSense sense) { + absolute_gap.reset(); + relative_gap.reset(); + if (sense != ObjectiveSense::Minimize && sense != ObjectiveSense::Maximize) + throw ModelError("invalid objective sense for gap computation"); + if (objective && !std::isfinite(*objective)) + throw ModelError("objective must be finite for gap computation"); + if (best_bound && std::isnan(*best_bound)) + throw ModelError("best bound must not be NaN"); + if (!objective || !best_bound) + return; + + if ((sense == ObjectiveSense::Minimize && *best_bound > *objective) || + (sense == ObjectiveSense::Maximize && *best_bound < *objective)) + throw ModelError("global best bound is inconsistent with the objective"); + if (!std::isfinite(*best_bound)) + return; + + const long double primal = *objective; + const long double dual = *best_bound; + const long double gap = sense == ObjectiveSense::Minimize + ? primal - dual : dual - primal; + absolute_gap = nonnegative_double(gap); + const long double scale = std::max({1.0L, std::fabs(primal), std::fabs(dual)}); + // Some platforms implement long double as double. Dividing before the + // subtraction avoids an overflowing absolute gap hiding a finite ratio. + relative_gap = nonnegative_double(std::isfinite(gap) + ? gap / scale : std::fabs(primal / scale - dual / scale)); +} + +}} diff --git a/gecode/optimize/result.hpp b/gecode/optimize/result.hpp new file mode 100644 index 0000000000..23963830ff --- /dev/null +++ b/gecode/optimize/result.hpp @@ -0,0 +1,168 @@ +/* Results and shared solve budgets for the additive optimization API. */ +#ifndef GECODE_OPTIMIZE_RESULT_HPP +#define GECODE_OPTIMIZE_RESULT_HPP + +#include "types.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { + +/** The reason a solve stopped, independent of whether it found a solution. */ +enum class Termination { + Unknown, + Optimal, + Infeasible, + Unbounded, + InfeasibleOrUnbounded, + TimeLimit, + NodeLimit, + MemoryLimit, + IterationLimit, + SolutionLimit, + ObjectiveLimit, + Cancelled, + NumericalFailure, + Unsupported, + InvalidModel, + BackendError +}; + +const char* to_string(Termination termination) noexcept; + +/** Monotonic cancellation: a cancelled token cannot be reset or reused. */ +class CancellationToken { +public: + void cancel() noexcept; + bool cancelled() const noexcept; + +private: + std::atomic cancelled_{false}; +}; + +/** One original-variable value in a possibly partial primal start. */ +struct StartValue { + Variable variable; + double value = 0.0; +}; + +struct SolveOptions { + Backend backend = Backend::Auto; + Guarantee guarantee = Guarantee::Numerical; + double time_limit_seconds = std::numeric_limits::infinity(); + int threads = 1; + int random_seed = 0; + double relative_gap = 1e-4; + double absolute_gap = 1e-6; + double feasibility_tolerance = 1e-7; + double integrality_tolerance = 1e-6; + std::shared_ptr cancellation; + std::optional node_limit; + /** + * Optional sparse primal start. Values must be finite, unique, and satisfy + * their original variable domains. A complete start must satisfy every + * original constraint, including retained indicators and globals. + * A partial start is a hint, not a validated incumbent or a fixed assignment. + * HiGHS accepts partial hints. Native requires a complete exact assignment + * after any deterministic completion of live indicator inactivity gates; + * unresolved partial starts are Unsupported. See solve_native(). + */ + std::vector primal_start; + + /** + * Validate values, throwing ModelError for malformed options. + * Exact and Certified requests are valid options; a backend that cannot + * deliver the requested guarantee must return Termination::Unsupported. + * Gap tolerances may be zero. Feasibility/integrality tolerances must be + * positive and finite; integrality tolerance must also be less than 0.5. + */ + void validate() const; +}; + +/** + * Copies share a monotonic clock, cancellation token and cumulative node count. + * All stages of one solve should use this same budget rather than restarting + * the deadline. Callers explicitly add newly consumed nodes (not a cumulative + * backend total on every poll). Concurrent node additions saturate at UINT64_MAX. + */ +class SolveBudget { +public: + explicit SolveBudget(const SolveOptions& options); + + /** A locally capped view sharing the original clock, nodes and cancellation. + * Exhausting a slice does not cancel its parent. Nested slices cannot relax + * any parent cap. All nodes consumed through a slice count globally. + */ + SolveBudget slice(double seconds, std::uint64_t node_allowance) const; + + double elapsed_seconds() const noexcept; + double remaining_seconds() const noexcept; + bool cancelled() const noexcept; + bool time_limit_reached() const noexcept; + bool node_limit_reached() const noexcept; + bool expired() const noexcept; + /** Cancellation takes precedence over time, then node limits. */ + std::optional stop_reason() const noexcept; + + void add_nodes(std::uint64_t count = 1) noexcept; + std::uint64_t nodes() const noexcept; + std::shared_ptr cancellation() const noexcept; + +private: + struct State; + std::shared_ptr state_; + double local_deadline_ = std::numeric_limits::infinity(); + std::optional local_node_limit_; +}; + +/** + * An owning historical result. Model edits do not invalidate this snapshot. + * Values and active_variables use original variable slots, including tombstones. + * Only an independent original-model validator may set solution_validated. + */ +struct SolveResult { + ModelId model_id = 0; + Revision revision = 0; + std::string backend; + std::string backend_version; + Termination termination = Termination::Unknown; + std::string message; + std::optional objective; + std::optional best_bound; + std::optional absolute_gap; + std::optional relative_gap; + std::vector values; + std::vector active_variables; + bool solution_validated = false; + Guarantee guarantee = Guarantee::Numerical; + double elapsed_seconds = 0.0; + std::optional native_backend_gap; + /** Backend accepted the hint; this does not claim it became an incumbent. */ + bool start_submitted = false; + + /** Requires a finite validated objective and every active slot to be finite. */ + bool has_solution() const noexcept; + /** Reject absent solutions, foreign handles, invalid slots and tombstones. */ + double value(Variable variable) const; + + /** + * Recompute gaps from the original-sense objective and global best_bound. + * Missing values or a valid infinite bound leave both gaps unavailable. + * NaNs, non-finite objectives and inconsistent bound ordering throw ModelError; + * previous gaps are cleared before validation, never silently clamped to zero. + * The common normalized relative gap is abs(objective-best_bound) divided by + * max(1, abs(objective), abs(best_bound)); it is finite for finite inputs, + * including zero objectives. The absolute gap can overflow double to positive + * infinity. native_backend_gap preserves the vendor convention separately. + */ + void update_gaps(ObjectiveSense sense); +}; + +}} +#endif diff --git a/gecode/optimize/scenarios.cpp b/gecode/optimize/scenarios.cpp new file mode 100644 index 0000000000..0e90be4d98 --- /dev/null +++ b/gecode/optimize/scenarios.cpp @@ -0,0 +1,436 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +#ifdef GECODE_OPTIMIZE_TEST_SCENARIOS +namespace Detail { +SolveResult scenario_test_solve(const ModelSnapshot&, const SolveOptions&, SolveSession*); +void scenario_test_checkpoint(const char*, std::size_t); +} +#endif +namespace { +struct Stopped { Termination reason; const char* message; }; +struct Unsupported : std::runtime_error { using std::runtime_error::runtime_error; }; +struct EvidenceError : std::runtime_error { using std::runtime_error::runtime_error; }; +// SolveBudget owns the shared cancellation/node state. This enclosing clock +// also includes option validation and its construction in the total allowance. +class BatchBudget { + SolveBudget shared_; + std::chrono::steady_clock::time_point started_; + double seconds_; +public: + BatchBudget(const SolveOptions& options,std::chrono::steady_clock::time_point started) + : shared_(options),started_(started),seconds_(options.time_limit_seconds) {} + double remaining_seconds() const noexcept { + const double elapsed=std::chrono::duration(std::chrono::steady_clock::now()-started_).count(); + return std::max(0.0,seconds_-elapsed); + } + std::optional stop_reason() const noexcept { + if(shared_.cancelled())return Termination::Cancelled; + if(remaining_seconds()==0)return Termination::TimeLimit; + if(shared_.node_limit_reached())return Termination::NodeLimit; + return {}; + } + std::shared_ptr cancellation() const noexcept{return shared_.cancellation();} +}; +void checkpoint(const BatchBudget& budget) { + if (const auto reason=budget.stop_reason()) throw Stopped{*reason,"Whole scenario batch budget stopped"}; +} +struct Meter { + const BatchBudget& budget; + std::size_t limit, used=0; + void tick(std::size_t count=1) { + checkpoint(budget); + if(count>limit-used)throw Stopped{Termination::IterationLimit,"Scenario coordinator element-visit cap reached"}; + used+=count; + } +}; +void tick(Meter* meter,std::size_t count=1){if(meter)meter->tick(count);} +void event(const char* point,std::size_t index) { +#ifdef GECODE_OPTIMIZE_TEST_SCENARIOS + Detail::scenario_test_checkpoint(point,index); +#else + (void)point;(void)index; +#endif +} +void storage(std::size_t count,std::size_t limit,const char* message) { + if(count>limit)throw Stopped{Termination::MemoryLimit,message}; +} +void product(std::size_t a,std::size_t b,std::size_t limit,const char* message) { + if(a && b>limit/a)throw Stopped{Termination::MemoryLimit,message}; +} +void visit(const ModelSnapshot& model,Meter* meter) { + tick(meter,model.variables.size()); + for(const auto& v:model.variables)tick(meter,v.name.size()); + tick(meter,model.rows.size()); + for(const auto& row:model.rows){tick(meter,row.terms.size());tick(meter,row.name.size());} + tick(meter,model.objective.terms.size()); +} +std::size_t variable(const ModelSnapshot& model,Variable handle) { + if(handle.model_id!=model.model_id || handle.id>=model.variables.size() || + !model.variables[static_cast(handle.id)].active) + throw ModelError("Scenario variable is foreign, missing or deleted"); + return static_cast(handle.id); +} +std::size_t row(const ModelSnapshot& model,Constraint handle) { + if(handle.model_id!=model.model_id || handle.id>=model.rows.size() || + !model.rows[static_cast(handle.id)].active) + throw ModelError("Scenario row is foreign, missing or deleted"); + return static_cast(handle.id); +} +void bounds(double lower,double upper) { + const double inf=std::numeric_limits::infinity(); + if(std::isnan(lower)||std::isnan(upper)||lower==inf||upper==-inf||lower>upper) + throw ModelError("Scenario has invalid or reversed bounds"); +} +void definition(const ModelSnapshot& base,const ScenarioDefinition& def,Meter& meter) { + if(def.objective_offset && !std::isfinite(*def.objective_offset)) + throw ModelError("Scenario objective offset must be finite"); + meter.tick(base.variables.size()); + std::vector seen(base.variables.size(),false); + for(const auto& term:def.objective_coefficients) { + meter.tick();const auto slot=variable(base,term.variable); + if(seen[slot])throw ModelError("Duplicate scenario objective coefficient override"); + seen[slot]=true; + if(!std::isfinite(term.coefficient))throw ModelError("Scenario objective coefficient must be finite"); + } + meter.tick(base.variables.size());std::fill(seen.begin(),seen.end(),false); + for(const auto& change:def.variable_bounds) { + meter.tick();const auto slot=variable(base,change.variable); + if(seen[slot])throw ModelError("Duplicate scenario variable-bound override"); + seen[slot]=true; + if(!change.lower&&!change.upper)throw ModelError("Scenario variable override has no bound side"); + const auto& v=base.variables[slot]; + const double lo=change.lower.value_or(v.lower),hi=change.upper.value_or(v.upper); + bounds(lo,hi); + if(v.type==VariableType::Binary&&(lo<0||hi>1))throw ModelError("Scenario binary bounds must remain in [0,1]"); + } + meter.tick(base.rows.size());seen.assign(base.rows.size(),false); + for(const auto& change:def.row_bounds) { + meter.tick();const auto slot=row(base,change.row); + if(seen[slot])throw ModelError("Duplicate scenario row-side override"); + seen[slot]=true; + if(!change.lower&&!change.upper)throw ModelError("Scenario row override has no bound side"); + const auto& r=base.rows[slot]; + bounds(change.lower.value_or(r.lower),change.upper.value_or(r.upper)); + } +} +ModelSnapshot materialize(const ModelSnapshot& base,const ScenarioDefinition& def, + ModelId owner,Revision revision,Meter* meter) { + visit(base,meter); // precharge the owned source copy + ModelSnapshot out=base;out.model_id=owner;out.revision=revision; + for(auto& v:out.variables){tick(meter);v.variable.model_id=owner;} + for(auto& r:out.rows){tick(meter);r.constraint.model_id=owner; + for(auto& t:r.terms){tick(meter);t.variable.model_id=owner;}} + tick(meter,base.variables.size());std::vector coefficients(base.variables.size(),0); + for(const auto& t:base.objective.terms){tick(meter);coefficients[t.variable.id]=t.coefficient;} + for(const auto& t:def.objective_coefficients){tick(meter);coefficients[t.variable.id]=t.coefficient;} + out.objective.terms.clear(); + for(std::size_t i=0;istatic_cast(exact_limit)) + throw EvidenceError("Exact scenario witness/data is not a supported exact integer"); + return static_cast(value); +} +std::int64_t add(std::int64_t a,std::int64_t b) { + constexpr auto hi=std::numeric_limits::max(),lo=std::numeric_limits::min(); + if((b>0&&a>hi-b)||(b<0&&a::max(),lo=std::numeric_limits::min(); + if((a>0&&((b>0&&a>hi/b)||(b<0&&b0&&a& values,Meter& meter) { + for(const auto& v:model.variables){meter.tick();if(!v.active)continue; + if(v.type!=VariableType::Integer&&v.type!=VariableType::Binary) + throw EvidenceError("Exact scenario result has a nondiscrete original variable"); + const auto x=integer(values[v.variable.id]); + if(xinteger(v.upper))throw EvidenceError("Exact scenario variable violation");} + const auto activity=[&](const std::vector& terms,std::int64_t offset) { + auto sum=offset;for(const auto& t:terms){meter.tick();sum=add(sum,multiply(integer(t.coefficient),integer(values[t.variable.id])));}return sum; + }; + for(const auto& r:model.rows){meter.tick();if(!r.active)continue; + const auto sum=activity(r.terms,0); + if((std::isfinite(r.lower)&&suminteger(r.upper))) + throw EvidenceError("Exact scenario row violation");} + const auto value=activity(model.objective.terms,integer(model.objective.offset)); + if(value < -exact_limit||value>exact_limit)throw EvidenceError("Exact scenario objective is not an exact double integer"); + return static_cast(value); +} +ScenarioCheck check(const ModelSnapshot& model,SolveResult& result,const SolveOptions& options,Meter& meter) { + ScenarioCheck out; + known_status(result.termination); + if(result.model_id!=model.model_id||result.revision!=model.revision) + throw EvidenceError("Scenario result owner or revision differs from the materialized scenario"); + if(result.guarantee!=options.guarantee)throw EvidenceError("Scenario result guarantee differs from request"); + if((result.objective&&!std::isfinite(*result.objective)) || (result.best_bound&&std::isnan(*result.best_bound))) + throw EvidenceError("Scenario result contains malformed objective or bound"); + if(result.native_backend_gap&&(!std::isfinite(*result.native_backend_gap)||*result.native_backend_gap<0)) + throw EvidenceError("Scenario result contains a malformed vendor gap"); + const bool supplied_candidate=!result.values.empty() || result.objective || result.solution_validated; + const bool values_present=supplied_candidate || + (model.variables.empty()&&definitive(result.termination)); + if(values_present || !result.active_variables.empty()) { + if(result.active_variables.size()!=model.variables.size())throw EvidenceError("Scenario active-mask dimension mismatch"); + for(std::size_t i=0;i0); + bounded=bounded&&std::isfinite(lower?v.lower:v.upper); + } + if(bounded)throw EvidenceError("Original variable bounds contradict objective unboundedness"); + } + try{result.update_gaps(model.objective.sense);}catch(const ModelError& e){throw EvidenceError(e.what());} + return out; +} +} + +void ScenarioBatchOptions::validate() const { + solve.validate(); + if(reuse!=ScenarioReuse::Automatic&&reuse!=ScenarioReuse::Cold)throw ModelError("Invalid scenario reuse mode"); +} +ModelId ScenarioBatch::id() const noexcept{return owner_;} +const ModelSnapshot& ScenarioBatch::base() const noexcept{return base_;} +std::size_t ScenarioBatch::size() const noexcept{return definitions_.size();} +ScenarioId ScenarioBatch::scenario(std::size_t index) const { + if(index>=size())throw ModelError("Scenario index is outside its batch");return {owner_,index}; +} +const ScenarioDefinition& ScenarioBatch::definition(ScenarioId id) const { + if(id.batch_id!=owner_||id.index>=size())throw ModelError("Scenario ID is foreign or out of range"); + return definitions_[static_cast(id.index)]; +} +ModelSnapshot ScenarioBatch::materialize(ScenarioId id) const { + return Optimize::materialize(base_,definition(id),owner_,id.index+1,nullptr); +} +Variable ScenarioBatch::map(Variable original) const{return {owner_,variable(base_,original)};} +Constraint ScenarioBatch::map(Constraint original) const{return {owner_,row(base_,original)};} +bool ScenarioBatchResult::all_resolved() const noexcept { + if(!batch||completion!=ScenarioBatchCompletion::Complete||outcomes.size()!=batch->size()||resolved!=outcomes.size())return false; + for(const auto& outcome:outcomes)if(!outcome.result||!definitive(outcome.result->termination))return false; + return true; +} +double ScenarioBatchResult::value(ScenarioId id,Variable original) const { + if(!batch)throw ModelError("Scenario batch was not admitted"); + batch->definition(id); + if(id.index>=outcomes.size())throw ModelError("Scenario outcome is missing"); + const auto& outcome=outcomes[id.index]; + if(!outcome.result||outcome.scenario.batch_id!=id.batch_id||outcome.scenario.index!=id.index|| + outcome.result->model_id!=batch->id()||outcome.result->revision!=id.index+1) + throw ModelError("Scenario result identity is absent or inconsistent"); + return outcome.result->value(batch->map(original)); +} +namespace Detail { +struct ScenarioBatchAccess { + static std::shared_ptr create(const ModelSnapshot& base, + const std::vector& definitions,const ScenarioBatchOptions& options, + Meter& meter,ScenarioBatchResult& output) { + storage(definitions.size(),options.max_scenarios,"Scenario count cap reached"); + if(definitions.size()>=std::numeric_limits::max()) + throw Unsupported("Too many scenario revisions"); + product(definitions.size(),base.variables.size(),options.max_saved_value_slots,"Scenario saved-value slot cap reached"); + if(!base.indicators.empty()||!base.globals.empty()) + throw Unsupported("Scenario batches currently reject all indicator/global metadata, including inactive history"); + visit(base,&meter);validate_structure(base);meter.tick(0); + // Admission is independent of backend availability and batch size. These + // routes cannot meet this guarantee, even if no scenario is requested. + if(options.solve.guarantee==Guarantee::Certified || + (options.solve.guarantee==Guarantee::Exact&&options.solve.backend!=Backend::Native)) + throw Unsupported("Scenario batches require Numerical, or explicit Native with Exact"); + for(const auto& v:base.variables){meter.tick();if(v.active&&v.type!=VariableType::Continuous&&v.type!=VariableType::Integer&&v.type!=VariableType::Binary) + throw Unsupported("Scenario batches currently support Continuous, Integer and Binary variables only");} + if(!options.solve.primal_start.empty())throw Unsupported("Scenario batches do not yet admit common primal starts"); + if(definitions.size()>1&&options.solve.node_limit&&*options.solve.node_limit>0) + throw Unsupported("Multi-scenario positive node limits require consumed-node accounting"); + std::size_t count=0; + for(std::size_t i=0;i(new ScenarioBatch); + Model owner;batch->owner_=owner.id(); + // Public snapshots can contain a caller-selected positive owner number. + // Keep original/private identity distinct even if it predicts our next ID. + if(batch->owner_==base.model_id){Model distinct;batch->owner_=distinct.id();} + batch->base_=base;batch->definitions_=definitions; + for(std::size_t i=0;iowner_,i+1,&meter);(void)tested;} + meter.tick(0); + } + output.offending_scenario.reset();return batch; + } +}; +} +namespace { +template +ScenarioBatchResult run(Snapshot snapshot,ModelId owner,Revision revision, + const std::vector& definitions,const ScenarioBatchOptions& options) { + const auto started=std::chrono::steady_clock::now(); + ScenarioBatchResult out;out.model_id=owner;out.revision=revision; + std::optional budget; + std::optional meter; + std::optional current; + auto fail=[&](Termination reason,const char* message) noexcept { + out.completion=out.batch?ScenarioBatchCompletion::Interrupted:ScenarioBatchCompletion::Rejected; + out.stop_reason=reason; + try {out.message=message;}catch(...){out.message.clear();} + if(current && out.outcomes[*current].result) { + out.outcomes[*current].check.reset(); + try {clear(*out.outcomes[*current].result,reason,message);} + catch(...){out.outcomes[*current].result->message.clear();} + } + }; + try { + options.validate();budget.emplace(options.solve,started);meter.emplace(Meter{*budget,options.max_work,0}); + checkpoint(*budget); + const auto& original=snapshot();checkpoint(*budget); + auto batch=Detail::ScenarioBatchAccess::create(original,definitions,options,*meter,out); + meter->tick(definitions.size());std::vector outcomes(definitions.size()); + for(std::size_t i=0;iscenario(i); + checkpoint(*budget);out.batch=std::move(batch);out.outcomes=std::move(outcomes); + out.completion=ScenarioBatchCompletion::Interrupted; + { + std::optional session; + if(options.reuse==ScenarioReuse::Automatic && options.solve.backend!=Backend::Native && !out.outcomes.empty())session.emplace(); + for(std::size_t i=0;ibase(),out.batch->definition(outcome.scenario),out.batch->id(),i+1,&*meter); + auto adjusted=options.solve;adjusted.time_limit_seconds=budget->remaining_seconds();adjusted.cancellation=budget->cancellation(); + const auto before=session?session->statistics():SessionStatistics{}; + event("before_solve",i);checkpoint(*budget);outcome.state=ScenarioRunState::Attempted;++out.attempted; + outcome.result.emplace();outcome.result->model_id=scenario.model_id; + outcome.result->revision=scenario.revision;outcome.result->guarantee=options.solve.guarantee; +#ifdef GECODE_OPTIMIZE_TEST_SCENARIOS + auto result=Detail::scenario_test_solve(scenario,adjusted,session?&*session:nullptr); +#else + auto result=session?session->solve(scenario,adjusted):solve(scenario,adjusted); +#endif + const auto after=session?session->statistics():SessionStatistics{}; + outcome.reuse_delta=difference(after,before);out.reuse_statistics=after; + event("after_solve",i);checkpoint(*budget); + auto checked=check(scenario,result,options.solve,*meter); + event("after_check",i);checkpoint(*budget); + // All allocating checked fields are staged before publication. + outcome.result=std::move(result);outcome.check=std::move(checked); + } + event("after_cleanup",i);checkpoint(*budget); + outcome.elapsed_seconds=std::chrono::duration(std::chrono::steady_clock::now()-stage_started).count(); + if(!definitive(outcome.result->termination)) { + out.stop_reason=outcome.result->termination;out.message="Scenario did not reach a definitive outcome"; + current.reset();break; + } + ++out.resolved;current.reset();out.offending_scenario.reset(); + } + } + event("batch_cleanup",out.outcomes.size());checkpoint(*budget); + if(out.resolved==out.outcomes.size()) {out.completion=ScenarioBatchCompletion::Complete;out.stop_reason.reset();} + } catch(const Stopped& e) {fail(e.reason,e.message);} + catch(const Unsupported& e){fail(Termination::Unsupported,e.what());} + catch(const ModelError& e){fail(Termination::InvalidModel,e.what());} + catch(const EvidenceError& e){fail(Termination::NumericalFailure,e.what());} + catch(const std::bad_alloc&){fail(Termination::MemoryLimit,"Scenario allocation failed");} + catch(const std::exception& e){fail(Termination::BackendError,e.what());} + // The Model overload's temporary snapshot has now been released as well. + // Earlier stage witnesses remain timely historical results if cleanup used + // the remaining allowance; only batch completion is downgraded here. + if(budget&&out.completion==ScenarioBatchCompletion::Complete) + if(const auto reason=budget->stop_reason())fail(*reason,"Whole batch budget stopped during final source cleanup"); + if(meter)out.work=meter->used; + out.elapsed_seconds=std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return out; +} +} +ScenarioBatchResult solve_scenarios(const ModelSnapshot& model,const std::vector& definitions,const ScenarioBatchOptions& options) { + return run([&]() -> const ModelSnapshot& {return model;},model.model_id,model.revision,definitions,options); +} +ScenarioBatchResult solve_scenarios(const Model& model,const std::vector& definitions,const ScenarioBatchOptions& options) { + return run([&]{return model.snapshot();},model.id(),model.revision(),definitions,options); +} +}} diff --git a/gecode/optimize/scenarios.hpp b/gecode/optimize/scenarios.hpp new file mode 100644 index 0000000000..06aac4055a --- /dev/null +++ b/gecode/optimize/scenarios.hpp @@ -0,0 +1,108 @@ +/* Owning serial scenario batches; no shared search-tree semantics. */ +#ifndef GECODE_OPTIMIZE_SCENARIOS_HPP +#define GECODE_OPTIMIZE_SCENARIOS_HPP +#include +#include + +namespace Gecode { namespace Optimize { +struct ScenarioVariableBounds { + Variable variable; + std::optional lower, upper; +}; +struct ScenarioRowBounds { + Constraint row; + std::optional lower, upper; +}; +struct ScenarioDefinition { + std::string name; + /** Absolute coefficients; zero removes a term. Missing entries inherit base. */ + std::vector objective_coefficients; + std::optional objective_offset; + std::vector variable_bounds; + std::vector row_bounds; +}; +struct ScenarioId { + ModelId batch_id = 0; + std::uint64_t index = 0; +}; +enum class ScenarioReuse { Automatic, Cold }; +struct ScenarioBatchOptions { + SolveOptions solve; + ScenarioReuse reuse = ScenarioReuse::Automatic; + std::size_t max_scenarios = 1000; + std::size_t max_patch_entries = 1000000; + std::size_t max_saved_value_slots = 10000000; + /** Metered coordinator element visits, excluding backend internals. */ + std::size_t max_work = 100000000; + void validate() const; +}; +enum class ScenarioRunState { NotStarted, Attempted }; +enum class ScenarioBatchCompletion { Rejected, Interrupted, Complete }; +namespace Detail { struct ScenarioBatchAccess; } +class ScenarioBatch { +public: + ScenarioBatch(const ScenarioBatch&) = delete; + ScenarioBatch& operator=(const ScenarioBatch&) = delete; + ModelId id() const noexcept; + const ModelSnapshot& base() const noexcept; + std::size_t size() const noexcept; + ScenarioId scenario(std::size_t index) const; + const ScenarioDefinition& definition(ScenarioId) const; + /** Owning private snapshot. Same private owner, distinct scenario revision. */ + ModelSnapshot materialize(ScenarioId) const; + Variable map(Variable original) const; + Constraint map(Constraint original) const; +private: + friend struct Detail::ScenarioBatchAccess; + ScenarioBatch() = default; + ModelId owner_ = 0; + ModelSnapshot base_; + std::vector definitions_; +}; +struct ScenarioCheck { + bool identity_valid = false; + /** validation/objective/exact flags are meaningful only when true. */ + bool candidate_examined = false; + bool objective_matches = false; + bool exact_witness_validated = false; + ValidationReport validation; +}; +struct ScenarioOutcome { + ScenarioId scenario; + ScenarioRunState state = ScenarioRunState::NotStarted; + std::optional result; + std::optional check; + SessionStatistics reuse_delta; + double elapsed_seconds = 0; +}; +struct ScenarioBatchResult { + ModelId model_id = 0; + Revision revision = 0; + std::shared_ptr batch; + ScenarioBatchCompletion completion = ScenarioBatchCompletion::Rejected; + std::optional stop_reason; + std::optional offending_scenario; + std::string message; + std::vector outcomes; + SessionStatistics reuse_statistics; + std::size_t attempted = 0, resolved = 0, work = 0; + double elapsed_seconds = 0; + bool all_resolved() const noexcept; + double value(ScenarioId, Variable original) const; +}; +/** + * Ordinary Continuous/Integer/Binary linear models only. All patches are + * admitted before any solve; nonempty indicator/global metadata and primal + * starts are Unsupported. Auto/HiGHS use private session reuse or Cold solves; + * explicit Native uses its ordinary one-shot route and exact admission. + * One whole-batch time/cancel allowance. Positive node limits with >1 scenario + * are Unsupported until consumed-node accounting exists. Zero stops before any + * solve; one scenario preserves the ordinary backend node-limit contract. + * No caller model/session is changed. Materializations and results own history. + */ +ScenarioBatchResult solve_scenarios(const ModelSnapshot&, + const std::vector&, const ScenarioBatchOptions& = {}); +ScenarioBatchResult solve_scenarios(const Model&, + const std::vector&, const ScenarioBatchOptions& = {}); +}} +#endif diff --git a/gecode/optimize/session.hpp b/gecode/optimize/session.hpp new file mode 100644 index 0000000000..f506bef992 --- /dev/null +++ b/gecode/optimize/session.hpp @@ -0,0 +1,66 @@ +/* Persistent numerical reoptimization with explicit state reuse. */ +#ifndef GECODE_OPTIMIZE_SESSION_HPP +#define GECODE_OPTIMIZE_SESSION_HPP + +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { + +struct SessionStatistics { + std::uint64_t solve_calls = 0; + std::uint64_t model_loads = 0; + std::uint64_t incremental_updates = 0; + std::uint64_t unchanged_models = 0; + /** Runs entered with a retained valid LP basis; no speedup is implied. */ + std::uint64_t basis_warm_starts = 0; + /** Previously validated MIP witnesses, rechecked and submitted as hints. */ + std::uint64_t incumbent_starts = 0; +}; + +/** + * Owns one HiGHS instance. Bounds, costs, row sides, sense and offset edits + * reuse its model; matrix/type/slot/owner changes reload it. Every snapshot is + * validated and compared by content, including when its revision is unchanged. + * LP bases can survive compatible edits. MIP trees/cuts are not retained; + * previous MIP solutions are reused only after original-model revalidation. + * Explicit primal starts take precedence. Each call has a fresh solve budget. + * + * Auto selects HiGHS; Native sessions are currently Unsupported. Separate + * sessions may be used independently. Do not call one session concurrently. + * Moving transfers all state; solving a moved-from session returns InvalidModel. + * reset() discards model, basis, witnesses and counters (and revives a moved + * session). Results remain owning historical snapshots after edits or reset. + */ +class SolveSession { +public: + SolveSession(); + ~SolveSession(); + SolveSession(SolveSession&&) noexcept; + SolveSession& operator=(SolveSession&&) noexcept; + SolveSession(const SolveSession&) = delete; + SolveSession& operator=(const SolveSession&) = delete; + + SolveResult solve(const ModelSnapshot& model, const SolveOptions& options = {}); + SolveResult solve(const Model& model, const SolveOptions& options = {}); + /** Owning continuous-LP observations; same session reuse/lifetime contract. */ + LpObservedResult solve_lp_observed(const ModelSnapshot& model, + const LpObservationOptions& options = {}); + LpObservedResult solve_lp_observed(const Model& model, + const LpObservationOptions& options = {}); + LpBasisSolveResult solve_lp_with_basis(const ModelSnapshot& model, + const LpBasisSolveOptions& options); + LpBasisSolveResult solve_lp_with_basis(const Model& model, + const LpBasisSolveOptions& options); + SessionStatistics statistics() const noexcept; + void reset(); + +private: + struct Impl; + std::unique_ptr impl_; +}; + +}} +#endif diff --git a/gecode/optimize/solve.cpp b/gecode/optimize/solve.cpp new file mode 100644 index 0000000000..10fd39cde7 --- /dev/null +++ b/gecode/optimize/solve.cpp @@ -0,0 +1,969 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +#include +#include +#include +#endif + +namespace Gecode { namespace Optimize { +#ifdef GECODE_OPTIMIZE_TEST_LP_BASIS_FAILURE +namespace Detail { bool lp_basis_test_cancel() noexcept; } +#endif +namespace { + +class Unsupported : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; +class BasisStopped : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; + +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + +void require_ok(HighsStatus status, const char* operation) { + if (status != HighsStatus::kOk) + throw ModelError(std::string("HiGHS rejected or modified input during ") + operation); +} + +void numerical_range(double value, double maximum, const char* kind) { + if (std::isfinite(value) && std::abs(value) >= maximum) + throw Unsupported(std::string(kind) + " exceeds supported HiGHS numerical range"); +} + +HighsVarType variable_type(VariableType type) { + switch (type) { + case VariableType::Continuous: return HighsVarType::kContinuous; + case VariableType::Integer: + case VariableType::Binary: return HighsVarType::kInteger; + case VariableType::SemiContinuous: return HighsVarType::kSemiContinuous; + case VariableType::SemiInteger: return HighsVarType::kSemiInteger; + } + throw ModelError("Invalid variable type"); +} + +HighsBasisStatus basis_status(LpBasisStatus value) { + switch(value) { + case LpBasisStatus::Lower: return HighsBasisStatus::kLower; + case LpBasisStatus::Basic: return HighsBasisStatus::kBasic; + case LpBasisStatus::Upper: return HighsBasisStatus::kUpper; + case LpBasisStatus::Zero: return HighsBasisStatus::kZero; + case LpBasisStatus::NonbasicUnspecified: return HighsBasisStatus::kNonbasic; + } + throw ModelError("Unknown original basis status"); +} +LpBasisStatus basis_status(HighsBasisStatus value) { + switch(value) { + case HighsBasisStatus::kLower: return LpBasisStatus::Lower; + case HighsBasisStatus::kBasic: return LpBasisStatus::Basic; + case HighsBasisStatus::kUpper: return LpBasisStatus::Upper; + case HighsBasisStatus::kZero: return LpBasisStatus::Zero; + case HighsBasisStatus::kNonbasic: return LpBasisStatus::NonbasicUnspecified; + } + throw std::runtime_error("Unknown returned backend basis status"); +} + +struct Compiled { + HighsLp lp; + std::vector slots; + std::vector row_slots; + // Unlike row_slots (all active-row topology), this maps emitted backend rows. + std::vector backend_row_slots; + std::vector original_types; + bool discrete = false; + bool contradictory_constant = false; +}; + +Compiled compile(const ModelSnapshot& model, double feasibility_tolerance) { + validate_structure(model); + Compiled compiled; + auto& lp = compiled.lp; + std::vector columns(model.variables.size(), -1); + const auto limit = static_cast(std::numeric_limits::max()); + for (const auto& v : model.variables) { + if (!v.active) continue; + if (compiled.slots.size() >= limit) throw Unsupported("Too many columns for HiGHS"); + numerical_range(v.lower, 1e20, "Variable bound"); + numerical_range(v.upper, 1e20, "Variable bound"); + if ((v.type == VariableType::SemiContinuous || v.type == VariableType::SemiInteger) + && (!std::isfinite(v.upper) || v.upper > 1e5)) + throw Unsupported("Semi variables require a finite upper bound <= 100000 in this adapter"); + columns[v.variable.id] = static_cast(compiled.slots.size()); + compiled.slots.push_back(static_cast(v.variable.id)); + compiled.original_types.push_back(v.type); + lp.col_lower_.push_back(v.lower); + lp.col_upper_.push_back(v.upper); + lp.col_cost_.push_back(0.0); + lp.col_names_.push_back(v.name.empty() ? "x" + std::to_string(v.variable.id) : v.name); + lp.integrality_.push_back(variable_type(v.type)); + compiled.discrete |= v.type != VariableType::Continuous; + } + lp.num_col_ = static_cast(compiled.slots.size()); + lp.sense_ = model.objective.sense == ObjectiveSense::Minimize + ? ObjSense::kMinimize : ObjSense::kMaximize; + numerical_range(model.objective.offset, 1e20, "Objective offset"); + lp.offset_ = model.objective.offset; + for (const auto& term : model.objective.terms) { + numerical_range(term.coefficient, 1e20, "Objective coefficient"); + lp.col_cost_[columns[term.variable.id]] = term.coefficient; + } + auto& matrix = lp.a_matrix_; + matrix.format_ = MatrixFormat::kRowwise; + matrix.start_.assign(1, 0); + for (const auto& row : model.rows) { + if (!row.active) continue; + compiled.row_slots.push_back(static_cast(row.constraint.id)); + if (lp.row_lower_.size() >= limit) throw Unsupported("Too many rows for HiGHS"); + numerical_range(row.lower, 1e20, "Row bound"); + numerical_range(row.upper, 1e20, "Row bound"); + if (row.terms.empty()) { + // HiGHS MIP presolve requires a nonempty matrix when rows exist. Constant + // rows need no backend column: decide them using the original checker's + // absolute feasibility convention and retain them in the original model. + compiled.contradictory_constant |= row.lower > feasibility_tolerance || + row.upper < -feasibility_tolerance; + continue; + } + compiled.backend_row_slots.push_back(static_cast(row.constraint.id)); + lp.row_lower_.push_back(row.lower); + lp.row_upper_.push_back(row.upper); + lp.row_names_.push_back(row.name.empty() ? "r" + std::to_string(row.constraint.id) : row.name); + for (const auto& term : row.terms) { + if (matrix.value_.size() >= limit) throw Unsupported("Too many nonzeros for HiGHS"); + // HiGHS discards coefficients at/below this minimum threshold. Refuse + // such input rather than silently changing the original problem. + if (std::abs(term.coefficient) <= 1e-12) + throw Unsupported("Nonzero matrix coefficients <= 1e-12 require rescaling"); + numerical_range(term.coefficient, 1e15, "Matrix coefficient"); + matrix.index_.push_back(columns[term.variable.id]); + matrix.value_.push_back(term.coefficient); + } + matrix.start_.push_back(static_cast(matrix.value_.size())); + } + lp.num_row_ = static_cast(lp.row_lower_.size()); + matrix.num_col_ = lp.num_col_; + matrix.num_row_ = lp.num_row_; + if (!compiled.discrete) lp.integrality_.clear(); + return compiled; +} + +HighsBasis prepare_basis(const LpBasis& source,const Compiled& model) { + HighsBasis out; + // The pinned alien zero-row path indexes internal status vectors before its + // general size checks. A fully checked basis with zero basic entities and + // zero rows has no singularity issue and uses the non-alien consistency path. + out.alien=!model.backend_row_slots.empty();out.valid=false;out.useful=true; + out.col_status.reserve(model.slots.size());out.row_status.reserve(model.backend_row_slots.size()); + for(auto slot:model.slots)out.col_status.push_back(basis_status(*source.columns()[slot])); + for(auto slot:model.backend_row_slots)out.row_status.push_back(basis_status(*source.rows()[slot])); + return out; +} + +void submit_basis(Highs& highs,const HighsBasis& requested,const Compiled& compiled, + const ModelSnapshot& model,const SolveBudget& budget,LpBasisSubmission& report) { + report.backend_attempted=true; + try { + auto status=highs.setBasis(requested,"Gecode original LP basis start"); +#ifdef GECODE_OPTIMIZE_TEST_LP_BASIS_FAILURE + // Separately compiled fault panel only: dirty the REAL backend first, then + // exercise rejection or cancellation cleanup. Absent in production builds. + if(status==HighsStatus::kOk) { + if(Detail::lp_basis_test_cancel())budget.cancellation()->cancel(); + else status=HighsStatus::kError; + } +#endif + if(budget.expired())throw BasisStopped("Budget expired during LP basis factorization/repair"); + if(status!=HighsStatus::kOk)throw std::runtime_error("HiGHS rejected the submitted LP basis"); + const auto& actual=highs.getBasis(); + if(!actual.valid||actual.alien||actual.col_status.size()!=compiled.slots.size()|| + actual.row_status.size()!=compiled.backend_row_slots.size()) + throw std::runtime_error("HiGHS returned an invalid or incomplete submitted basis"); + { + std::vector> rows(model.rows.size()),cols(model.variables.size()); + for(std::size_t i=0;i static_cast(std::numeric_limits::max())) + throw Unsupported("Node limit exceeds HiGHS integer range"); + require_ok(highs.setOptionValue("mip_max_nodes", static_cast(*options.node_limit)), "node limit setup"); + } else { + require_ok(highs.setOptionValue("mip_max_nodes", kHighsIInf), "node limit reset"); + } +} + +HighsSolution prepare_start(const ModelSnapshot& model, + const Compiled& compiled, const SolveOptions& options) { + std::vector column(model.variables.size(), -1); + for (std::size_t i=0; i(i); + std::vector values(model.variables.size(), std::numeric_limits::quiet_NaN()); + std::vector indices; + std::vector entries; + for (const auto& entry : options.primal_start) { + const auto handle = entry.variable; + if (handle.model_id != model.model_id || handle.id >= model.variables.size() + || !model.variables[handle.id].active) + throw ModelError("Primal start contains a foreign or deleted variable"); + if (!std::isnan(values[handle.id])) + throw ModelError("Primal start contains a duplicate variable"); + const auto& v = model.variables[handle.id]; + const long double value = entry.value; + const bool semi = v.type == VariableType::SemiContinuous || v.type == VariableType::SemiInteger; + const bool zero = semi && std::abs(value) <= options.feasibility_tolerance; + if (!zero && (value < static_cast(v.lower)-options.feasibility_tolerance + || value > static_cast(v.upper)+options.feasibility_tolerance)) + throw ModelError("Primal start violates a variable bound"); + if (v.type != VariableType::Continuous && v.type != VariableType::SemiContinuous + && std::abs(value-std::round(value)) > options.integrality_tolerance) + throw ModelError("Primal start violates integrality"); + values[handle.id] = entry.value; + indices.push_back(column[handle.id]); + entries.push_back(entry.value); + } + if (entries.size() == compiled.slots.size()) { + const auto checked = validate(model, values, options.feasibility_tolerance, + options.integrality_tolerance); + if (!checked.valid) throw ModelError("Complete primal start is infeasible: " + checked.message); + } + // HiGHS's sparse overload checks only the nonzero interval of semi domains, + // incorrectly rejecting their valid zero alternative. Its dense overload + // uses kHighsUndefined for unprovided values and handles the MIP hint normally. + HighsSolution start; + start.col_value.assign(compiled.slots.size(), kHighsUndefined); + for (std::size_t i=0; i original_values(const ModelSnapshot& model, + const std::vector& slots, + const std::vector& columns) { + if (columns.size() != slots.size()) throw ModelError("HiGHS returned wrong solution dimension"); + std::vector values(model.variables.size(), std::numeric_limits::quiet_NaN()); + for (std::size_t i = 0; i < slots.size(); ++i) values[slots[i]] = columns[i]; + return values; +} + +#endif + +struct SessionState { + SessionStatistics statistics; +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + std::unique_ptr highs; + std::optional compiled; + ModelId model_id = 0; + std::optional previous; + void invalidate() noexcept { + previous.reset(); + compiled.reset(); + highs.reset(); + model_id = 0; + } +#endif +}; + +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +bool compatible(const Compiled& a, const Compiled& b) { + return a.slots == b.slots && a.row_slots == b.row_slots && + a.backend_row_slots == b.backend_row_slots && + a.original_types == b.original_types && + a.lp.integrality_ == b.lp.integrality_ && + a.lp.a_matrix_.start_ == b.lp.a_matrix_.start_ && + a.lp.a_matrix_.index_ == b.lp.a_matrix_.index_ && + a.lp.a_matrix_.value_ == b.lp.a_matrix_.value_; +} + +bool prepare(SessionState& state, Compiled&& compiled, ModelId owner) { + auto& highs = *state.highs; + const bool reuse = state.compiled && state.model_id == owner && + compatible(*state.compiled, compiled); + if (!reuse) { + require_ok(highs.passModel(compiled.lp), "model load"); + state.previous.reset(); + ++state.statistics.model_loads; + } else { + const auto& old = state.compiled->lp; + const auto& next = compiled.lp; + bool changed = false; + if (old.col_cost_ != next.col_cost_) { + require_ok(highs.changeColsCost(0, next.num_col_-1, next.col_cost_.data()), "cost update"); + changed = true; + } + if (old.col_lower_ != next.col_lower_ || old.col_upper_ != next.col_upper_) { + require_ok(highs.changeColsBounds(0, next.num_col_-1, next.col_lower_.data(), + next.col_upper_.data()), "column bound update"); + changed = true; + } + if (old.row_lower_ != next.row_lower_ || old.row_upper_ != next.row_upper_) { + require_ok(highs.changeRowsBounds(0, next.num_row_-1, next.row_lower_.data(), + next.row_upper_.data()), "row bound update"); + changed = true; + } + if (old.sense_ != next.sense_) { + require_ok(highs.changeObjectiveSense(next.sense_), "sense update"); + changed = true; + } + if (old.offset_ != next.offset_) { + require_ok(highs.changeObjectiveOffset(next.offset_), "offset update"); + changed = true; + } + if (changed) ++state.statistics.incremental_updates; + else ++state.statistics.unchanged_models; + } + state.compiled = std::move(compiled); + state.model_id = owner; + return reuse; +} + +struct CallbackScope { + SessionState& state; + ~CallbackScope() noexcept { + // A persistent backend must never retain references to a completed call's + // budget or local vectors, including exception and early-return paths. + try { state.highs->setCallback(HighsCallbackFunctionType{}, nullptr); } + catch (...) { state.invalidate(); } + } +}; +#endif +} // namespace + +#ifdef GECODE_OPTIMIZE_WITH_HIGHS +Detail::LpSensitivityCompiled Detail::compile_lp_sensitivity( + const ModelSnapshot& model,double primal_tolerance) { + try { + auto compiled=compile(model,primal_tolerance); + if(compiled.row_slots.size()!=compiled.backend_row_slots.size()) + throw LpSensitivityBackendError(LpSensitivityReason::NoBasis, + "LP sensitivity cannot map elided constant rows"); + return {std::move(compiled.lp),std::move(compiled.slots), + std::move(compiled.backend_row_slots)}; + } catch(const Unsupported& error) { + throw LpSensitivityBackendError(LpSensitivityReason::Unsupported,error.what()); + } +} +#endif + +struct SolveSession::Impl : SessionState {}; + +BackendCapabilities capabilities(Backend backend) { + if (backend == Backend::Native) return native_capabilities(); + BackendCapabilities c; + if (backend != Backend::Auto && backend != Backend::Highs) { + c.limitations.push_back("Unknown backend"); + return c; + } + c.name = "HiGHS"; +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + c.available = c.linear_programming = c.mixed_integer_linear = true; + c.version = Highs().version(); +#else + c.limitations.push_back("Built without HiGHS"); +#endif + c.limitations.push_back("Numerical linear LP/MILP only; no exact/certified or nonlinear solve"); + c.limitations.push_back("No action callbacks; sessions retain LP bases and revalidated MIP hints only"); + c.limitations.push_back("One HiGHS worker per solve in this initial adapter"); + c.limitations.push_back("Finite bounds/costs below 1e20; nonzero matrix magnitudes in (1e-12,1e15)"); + c.limitations.push_back("Time/cancellation is cooperative and may overrun during backend calls"); + return c; +} + +static SolveResult solve_highs(const ModelSnapshot& model, const SolveOptions& options, + SessionState* persistent = nullptr, + const SolveBudget* shared_budget = nullptr, + Detail::LpBackendObservations* observations = nullptr, + const LpBasis* basis_start = nullptr, + LpBasisSubmission* basis_report = nullptr) { +#ifndef GECODE_OPTIMIZE_WITH_HIGHS + (void)observations; + (void)basis_start;(void)basis_report; +#endif + const auto started = std::chrono::steady_clock::now(); + SolveResult result; + result.model_id = model.model_id; + result.revision = model.revision; + result.backend = "HiGHS"; + // Start the budget before structural validation and conversion. + std::optional budget_storage; + try { + if (shared_budget) budget_storage.emplace(*shared_budget); + else budget_storage.emplace(options); + } + catch (const ModelError& e) { + result.termination = Termination::InvalidModel; + result.message = e.what(); + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return result; + } + catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; + result.message = "Budget allocation failed"; + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return result; + } + auto& budget = *budget_storage; + SessionState local; + auto& state = persistent ? *persistent : local; +#ifndef GECODE_OPTIMIZE_WITH_HIGHS + (void)state; +#endif + try { + validate_structure(model); + if (std::any_of(model.globals.begin(),model.globals.end(),[](const auto& record){return record.active;})) + throw Unsupported("HiGHS linear adapter cannot preserve native global constraints; choose Native"); + if (options.guarantee != Guarantee::Numerical) + throw Unsupported("HiGHS adapter cannot satisfy an Exact or Certified guarantee"); + result.active_variables.reserve(model.variables.size()); + for (const auto& variable : model.variables) result.active_variables.push_back(variable.active); + if (budget.expired()) { + result.termination = budget.stop_reason().value_or(Termination::Unknown); + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + // Complete source admission before mutating a retained backend instance. + auto conversion = compile(model, options.feasibility_tolerance); + std::optional explicit_start; + if (!options.primal_start.empty()) explicit_start = prepare_start(model, conversion, options); + std::optional external_basis; + if (basis_start) external_basis=prepare_basis(*basis_start,conversion); + if (budget.expired()) { + result.termination = budget.stop_reason().value_or(Termination::Unknown); + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + if (!state.highs) state.highs = std::make_unique(); + auto& highs = *state.highs; + result.backend_version = highs.version(); + configure(highs, options); + if (budget.expired()) { + result.termination = budget.stop_reason().value_or(Termination::Unknown); + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + if (conversion.contradictory_constant) { + state.invalidate(); + result.termination = Termination::Infeasible; + result.message = "An original constant row violates the feasibility tolerance"; + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + if (conversion.slots.empty()) { + if (!options.primal_start.empty()) + throw ModelError("A model without active variables cannot accept a primal start"); + // HiGHS's empty-model status does not check constant rows for us. + auto values = original_values(model, conversion.slots, {}); + auto checked = validate(model, values, options.feasibility_tolerance, options.integrality_tolerance); + state.invalidate(); + result.termination = checked.valid ? Termination::Optimal : Termination::Infeasible; + if (budget.expired()) { + result.termination = budget.stop_reason().value_or(Termination::Unknown); + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + if (checked.valid) { + result.values = std::move(values); + result.objective = checked.objective; + result.best_bound = checked.objective; + result.solution_validated = true; + result.update_gaps(model.objective.sense); + } + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + const bool reused = prepare(state, std::move(conversion), model.model_id); + const auto& compiled = *state.compiled; + if (compiled.discrete) + require_ok(highs.clearSolver(), "MIP search state reset"); + if (explicit_start) { + require_ok(highs.setSolution(*explicit_start), "primal start submission"); + result.start_submitted = true; + } else if (compiled.discrete && state.previous && state.previous->has_solution()) { + const auto checked = validate(model, state.previous->values, + options.feasibility_tolerance, options.integrality_tolerance); + if (checked.valid) { + HighsSolution hint; + for (const auto slot : compiled.slots) hint.col_value.push_back(state.previous->values[slot]); + require_ok(highs.setSolution(hint), "session incumbent submission"); + result.start_submitted = true; + ++state.statistics.incumbent_starts; + } + } + if (budget.expired()) { + result.termination = budget.stop_reason().value_or(Termination::Unknown); + result.elapsed_seconds = budget.elapsed_seconds(); + return result; + } + std::vector timely_columns; + std::optional timely_bound; + bool callback_failed = false; + auto callback = [&](int type, const std::string&, const HighsCallbackOutput* out, + HighsCallbackInput* in, void*) { + const bool can_interrupt = type == kCallbackSimplexInterrupt || + type == kCallbackIpmInterrupt || type == kCallbackMipInterrupt; + try { + // Improving-solution callbacks are observations only. HiGHS asserts + // that they never request actions, including user_interrupt. + if (budget.expired() || callback_failed) { + if (in && can_interrupt) in->user_interrupt = true; + return; + } + if (!out) return; + if (type == kCallbackMipImprovingSolution && out->mip_solution.size() == compiled.slots.size()) + timely_columns = out->mip_solution; + if (compiled.discrete && (type == kCallbackMipInterrupt || type == kCallbackMipImprovingSolution) + && std::isfinite(out->mip_dual_bound)) timely_bound = out->mip_dual_bound; + } catch (...) { + callback_failed = true; + if (in && can_interrupt) in->user_interrupt = true; + } + }; + CallbackScope callback_scope{state}; + require_ok(highs.setCallback(callback, nullptr), "callback setup"); + for (auto type : {kCallbackSimplexInterrupt, kCallbackIpmInterrupt, + kCallbackMipInterrupt, kCallbackMipImprovingSolution}) + require_ok(highs.startCallback(type), "callback activation"); + highs.zeroAllClocks(); + require_ok(highs.setOptionValue("time_limit", budget.remaining_seconds()), "time limit setup"); + if (external_basis) { + if (budget.expired()) throw BasisStopped("Budget expired before LP basis submission"); + submit_basis(highs,*external_basis,compiled,model,budget,*basis_report); + if (budget.expired()) { + basis_report->state=LpBasisSubmissionState::Interrupted; + basis_report->statuses_changed.reset(); + throw BasisStopped("Budget expired before LP basis submission returned"); + } + highs.zeroAllClocks(); + require_ok(highs.setOptionValue("time_limit",budget.remaining_seconds()),"post-basis time limit setup"); + } + if (!external_basis && reused && !compiled.discrete && highs.getBasis().valid) + ++state.statistics.basis_warm_starts; + const auto run_status = highs.run(); + const bool returned_in_budget = !budget.expired(); + result.termination = status(highs.getModelStatus()); + result.message = highs.modelStatusToString(highs.getModelStatus()); + if (!returned_in_budget) result.termination = budget.stop_reason().value_or(Termination::Unknown); + const auto& info = highs.getInfo(); + if (result.termination == Termination::SolutionLimit && options.node_limit && info.valid + && info.mip_node_count >= 0 && static_cast(info.mip_node_count) >= *options.node_limit) + result.termination = Termination::NodeLimit; + if (run_status == HighsStatus::kError || callback_failed) { + result.termination = Termination::BackendError; + result.message = callback_failed ? "Callback storage failed" : "HiGHS solve failed"; + } + const auto& candidate = highs.getSolution(); + if (observations) { + // Passive copies only. In particular, do not call ray/ranging/tableau + // methods here: those can solve or mutate the backend. + auto& raw=*observations; + raw.attempted=true;raw.timely=returned_in_budget; + raw.model_id=model.model_id;raw.revision=model.revision; + raw.info_valid=info.valid;raw.value_valid=candidate.value_valid; + raw.primal_feasible=info.valid && info.primal_solution_status == kSolutionStatusFeasible; + raw.dual_valid=candidate.dual_valid; + raw.dual_feasible=info.valid && info.dual_solution_status == kSolutionStatusFeasible; + try { + if (returned_in_budget) { + raw.column_slots=compiled.slots;raw.row_slots=compiled.backend_row_slots; + double tolerance=0; + if (highs.getOptionValue("primal_feasibility_tolerance",tolerance) == HighsStatus::kOk) + raw.primal_tolerance=tolerance; + if (highs.getOptionValue("dual_feasibility_tolerance",tolerance) == HighsStatus::kOk) + raw.dual_tolerance=tolerance; + if (raw.requested_duals && raw.dual_valid) { + raw.column_duals=candidate.col_dual;raw.row_duals=candidate.row_dual; + } + if (raw.requested_basis) { + const auto& basis=highs.getBasis(); + raw.basis_valid=basis.valid; + raw.info_basis_valid=info.valid && info.basis_validity == kBasisValidityValid; + auto convert_basis=[](HighsBasisStatus value) { + switch (value) { + case HighsBasisStatus::kLower: return LpBasisStatus::Lower; + case HighsBasisStatus::kBasic: return LpBasisStatus::Basic; + case HighsBasisStatus::kUpper: return LpBasisStatus::Upper; + case HighsBasisStatus::kZero: return LpBasisStatus::Zero; + case HighsBasisStatus::kNonbasic: return LpBasisStatus::NonbasicUnspecified; + } + throw ModelError("Unknown HiGHS basis status"); + }; + if (basis.valid) { + raw.column_basis.reserve(basis.col_status.size()); + raw.row_basis.reserve(basis.row_status.size()); + for (auto value : basis.col_status) raw.column_basis.push_back(convert_basis(value)); + for (auto value : basis.row_status) raw.row_basis.push_back(convert_basis(value)); + } + } + raw.complete=true; + } + } catch (const std::bad_alloc&) { raw.failure=Detail::LpCaptureFailure::Allocation; } + catch (...) { raw.failure=Detail::LpCaptureFailure::InvalidData; } + // An observation copy cannot turn a late primal into a timely incumbent. + if (budget.expired()) raw.timely=false; + } + std::vector columns; + if (returned_in_budget && candidate.value_valid && info.valid + && info.primal_solution_status == kSolutionStatusFeasible) + columns = candidate.col_value; + else if (!timely_columns.empty()) columns = std::move(timely_columns); + if (!columns.empty()) { + auto values = original_values(model, compiled.slots, columns); + const auto checked = validate(model, values, options.feasibility_tolerance, options.integrality_tolerance); + if (checked.valid) { + result.values = std::move(values); + result.objective = checked.objective; + result.solution_validated = true; + } else { + result.termination = Termination::NumericalFailure; + result.message = "Original-model validation rejected HiGHS candidate: " + checked.message; + } + } + if (returned_in_budget && info.valid && compiled.discrete) { + if (std::isfinite(info.mip_dual_bound)) result.best_bound = info.mip_dual_bound; + if (std::isfinite(info.mip_gap)) result.native_backend_gap = info.mip_gap; + } else if (returned_in_budget && result.termination == Termination::Optimal && info.valid + && std::isfinite(info.objective_function_value)) { + result.best_bound = info.objective_function_value; + } else if (timely_bound) result.best_bound = timely_bound; + if (result.termination == Termination::Optimal && !result.has_solution()) { + result.termination = Termination::NumericalFailure; + result.message = "HiGHS reported optimal without a validated original-model solution"; + } + try { result.update_gaps(model.objective.sense); } + catch (const ModelError&) { + // Preserve the observed numerical discrepancy, never manufacture zero. + result.best_bound.reset(); + result.absolute_gap.reset(); + result.relative_gap.reset(); + result.message += "; bound inconsistent with independently recomputed objective"; + } + state.previous.reset(); + if (persistent && compiled.discrete && result.has_solution()) { + // A cache is optional: allocation pressure must not erase a valid result. + try { state.previous.emplace(result); } + catch (const std::bad_alloc&) { state.previous.reset(); } + } +#else + throw Unsupported("This build has no HiGHS backend; configure GECODE_OPTIMIZE_WITH_HIGHS=ON"); +#endif + } catch (const BasisStopped& e) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + state.invalidate(); +#endif + result.termination=budget.stop_reason().value_or(Termination::Unknown); + result.message=e.what(); + } catch (const Unsupported& e) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + state.invalidate(); +#endif + result.termination = Termination::Unsupported; + result.message = e.what(); + } catch (const ModelError& e) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + state.invalidate(); +#endif + result.termination = Termination::InvalidModel; + result.message = e.what(); + } catch (const std::bad_alloc&) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + state.invalidate(); +#endif + result.termination = Termination::MemoryLimit; + result.message = "Allocation failed"; + } catch (const std::exception& e) { +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + state.invalidate(); +#endif + result.termination = Termination::BackendError; + result.message = e.what(); + } + result.elapsed_seconds = budget.elapsed_seconds(); +#ifdef GECODE_OPTIMIZE_WITH_HIGHS + if (result.termination == Termination::BackendError || result.termination == Termination::NumericalFailure) + state.invalidate(); +#endif + if (result.termination == Termination::Optimal && budget.expired()) + result.termination = budget.stop_reason().value_or(Termination::Unknown); + return result; +} + +template +static LpObservedResult observed_solve(Snapshot&& snapshot, ModelId owner, + Revision revision, + const LpObservationOptions& options, + SessionState* persistent = nullptr, + bool session_live = true, + const LpBasisSolveOptions* basis_options = nullptr, + LpBasisSubmission* basis_report = nullptr) { +#ifndef GECODE_OPTIMIZE_WITH_HIGHS + (void)persistent; +#endif + const auto started=std::chrono::steady_clock::now(); + LpObservedResult out; + out.result.model_id=owner;out.result.revision=revision;out.result.backend="HiGHS"; + std::shared_ptr observations; + auto failure=[&](Termination termination,LpObservationReason reason,const char* message) noexcept { + out.result.termination=termination; + try { + out.result.message=message; + if (observations) Detail::LpObservationAccess::unavailable(*observations,reason,message); + } catch (...) { + observations.reset();out.observations.reset();out.result.message.clear(); + } + }; + try { + // The same shared clock covers cold snapshot ownership, backend work and + // independent observation checks. Never restart it for collection. + SolveBudget budget(options.solve); + options.checks.validate(); + if (basis_options) basis_options->validate(); + out.result.guarantee=options.solve.guarantee; + observations=Detail::LpObservationAccess::create(snapshot(),options); + out.observations=observations; + const auto& original=observations->source(); + out.result.active_variables.reserve(original.variables.size()); + for (const auto& variable : original.variables) out.result.active_variables.push_back(variable.active); + const auto unsupported=Detail::LpObservationAccess::unsupported(original,options.solve); + if (!session_live) { + failure(Termination::InvalidModel,LpObservationReason::InvalidModel,"Moved-from solve session"); + } else if (!unsupported.empty()) { + // Admission must precede any persistent backend/statistics mutation. + failure(Termination::Unsupported,LpObservationReason::Unsupported,unsupported.c_str()); + } else { + if (basis_options && !budget.expired()) { + try { Detail::LpBasisAccess::compatible(*basis_options->basis,original,budget); } + catch (const ModelError&) { if (!budget.expired()) throw; } + } +#ifndef GECODE_OPTIMIZE_WITH_HIGHS + failure(Termination::Unsupported,LpObservationReason::Unsupported,"This build has no HiGHS LP observation backend"); +#else + if (budget.expired()) { + failure(budget.stop_reason().value_or(Termination::Unknown),LpObservationReason::Interrupted, + "Budget expired before LP observation solve"); + } else { + { + Detail::LpBackendObservations raw; + raw.requested_duals=options.duals;raw.requested_basis=options.basis; + if (persistent) ++persistent->statistics.solve_calls; + out.result=solve_highs(original,options.solve,persistent,&budget,&raw, + basis_options ? basis_options->basis.get() : nullptr,basis_report); + if (out.result.termination == Termination::Unsupported) + Detail::LpObservationAccess::unavailable(*observations,LpObservationReason::Unsupported,out.result.message); + else if (out.result.termination == Termination::InvalidModel) + Detail::LpObservationAccess::unavailable(*observations,LpObservationReason::InvalidModel,out.result.message); + else + Detail::LpObservationAccess::finish(*observations,out.result,raw,budget); + } + // Raw vector release is part of the same cooperative call budget. + Detail::LpObservationAccess::final_budget(out,observations,budget); + } +#endif + } + } catch (const ModelError& error) { + failure(Termination::InvalidModel,LpObservationReason::InvalidModel,error.what()); + } catch (const std::bad_alloc&) { + failure(Termination::MemoryLimit,LpObservationReason::AllocationFailure,"LP observation allocation failed"); + } catch (const std::exception& error) { + failure(Termination::BackendError,LpObservationReason::InvalidBackendData,error.what()); + } + out.result.elapsed_seconds=std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return out; +} + +LpObservedResult solve_lp_observed(const ModelSnapshot& model,const LpObservationOptions& options) { + return observed_solve([&] {return model;},model.model_id,model.revision,options); +} +LpObservedResult solve_lp_observed(const Model& model,const LpObservationOptions& options) { + return observed_solve([&] {return model.snapshot();},model.id(),model.revision(),options); +} + +template +static LpBasisSolveResult basis_solve(Snapshot&& snapshot,ModelId owner,Revision revision, + const LpBasisSolveOptions& options,SessionState* session=nullptr,bool live=true) { + LpBasisSolveResult out;out.requested_basis=options.basis; + out.observed=observed_solve(std::forward(snapshot),owner,revision, + options.observations,session,live,&options,&out.submission); + return out; +} +LpBasisSolveResult solve_lp_with_basis(const ModelSnapshot& model,const LpBasisSolveOptions& options) { + return basis_solve([&]{return model;},model.model_id,model.revision,options); +} +LpBasisSolveResult solve_lp_with_basis(const Model& model,const LpBasisSolveOptions& options) { + return basis_solve([&]{return model.snapshot();},model.id(),model.revision(),options); +} + +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options) { + if (options.backend == Backend::Native || (options.backend == Backend::Auto && + std::any_of(model.globals.begin(),model.globals.end(),[](const auto& record){return record.active;}))) + return solve_native_auto(model, options); + return solve_highs(model, options); +} + +SolveResult solve(const Model& model, const SolveOptions& options) { + if (options.backend == Backend::Native) return solve_native_auto(model, options); + const auto start = std::chrono::steady_clock::now(); + SolveResult result; + result.model_id = model.id(); + result.revision = model.revision(); + result.backend = "HiGHS"; + try { + auto snapshot = model.snapshot(); + auto adjusted = options; + const double copy_seconds = std::chrono::duration(std::chrono::steady_clock::now()-start).count(); + if (std::isfinite(adjusted.time_limit_seconds) && adjusted.time_limit_seconds >= 0) + adjusted.time_limit_seconds = std::max(0.0, adjusted.time_limit_seconds-copy_seconds); + result = solve(snapshot, adjusted); + } catch (const ModelError& error) { + result.termination = Termination::InvalidModel; + result.message = error.what(); + } catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; + result.message = "Snapshot/options allocation failed"; + } + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now()-start).count(); + return result; +} + +SolveSession::SolveSession() : impl_(std::make_unique()) {} +SolveSession::~SolveSession() = default; +SolveSession::SolveSession(SolveSession&&) noexcept = default; +SolveSession& SolveSession::operator=(SolveSession&&) noexcept = default; + +SessionStatistics SolveSession::statistics() const noexcept { + return impl_ ? impl_->statistics : SessionStatistics{}; +} + +void SolveSession::reset() { impl_ = std::make_unique(); } + +SolveResult SolveSession::solve(const ModelSnapshot& model, const SolveOptions& options) { + if (!impl_ || options.backend == Backend::Native) { + SolveResult result; + result.model_id = model.model_id; + result.revision = model.revision; + result.backend = "HiGHS"; + result.termination = impl_ ? Termination::Unsupported : Termination::InvalidModel; + result.message = impl_ ? "Persistent Native sessions are not implemented" : "Moved-from solve session"; + return result; + } + ++impl_->statistics.solve_calls; + return solve_highs(model, options, impl_.get()); +} + +SolveResult SolveSession::solve(const Model& model, const SolveOptions& options) { + const auto started = std::chrono::steady_clock::now(); + SolveResult result; + result.model_id = model.id(); + result.revision = model.revision(); + result.backend = "HiGHS"; + try { + auto snapshot = model.snapshot(); + auto adjusted = options; + const double elapsed = std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + if (std::isfinite(adjusted.time_limit_seconds) && adjusted.time_limit_seconds >= 0) + adjusted.time_limit_seconds = std::max(0.0, adjusted.time_limit_seconds-elapsed); + result = solve(snapshot, adjusted); + } catch (const ModelError& error) { + result.termination = Termination::InvalidModel; + result.message = error.what(); + } catch (const std::bad_alloc&) { + result.termination = Termination::MemoryLimit; + result.message = "Snapshot/options allocation failed"; + } + result.elapsed_seconds = std::chrono::duration(std::chrono::steady_clock::now()-started).count(); + return result; +} + +LpObservedResult SolveSession::solve_lp_observed(const ModelSnapshot& model, + const LpObservationOptions& options) { + return observed_solve([&] {return model;},model.model_id,model.revision,options, + impl_.get(),static_cast(impl_)); +} +LpObservedResult SolveSession::solve_lp_observed(const Model& model, + const LpObservationOptions& options) { + return observed_solve([&] {return model.snapshot();},model.id(),model.revision(),options, + impl_.get(),static_cast(impl_)); +} +LpBasisSolveResult SolveSession::solve_lp_with_basis(const ModelSnapshot& model, + const LpBasisSolveOptions& options) { + return basis_solve([&]{return model;},model.model_id,model.revision,options, + impl_.get(),static_cast(impl_)); +} +LpBasisSolveResult SolveSession::solve_lp_with_basis(const Model& model, + const LpBasisSolveOptions& options) { + return basis_solve([&]{return model.snapshot();},model.id(),model.revision(),options, + impl_.get(),static_cast(impl_)); +} + +}} diff --git a/gecode/optimize/solve.hpp b/gecode/optimize/solve.hpp new file mode 100644 index 0000000000..708b8208e3 --- /dev/null +++ b/gecode/optimize/solve.hpp @@ -0,0 +1,61 @@ +/* Numerical LP/MILP backend for the additive optimization API. */ +#ifndef GECODE_OPTIMIZE_SOLVE_HPP +#define GECODE_OPTIMIZE_SOLVE_HPP + +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { + +struct BackendCapabilities { + std::string name; + std::string version; + bool available = false; + bool linear_programming = false; + bool mixed_integer_linear = false; + bool exact_solving = false; + bool proof_certificates = false; + bool lazy_constraints = false; + bool quadratic_programming = false; + std::vector limitations; +}; + +/** Query one backend without inspecting a model. Auto reports HiGHS here; + * solve() separately routes models with active native globals to Native. + * Other explicit operations have their own capability queries and contracts. + */ +BackendCapabilities capabilities(Backend backend = Backend::Auto); + +/** + * Solve an owning original-model snapshot. HiGHS is explicitly a numerical + * backend, not the legacy certified Gecode binary-LP propagation engine. + * Auto selects Native for models with active native globals, HiGHS otherwise. + * HiGHS cannot meet Exact/Certified requests. + * Explicit Native selects the bounded exact-integer Gecode bridge with + * conservative structural algorithm selection; see solve_native_auto() in + * native.hpp. The explicit solve_native() entry point retains ordinary BAB. + * Returned incumbents pass the + * independent original-model numerical checker. Time/cancel limits are + * cooperative; elapsed_seconds includes compilation and checking. A late + * candidate is excluded unless captured by an internal HiGHS observation + * callback before the deadline. This does not expose a user callback API. + */ +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options = {}); +SolveResult solve(const Model& model, const SolveOptions& options = {}); + +/** + * Backend-independent, strict numerical LP/free-MPS I/O. Unsupported dialects, + * quadratic models, and exporting active original indicators/globals are rejected. + * Writes preserve double values and atomically replace only after a checked + * semantic round trip. See docs/solver-parity/IO.md for the supported syntax. + */ +Model read_model(const std::string& filename); +void write_model(const ModelSnapshot& model, const std::string& filename); +inline void write_model(const Model& model, const std::string& filename) { + write_model(model.snapshot(), filename); +} + +}} +#endif diff --git a/gecode/optimize/types.hpp b/gecode/optimize/types.hpp new file mode 100644 index 0000000000..9b62278ce9 --- /dev/null +++ b/gecode/optimize/types.hpp @@ -0,0 +1,36 @@ +/* Shared types for the additive optimization API. */ +#ifndef GECODE_OPTIMIZE_TYPES_HPP +#define GECODE_OPTIMIZE_TYPES_HPP + +#include +#include +#include + +namespace Gecode { namespace Optimize { + +using ModelId = std::uint64_t; +using Revision = std::uint64_t; +enum class VariableType { Continuous, Integer, Binary, SemiContinuous, SemiInteger }; +enum class ObjectiveSense { Minimize, Maximize }; +enum class Guarantee { Numerical, Exact, Certified }; +enum class Backend { Auto, Highs, Native }; + +struct Variable { + ModelId model_id = 0; + std::uint64_t id = 0; + bool operator==(const Variable& other) const noexcept { + return model_id == other.model_id && id == other.id; + } + bool operator!=(const Variable& other) const noexcept { return !(*this == other); } +}; +struct Constraint { + ModelId model_id = 0; + std::uint64_t id = 0; +}; +class ModelError : public std::invalid_argument { +public: + explicit ModelError(const std::string& message) : std::invalid_argument(message) {} +}; + +}} +#endif diff --git a/gecode/optimize/validate.cpp b/gecode/optimize/validate.cpp new file mode 100644 index 0000000000..ee83d74f36 --- /dev/null +++ b/gecode/optimize/validate.cpp @@ -0,0 +1,292 @@ +/* Independent original-model checks; no numerical backend is consulted. */ +#include +#include +#include + +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { + +using Wide = long double; + +std::string slot(const char* kind, std::size_t index) { + return std::string(kind) + " slot " + std::to_string(index); +} + +void check_range(double lower, double upper, const std::string& location) { + if (std::isnan(lower) || std::isnan(upper)) + throw ModelError(location + ": NaN bound"); + if (lower == std::numeric_limits::infinity() || + upper == -std::numeric_limits::infinity()) + throw ModelError(location + ": invalid infinity in bound"); + if (lower > upper) + throw ModelError(location + ": lower bound exceeds upper bound"); +} + +void check_type(const VariableData& variable, const std::string& location) { + switch (variable.type) { + case VariableType::Continuous: + case VariableType::Integer: + break; + case VariableType::Binary: + if (variable.lower < 0.0 || variable.upper > 1.0) + throw ModelError(location + ": binary bounds must lie in [0,1]"); + break; + case VariableType::SemiContinuous: + case VariableType::SemiInteger: + if (!std::isfinite(variable.lower) || variable.lower <= 0.0) + throw ModelError(location + ": semi-variable lower bound must be finite and positive"); + break; + default: + throw ModelError(location + ": unknown variable type"); + } +} + +void check_terms(const ModelSnapshot& model, const std::vector& terms, + const std::string& location, bool active) { + std::uint64_t previous = 0; + bool first = true; + for (const auto& term : terms) { + if (term.variable.model_id != model.model_id) + throw ModelError(location + ": variable belongs to another model"); + if (term.variable.id >= model.variables.size()) + throw ModelError(location + ": dangling variable reference"); + if (active && !model.variables[static_cast(term.variable.id)].active) + throw ModelError(location + ": deleted variable reference"); + if (!std::isfinite(term.coefficient)) + throw ModelError(location + ": non-finite coefficient"); + if (term.coefficient == 0.0) + throw ModelError(location + ": zero coefficient is not canonical"); + if (!first && term.variable.id <= previous) + throw ModelError(location + ": terms must have ascending unique variable IDs"); + previous = term.variable.id; + first = false; + } +} + +// Compensated summation also helps on platforms where long double has the +// same precision as double. Overflow still invalidates the numerical check. +class WideSum { + Wide sum_ = 0.0L; + Wide correction_ = 0.0L; +public: + bool add(Wide value) { + if (!std::isfinite(value)) + return false; + const Wide next = sum_ + value; + if (!std::isfinite(next)) + return false; + const Wide correction = std::fabs(sum_) >= std::fabs(value) + ? (sum_ - next) + value : (value - next) + sum_; + const Wide next_correction = correction_ + correction; + if (!std::isfinite(next_correction)) + return false; + sum_ = next; + correction_ = next_correction; + return true; + } + bool value(Wide& result) const { + result = sum_ + correction_; + return std::isfinite(result); + } +}; + +bool evaluate(const std::vector& terms, double offset, + const std::vector& values, Wide& result) { + WideSum sum; + if (!sum.add(static_cast(offset))) + return false; + for (const auto& term : terms) { + const Wide product = static_cast(term.coefficient) * + static_cast(values[static_cast(term.variable.id)]); + if (!sum.add(product)) + return false; + } + return sum.value(result); +} + +Wide range_violation(Wide value, double lower, double upper) { + Wide violation = 0.0L; + if (std::isfinite(lower)) + violation = std::max(violation, static_cast(lower) - value); + if (std::isfinite(upper)) + violation = std::max(violation, value - static_cast(upper)); + return violation; +} + +// Include each finite bound in the compensated sum. Collapsing a large row +// activity first can erase a small residual before subtracting its bound (for +// example 1 + 1e16 <= 1e16 on platforms with double-width long double). +bool linear_violation(const std::vector& terms, double lower, double upper, + const std::vector& values, Wide& violation) { + Wide activity = 0.0L; + if (!evaluate(terms, 0.0, values, activity)) + return false; + violation = 0.0L; + Wide residual = 0.0L; + if (std::isfinite(lower)) { + if (!evaluate(terms, -lower, values, residual)) + return false; + violation = std::max(violation, -residual); + } + if (std::isfinite(upper)) { + if (!evaluate(terms, -upper, values, residual)) + return false; + violation = std::max(violation, residual); + } + return true; +} + +void record_violation(Wide violation, double& maximum) { + const double reported = violation > static_cast(std::numeric_limits::max()) + ? std::numeric_limits::infinity() : static_cast(violation); + maximum = std::max(maximum, reported); +} + +void record_failure(ValidationReport& report, const std::string& message) { + if (report.message.empty()) + report.message = message; +} + +} // namespace + +void validate_structure(const ModelSnapshot& model) { + if (model.model_id == 0) + throw ModelError("model ID must be nonzero"); + for (std::size_t i = 0; i < model.variables.size(); ++i) { + const auto& variable = model.variables[i]; + const auto location = slot("variable", i); + if (variable.variable.model_id != model.model_id) + throw ModelError(location + ": owner does not match model"); + if (variable.variable.id != i) + throw ModelError(location + ": ID does not match stable slot"); + check_range(variable.lower, variable.upper, location); + check_type(variable, location); + } + for (std::size_t i = 0; i < model.rows.size(); ++i) { + const auto& row = model.rows[i]; + const auto location = slot("row", i); + if (row.constraint.model_id != model.model_id) + throw ModelError(location + ": owner does not match model"); + if (row.constraint.id != i) + throw ModelError(location + ": ID does not match stable slot"); + check_range(row.lower, row.upper, location); + // Inactive rows can legitimately retain terms referencing tombstones. + check_terms(model, row.terms, location, row.active); + } + if (!std::isfinite(model.objective.offset)) + throw ModelError("objective: non-finite offset"); + switch (model.objective.sense) { + case ObjectiveSense::Minimize: + case ObjectiveSense::Maximize: + break; + default: + throw ModelError("objective: unknown sense"); + } + check_terms(model, model.objective.terms, "objective", true); + Detail::validate_indicators(model); + Detail::validate_globals(model); +} + +ValidationReport validate(const ModelSnapshot& model, + const std::vector& slot_values, + double feasibility_tolerance, + double integrality_tolerance) { + ValidationReport report; + try { + validate_structure(model); + report.model_valid = true; + } catch (const ModelError& error) { + report.message = std::string("invalid model: ") + error.what(); + return report; + } + if (!std::isfinite(feasibility_tolerance) || feasibility_tolerance < 0.0 || + !std::isfinite(integrality_tolerance) || integrality_tolerance < 0.0) { + report.message = "validation tolerances must be finite and nonnegative"; + return report; + } + if (slot_values.size() != model.variables.size()) { + report.message = "assignment size does not match original variable slots"; + return report; + } + const Wide feasibility = static_cast(feasibility_tolerance); + const Wide integrality = static_cast(integrality_tolerance); + for (std::size_t i = 0; i < model.variables.size(); ++i) { + const auto& variable = model.variables[i]; + if (!variable.active) + continue; + if (!std::isfinite(slot_values[i])) { + report.message = slot("variable", i) + ": non-finite assignment"; + return report; + } + const Wide value = static_cast(slot_values[i]); + Wide bound_violation = range_violation(value, variable.lower, variable.upper); + if (variable.type == VariableType::SemiContinuous || + variable.type == VariableType::SemiInteger) + bound_violation = std::min(bound_violation, std::fabs(value)); + record_violation(bound_violation, report.max_bound_violation); + if (!std::isfinite(bound_violation) || bound_violation > feasibility) + record_failure(report, slot("variable", i) + ": bound violation"); + if (variable.type == VariableType::Integer || + variable.type == VariableType::Binary || + variable.type == VariableType::SemiInteger) { + const Wide violation = std::fabs(value - std::round(value)); + record_violation(violation, report.max_integrality_violation); + if (!std::isfinite(violation) || violation > integrality) + record_failure(report, slot("variable", i) + ": integrality violation"); + } + } + for (std::size_t i = 0; i < model.rows.size(); ++i) { + const auto& row = model.rows[i]; + if (!row.active) + continue; + Wide violation = 0.0L; + if (!linear_violation(row.terms, row.lower, row.upper, slot_values, violation)) { + report.message = slot("row", i) + ": non-finite accumulated activity"; + return report; + } + record_violation(violation, report.max_row_violation); + if (!std::isfinite(violation) || violation > feasibility) + record_failure(report, slot("row", i) + ": row violation"); + } + for (std::size_t i = 0; i < model.indicators.size(); ++i) { + const auto& indicator = model.indicators[i]; + if (!indicator.active || + std::round(slot_values[static_cast(indicator.activator.id)]) != + (indicator.active_value ? 1.0 : 0.0)) + continue; + Wide violation = 0.0L; + if (!linear_violation(indicator.terms, indicator.lower, indicator.upper, slot_values, violation)) { + report.message = slot("indicator", i) + ": non-finite original activity"; + return report; + } + record_violation(violation, report.max_indicator_violation); + if (!std::isfinite(violation) || violation > feasibility) + record_failure(report, slot("indicator", i) + ": original logical constraint violated"); + } + for (std::size_t i=0;i static_cast(std::numeric_limits::max())) { + report.message = "objective: non-finite or unrepresentable accumulated value"; + return report; + } + report.objective = static_cast(objective); + report.valid = report.message.empty(); + if (report.valid) + report.message = "original model satisfied within numerical tolerances"; + return report; +} + +}} diff --git a/gecode/optimize/validate.hpp b/gecode/optimize/validate.hpp new file mode 100644 index 0000000000..ee6dbe5975 --- /dev/null +++ b/gecode/optimize/validate.hpp @@ -0,0 +1,59 @@ +/* Independent validation of numerical linear optimization models. */ +#ifndef GECODE_OPTIMIZE_VALIDATE_HPP +#define GECODE_OPTIMIZE_VALIDATE_HPP + +#include + +#include +#include +#include + +namespace Gecode { namespace Optimize { + +struct ValidationReport { + bool valid = false; + // True iff the snapshot itself passed structural validation. This does + // not establish that its domains contain a feasible solution. + bool model_valid = false; + std::string message; + std::optional objective; + double max_bound_violation = 0.0; + double max_row_violation = 0.0; + double max_integrality_violation = 0.0; + double max_indicator_violation = 0.0; + std::size_t violated_globals = 0; +}; + +/** Check a complete original snapshot before a backend or workflow uses it. + * Throws ModelError for malformed IDs, domains, expressions or references. + * Expression terms must have ascending unique slot IDs and finite nonzero + * coefficients, matching the canonical form produced by Model. + * Semi-variable domains are {0} union [lower, upper], with finite lower > 0. + * A mathematically infeasible integer interval is not a structural error. + * Active original indicators require complete lowerings, safe M values, + * intact generated rows/gates and valid captured-domain dependencies. + * Typed global payloads and their referenced variable domains are checked too; + * backend-specific numerical/native admission remains a separate operation. + */ +void validate_structure(const ModelSnapshot& model); + +/** Independently evaluate original domains, rows, indicators, globals and cost. + * Values use original slot indexing: exactly one entry per variable slot; + * unreferenced deleted slots may contain NaN and are ignored. Tolerances must + * be finite and nonnegative, in absolute original-model units. + * Linear arithmetic uses compensated long double accumulation. This is + * numerical validation, not a proof of optimality or infeasibility. + * Original indicators are checked after rounding their binary activator; + * passing their big-M rows alone never establishes logical feasibility. + * Globals check tolerance-qualified integer values against original payloads. + * Malformed models, options and assignments return an invalid report rather + * than throwing ModelError. Allocation failures may still propagate. + */ +ValidationReport validate(const ModelSnapshot& model, + const std::vector& slot_values, + double feasibility_tolerance = 1e-7, + double integrality_tolerance = 1e-6); + +}} + +#endif diff --git a/gecode/optimize/workflow.cpp b/gecode/optimize/workflow.cpp new file mode 100644 index 0000000000..6287cf713b --- /dev/null +++ b/gecode/optimize/workflow.cpp @@ -0,0 +1,337 @@ +#include +#include + +#include +#include +#include +#include +#include + +namespace Gecode { namespace Optimize { +namespace { +class UnsupportedWorkflow : public std::runtime_error { +public: + using std::runtime_error::runtime_error; +}; + +struct ObjectiveValue { + long double linear; + long double total; +}; + +class ObjectiveSum { + long double sum_ = 0.0L; + long double correction_ = 0.0L; +public: + void add(long double value) { + const long double next = sum_ + value; + if (!std::isfinite(value) || !std::isfinite(next)) + throw UnsupportedWorkflow("Objective accumulation exceeds supported precision"); + const long double correction = std::fabs(sum_) >= std::fabs(value) + ? (sum_ - next) + value : (value - next) + sum_; + const long double corrected = correction_ + correction; + if (!std::isfinite(corrected)) + throw UnsupportedWorkflow("Objective accumulation exceeds supported precision"); + sum_ = next; + correction_ = corrected; + } + long double value() const { + const long double result = sum_ + correction_; + if (!std::isfinite(result)) + throw UnsupportedWorkflow("Objective accumulation exceeds supported precision"); + return result; + } +}; + +ObjectiveValue evaluate(const ObjectiveData& objective, + const std::vector& values) { + ObjectiveSum linear, total; + // Include the offset before collapsing the compensated terms. A large + // linear subtotal can otherwise lose a small residual before cancellation + // against the offset, even when the final objective is representable. + total.add(static_cast(objective.offset)); + for (const auto& term : objective.terms) { + const long double term_value = static_cast(term.coefficient) * + values[term.variable.id]; + linear.add(term_value); + total.add(term_value); + } + return {linear.value(), total.value()}; +} + +double finite_double(long double value, const char* what) { + if (!std::isfinite(value) || + std::fabs(value) > static_cast(std::numeric_limits::max())) + throw UnsupportedWorkflow(std::string(what) + " exceeds finite double range"); + return static_cast(value); +} + +// Round toward a tighter feasible region so conversion never grants additional +// degradation. Candidate validation detects an unrepresentable restrictive lock. +double row_bound(long double value, ObjectiveSense sense) { + double converted = finite_double(value, "Objective lock"); + if (sense == ObjectiveSense::Minimize && static_cast(converted) > value) + converted = std::nextafter(converted, -std::numeric_limits::infinity()); + if (sense == ObjectiveSense::Maximize && static_cast(converted) < value) + converted = std::nextafter(converted, std::numeric_limits::infinity()); + if (!std::isfinite(converted)) + throw UnsupportedWorkflow("Objective lock cannot be represented conservatively"); + return converted; +} + +struct Retention { + ObjectiveData objective; + long double bound; +}; + +bool retained(const std::vector& locks, + const std::vector& values, double tolerance) { + for (const auto& lock : locks) { + const long double actual = evaluate(lock.objective, values).total; + const long double violation = lock.objective.sense == ObjectiveSense::Minimize + ? actual - lock.bound : lock.bound - actual; + if (violation > static_cast(tolerance)) return false; + } + return true; +} + +bool bound_agrees(const SolveResult& result, double actual, + ObjectiveSense sense, double tolerance) { + if (!result.objective || !result.best_bound || !std::isfinite(*result.best_bound)) + return false; + const double scale = std::max({1.0, std::fabs(actual), + std::fabs(*result.objective), std::fabs(*result.best_bound)}); + const double allowance = std::max(tolerance, + 64.0 * std::numeric_limits::epsilon() * scale); + if (std::fabs(static_cast(actual) - *result.objective) > allowance) + return false; + // Recompute from independent activity and the actual bound. A backend's + // cached zero gap must not establish completion after its values change. + auto checked = result; + checked.objective = actual; + try { checked.update_gaps(sense); } + catch (const ModelError&) { return false; } + return checked.absolute_gap && std::isfinite(*checked.absolute_gap) && + *checked.absolute_gap <= allowance; +} + +void clear_late_solution(SolveResult& result, Termination reason) { + result.termination = reason; + result.message = "Stage returned after the shared workflow budget stopped"; + result.solution_validated = false; + result.values.clear(); + result.objective.reset(); + result.best_bound.reset(); + result.absolute_gap.reset(); + result.relative_gap.reset(); + result.native_backend_gap.reset(); +} + +LexicographicResult run(const ModelSnapshot& original, + const std::vector& objectives, + const SolveOptions& options, SolveBudget& budget) { + LexicographicResult output; + output.model_id = original.model_id; + output.revision = original.revision; + auto finish = [&]() { + output.elapsed_seconds = budget.elapsed_seconds(); + if (output.termination == Termination::Optimal && budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + output.message = "Shared workflow budget stopped before completion"; + } + return std::move(output); + }; + try { + validate_structure(original); + if (objectives.empty()) throw ModelError("At least one lexicographic objective is required"); + if (options.guarantee != Guarantee::Numerical) + throw UnsupportedWorkflow("Lexicographic workflow supports Numerical guarantees only"); + if (objectives.size() > 1 && options.node_limit) + throw UnsupportedWorkflow("Multi-stage node budgets need consumed-node reporting"); + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + return finish(); + } + ModelSnapshot working = original; + for (const auto& objective : objectives) { + if (!std::isfinite(objective.absolute_degradation) || objective.absolute_degradation < 0.0 || + !std::isfinite(objective.relative_degradation) || objective.relative_degradation < 0.0) + throw ModelError("Objective degradation must be nonnegative and finite"); + working.objective = objective.objective; + validate_structure(working); // reject later malformed objectives before solving + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + return finish(); + } + } + std::vector locks; + for (std::size_t i = 0; i < objectives.size(); ++i) { + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + return finish(); + } + working.objective = objectives[i].objective; + auto stage_options = options; + stage_options.cancellation = budget.cancellation(); + stage_options.time_limit_seconds = budget.remaining_seconds(); + stage_options.relative_gap = 0.0; + stage_options.absolute_gap = 0.0; + if (i != 0) stage_options.primal_start.clear(); + LexicographicStage stage; + stage.index = i; + stage.name = objectives[i].name; + stage.result = solve(working, stage_options); + if (budget.expired()) { + const auto reason = budget.stop_reason().value_or(Termination::Unknown); + clear_late_solution(stage.result, reason); + output.stages.push_back(std::move(stage)); + output.termination = reason; + output.message = "Shared workflow budget stopped during stage " + std::to_string(i); + return finish(); + } + output.stages.push_back(std::move(stage)); + auto& current = output.stages.back(); + auto& result = current.result; + std::optional stage_objective; + + // Even an incomplete stage can supply an independently checked incumbent. + // Never accept a candidate merely because a previous phase accepted it. + if (result.has_solution()) { + const auto original_check = validate(original, result.values, + options.feasibility_tolerance, options.integrality_tolerance); + const auto lock_check = validate(working, result.values, + options.feasibility_tolerance, options.integrality_tolerance); + if (!original_check.valid || !lock_check.valid || + !retained(locks, result.values, options.feasibility_tolerance)) { + output.termination = Termination::NumericalFailure; + output.message = "Independent original-model or objective-lock validation failed"; + return finish(); + } + std::vector vector_values; + vector_values.reserve(objectives.size()); + for (const auto& objective : objectives) + vector_values.push_back(finite_double(evaluate(objective.objective, result.values).total, + "Reported objective")); + stage_objective = vector_values[i]; + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + clear_late_solution(result, output.termination); + output.message = "Shared workflow budget stopped during candidate validation"; + return finish(); + } + output.final_solution = result; + output.final_solution.model_id = original.model_id; + output.final_solution.revision = original.revision; + output.final_solution.objective = original_check.objective; + output.final_solution.best_bound.reset(); + output.final_solution.absolute_gap.reset(); + output.final_solution.relative_gap.reset(); + output.final_solution.native_backend_gap.reset(); + output.final_solution.termination = Termination::Unknown; + output.final_solution.message = "Validated original-model feasible solution; see workflow stages"; + output.objective_values = std::move(vector_values); + } + + if (result.termination != Termination::Optimal) { + output.termination = result.termination; + output.message = "Lexicographic stage " + std::to_string(i) + " stopped: " + result.message; + if (result.termination == Termination::Infeasible && output.has_solution()) { + output.termination = Termination::NumericalFailure; + output.message = "Stage reported infeasible despite a validated retained solution"; + } + return finish(); + } + if (!result.has_solution() || result.guarantee != Guarantee::Numerical || + !stage_objective || !bound_agrees(result, *stage_objective, + working.objective.sense, options.feasibility_tolerance)) { + output.termination = Termination::NumericalFailure; + output.message = "Stage optimum lacks a validated solution and agreeing numerical global bound"; + return finish(); + } + + if (i + 1 < objectives.size()) { + const auto value = evaluate(working.objective, result.values); + const long double degradation = objectives[i].absolute_degradation + + static_cast(objectives[i].relative_degradation) * std::fabs(value.total); + if (!std::isfinite(degradation)) + throw UnsupportedWorkflow("Objective degradation exceeds supported precision"); + const long double change = working.objective.sense == ObjectiveSense::Minimize + ? degradation : -degradation; + const long double threshold = value.total + change; + // Direct linear evaluation avoids cancelling a large objective offset + // against a rounded reported objective value when forming the row. + const double bound = row_bound(value.linear + change, working.objective.sense); + current.retention_bound = finite_double(threshold, "Objective retention threshold"); + RowData row; + row.constraint = {working.model_id, static_cast(working.rows.size())}; + row.terms = working.objective.terms; + row.name = "__lexicographic_lock_" + std::to_string(i); + if (working.objective.sense == ObjectiveSense::Minimize) row.upper = bound; + else row.lower = bound; + working.rows.push_back(std::move(row)); + locks.push_back({working.objective, threshold}); + const auto retained_check = validate(working, result.values, + options.feasibility_tolerance, options.integrality_tolerance); + if (!retained_check.valid || !retained(locks, result.values, options.feasibility_tolerance)) + throw UnsupportedWorkflow("Objective retention lock loses its incumbent at available precision"); + } + if (budget.expired()) { + output.termination = budget.stop_reason().value_or(Termination::Unknown); + output.message = "Shared workflow budget stopped before stage promotion"; + return finish(); + } + current.completed = true; + ++output.completed_stages; + } + output.termination = Termination::Optimal; + output.message = "All ordered stages completed numerically with requested degradation and feasibility tolerances"; + } catch (const UnsupportedWorkflow& e) { + output.termination = Termination::Unsupported; + output.message = e.what(); + } catch (const ModelError& e) { + output.termination = Termination::InvalidModel; + output.message = e.what(); + } catch (const std::bad_alloc&) { + output.termination = Termination::MemoryLimit; + output.message = "Workflow allocation failed"; + } catch (const std::exception& e) { + output.termination = Termination::BackendError; + output.message = e.what(); + } + return finish(); +} + +LexicographicResult invalid_options(const ModelId id, const Revision revision, + const std::exception& error) { + LexicographicResult result; + result.model_id = id; + result.revision = revision; + result.termination = Termination::InvalidModel; + result.message = error.what(); + return result; +} +} // namespace + +LexicographicResult solve_lexicographic( + const ModelSnapshot& model, const std::vector& objectives, + const SolveOptions& options) { + try { + SolveBudget budget(options); + return run(model, objectives, options, budget); + } catch (const ModelError& e) { + return invalid_options(model.model_id, model.revision, e); + } +} + +LexicographicResult solve_lexicographic( + const Model& model, const std::vector& objectives, + const SolveOptions& options) { + try { + SolveBudget budget(options); // includes owning snapshot copy in the deadline + return run(model.snapshot(), objectives, options, budget); + } catch (const ModelError& e) { + return invalid_options(model.id(), model.revision(), e); + } +} + +}} diff --git a/gecode/optimize/workflow.hpp b/gecode/optimize/workflow.hpp new file mode 100644 index 0000000000..fbe5c86d30 --- /dev/null +++ b/gecode/optimize/workflow.hpp @@ -0,0 +1,74 @@ +/* Ordered linear objective workflows for the numerical optimization API. */ +#ifndef GECODE_OPTIMIZE_WORKFLOW_HPP +#define GECODE_OPTIMIZE_WORKFLOW_HPP + +#include + +namespace Gecode { namespace Optimize { + +/** The input vector establishes priority: first objective has highest priority. */ +struct LexicographicObjective { + ObjectiveData objective; + double absolute_degradation = 0.0; + double relative_degradation = 0.0; + std::string name; +}; + +struct LexicographicStage { + std::size_t index = 0; + std::string name; + SolveResult result; + bool completed = false; + // Threshold in this objective's original units, including its offset. + // A minimization stage supplies an upper threshold; maximization a lower. + std::optional retention_bound; +}; + +struct LexicographicResult { + ModelId model_id = 0; + Revision revision = 0; + Termination termination = Termination::Unknown; + Guarantee guarantee = Guarantee::Numerical; + std::string message; + std::vector stages; + std::size_t completed_stages = 0; + double elapsed_seconds = 0.0; + // Feasible historical solution of the ORIGINAL model. Its scalar objective + // evaluates the original model objective, which this workflow need not have + // optimized; its termination remains Unknown and it has no objective bound. + SolveResult final_solution; + // All requested objectives at final_solution, in the original input order. + std::vector objective_values; + + bool has_solution() const noexcept { return final_solution.has_solution(); } + bool completed_numerically() const noexcept { + return termination == Termination::Optimal && !stages.empty() && + completed_stages == stages.size(); + } +}; + +/** + * Optimize ordered linear objectives on private snapshot copies. Degradation + * after stage i is absolute_degradation + relative_degradation * abs(value_i). + * Both native MIP gap targets are forced to zero. Completion is numerical and + * tolerance-qualified, never an exact certificate of lexicographic optimality. + * All candidates are independently checked against original constraints, + * accumulated lock rows and original objective retention thresholds. + * + * A shared outer clock/token covers copying, validation and every solve. + * Time/cancellation remains cooperative; a stage returned after the outer + * deadline is not promoted. Node-limited multi-stage requests are Unsupported. + * Terms must use the canonical ascending unique slots of ModelSnapshot. + */ +LexicographicResult solve_lexicographic( + const ModelSnapshot& model, + const std::vector& objectives, + const SolveOptions& options = {}); + +LexicographicResult solve_lexicographic( + const Model& model, + const std::vector& objectives, + const SolveOptions& options = {}); + +}} +#endif diff --git a/python/gecode_optimize/__init__.py b/python/gecode_optimize/__init__.py new file mode 100644 index 0000000000..9f37e7cfde --- /dev/null +++ b/python/gecode_optimize/__init__.py @@ -0,0 +1,66 @@ +"""Minimal owning ctypes binding for Gecode's version 1 optimization ABI. + +Set GECODE_OPTIMIZE_LIBRARY to the shared C ABI library, or pass Library(path). +No native dependency is downloaded, installed, or loaded until explicitly used. +""" +from .binding import (ApiError, Backend, Cancellation, Guarantee, GlobalConstraint, Indicator, Library, Model, + Options, Result, Row, Session, Termination, Variable, + VariableType, load_library) +from .binding import (PoolAttempt, PoolCompletion, PoolEntry, PoolOptions, PoolResult, + RelaxationSelection, RelaxationSide, RepairItem, RepairOptions, + RepairResult, RepairStage, RepairVariable, Validation) + +__all__ = ["ApiError", "Backend", "Cancellation", "Guarantee", "GlobalConstraint", "Indicator", "Library", "Model", + "Options", "Result", "Row", "Session", "Termination", "Variable", + "VariableType", "load_library"] +__all__ += ["PoolAttempt", "PoolCompletion", "PoolEntry", "PoolOptions", "PoolResult", + "RelaxationSelection", "RelaxationSide", "RepairItem", "RepairOptions", + "RepairResult", "RepairStage", "RepairVariable", "Validation"] + +from .binding import VariableSpec, RowSpec, SparseRowBatch +__all__ += ["VariableSpec", "RowSpec", "SparseRowBatch"] + +from .binding import QuadraticModel, QuadraticOptions, QuadraticResult, QuadraticChecks, WeightedSquare +__all__ += ["QuadraticModel", "QuadraticOptions", "QuadraticResult", "QuadraticChecks", "WeightedSquare"] + +from .binding import (LpObservationOptions, LpObservationState, LpObservationReason, + LpBasisStatus, LpDualSource, LpObservationCapabilities, + LpObservationGroup, LpObservationMetadata, LpKktReport, + LpRowObservation, LpColumnObservation, LpObservations, LpObservedResult) +__all__ += ["LpObservationOptions", "LpObservationState", "LpObservationReason", + "LpBasisStatus", "LpDualSource", "LpObservationCapabilities", + "LpObservationGroup", "LpObservationMetadata", "LpKktReport", + "LpRowObservation", "LpColumnObservation", "LpObservations", "LpObservedResult"] + +from .binding import LpBasis, LpBasisInfo, LpBasisOrigin, LpBasisSubmissionState, LpBasisSubmission, LpBasisSolveResult +__all__ += ["LpBasis", "LpBasisInfo", "LpBasisOrigin", "LpBasisSubmissionState", "LpBasisSubmission", "LpBasisSolveResult"] + +from .binding import RegularTransition +__all__ += ["RegularTransition"] + +from .binding import (ScenarioReuse, ScenarioRunState, ScenarioBatchCompletion, ScenarioId, + ScenarioVariableBounds, ScenarioRowBounds, ScenarioDefinition, ScenarioOptions, + ScenarioStatistics, ScenarioBatchInfo, ScenarioResultInfo, ScenarioCheck, + ScenarioOutcome, ScenarioBatchResult) +__all__ += ["ScenarioReuse", "ScenarioRunState", "ScenarioBatchCompletion", "ScenarioId", + "ScenarioVariableBounds", "ScenarioRowBounds", "ScenarioDefinition", "ScenarioOptions", + "ScenarioStatistics", "ScenarioBatchInfo", "ScenarioResultInfo", "ScenarioCheck", + "ScenarioOutcome", "ScenarioBatchResult"] + +from .binding import (LpEvidenceRequest, LpEvidenceState, LpEvidenceReason, LpEvidenceCompletion, + LpEvidencePhase, LpEvidenceSide, LpEvidenceColumnKind, LpEvidenceOptions, + LpEvidenceInfo, LpEvidenceGroup, LpEvidenceMetadata, LpPrimalEvidence, + LpFarkasEvidence, LpEvidenceSlot, LpEvidenceDiagnostics, LpEvidenceRawResult, + LpEvidenceStageInfo, LpEvidenceColumn, LpEvidenceRawValue, LpEvidenceResult, LpEvidenceStage) +__all__ += ["LpEvidenceRequest", "LpEvidenceState", "LpEvidenceReason", "LpEvidenceCompletion", + "LpEvidencePhase", "LpEvidenceSide", "LpEvidenceColumnKind", "LpEvidenceOptions", + "LpEvidenceInfo", "LpEvidenceGroup", "LpEvidenceMetadata", "LpPrimalEvidence", + "LpFarkasEvidence", "LpEvidenceSlot", "LpEvidenceDiagnostics", "LpEvidenceRawResult", + "LpEvidenceStageInfo", "LpEvidenceColumn", "LpEvidenceRawValue", "LpEvidenceResult", "LpEvidenceStage"] + +from .binding import (LpSensitivityState, LpSensitivityReason, LpSensitivityCompletion, LpRangeEndKind, + LpSensitivitySide, LpObjectiveParameter, LpEqualityRhsParameter, LpSensitivityTolerances, + LpSensitivityLimits, LpSensitivityOptions, LpSensitivityInfo, LpSensitivityWork, + LpSensitivityGroup, LpRangeEnd, LpSensitivityLimiter, LpIntervalCheckReport, + LpParameterInterval, LpSensitivityEntry, LpSensitivityReferenceChecks, LpSensitivityResult) +__all__ += ['LpSensitivityState', 'LpSensitivityReason', 'LpSensitivityCompletion', 'LpRangeEndKind', 'LpSensitivitySide', 'LpObjectiveParameter', 'LpEqualityRhsParameter', 'LpSensitivityTolerances', 'LpSensitivityLimits', 'LpSensitivityOptions', 'LpSensitivityInfo', 'LpSensitivityWork', 'LpSensitivityGroup', 'LpRangeEnd', 'LpSensitivityLimiter', 'LpIntervalCheckReport', 'LpParameterInterval', 'LpSensitivityEntry', 'LpSensitivityReferenceChecks', 'LpSensitivityResult'] diff --git a/python/gecode_optimize/_runtime.py b/python/gecode_optimize/_runtime.py new file mode 100644 index 0000000000..7abb777862 --- /dev/null +++ b/python/gecode_optimize/_runtime.py @@ -0,0 +1,20 @@ +"""Locate an optional bundled binary without searching the working directory.""" +from pathlib import Path +import sys + + +def bundled_library_path(): + directory = Path(__file__).resolve().parent / "_native" + if not directory.exists(): + return None + names = {"darwin": "libgecodeoptimize_c.dylib", "win32": "gecodeoptimize_c.dll", + "linux": "libgecodeoptimize_c.so"} + if sys.platform not in names: + raise RuntimeError("the installed native bundle does not support this platform") + candidate = directory / names[sys.platform] + if not directory.is_dir() or not candidate.is_file(): + raise RuntimeError("the installed gecode_optimize native bundle is incomplete") + resolved = candidate.resolve() + if resolved.parent != directory.resolve(): + raise RuntimeError("bundled solver library resolves outside its native directory") + return str(resolved) diff --git a/python/gecode_optimize/binding.py b/python/gecode_optimize/binding.py new file mode 100644 index 0000000000..fe6f1ddc1a --- /dev/null +++ b/python/gecode_optimize/binding.py @@ -0,0 +1,2298 @@ +"""Owning Python wrappers for the versioned C ABI; close handles explicitly.""" + +import ctypes as C +from ctypes.util import find_library +from ._runtime import bundled_library_path +from dataclasses import dataclass, field +from enum import IntEnum +import math +import os +import threading +import time + + +class VariableType(IntEnum): + CONTINUOUS=0; INTEGER=1; BINARY=2; SEMI_CONTINUOUS=3; SEMI_INTEGER=4 +class Backend(IntEnum): + AUTO=0; HIGHS=1; NATIVE=2 +class Guarantee(IntEnum): + NUMERICAL=0; EXACT=1; CERTIFIED=2 +class Termination(IntEnum): + UNKNOWN=0; OPTIMAL=1; INFEASIBLE=2; UNBOUNDED=3; INFEASIBLE_OR_UNBOUNDED=4 + TIME_LIMIT=5; NODE_LIMIT=6; MEMORY_LIMIT=7; ITERATION_LIMIT=8; SOLUTION_LIMIT=9 + OBJECTIVE_LIMIT=10; CANCELLED=11; NUMERICAL_FAILURE=12; UNSUPPORTED=13 + INVALID_MODEL=14; BACKEND_ERROR=15 +class PoolCompletion(IntEnum): + INCOMPLETE=0; REQUESTED_LIMIT=1; EXHAUSTED=2 +class RelaxationSide(IntEnum): + LOWER=0; UPPER=1 + + +class ApiError(RuntimeError): + """C ABI misuse/model-building error; distinct from solver Termination.""" + def __init__(self, code, message): + self.code = code + super().__init__(message) + + +U64=C.c_uint64; I64=C.c_int64; I32=C.c_int32; U32=C.c_uint32; F64=C.c_double; U8=C.c_uint8 +class _Id(C.Structure): + _fields_=[("model_id", U64), ("slot", U64), ("kind", U32), ("reserved", U32)] +class _RegularTransition(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("from_state",U64),("symbol",I64),("to_state",U64)] +class _Term(C.Structure): + _fields_=[("variable", _Id), ("coefficient", F64)] +class _Start(C.Structure): + _fields_=[("variable", _Id), ("value", F64)] +class _VariableSpec(C.Structure): + _fields_=[("struct_size",U64),("type",I32),("reserved",I32), + ("lower",F64),("upper",F64),("name",C.c_char_p)] +class _RowSpec(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("terms",C.POINTER(_Term)), + ("term_count",U64),("lower",F64),("upper",F64),("name",C.c_char_p)] +class _SparseRowBatch(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64), + ("columns",C.POINTER(_Id)),("columns_count",U64), + ("row_start",C.POINTER(U64)),("row_start_count",U64), + ("column",C.POINTER(U64)),("column_count",U64), + ("coefficient",C.POINTER(F64)),("coefficient_count",U64), + ("lower",C.POINTER(F64)),("lower_count",U64), + ("upper",C.POINTER(F64)),("upper_count",U64), + ("names",C.POINTER(C.c_char_p)),("names_count",U64)] +class _Options(C.Structure): + _fields_=[("struct_size", U64), ("backend", I32), ("guarantee", I32), ("threads", I32), ("random_seed", I32), + ("time_limit_seconds", F64), ("relative_gap", F64), ("absolute_gap", F64), + ("feasibility_tolerance", F64), ("integrality_tolerance", F64), ("node_limit", U64), + ("has_node_limit", I32), ("reserved", I32), ("cancellation", U64), + ("primal_start", C.POINTER(_Start)), ("primal_start_count", U64)] +class _Info(C.Structure): + _fields_=[("model_id", U64), ("revision", U64), ("variable_slots", U64), ("termination", I32), + ("guarantee", I32), ("has_solution", I32), ("solution_validated", I32), ("start_submitted", I32), + ("reserved", I32), ("elapsed_seconds", F64)] +class _Statistics(C.Structure): + _fields_=[(name, U64) for name in ("solve_calls", "model_loads", "incremental_updates", "unchanged_models", "basis_warm_starts", "incumbent_starts")] +class _OptionalNumber(C.Structure): + _fields_=[("present", I32), ("reserved", I32), ("value", F64)] +class _LpOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("solve",_Options),("duals",I32),("basis",I32)]+[ + (name,F64) for name in ("dual_feasibility","stationarity","complementarity","objective_gap")] +class _LpCapabilities(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,I32) for name in + ("available","duals","basis_export","reserved_flags")]+[("limitation_count",U64)] +class _LpInfo(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("result",_Info),("has_observations",I32),("reserved_flags",I32)]+[ + (name,U64) for name in ("model_id","revision","row_slots","column_slots")] +class _BasisInfo(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","model_id","revision","row_slots","column_slots")]+[ + ("origin",I32),("reserved_flags",I32)] +class _BasisResultInfo(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("result",_Info), + ("requested_model_id",U64),("requested_revision",U64)]+[(name,I32) for name in + ("has_requested_basis","state","backend_attempted","has_statuses_changed","statuses_changed","reserved_flags")] +class _LpMetadata(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,F64) for name in + ("dual_feasibility","stationarity","complementarity","objective_gap","primal_check_tolerance")]+[ + (name,_OptionalNumber) for name in ("backend_primal_tolerance","backend_dual_tolerance")] +class _LpGroup(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("state",I32),("reason",I32)] +class _LpRow(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,I32) for name in + ("active","dual_source","has_basis","basis")]+[(name,_OptionalNumber) for name in + ("activity","lower_slack","upper_slack","dual")] +class _LpColumn(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,I32) for name in + ("active","has_basis","basis","reserved_flags")]+[("reduced_cost",_OptionalNumber)] +class _LpChecks(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,I32) for name in + ("primal_valid","dual_signs_valid","stationarity_valid","complementarity_valid","gap_valid","accepted")]+[ + (name,_OptionalNumber) for name in ("max_dual_sign_violation","max_stationarity","max_complementarity", + "dual_objective_estimate","normalized_gap")] +class _WeightedSquare(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("terms",C.POINTER(_Term)), + ("term_count",U64),("offset",F64),("weight",F64),("name",C.c_char_p)] +class _QuadraticOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("solve",_Options)]+[ + (name,U64) for name in ("iteration_limit","max_auxiliary_variables","max_lifted_nonzeros")]+[ + (name,F64) for name in ("stationarity_tolerance","complementarity_tolerance","optimality_tolerance")] +class _QuadraticInfo(C.Structure): + _fields_=[("result",_Info),("qp_iterations",U64),("regularization",F64)] +class _QuadraticChecks(C.Structure): + _fields_=[(name,I32) for name in ("primal_valid","objective_valid","kkt_available","kkt_valid","bound_valid","reserved")]+[ + (name,_OptionalNumber) for name in ("max_stationarity","max_complementarity","original_objective", + "normalized_lower_bound","gap_upper_bound")]+[ + ("square_count",U64),("gradient_slots",U64)] +class _PoolOptions(C.Structure): + _fields_=[("struct_size", U64), ("solve", _Options), ("max_solutions", U64), + ("has_projection", I32), ("reserved", I32), ("projection", C.POINTER(_Id)), ("projection_count", U64)] +class _PoolInfo(C.Structure): + _fields_=[(name,U64) for name in ("model_id","revision","projection_count","entry_count","attempt_count","ranked_prefix")]+[ + (name,I32) for name in ("termination","completion","guarantee","reserved")]+[("elapsed_seconds",F64)] +class _PoolEntryInfo(C.Structure): + _fields_=[("projection_count",U64),("rank_established",I32),("reserved",I32)] +class _PoolAttemptInfo(C.Structure): + _fields_=[(name,I32) for name in ("termination","guarantee","candidate_accepted","rank_established")]+[ + ("objective",_OptionalNumber),("remaining_bound",_OptionalNumber)] +class _Selection(C.Structure): + _fields_=[("source",_Id),("side",I32),("reserved",I32),("penalty",F64)] +class _RepairOptions(C.Structure): + _fields_=[("struct_size",U64),("solve",_Options),("selections",C.POINTER(_Selection)), + ("selection_count",U64),("optimize_original_objective",I32),("reserved",I32)] +class _RepairInfo(C.Structure): + _fields_=[(name,U64) for name in ("source_model_id","source_revision","private_model_id","private_revision", + "variable_slots","item_count","stage_count","completed_stages")]+[(name,I32) for name in ( + "termination","guarantee","has_private_model","has_repair","minimum_violation_established", + "original_objective_optimized","workflow_termination","workflow_guarantee")]+[ + ("elapsed_seconds",F64),("workflow_elapsed_seconds",F64)] +class _RepairItemInfo(C.Structure): + _fields_=[("source",_Id),("slack",_Id),("penalty_row",_Id),("side",I32),("reserved",I32), + ("original_bound",F64),("penalty",F64)]+[(name,_OptionalNumber) for name in ( + "activity","violation","weighted_violation","slack_value")] +class _RepairStageInfo(C.Structure): + _fields_=[("index",U64),("completed",I32),("reserved",I32),("retention_bound",_OptionalNumber)] +class _ValidationInfo(C.Structure): + _fields_=[("valid",I32),("model_valid",I32),("violated_globals",U64)]+[(name,F64) for name in ( + "max_bound_violation","max_row_violation","max_integrality_violation","max_indicator_violation")]+[("objective",_OptionalNumber)] + + +class _ScenarioId(C.Structure): + _fields_=[("batch_id",U64),("index",U64)] +class _ScenarioBounds(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("entity",_Id),("has_lower",I32),("has_upper",I32),("lower",F64),("upper",F64)] +class _ScenarioDefinition(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("name",C.c_char_p), + ("objective_coefficients",C.POINTER(_Term)),("objective_count",U64),("objective_offset",_OptionalNumber), + ("variable_bounds",C.POINTER(_ScenarioBounds)),("variable_count",U64), + ("row_bounds",C.POINTER(_ScenarioBounds)),("row_count",U64)] +class _ScenarioOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("solve",_Options),("reuse",I32),("reserved_flags",I32)]+[ + (name,U64) for name in ("max_scenarios","max_patch_entries","max_saved_value_slots","max_work")] +class _ScenarioInfo(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","model_id","revision","batch_id","scenario_count","outcome_count")]+[ + (name,I32) for name in ("has_batch","completion","has_stop_reason","stop_reason","has_offending_scenario","all_resolved")]+[ + (name,U64) for name in ("offending_scenario","attempted","resolved","work")]+[("elapsed_seconds",F64),("reuse_statistics",_Statistics)] +class _ScenarioOutcome(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("scenario",_ScenarioId)]+[ + (name,I32) for name in ("state","has_result","has_check","reserved_flags")]+[ + ("result",_Info),("reuse_delta",_Statistics),("elapsed_seconds",F64)] +class _ScenarioCheck(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,I32) for name in + ("has_check","identity_valid","candidate_examined","objective_matches","exact_witness_validated","reserved_flags")]+[("validation",_ValidationInfo)] +class _ScenarioDefinitionInfo(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","objective_count","variable_count","row_count")]+[("objective_offset",_OptionalNumber)] + + +class _EvidenceOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("solve",_Options),("request",I32),("reserved_flags",I32)]+[ + (name,F64) for name in ("recession","stationarity","minimum_improvement","minimum_contradiction")]+[ + (name,U64) for name in ("max_auxiliary_variables","max_auxiliary_rows","max_auxiliary_nonzeros","max_retained_slots","max_work","max_auxiliary_solves")] +class _EvidenceInfo(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","model_id","revision")]+[ + (name,I32) for name in ("has_evidence","completion","has_stop_reason","stop_reason")]+[ + (name,U64) for name in ("row_slots","column_slots","stage_count","attempted_calls","work")]+[("elapsed_seconds",F64)] +class _EvidenceGroup(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("state",I32),("reason",I32)] +class _EvidenceMetadata(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,F64) for name in + ("recession","stationarity","minimum_improvement","minimum_contradiction","primal_tolerance")] +class _EvidencePrimal(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("has_base_check",I32),("reserved_flags",I32),("base_check",_ValidationInfo)]+[ + (name,_OptionalNumber) for name in ("direction_scale","normalized_objective_slope","max_variable_recession_violation","max_row_recession_violation")] +class _EvidenceFarkas(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,_OptionalNumber) for name in + ("multiplier_scale","contradiction_margin","max_stationarity")] +class _EvidenceSlot(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("source",_Id)]+[(name,I32) for name in + ("active","has_side","side","reserved_flags")]+[(name,_OptionalNumber) for name in + ("base_value","direction","multiplier","contribution","selected_bound")] +class _EvidenceRawResult(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","model_id","revision","value_count","mask_count")]+[ + (name,I32) for name in ("termination_code","guarantee_code","reported_solution_validated","reported_start_submitted")]+[ + ("elapsed_seconds",F64)]+[(name,_OptionalNumber) for name in ("objective","best_bound","absolute_gap","relative_gap","native_gap")] +class _EvidenceStage(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","index","private_model_id","private_revision","row_count","column_count","nonzeros")]+[ + (name,I32) for name in ("phase","attempted","has_raw_result","candidate_examined")]+[("check",_ValidationInfo),("raw_result",_EvidenceRawResult)] +class _EvidenceColumn(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("private_variable",_Id),("source",_Id)]+[ + (name,I32) for name in ("kind","has_side","side","reserved_flags")] +class _EvidenceRawValue(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("slot",U64),("reported_value",_OptionalNumber),("has_reported_mask",I32),("reported_mask",I32)] + + + +class _SensitivityRequest(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("kind",I32),("reserved_flags",I32),("entity",_Id)] +class _SensitivityChecksOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64)]+[(name,F64) for name in + ("primal_feasibility","dual_feasibility","stationarity","complementarity","objective_gap","system_absolute","system_relative")] +class _SensitivityLimits(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","max_rows","max_columns","max_nonzeros","max_requests", + "max_basis_solves","max_factor_entries","max_retained_slots","max_work")] +class _SensitivityOptions(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("backend",I32),("reserved_flags",I32), + ("time_limit_seconds",F64),("cancellation",U64),("checks",_SensitivityChecksOptions),("limits",_SensitivityLimits), + ("requests",C.POINTER(_SensitivityRequest)),("request_count",U64)] +class _SensitivityInfo(C.Structure): + _fields_=[(name,U64) for name in ("struct_size","reserved","model_id","revision")]+[(name,I32) for name in + ("completion","reason","has_stop_reason","stop_reason","has_sensitivity","has_basis","guarantee","reserved_flags")]+[ + (name,U64) for name in ("entry_count","factor_order_count","row_slots","column_slots")]+[("elapsed_seconds",F64)] +class _SensitivityWork(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("factor_setup_attempted",I32),("reserved_flags",I32)]+[ + (name,U64) for name in ("basis_solves","coordinator_visits","retained_slots","preparation_visits")] +class _SensitivityGroup(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("state",I32),("reason",I32)] +class _SensitivityEnd(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("kind",I32),("reserved_flags",I32),("value",_OptionalNumber)] +class _SensitivityLimiter(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("entity",_Id),("side",I32),("dual_condition",I32)] +class _SensitivityIntervalChecks(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("inequalities",U64)]+[(name,I32) for name in + ("accepted","lower_direction_checked","upper_direction_checked","reserved_flags")]+[("max_endpoint_violation",_OptionalNumber)] +class _SensitivityEntry(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("request",_SensitivityRequest),("group",_SensitivityGroup),("index",U64)]+[ + (name,I32) for name in ("requested","has_interval","has_lower_limiter","has_upper_limiter")]+[ + ("anchor",F64),("lower",_SensitivityEnd),("upper",_SensitivityEnd),("objective_slope",_OptionalNumber), + ("lower_limiter",_SensitivityLimiter),("upper_limiter",_SensitivityLimiter),("checks",_SensitivityIntervalChecks)] +class _SensitivityReferenceChecks(C.Structure): + _fields_=[("struct_size",U64),("reserved",U64),("primal",_ValidationInfo),("kkt",_LpChecks), + ("basis_point_matches",I32),("reserved_flags",I32)]+[(name,_OptionalNumber) for name in + ("max_point_difference","max_system_residual","max_scaled_system_residual")] + + +def _integer(value, bits, signed=False): + if isinstance(value, bool) or not isinstance(value, int): + raise TypeError("integer argument must be an int, not a float/bool") + low=-(1 << (bits-1)) if signed else 0 + high=(1 << (bits-1))-1 if signed else (1 << bits)-1 + if not low <= value <= high: + raise OverflowError("integer does not fit the C ABI field") + return value + + +def _text(value): + if not isinstance(value, str): + raise TypeError("expected str") + if "\0" in value: + raise ValueError("embedded NUL would truncate the C string") + return value.encode("utf-8") + + +class Library: + """One explicitly loaded ABI instance. Keep handles within this instance.""" + def __init__(self, path): + self.path=os.fspath(path) + self._dll=C.CDLL(self.path) + self._dll.gecode_opt_v1_abi_version.argtypes=[] + self._dll.gecode_opt_v1_abi_version.restype=U32 + if self._dll.gecode_opt_v1_abi_version() != 1: + raise RuntimeError("unsupported Gecode optimization C ABI version") + self._dll.gecode_opt_v1_last_error.argtypes=[] + self._dll.gecode_opt_v1_last_error.restype=C.c_char_p + ptr=C.POINTER + signatures={ + "sensitivity_options_default": [ptr(_SensitivityOptions),U64], + "analyze_lp_sensitivity": [U64,ptr(_SensitivityOptions),ptr(U64)], + "sensitivity_info": [U64,ptr(_SensitivityInfo),U64], + "sensitivity_work": [U64,ptr(_SensitivityWork),U64], + "sensitivity_checks_options": [U64,ptr(_SensitivityChecksOptions),U64], + "sensitivity_reference_checks": [U64,ptr(_SensitivityReferenceChecks),U64], + "sensitivity_copy_source_observed": [U64,ptr(U64)], + "sensitivity_copy_basis": [U64,ptr(U64)], + "sensitivity_entry": [U64,U64,ptr(_SensitivityEntry),U64], + "sensitivity_entries": [U64,ptr(_SensitivityEntry),U64,U64,ptr(U64)], + "sensitivity_objective": [U64,_Id,ptr(_SensitivityEntry),U64], + "sensitivity_equality_rhs": [U64,_Id,ptr(_SensitivityEntry),U64], + "sensitivity_factor_order": [U64,ptr(_Id),U64,ptr(U64)], + "sensitivity_active_slots": [U64,I32,ptr(U8),U64,ptr(U64)], + "sensitivity_text": [U64,I32,U64,ptr(C.c_char),U64,ptr(U64)], + "evidence_options_default": [ptr(_EvidenceOptions),U64], + "analyze_lp_evidence": [U64,ptr(_EvidenceOptions),ptr(U64)], + "lp_evidence_info": [U64,ptr(_EvidenceInfo),U64], + "lp_evidence_group": [U64,I32,ptr(_EvidenceGroup),U64], + "lp_evidence_metadata": [U64,ptr(_EvidenceMetadata),U64], + "lp_evidence_primal": [U64,ptr(_EvidencePrimal),U64], + "lp_evidence_farkas": [U64,ptr(_EvidenceFarkas),U64], + "lp_evidence_slot": [U64,_Id,ptr(_EvidenceSlot),U64], + "lp_evidence_slots": [U64,I32,ptr(_EvidenceSlot),U64,U64,ptr(U64)], + "lp_evidence_value": [U64,_Id,I32,ptr(F64)], + "lp_evidence_multiplier": [U64,_Id,ptr(_EvidenceSlot),U64], + "lp_evidence_text": [U64,I32,ptr(C.c_char),U64,ptr(U64)], + "lp_evidence_copy_stage": [U64,U64,ptr(U64)], + "lp_evidence_stage_info": [U64,ptr(_EvidenceStage),U64], + "lp_evidence_stage_columns": [U64,ptr(_EvidenceColumn),U64,U64,ptr(U64)], + "lp_evidence_stage_raw_values": [U64,ptr(_EvidenceRawValue),U64,U64,ptr(U64)], + "lp_evidence_stage_text": [U64,I32,ptr(C.c_char),U64,ptr(U64)], + "scenario_options_default": [ptr(_ScenarioOptions),U64], + "solve_scenarios": [U64,ptr(_ScenarioDefinition),U64,U64,ptr(_ScenarioOptions),ptr(U64)], + "scenario_batch_info": [U64,ptr(_ScenarioInfo),U64], + "scenario_batch_id": [U64,U64,ptr(_ScenarioId)], + "scenario_batch_outcome": [U64,_ScenarioId,ptr(_ScenarioOutcome),U64], + "scenario_batch_check": [U64,_ScenarioId,ptr(_ScenarioCheck),U64], + "scenario_batch_copy_result": [U64,_ScenarioId,ptr(U64)], + "scenario_batch_map": [U64,_Id,ptr(_Id)], + "scenario_batch_value": [U64,_ScenarioId,_Id,ptr(F64)], + "scenario_batch_message": [U64,ptr(C.c_char),U64,ptr(U64)], + "scenario_batch_text": [U64,_ScenarioId,I32,ptr(C.c_char),U64,ptr(U64)], + "scenario_batch_definition": [U64,_ScenarioId,ptr(_ScenarioDefinitionInfo),U64], + "scenario_batch_objective": [U64,_ScenarioId,ptr(_Term),U64,ptr(U64)], + "scenario_batch_bounds": [U64,_ScenarioId,I32,ptr(_ScenarioBounds),U64,U64,ptr(U64)], + "basis_from_observed": [U64,ptr(U64)], + "basis_from_model": [U64,ptr(I32),U64,ptr(I32),U64,ptr(U64)], + "basis_info": [U64,ptr(_BasisInfo),U64], + "basis_statuses": [U64,I32,ptr(I32),U64,ptr(U64)], + "basis_row": [U64,_Id,ptr(I32)], "basis_column": [U64,_Id,ptr(I32)], + "solve_lp_with_basis": [U64,U64,ptr(_LpOptions),ptr(U64)], + "session_solve_lp_with_basis": [U64,U64,U64,ptr(_LpOptions),ptr(U64)], + "basis_result_info": [U64,ptr(_BasisResultInfo),U64], + "basis_result_message": [U64,ptr(C.c_char),U64,ptr(U64)], + "basis_result_copy_observed": [U64,ptr(U64)], "basis_result_copy_basis": [U64,ptr(U64)], + "lp_capabilities": [ptr(_LpCapabilities),U64], + "lp_capability_text": [I32,U64,ptr(C.c_char),U64,ptr(U64)], + "lp_options_default": [ptr(_LpOptions),U64], + "solve_lp_observed": [U64,ptr(_LpOptions),ptr(U64)], + "session_solve_lp_observed": [U64,U64,ptr(_LpOptions),ptr(U64)], + "lp_observed_result_copy_result": [U64,ptr(U64)], + "lp_observed_result_info": [U64,ptr(_LpInfo),U64], + "lp_observed_result_metadata": [U64,ptr(_LpMetadata),U64], + "lp_observed_result_group": [U64,I32,ptr(_LpGroup),U64], + "lp_observed_result_checks": [U64,ptr(_LpChecks),U64], + "lp_observed_result_row": [U64,_Id,ptr(_LpRow),U64], + "lp_observed_result_column": [U64,_Id,ptr(_LpColumn),U64], + "lp_observed_result_rows": [U64,ptr(_LpRow),U64,U64,ptr(U64)], + "lp_observed_result_columns": [U64,ptr(_LpColumn),U64,U64,ptr(U64)], + "lp_observed_result_text": [U64,I32,ptr(C.c_char),U64,ptr(U64)], + "quadratic_capabilities": [ptr(I32)], + "quadratic_options_default": [ptr(_QuadraticOptions),U64], + "quadratic_model_create": [ptr(U64)], "quadratic_model_identity": [U64,ptr(U64),ptr(U64)], + "quadratic_model_add_continuous": [U64,F64,F64,C.c_char_p,ptr(_Id)], + "quadratic_model_add_row": [U64,ptr(_Term),U64,F64,F64,C.c_char_p,ptr(_Id)], + "quadratic_model_set_objective": [U64,ptr(_WeightedSquare),U64,ptr(_Term),U64,I32,F64], + "quadratic_model_set_variable_bounds": [U64,_Id,F64,F64], + "quadratic_model_set_row_bounds": [U64,_Id,F64,F64], + "quadratic_model_set_coefficient": [U64,_Id,_Id,F64], + "quadratic_model_remove_variable": [U64,_Id], "quadratic_model_remove_row": [U64,_Id], + "quadratic_solve": [U64,ptr(_QuadraticOptions),ptr(U64)], + "quadratic_result_info": [U64,ptr(_QuadraticInfo),U64], + "quadratic_result_checks": [U64,ptr(_QuadraticChecks),U64], + "quadratic_result_number": [U64,I32,ptr(I32),ptr(F64)], + "quadratic_result_value": [U64,_Id,ptr(F64)], + "quadratic_result_values": [U64,ptr(F64),ptr(U8),ptr(U8),U64,ptr(U64)], + "quadratic_result_array": [U64,I32,ptr(F64),U64,ptr(U64)], + "quadratic_result_text": [U64,I32,ptr(C.c_char),U64,ptr(U64)], + "options_default": [ptr(_Options), U64], "capabilities": [I32, ptr(I32), ptr(I32), ptr(I32)], + "model_create": [ptr(U64)], "model_identity": [U64, ptr(U64), ptr(U64)], + "model_read": [C.c_char_p, ptr(U64)], "model_write": [U64, C.c_char_p], + "model_add_variable": [U64, I32, F64, F64, C.c_char_p, ptr(_Id)], + "model_add_row": [U64, ptr(_Term), U64, F64, F64, C.c_char_p, ptr(_Id)], + "model_add_variables": [U64,ptr(_VariableSpec),U64,ptr(_Id),U64], + "model_add_rows": [U64,ptr(_RowSpec),U64,ptr(_Id),U64], + "model_add_rows_sparse": [U64,ptr(_SparseRowBatch),ptr(_Id),U64], + "model_set_objective": [U64, ptr(_Term), U64, I32, F64], + "model_set_coefficient": [U64, _Id, _Id, F64], + "model_set_objective_coefficient": [U64, _Id, F64], "model_set_objective_offset": [U64, F64], + "solve": [U64, ptr(_Options), ptr(U64)], "session_solve": [U64, U64, ptr(_Options), ptr(U64)], + "session_create": [ptr(U64)], "session_reset": [U64], "session_statistics": [U64, ptr(_Statistics), U64], + "model_add_all_different": [U64, ptr(_Id), U64, C.c_char_p, ptr(_Id)], + "model_add_element": [U64, _Id, ptr(_Id), U64, _Id, I64, C.c_char_p, ptr(_Id)], + "model_add_table": [U64, ptr(_Id), U64, ptr(I64), U64, U64, C.c_char_p, ptr(_Id)], + "model_add_cumulative": [U64, ptr(_Id), U64, ptr(I64), U64, ptr(I64), U64, I64, C.c_char_p, ptr(_Id)], + "model_add_circuit": [U64, ptr(_Id), U64, I64, C.c_char_p, ptr(_Id)], + "model_add_regular": [U64,ptr(_Id),U64,U64,U64,ptr(_RegularTransition),U64,U64,ptr(U64),U64,C.c_char_p,ptr(_Id)], + "model_remove_global": [U64, _Id], "model_set_global_name": [U64, _Id, C.c_char_p], + "model_add_indicator": [U64, _Id, I32, ptr(_Term), U64, F64, F64, C.c_char_p, ptr(_Id), ptr(I32), ptr(_Id)], + "model_remove_indicator": [U64, _Id], + "model_add_boolean_and": [U64, _Id, ptr(_Id), U64, C.c_char_p], + "model_add_boolean_or": [U64, _Id, ptr(_Id), U64, C.c_char_p], + "cancellation_create": [ptr(U64)], "cancellation_cancel": [U64], + "cancellation_is_cancelled": [U64,ptr(I32)], + "cancellation_copy": [U64,ptr(U64)], + "result_info": [U64, ptr(_Info), U64], "result_number": [U64, I32, ptr(I32), ptr(F64)], + "result_value": [U64, _Id, ptr(F64)], + "result_values": [U64, ptr(F64), ptr(U8), ptr(U8), U64, ptr(U64)], + "result_text": [U64, I32, ptr(C.c_char), U64, ptr(U64)], + "pool_options_default": [ptr(_PoolOptions),U64], "pool_solve": [U64,ptr(_PoolOptions),ptr(U64)], + "pool_info": [U64,ptr(_PoolInfo),U64], "pool_projection": [U64,ptr(_Id),U64,ptr(U64)], + "pool_entry_info": [U64,U64,ptr(_PoolEntryInfo),U64], "pool_entry_result": [U64,U64,ptr(U64)], + "pool_entry_projection": [U64,U64,ptr(I64),U64,ptr(U64)], + "pool_attempt_info": [U64,U64,ptr(_PoolAttemptInfo),U64], "pool_message": [U64,ptr(C.c_char),U64,ptr(U64)], + "repair_options_default": [ptr(_RepairOptions),U64], "repair_solve": [U64,ptr(_RepairOptions),ptr(U64)], + "repair_info": [U64,ptr(_RepairInfo),U64], "repair_number": [U64,I32,ptr(I32),ptr(F64)], + "repair_original_value": [U64,_Id,ptr(F64)], "repair_original_values": [U64,ptr(F64),ptr(U8),ptr(U8),U64,ptr(U64)], + "repair_variable_map": [U64,ptr(_Id),ptr(_Id),ptr(U8),U64,ptr(U64)], + "repair_validation": [U64,ptr(_ValidationInfo),U64], "repair_item_info": [U64,U64,ptr(_RepairItemInfo),U64], + "repair_stage_info": [U64,U64,ptr(_RepairStageInfo),U64], "repair_stage_result": [U64,U64,ptr(U64)], + "repair_final_result": [U64,ptr(U64)], "repair_violation_lock": [U64,ptr(I32),ptr(_Id)], + "repair_objective_values": [U64,ptr(F64),U64,ptr(U64)], + "repair_text": [U64,I32,U64,ptr(C.c_char),U64,ptr(U64)], + } + for entity in ("model", "session", "result", "cancellation", "pool", "repair", "quadratic_model", "quadratic_result", "lp_observed_result", "basis", "basis_result", "scenario_batch", "lp_evidence", "lp_evidence_stage", "sensitivity"): + signatures[entity+"_destroy"]=[U64] + for entity in ("variable", "row"): + signatures["model_set_"+entity+"_bounds"]=[U64, _Id, F64, F64] + signatures["model_set_"+entity+"_name"]=[U64, _Id, C.c_char_p] + signatures["model_remove_"+entity]=[U64, _Id] + self._functions={} + for name, signature in signatures.items(): + try: + function=getattr(self._dll, "gecode_opt_v1_"+name) + except AttributeError as error: + raise RuntimeError("C ABI library lacks required additive symbol: gecode_opt_v1_"+name) from error + function.argtypes=signature; function.restype=I32 + self._functions[name]=function + # Runtime structure-size handshake catches ctypes layout mismatches. + temporary=_Options();self.call("options_default", C.byref(temporary), C.sizeof(temporary)) + + def call(self, name, *args): + code=self._functions[name](*args) + if code: + message=self._dll.gecode_opt_v1_last_error() + raise ApiError(code, message.decode("utf-8", errors="replace") if message else "C ABI error") + + def lp_observation_capabilities(self): + out=_LpCapabilities();self.call("lp_capabilities",C.byref(out),C.sizeof(out)) + def text(field,index=0): + count=U64();self.call("lp_capability_text",field,index,None,0,C.byref(count)) + buffer=C.create_string_buffer(count.value) + self.call("lp_capability_text",field,index,buffer,count.value,C.byref(count)) + return buffer.value.decode("utf-8",errors="replace") + return LpObservationCapabilities(bool(out.available),bool(out.duals),bool(out.basis_export), + text(0),text(1),tuple(text(2,i) for i in range(out.limitation_count))) + + def quadratic_capabilities(self): + """Availability of the explicit finite-box continuous numerical QP scope.""" + available=I32();self.call("quadratic_capabilities",C.byref(available)) + return {"available":bool(available.value)} + + def capabilities(self, backend=Backend.AUTO): + available=I32(); lp=I32(); mip=I32() + self.call("capabilities", int(Backend(backend)), C.byref(available), C.byref(lp), C.byref(mip)) + return {"available": bool(available.value), "linear_programming": bool(lp.value), "mixed_integer_linear": bool(mip.value)} + + +_libraries={} +_library_lock=threading.Lock() +def load_library(path=None): + if isinstance(path, Library): + return path + if path is None: + path=os.environ.get("GECODE_OPTIMIZE_LIBRARY") or bundled_library_path() or find_library("gecodeoptimize_c") + if not path: + raise RuntimeError("set GECODE_OPTIMIZE_LIBRARY to the built shared C ABI library") + key=os.fspath(path) + with _library_lock: + if key not in _libraries: + _libraries[key]=Library(key) + return _libraries[key] + + +@dataclass(frozen=True) +class Variable: + model_id: int + slot: int + _library: Library=field(repr=False) + def _id(self): + return _Id(_integer(self.model_id,64), _integer(self.slot,64), 1, 0) +@dataclass(frozen=True) +class Row: + model_id: int + slot: int + _library: Library=field(repr=False) + def _id(self): + return _Id(_integer(self.model_id,64), _integer(self.slot,64), 2, 0) + +@dataclass(frozen=True) +class GlobalConstraint: + model_id: int + slot: int + _library: Library=field(repr=False) + def _id(self): + return _Id(_integer(self.model_id,64), _integer(self.slot,64), 3, 0) +@dataclass(frozen=True) +class Indicator: + model_id: int + slot: int + _library: Library=field(repr=False) + inactive_gate: object=None + def _id(self): + return _Id(_integer(self.model_id,64), _integer(self.slot,64), 4, 0) + + +def _entity(value, library, expected=None): + if not isinstance(value, expected or (Variable, Row, GlobalConstraint, Indicator)): + raise TypeError("wrong model entity handle type") + if value._library is not library: + raise ValueError("handle belongs to another loaded ABI instance") + return value._id() + + +def _terms(items, library): + if hasattr(items, "items"): + items=items.items() + data=[_Term(_entity(v,library,Variable),float(c)) for v,c in items] + return (_Term*len(data))(*data) + + +def _ids(values, library): + data=[_entity(value,library,Variable) for value in values] + return (_Id*len(data))(*data) + + +def _int64s(values): + data=[_integer(value,64,True) for value in values] + return (I64*len(data))(*data) + + +@dataclass +class VariableSpec: + type: VariableType=VariableType.CONTINUOUS + lower: float=0.0 + upper: object=None # As with scalar construction: Binary 1, otherwise +inf. + name: str="" + + +@dataclass +class RowSpec: + terms: object=() + lower: float=-math.inf + upper: float=math.inf + name: str="" + + +@dataclass +class SparseRowBatch: + columns: object=() + row_start: object=(0,) + column: object=() + coefficient: object=() + lower: object=() + upper: object=() + names: object=() + + +@dataclass +class Options: + backend: Backend=Backend.AUTO + guarantee: Guarantee=Guarantee.NUMERICAL + threads: int=1 + random_seed: int=0 + time_limit_seconds: float=math.inf + relative_gap: float=1e-4 + absolute_gap: float=1e-6 + feasibility_tolerance: float=1e-7 + integrality_tolerance: float=1e-6 + node_limit: object=None + cancellation: object=None + primal_start: object=() + + def _marshal(self, library): + out=_Options();library.call("options_default",C.byref(out),C.sizeof(out)) + out.backend=int(Backend(self.backend));out.guarantee=int(Guarantee(self.guarantee)) + out.threads=_integer(self.threads,32,True);out.random_seed=_integer(self.random_seed,32,True) + for name in ("time_limit_seconds","relative_gap","absolute_gap","feasibility_tolerance","integrality_tolerance"): + setattr(out,name,float(getattr(self,name))) + if self.node_limit is not None: + out.has_node_limit=1;out.node_limit=_integer(self.node_limit,64) + if self.cancellation is not None: + if not isinstance(self.cancellation,Cancellation) or self.cancellation._library is not library: + raise TypeError("cancellation must belong to the same ABI instance") + out.cancellation=self.cancellation._open() + entries=self.primal_start.items() if hasattr(self.primal_start,"items") else self.primal_start + starts=[_Start(_entity(v,library,Variable),float(value)) for v,value in entries] + array=(_Start*len(starts))(*starts) + out.primal_start=array;out.primal_start_count=len(starts) + out._keepalive=(array,self.cancellation) + return out + + +@dataclass +class PoolOptions: + solve: Options=field(default_factory=Options) + max_solutions: int=10 + projection: object=None + def _marshal(self, library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + out=_PoolOptions();library.call("pool_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve + out.max_solutions=_integer(self.max_solutions,64) + array=None + if self.projection is not None: + array=_ids(self.projection,library);out.has_projection=1 + out.projection=array;out.projection_count=len(array) + out._keepalive=(solve,array) + return out + + +@dataclass(frozen=True) +class RelaxationSelection: + source: object + side: RelaxationSide=RelaxationSide.LOWER + penalty: float=1.0 + + +@dataclass +class RepairOptions: + solve: Options=field(default_factory=Options) + selections: object=() + optimize_original_objective: bool=False + def _marshal(self, library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + if type(self.optimize_original_objective) is not bool: + raise TypeError("optimize_original_objective must be bool") + data=[] + for selection in self.selections: + if not isinstance(selection,RelaxationSelection): + raise TypeError("selections must contain RelaxationSelection records") + data.append(_Selection(_entity(selection.source,library,(Variable,Row)), + int(RelaxationSide(selection.side)),0,float(selection.penalty))) + out=_RepairOptions();library.call("repair_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve + array=(_Selection*len(data))(*data);out.selections=array;out.selection_count=len(array) + out.optimize_original_objective=int(self.optimize_original_objective) + out._keepalive=(solve,array) + return out + + +class _Owner: + _kind=None + def _initialize(self, library, handle=None): + self._library=load_library(library);self._handle=0 + if handle is None: + out=U64();self._library.call(self._kind+"_create",C.byref(out));self._handle=out.value + else: + self._handle=handle + @property + def closed(self): + return not self._handle + def _open(self): + if self.closed: + raise RuntimeError(self._kind+" is closed") + return self._handle + def close(self): + if getattr(self,"_handle",0): + self._library.call(self._kind+"_destroy",self._handle) + self._handle=0 + def __enter__(self): + self._open();return self + def __exit__(self,*unused): + self.close() + def __del__(self): + try: + self.close() + except Exception: + pass + + +class Model(_Owner): + _kind="model" + def __init__(self, library=None): + self._initialize(library) + @classmethod + def read(cls, filename, library=None): + """Read LP/MPS into an independent owner, closed explicitly or by context.""" + lib = load_library(library) + model = cls.__new__(cls) + model._initialize(lib, 0) + out = U64() + lib.call("model_read", _text(os.fspath(filename)), C.byref(out)) + try: + model._handle = out.value + except BaseException: + lib.call("model_destroy", out) + raise + return model + @property + def identity(self): + owner=U64();revision=U64();self._library.call("model_identity",self._open(),C.byref(owner),C.byref(revision)) + return owner.value,revision.value + def add_variable(self, type=VariableType.CONTINUOUS, lower=0.0, upper=None, name=""): + kind=VariableType(type);upper=(1.0 if kind==VariableType.BINARY else math.inf) if upper is None else upper + out=_Id();self._library.call("model_add_variable",self._open(),int(kind),float(lower),float(upper),_text(name),C.byref(out)) + return Variable(out.model_id,out.slot,self._library) + def add_row(self, terms=(), lower=-math.inf, upper=math.inf, name=""): + array=_terms(terms,self._library);out=_Id() + self._library.call("model_add_row",self._open(),array,len(array),float(lower),float(upper),_text(name),C.byref(out)) + return Row(out.model_id,out.slot,self._library) + def add_variables(self, specs): + """Atomically add an ordinary sequence of VariableSpec records.""" + data=[];keepalive=[] + for spec in specs: + if not isinstance(spec,VariableSpec): + raise TypeError("expected VariableSpec entries") + kind=VariableType(spec.type) + upper=(1.0 if kind==VariableType.BINARY else math.inf) if spec.upper is None else spec.upper + name=_text(spec.name);keepalive.append(name) + data.append(_VariableSpec(C.sizeof(_VariableSpec),int(kind),0,float(spec.lower),float(upper),name)) + array=(_VariableSpec*len(data))(*data);out=(_Id*len(data))() + self._library.call("model_add_variables",self._open(),array,len(array),out,len(out)) + return tuple(Variable(v.model_id,v.slot,self._library) for v in out) + def add_rows(self, specs): + """Atomically add RowSpec entries; each terms field accepts a mapping or pairs.""" + data=[];keepalive=[] + for spec in specs: + if not isinstance(spec,RowSpec): + raise TypeError("expected RowSpec entries") + terms=_terms(spec.terms,self._library);name=_text(spec.name);keepalive.append((terms,name)) + data.append(_RowSpec(C.sizeof(_RowSpec),0,terms,len(terms),float(spec.lower),float(spec.upper),name)) + array=(_RowSpec*len(data))(*data);out=(_Id*len(data))() + self._library.call("model_add_rows",self._open(),array,len(array),out,len(out)) + return tuple(Row(r.model_id,r.slot,self._library) for r in out) + def add_rows_sparse(self, batch): + """Add a CSR batch in one C call, copying ordinary sequences, without NumPy.""" + if not isinstance(batch,SparseRowBatch): + raise TypeError("expected SparseRowBatch") + record=_SparseRowBatch();record.struct_size=C.sizeof(record);keepalive=[] + columns=_ids(batch.columns,self._library);record.columns=columns;record.columns_count=len(columns) + keepalive.append(columns) + for name in ("row_start","column"): + data=[_integer(v,64) for v in getattr(batch,name)] + array=(U64*len(data))(*data);setattr(record,name,array);setattr(record,name+"_count",len(array)) + keepalive.append(array) + for name in ("coefficient","lower","upper"): + data=[float(v) for v in getattr(batch,name)] + array=(F64*len(data))(*data);setattr(record,name,array);setattr(record,name+"_count",len(array)) + keepalive.append(array) + names=[_text(v) for v in batch.names];array=(C.c_char_p*len(names))(*names) + record.names=array;record.names_count=len(array);keepalive.extend((names,array)) + out=(_Id*record.lower_count)() + self._library.call("model_add_rows_sparse",self._open(),C.byref(record),out,len(out)) + return tuple(Row(r.model_id,r.slot,self._library) for r in out) + def set_objective(self, terms=(), *, maximize=False, offset=0.0): + if type(maximize) is not bool: + raise TypeError("maximize must be bool") + array=_terms(terms,self._library);self._library.call("model_set_objective",self._open(),array,len(array),int(maximize),float(offset)) + def set_bounds(self, entity, lower, upper): + identifier=_entity(entity,self._library,(Variable,Row));kind="variable" if isinstance(entity,Variable) else "row" + self._library.call("model_set_"+kind+"_bounds",self._open(),identifier,float(lower),float(upper)) + def set_coefficient(self, row, variable, value): + self._library.call("model_set_coefficient",self._open(),_entity(row,self._library,Row),_entity(variable,self._library,Variable),float(value)) + def set_objective_coefficient(self, variable, value): + self._library.call("model_set_objective_coefficient",self._open(),_entity(variable,self._library,Variable),float(value)) + def set_objective_offset(self, value): + self._library.call("model_set_objective_offset",self._open(),float(value)) + def set_name(self, entity, name): + identifier=_entity(entity,self._library,(Variable,Row,GlobalConstraint)) + kind="variable" if isinstance(entity,Variable) else "row" if isinstance(entity,Row) else "global" + self._library.call("model_set_"+kind+"_name",self._open(),identifier,_text(name)) + def remove(self, entity): + identifier=_entity(entity,self._library) + kind=("variable" if isinstance(entity,Variable) else "row" if isinstance(entity,Row) + else "global" if isinstance(entity,GlobalConstraint) else "indicator") + self._library.call("model_remove_"+kind,self._open(),identifier) + def add_all_different(self, variables, name=""): + array=_ids(variables,self._library);out=_Id() + self._library.call("model_add_all_different",self._open(),array,len(array),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_element(self, index, elements, result, index_base=0, name=""): + array=_ids(elements,self._library);out=_Id() + self._library.call("model_add_element",self._open(),_entity(index,self._library,Variable),array,len(array), + _entity(result,self._library,Variable),_integer(index_base,64,True),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_table(self, variables, tuples, name=""): + array=_ids(variables,self._library);rows=[tuple(row) for row in tuples] + if any(len(row)!=len(array) for row in rows): + raise ValueError("table tuple arity must match its variable count") + values=_int64s(value for row in rows for value in row);out=_Id() + self._library.call("model_add_table",self._open(),array,len(array),values,len(values),len(rows),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_cumulative(self, starts, durations, heights, capacity, name=""): + array=_ids(starts,self._library);ds=_int64s(durations);hs=_int64s(heights);out=_Id() + self._library.call("model_add_cumulative",self._open(),array,len(array),ds,len(ds),hs,len(hs), + _integer(capacity,64,True),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_circuit(self, successors, index_base=0, name=""): + array=_ids(successors,self._library);out=_Id() + self._library.call("model_add_circuit",self._open(),array,len(array),_integer(index_base,64,True),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_regular(self, variables, state_count, initial_state, transitions, final_states, name=""): + array=_ids(variables,self._library) + edges=[] + for edge in transitions: + if not isinstance(edge,RegularTransition): + raise TypeError("transitions must contain RegularTransition records") + edges.append(_RegularTransition(C.sizeof(_RegularTransition),0,_integer(edge.from_state,64), + _integer(edge.symbol,64,True),_integer(edge.to_state,64))) + edges=(_RegularTransition*len(edges))(*edges) + finals=[_integer(value,64) for value in final_states];finals=(U64*len(finals))(*finals);out=_Id() + self._library.call("model_add_regular",self._open(),array,len(array),_integer(state_count,64),_integer(initial_state,64), + edges,len(edges),C.sizeof(_RegularTransition),finals,len(finals),_text(name),C.byref(out)) + return GlobalConstraint(out.model_id,out.slot,self._library) + def add_indicator(self, activator, active_value, terms=(), lower=-math.inf, upper=math.inf, name=""): + if type(active_value) is not bool: + raise TypeError("indicator active_value must be bool") + array=_terms(terms,self._library);out=_Id();has_gate=I32();gate=_Id() + self._library.call("model_add_indicator",self._open(),_entity(activator,self._library,Variable),int(active_value), + array,len(array),float(lower),float(upper),_text(name),C.byref(out),C.byref(has_gate),C.byref(gate)) + auxiliary=Variable(gate.model_id,gate.slot,self._library) if has_gate.value else None + return Indicator(out.model_id,out.slot,self._library,auxiliary) + def add_boolean_and(self, result, inputs=(), name=""): + array=_ids(inputs,self._library) + self._library.call("model_add_boolean_and",self._open(),_entity(result,self._library,Variable),array,len(array),_text(name)) + def add_boolean_or(self, result, inputs=(), name=""): + array=_ids(inputs,self._library) + self._library.call("model_add_boolean_or",self._open(),_entity(result,self._library,Variable),array,len(array),_text(name)) + def write(self, filename): + self._library.call("model_write",self._open(),_text(os.fspath(filename))) + def solve(self, options=None): + if options is not None and not isinstance(options,Options): + raise TypeError("options must be Options") + native=(options or Options())._marshal(self._library);out=U64() + self._library.call("solve",self._open(),C.byref(native),C.byref(out));return Result(self._library,out.value) + def analyze_lp_evidence(self, options=None): + """Explicit numerical ray/Farkas recovery in private auxiliary models.""" + started=time.monotonic() + if options is not None and not isinstance(options,LpEvidenceOptions): + raise TypeError("options must be LpEvidenceOptions") + native=(options or LpEvidenceOptions())._marshal(self._library) + if math.isfinite(native.solve.time_limit_seconds) and native.solve.time_limit_seconds>=0: + native.solve.time_limit_seconds=max(0.0,native.solve.time_limit_seconds-(time.monotonic()-started)) + return _own_call(self,LpEvidenceResult,"analyze_lp_evidence",C.byref(native)) + def solve_scenarios(self, definitions, options=None): + """Serial owning batch. Sparse absolute patches; one whole-batch allowance.""" + start=time.monotonic() + if options is not None and not isinstance(options,ScenarioOptions): + raise TypeError("options must be ScenarioOptions") + native=(options or ScenarioOptions())._marshal(self._library) + array=_scenario_definitions(definitions,self._library) + if math.isfinite(native.solve.time_limit_seconds) and native.solve.time_limit_seconds>=0: + native.solve.time_limit_seconds=max(0.0,native.solve.time_limit_seconds-(time.monotonic()-start)) + return _own_call(self,ScenarioBatchResult,"solve_scenarios",array,len(array),C.sizeof(_ScenarioDefinition),C.byref(native)) + def solve_lp_observed(self, options=None): + if options is not None and not isinstance(options,LpObservationOptions): + raise TypeError("options must be LpObservationOptions") + native=(options or LpObservationOptions())._marshal(self._library) + return _own_call(self,LpObservedResult,"solve_lp_observed",C.byref(native)) + def solve_lp_with_basis(self, basis, options=None): + native=_basis_solve_options(self,basis,options) + return _own_call(self,LpBasisSolveResult,"solve_lp_with_basis",basis._open(),C.byref(native)) + def solve_pool(self, options=None): + if options is not None and not isinstance(options,PoolOptions): + raise TypeError("options must be PoolOptions") + native=(options or PoolOptions())._marshal(self._library) + return _own_call(self,PoolResult,"pool_solve",C.byref(native)) + def relax_feasibility(self, options=None): + if options is not None and not isinstance(options,RepairOptions): + raise TypeError("options must be RepairOptions") + native=(options or RepairOptions())._marshal(self._library) + return _own_call(self,RepairResult,"repair_solve",C.byref(native)) + + +class Cancellation(_Owner): + _kind="cancellation" + def __init__(self, library=None): + self._initialize(library) + def cancel(self): + self._library.call("cancellation_cancel",self._open()) + @property + def cancelled(self): + out=I32();self._library.call("cancellation_is_cancelled",self._open(),C.byref(out));return bool(out.value) + def copy(self): + """Independent owner of the same thread-safe cancellation state.""" + return _own_call(self,Cancellation,"cancellation_copy") + + +class Session(_Owner): + _kind="session" + def __init__(self, library=None): + self._initialize(library) + def reset(self): + self._library.call("session_reset",self._open()) + @property + def statistics(self): + out=_Statistics();self._library.call("session_statistics",self._open(),C.byref(out),C.sizeof(out)) + return {name:getattr(out,name) for name,_ in out._fields_} + def solve(self, model, options=None): + if not isinstance(model,Model) or model._library is not self._library: + raise TypeError("model must belong to the same ABI instance") + if options is not None and not isinstance(options,Options): + raise TypeError("options must be Options") + native=(options or Options())._marshal(self._library);out=U64() + self._library.call("session_solve",self._open(),model._open(),C.byref(native),C.byref(out));return Result(self._library,out.value) + def solve_lp_observed(self, model, options=None): + if not isinstance(model,Model) or model._library is not self._library: + raise TypeError("model must belong to the same ABI instance") + if options is not None and not isinstance(options,LpObservationOptions): + raise TypeError("options must be LpObservationOptions") + native=(options or LpObservationOptions())._marshal(self._library) + return _own_call(self,LpObservedResult,"session_solve_lp_observed",model._open(),C.byref(native)) + + def solve_lp_with_basis(self, model, basis, options=None): + if not isinstance(model,Model) or model._library is not self._library: + raise TypeError("model must belong to the same ABI instance") + native=_basis_solve_options(self,basis,options) + return _own_call(self,LpBasisSolveResult,"session_solve_lp_with_basis",model._open(),basis._open(),C.byref(native)) + + +class Result(_Owner): + """Immutable historical result; remains usable after Model/Session.close().""" + _kind="result" + def __init__(self, library, handle): + self._initialize(library,handle) + @property + def info(self): + out=_Info();self._library.call("result_info",self._open(),C.byref(out),C.sizeof(out)) + data={name:getattr(out,name) for name,_ in out._fields_ if name!="reserved"} + data["termination"]=Termination(data["termination"]);data["guarantee"]=Guarantee(data["guarantee"]) + for key in ("has_solution","solution_validated","start_submitted"): + data[key]=bool(data[key]) + return data + @property + def termination(self): + return self.info["termination"] + @property + def has_solution(self): + return self.info["has_solution"] + def _number(self, field): + present=I32();value=F64();self._library.call("result_number",self._open(),field,C.byref(present),C.byref(value)) + return value.value if present.value else None + objective=property(lambda self:self._number(0)) + best_bound=property(lambda self:self._number(1)) + absolute_gap=property(lambda self:self._number(2)) + relative_gap=property(lambda self:self._number(3)) + native_gap=property(lambda self:self._number(4)) + def value(self, variable): + out=F64();self._library.call("result_value",self._open(),_entity(variable,self._library,Variable),C.byref(out));return out.value + @property + def values(self): + """Copy per-slot records: active, present, and value (None if absent).""" + count=U64();self._library.call("result_values",self._open(),None,None,None,0,C.byref(count)) + values=(F64*count.value)();active=(U8*count.value)();present=(U8*count.value)() + self._library.call("result_values",self._open(),values,active,present,count.value,C.byref(count)) + return [{"active":bool(active[i]),"present":bool(present[i]),"value":values[i] if present[i] else None} for i in range(count.value)] + def _text(self, field): + size=U64();self._library.call("result_text",self._open(),field,None,0,C.byref(size)) + buffer=C.create_string_buffer(size.value);self._library.call("result_text",self._open(),field,buffer,size.value,C.byref(size)) + return buffer.value.decode("utf-8",errors="replace") + backend=property(lambda self:self._text(0)) + backend_version=property(lambda self:self._text(1)) + message=property(lambda self:self._text(2)) + + +def _own_call(owner, cls, function, *args): + """Prepare the Python owner before allocating its C token.""" + result=cls.__new__(cls);result._initialize(owner._library,0) + out=U64();owner._library.call(function,owner._open(),*args,C.byref(out)) + try: + result._handle=out.value + except BaseException: + owner._library.call(cls._kind+"_destroy",out) + raise + return result + + +def _record(owner, function, cls, *args): + out=cls();owner._library.call(function,owner._open(),*args,C.byref(out),C.sizeof(out));return out + + +def _metadata(record): + result={} + for name,_ in record._fields_: + if name!="reserved": + value=getattr(record,name) + result[name]=(value.value if value.present else None) if isinstance(value,_OptionalNumber) else value + return result + + +def _array(owner, function, element, *args): + count=U64();owner._library.call(function,owner._open(),*args,None,0,C.byref(count)) + buffer=(element*count.value)();owner._library.call(function,owner._open(),*args,buffer,count.value,C.byref(count)) + return buffer + + +def _copied_text(owner, function, *args): + buffer=_array(owner,function,C.c_char,*args) + return buffer.value.decode("utf-8",errors="replace") + + +def _returned_id(identifier, library): + if identifier.model_id==0: + return None + classes={1:Variable,2:Row,3:GlobalConstraint,4:Indicator} + if identifier.reserved or identifier.kind not in classes: + raise RuntimeError("C ABI returned an invalid entity identity") + return classes[identifier.kind](identifier.model_id,identifier.slot,library) + + +@dataclass(frozen=True) +class PoolEntry: + projection_values: tuple + rank_established: bool + + +@dataclass(frozen=True) +class PoolAttempt: + termination: Termination + guarantee: Guarantee + candidate_accepted: bool + rank_established: bool + objective: object + remaining_bound: object + + +class PoolResult(_Owner): + """Owning workflow; use entry_result(i) to obtain an independent Result.""" + _kind="pool" + def __init__(self, library, handle): + self._initialize(library,handle) + @property + def info(self): + data=_metadata(_record(self,"pool_info",_PoolInfo)) + data["termination"]=Termination(data["termination"]);data["guarantee"]=Guarantee(data["guarantee"]) + data["completion"]=PoolCompletion(data["completion"]);return data + termination=property(lambda self:self.info["termination"]) + completion=property(lambda self:self.info["completion"]) + exhausted=property(lambda self:self.completion==PoolCompletion.EXHAUSTED) + ranked_prefix=property(lambda self:self.info["ranked_prefix"]) + message=property(lambda self:_copied_text(self,"pool_message")) + @property + def projection(self): + return tuple(_returned_id(value,self._library) for value in _array(self,"pool_projection",_Id)) + def entry(self, index): + index=_integer(index,64);info=_record(self,"pool_entry_info",_PoolEntryInfo,index) + return PoolEntry(tuple(_array(self,"pool_entry_projection",I64,index)),bool(info.rank_established)) + def entry_result(self, index): + return _own_call(self,Result,"pool_entry_result",_integer(index,64)) + def attempt(self, index): + info=_metadata(_record(self,"pool_attempt_info",_PoolAttemptInfo,_integer(index,64))) + info["termination"]=Termination(info["termination"]);info["guarantee"]=Guarantee(info["guarantee"]) + info["candidate_accepted"]=bool(info["candidate_accepted"]);info["rank_established"]=bool(info["rank_established"]) + return PoolAttempt(**info) + + +@dataclass(frozen=True) +class RepairItem: + source: object + slack: object + penalty_row: object + side: RelaxationSide + original_bound: float + penalty: float + activity: object + violation: object + weighted_violation: object + slack_value: object + name: str + + +@dataclass(frozen=True) +class RepairStage: + index: int + completed: bool + retention_bound: object + name: str + + +@dataclass(frozen=True) +class RepairVariable: + source: Variable + private: object + active: bool + + +@dataclass(frozen=True) +class Validation: + valid: bool + model_valid: bool + violated_globals: int + max_bound_violation: float + max_row_violation: float + max_integrality_violation: float + max_indicator_violation: float + objective: object + message: str + + +class RepairResult(_Owner): + """Owning repair evidence; original values are not a feasible solve result.""" + _kind="repair" + def __init__(self, library, handle): + self._initialize(library,handle) + @property + def info(self): + data=_metadata(_record(self,"repair_info",_RepairInfo)) + for name in ("termination","workflow_termination"): + data[name]=Termination(data[name]) + for name in ("guarantee","workflow_guarantee"): + data[name]=Guarantee(data[name]) + for name in ("has_private_model","has_repair","minimum_violation_established","original_objective_optimized"): + data[name]=bool(data[name]) + return data + termination=property(lambda self:self.info["termination"]) + has_repair=property(lambda self:self.info["has_repair"]) + def _number(self, field): + present=I32();value=F64();self._library.call("repair_number",self._open(),field,C.byref(present),C.byref(value)) + return value.value if present.value else None + minimum_weighted_violation=property(lambda self:self._number(0)) + weighted_violation=property(lambda self:self._number(1)) + original_objective=property(lambda self:self._number(2)) + message=property(lambda self:_copied_text(self,"repair_text",0,0)) + workflow_message=property(lambda self:_copied_text(self,"repair_text",1,0)) + def original_value(self, variable): + out=F64();self._library.call("repair_original_value",self._open(),_entity(variable,self._library,Variable),C.byref(out)) + return out.value + @property + def original_values(self): + count=U64();self._library.call("repair_original_values",self._open(),None,None,None,0,C.byref(count)) + values=(F64*count.value)();active=(U8*count.value)();present=(U8*count.value)() + self._library.call("repair_original_values",self._open(),values,active,present,count.value,C.byref(count)) + return tuple({"active":bool(active[i]),"present":bool(present[i]),"value":values[i] if present[i] else None} for i in range(count.value)) + @property + def variable_map(self): + count=U64();self._library.call("repair_variable_map",self._open(),None,None,None,0,C.byref(count)) + source=(_Id*count.value)();private=(_Id*count.value)();active=(U8*count.value)() + self._library.call("repair_variable_map",self._open(),source,private,active,count.value,C.byref(count)) + return tuple(RepairVariable(_returned_id(source[i],self._library),_returned_id(private[i],self._library),bool(active[i])) for i in range(count.value)) + @property + def original_validation(self): + info=_metadata(_record(self,"repair_validation",_ValidationInfo)) + info["valid"]=bool(info["valid"]);info["model_valid"]=bool(info["model_valid"]) + return Validation(**info,message=_copied_text(self,"repair_text",2,0)) + def item(self, index): + index=_integer(index,64);info=_metadata(_record(self,"repair_item_info",_RepairItemInfo,index)) + for name in ("source","slack","penalty_row"): + info[name]=_returned_id(info[name],self._library) + info["side"]=RelaxationSide(info["side"]) + return RepairItem(**info,name=_copied_text(self,"repair_text",3,index)) + def stage(self, index): + index=_integer(index,64);info=_metadata(_record(self,"repair_stage_info",_RepairStageInfo,index)) + info["completed"]=bool(info["completed"]) + return RepairStage(**info,name=_copied_text(self,"repair_text",4,index)) + def stage_result(self, index): + return _own_call(self,Result,"repair_stage_result",_integer(index,64)) + def final_result(self): + return _own_call(self,Result,"repair_final_result") + @property + def violation_lock(self): + present=I32();out=_Id();self._library.call("repair_violation_lock",self._open(),C.byref(present),C.byref(out)) + return _returned_id(out,self._library) if present.value else None + objective_values=property(lambda self:tuple(_array(self,"repair_objective_values",F64))) + + +@dataclass +class WeightedSquare: + """Positive weight times (sum(coefficient*variable) + offset)**2.""" + terms: object=() + offset: float=0.0 + weight: float=1.0 + name: str="" + + +@dataclass +class QuadraticOptions: + solve: Options=field(default_factory=Options) + iteration_limit: int=100000 + max_auxiliary_variables: int=100000 + max_lifted_nonzeros: int=2000000 + stationarity_tolerance: float=1e-7 + complementarity_tolerance: float=1e-7 + optimality_tolerance: float=1e-6 + + def _marshal(self, library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + out=_QuadraticOptions();library.call("quadratic_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve + for name in ("iteration_limit","max_auxiliary_variables","max_lifted_nonzeros"): + setattr(out,name,_integer(getattr(self,name),64)) + for name in ("stationarity_tolerance","complementarity_tolerance","optimality_tolerance"): + setattr(out,name,float(getattr(self,name))) + out._keepalive=(solve,) + return out + + +class QuadraticModel(_Owner): + """Distinct finite-box continuous QP owner; no linear Model conversion.""" + _kind="quadratic_model" + def __init__(self, library=None): + self._initialize(library) + @property + def identity(self): + owner=U64();revision=U64() + self._library.call("quadratic_model_identity",self._open(),C.byref(owner),C.byref(revision)) + return owner.value,revision.value + def add_continuous(self, lower, upper, name=""): + out=_Id();self._library.call("quadratic_model_add_continuous",self._open(),float(lower),float(upper),_text(name),C.byref(out)) + return Variable(out.model_id,out.slot,self._library) + def add_row(self, terms=(), lower=-math.inf, upper=math.inf, name=""): + array=_terms(terms,self._library);out=_Id() + self._library.call("quadratic_model_add_row",self._open(),array,len(array),float(lower),float(upper),_text(name),C.byref(out)) + return Row(out.model_id,out.slot,self._library) + def _objective(self, squares, linear, offset, maximize): + data=[];keepalive=[] + for square in squares: + if not isinstance(square,WeightedSquare): + raise TypeError("squares must contain WeightedSquare records") + terms=_terms(square.terms,self._library);name=_text(square.name);keepalive.append((terms,name)) + data.append(_WeightedSquare(C.sizeof(_WeightedSquare),0,terms,len(terms),float(square.offset),float(square.weight),name)) + array=(_WeightedSquare*len(data))(*data);linear=_terms(linear,self._library) + self._library.call("quadratic_model_set_objective",self._open(),array,len(array),linear,len(linear),maximize,float(offset)) + def minimize_squares(self, squares=(), linear=(), offset=0.0): + """Minimize linear + offset + sum(positive weighted squares).""" + self._objective(squares,linear,offset,0) + def maximize_concave_squares(self, squares=(), linear=(), offset=0.0): + """Maximize linear + offset MINUS sum(positive weighted squares).""" + self._objective(squares,linear,offset,1) + def set_bounds(self, entity, lower, upper): + identifier=_entity(entity,self._library,(Variable,Row)) + kind="variable" if isinstance(entity,Variable) else "row" + self._library.call("quadratic_model_set_"+kind+"_bounds",self._open(),identifier,float(lower),float(upper)) + def set_coefficient(self, row, variable, value): + self._library.call("quadratic_model_set_coefficient",self._open(),_entity(row,self._library,Row), + _entity(variable,self._library,Variable),float(value)) + def remove(self, entity): + identifier=_entity(entity,self._library,(Variable,Row)) + kind="variable" if isinstance(entity,Variable) else "row" + self._library.call("quadratic_model_remove_"+kind,self._open(),identifier) + def solve(self, options=None): + if options is not None and not isinstance(options,QuadraticOptions): + raise TypeError("options must be QuadraticOptions") + native=(options or QuadraticOptions())._marshal(self._library) + return _own_call(self,QuadraticResult,"quadratic_solve",C.byref(native)) + + +@dataclass(frozen=True) +class QuadraticChecks: + primal_valid: bool + objective_valid: bool + kkt_available: bool + kkt_valid: bool + bound_valid: bool + max_stationarity: object + max_complementarity: object + original_objective: object + normalized_lower_bound: object + gap_upper_bound: object + square_count: int + gradient_slots: int + message: str + + +class QuadraticResult(_Owner): + """Owning original QP result and numerical checks, distinct from Result.""" + _kind="quadratic_result" + def __init__(self, library, handle): + self._initialize(library,handle) + @property + def info(self): + out=_record(self,"quadratic_result_info",_QuadraticInfo);data=_metadata(out.result) + data["termination"]=Termination(data["termination"]);data["guarantee"]=Guarantee(data["guarantee"]) + for name in ("has_solution","solution_validated","start_submitted"): + data[name]=bool(data[name]) + data["qp_iterations"]=out.qp_iterations;data["regularization"]=out.regularization + return data + termination=property(lambda self:self.info["termination"]) + has_solution=property(lambda self:self.info["has_solution"]) + def _number(self, field): + present=I32();value=F64() + self._library.call("quadratic_result_number",self._open(),field,C.byref(present),C.byref(value)) + return value.value if present.value else None + objective=property(lambda self:self._number(0)) + best_bound=property(lambda self:self._number(1)) + absolute_gap=property(lambda self:self._number(2)) + relative_gap=property(lambda self:self._number(3)) + native_gap=property(lambda self:self._number(4)) + vendor_objective=property(lambda self:self._number(5)) + vendor_dual_estimate=property(lambda self:self._number(6)) + def value(self, variable): + out=F64();self._library.call("quadratic_result_value",self._open(),_entity(variable,self._library,Variable),C.byref(out)) + return out.value + @property + def values(self): + count=U64();self._library.call("quadratic_result_values",self._open(),None,None,None,0,C.byref(count)) + values=(F64*count.value)();active=(U8*count.value)();present=(U8*count.value)() + self._library.call("quadratic_result_values",self._open(),values,active,present,count.value,C.byref(count)) + return tuple({"active":bool(active[i]),"present":bool(present[i]),"value":values[i] if present[i] else None} + for i in range(count.value)) + backend=property(lambda self:_copied_text(self,"quadratic_result_text",0)) + backend_version=property(lambda self:_copied_text(self,"quadratic_result_text",1)) + message=property(lambda self:_copied_text(self,"quadratic_result_text",2)) + @property + def checks(self): + data=_metadata(_record(self,"quadratic_result_checks",_QuadraticChecks)) + for name in ("primal_valid","objective_valid","kkt_available","kkt_valid","bound_valid"): + data[name]=bool(data[name]) + return QuadraticChecks(**data,message=_copied_text(self,"quadratic_result_text",3)) + @property + def square_residuals(self): + """Original affine residuals, not their squared/weighted contributions.""" + if not self.checks.objective_valid: + return None + return tuple(_array(self,"quadratic_result_array",F64,0)) + @property + def original_gradient(self): + if not self.checks.objective_valid: + return None + return tuple(_array(self,"quadratic_result_array",F64,1)) + + +class LpObservationState(IntEnum): + NOT_REQUESTED=0; AVAILABLE=1; UNAVAILABLE=2; REJECTED=3 +class LpObservationReason(IntEnum): + NONE=0; NOT_REQUESTED=1; UNSUPPORTED=2; NO_BACKEND_SOLVE=3; NO_PRIMAL_POINT=4 + NOT_OPTIMAL=5; NO_DUAL_POINT=6; NO_BASIS=7; ELIDED_CONSTANT_ROWS=8; INTERRUPTED=9 + INVALID_BACKEND_DATA=10; FAILED_CHECKS=11; ALLOCATION_FAILURE=12; INVALID_MODEL=13 +class LpBasisStatus(IntEnum): + LOWER=0; BASIC=1; UPPER=2; ZERO=3; NONBASIC_UNSPECIFIED=4 +class LpDualSource(IntEnum): + NONE=0; BACKEND=1; DERIVED_CONSTANT_ROW=2 + + +@dataclass +class LpObservationOptions: + solve: Options=field(default_factory=Options) + duals: bool=True + basis: bool=True + dual_feasibility: float=1e-7 + stationarity: float=1e-7 + complementarity: float=1e-6 + objective_gap: float=1e-6 + def _marshal(self, library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + if type(self.duals) is not bool or type(self.basis) is not bool: + raise TypeError("duals and basis must be bool") + out=_LpOptions();library.call("lp_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve + out.duals=self.duals;out.basis=self.basis + for name in ("dual_feasibility","stationarity","complementarity","objective_gap"): + setattr(out,name,float(getattr(self,name))) + out._keepalive=(solve,) + return out + + +@dataclass(frozen=True) +class LpObservationCapabilities: + available: bool + duals: bool + basis_export: bool + backend: str + backend_version: str + limitations: tuple +@dataclass(frozen=True) +class LpObservationGroup: + state: LpObservationState + reason: LpObservationReason + message: str +@dataclass(frozen=True) +class LpObservationMetadata: + dual_feasibility: float + stationarity: float + complementarity: float + objective_gap: float + primal_check_tolerance: float + backend_primal_tolerance: object + backend_dual_tolerance: object + backend: str + backend_version: str +@dataclass(frozen=True) +class LpKktReport: + primal_valid: bool + dual_signs_valid: bool + stationarity_valid: bool + complementarity_valid: bool + gap_valid: bool + accepted: bool + max_dual_sign_violation: object + max_stationarity: object + max_complementarity: object + dual_objective_estimate: object + normalized_gap: object + message: str +@dataclass(frozen=True) +class LpRowObservation: + active: bool + dual_source: LpDualSource + basis: object + activity: object + lower_slack: object + upper_slack: object + dual: object +@dataclass(frozen=True) +class LpColumnObservation: + active: bool + basis: object + reduced_cost: object +@dataclass(frozen=True) +class LpObservations: + """Copied immutable original-slot data; no solver handle or borrowed child.""" + model_id: int + revision: int + metadata: LpObservationMetadata + primal_rows: LpObservationGroup + dual_point: LpObservationGroup + basis: LpObservationGroup + checks: LpKktReport + rows: tuple + columns: tuple + _library: Library=field(repr=False,compare=False) + def row(self, row): + entity=_entity(row,self._library,Row) + if entity.model_id!=self.model_id or entity.slot>=len(self.rows) or not self.rows[entity.slot].active: + raise ValueError("observation row is foreign, absent or deleted") + return self.rows[entity.slot] + def column(self, variable): + entity=_entity(variable,self._library,Variable) + if entity.model_id!=self.model_id or entity.slot>=len(self.columns) or not self.columns[entity.slot].active: + raise ValueError("observation variable is foreign, absent or deleted") + return self.columns[entity.slot] + + +def _lp_metadata(record): + return {name:value for name,value in _metadata(record).items() if name not in ("struct_size","reserved_flags")} +def _lp_entry(record): + data=_lp_metadata(record);data["active"]=bool(data["active"]) + data["basis"]=LpBasisStatus(data["basis"]) if data.pop("has_basis") else None + if isinstance(record,_LpRow): + data["dual_source"]=LpDualSource(data["dual_source"]) + return LpRowObservation(**data) + return LpColumnObservation(**data) + + +class LpObservedResult(_Owner): + def analyze_sensitivity(self, options=None): + """Analyze this historical optimal basis; no optimization solve is run.""" + start=time.monotonic() + options=LpSensitivityOptions() if options is None else options + if not isinstance(options,LpSensitivityOptions): + raise TypeError("options must be LpSensitivityOptions") + native=options._marshal(self._library) + seconds=native.time_limit_seconds + valid_options=(native.request_count>0 and not math.isnan(seconds) and seconds>=0 and + all(math.isfinite(getattr(native.checks,n)) and getattr(native.checks,n)>=0 + for n,_ in _SensitivityChecksOptions._fields_[2:])) + private_token=None + result=None + try: + # A private registry owner survives explicit close of the caller's + # token after admission, while cancellation propagates both ways. + if options.cancellation is not None: + private_token=options.cancellation.copy() + native.cancellation=private_token._open() + preparation=time.monotonic()-start + if math.isfinite(seconds) and seconds>=0: + native.time_limit_seconds=max(0.0,seconds-preparation) + result=_own_call(self,LpSensitivityResult,"analyze_lp_sensitivity",C.byref(native)) + native=None # release request buffers before the publication check + cancelled=private_token.cancelled if private_token is not None else False + if private_token is not None: + private_token.close();private_token=None + result._python_stop=Termination.CANCELLED if valid_options and cancelled else None + elapsed=time.monotonic()-start + if valid_options and result._python_stop is None and elapsed>=seconds: + result._python_stop=Termination.TIME_LIMIT + result._total_elapsed_seconds=elapsed + return result + except BaseException: + if result is not None:result.close() + raise + finally: + if private_token is not None:private_token.close() + _kind="lp_observed_result" + def __init__(self, library, handle): + self._initialize(library,handle) + @property + def info(self): + out=_record(self,"lp_observed_result_info",_LpInfo);data=_lp_metadata(out) + info=_metadata(out.result);info["termination"]=Termination(info["termination"]);info["guarantee"]=Guarantee(info["guarantee"]) + for name in ("has_solution","solution_validated","start_submitted"): + info[name]=bool(info[name]) + data["result"]=info;data["has_observations"]=bool(data["has_observations"]) + return data + termination=property(lambda self:self.info["result"]["termination"]) + has_solution=property(lambda self:self.info["result"]["has_solution"]) + def copy_result(self): + return _own_call(self,Result,"lp_observed_result_copy_result") + @property + def observations(self): + info=self.info + if not info["has_observations"]: + return None + text=lambda field:_copied_text(self,"lp_observed_result_text",field) + metadata=LpObservationMetadata(**_lp_metadata(_record(self,"lp_observed_result_metadata",_LpMetadata)),backend=text(0),backend_version=text(1)) + def group(index): + data=_lp_metadata(_record(self,"lp_observed_result_group",_LpGroup,index)) + return LpObservationGroup(LpObservationState(data["state"]),LpObservationReason(data["reason"]),text(index+2)) + check=_lp_metadata(_record(self,"lp_observed_result_checks",_LpChecks)) + for name in ("primal_valid","dual_signs_valid","stationarity_valid","complementarity_valid","gap_valid","accepted"): + check[name]=bool(check[name]) + checks=LpKktReport(**check,message=text(5)) + def entries(function,element): + count=U64();self._library.call(function,self._open(),None,C.sizeof(element),0,C.byref(count)) + data=(element*count.value)() + self._library.call(function,self._open(),data,C.sizeof(element),count.value,C.byref(count)) + return tuple(_lp_entry(item) for item in data) + return LpObservations(info["model_id"],info["revision"],metadata,group(0),group(1),group(2),checks, + entries("lp_observed_result_rows",_LpRow),entries("lp_observed_result_columns",_LpColumn),self._library) + + +class LpBasisOrigin(IntEnum): + CALLER=0; OBSERVATIONS=1 +class LpBasisSubmissionState(IntEnum): + NOT_ATTEMPTED=0; ACCEPTED=1; REPAIRED=2; REJECTED=3; INTERRUPTED=4 +@dataclass(frozen=True) +class LpBasisInfo: + model_id: int + revision: int + row_slots: int + column_slots: int + origin: LpBasisOrigin +@dataclass(frozen=True) +class LpBasisSubmission: + state: LpBasisSubmissionState + backend_attempted: bool + statuses_changed: object + message: str + + +def _basis_solve_options(owner,basis,options): + if not isinstance(basis,LpBasis) or basis._library is not owner._library: + raise TypeError("basis must belong to the same ABI instance") + if options is not None and not isinstance(options,LpObservationOptions): + raise TypeError("options must be LpObservationOptions") + return (options or LpObservationOptions())._marshal(owner._library) + + +class LpBasis(_Owner): + """Immutable source-tagged statuses. Use a factory; close releases only this token.""" + _kind="basis" + def __init__(self,library,handle): + self._initialize(library,handle) + @classmethod + def from_model(cls,model,columns,rows): + if not isinstance(model,Model): + raise TypeError("model must be Model") + def statuses(values): + encoded=[-1 if value is None else int(LpBasisStatus(_integer(value,32,True))) for value in values] + return (I32*len(encoded))(*encoded) + columns=statuses(columns);rows=statuses(rows) + return _own_call(model,cls,"basis_from_model",columns,len(columns),rows,len(rows)) + @classmethod + def from_observed(cls,observed): + if not isinstance(observed,LpObservedResult): + raise TypeError("observed must be an owning LpObservedResult") + return _own_call(observed,cls,"basis_from_observed") + @property + def info(self): + data=_lp_metadata(_record(self,"basis_info",_BasisInfo)) + data["origin"]=LpBasisOrigin(data["origin"]) + return LpBasisInfo(**data) + def _statuses(self,kind): + n=U64();self._library.call("basis_statuses",self._open(),kind,None,0,C.byref(n)) + values=(I32*n.value)();self._library.call("basis_statuses",self._open(),kind,values,n.value,C.byref(n)) + return tuple(None if value==-1 else LpBasisStatus(value) for value in values) + rows=property(lambda self:self._statuses(2)) + columns=property(lambda self:self._statuses(1)) + def row(self,row): + value=I32();self._library.call("basis_row",self._open(),_entity(row,self._library,Row),C.byref(value)) + return LpBasisStatus(value.value) + def column(self,variable): + value=I32();self._library.call("basis_column",self._open(),_entity(variable,self._library,Variable),C.byref(value)) + return LpBasisStatus(value.value) + + +class LpBasisSolveResult(_Owner): + """Submission facts and solve termination are independent; copied children own data.""" + _kind="basis_result" + def __init__(self,library,handle): + self._initialize(library,handle) + @property + def info(self): + out=_record(self,"basis_result_info",_BasisResultInfo) + result=_metadata(out.result);result["termination"]=Termination(result["termination"]) + result["guarantee"]=Guarantee(result["guarantee"]) + for name in ("has_solution","solution_validated","start_submitted"): + result[name]=bool(result[name]) + return {"result":result,"requested_model_id":out.requested_model_id if out.has_requested_basis else None, + "requested_revision":out.requested_revision if out.has_requested_basis else None} + termination=property(lambda self:self.info["result"]["termination"]) + has_solution=property(lambda self:self.info["result"]["has_solution"]) + @property + def submission(self): + out=_record(self,"basis_result_info",_BasisResultInfo) + return LpBasisSubmission(LpBasisSubmissionState(out.state),bool(out.backend_attempted), + bool(out.statuses_changed) if out.has_statuses_changed else None, + _copied_text(self,"basis_result_message")) + def copy_observed(self): + return _own_call(self,LpObservedResult,"basis_result_copy_observed") + def copy_basis(self): + return _own_call(self,LpBasis,"basis_result_copy_basis") + + +@dataclass(frozen=True) +class RegularTransition: + """One sparse edge; state indices are zero based and symbols are signed integers.""" + from_state: int + symbol: int + to_state: int + + +class ScenarioReuse(IntEnum): + AUTOMATIC=0; COLD=1 +class ScenarioRunState(IntEnum): + NOT_STARTED=0; ATTEMPTED=1 +class ScenarioBatchCompletion(IntEnum): + REJECTED=0; INTERRUPTED=1; COMPLETE=2 +@dataclass(frozen=True) +class ScenarioId: + batch_id: int + index: int + _library: Library=field(repr=False) + def _id(self): + return _ScenarioId(_integer(self.batch_id,64),_integer(self.index,64)) +@dataclass(frozen=True) +class ScenarioVariableBounds: + variable: Variable + lower: object=None + upper: object=None +@dataclass(frozen=True) +class ScenarioRowBounds: + row: Row + lower: object=None + upper: object=None +@dataclass(frozen=True) +class ScenarioDefinition: + """Absolute patches. None inherits; a zero objective coefficient removes it.""" + name: str="" + objective_coefficients: tuple=() + objective_offset: object=None + variable_bounds: tuple=() + row_bounds: tuple=() + def __post_init__(self): + terms=self.objective_coefficients + if hasattr(terms,"items"): + terms=terms.items() + object.__setattr__(self,"objective_coefficients",tuple((v,c) for v,c in terms)) + object.__setattr__(self,"variable_bounds",tuple(self.variable_bounds)) + object.__setattr__(self,"row_bounds",tuple(self.row_bounds)) +@dataclass +class ScenarioOptions: + solve: Options=field(default_factory=Options) + reuse: ScenarioReuse=ScenarioReuse.AUTOMATIC + max_scenarios: int=1000 + max_patch_entries: int=1000000 + max_saved_value_slots: int=10000000 + max_work: int=100000000 + def _marshal(self,library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + out=_ScenarioOptions();library.call("scenario_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve;out._keepalive=solve + out.reuse=int(ScenarioReuse(_integer(self.reuse,32,True))) + for name in ("max_scenarios","max_patch_entries","max_saved_value_slots","max_work"): + setattr(out,name,_integer(getattr(self,name),64)) + return out +@dataclass(frozen=True) +class ScenarioStatistics: + solve_calls: int + model_loads: int + incremental_updates: int + unchanged_models: int + basis_warm_starts: int + incumbent_starts: int +@dataclass(frozen=True) +class ScenarioBatchInfo: + model_id: int + revision: int + batch_id: object + scenario_count: int + outcome_count: int + completion: ScenarioBatchCompletion + stop_reason: object + offending_scenario: object + all_resolved: bool + attempted: int + resolved: int + work: int + elapsed_seconds: float + reuse_statistics: ScenarioStatistics +@dataclass(frozen=True) +class ScenarioResultInfo: + model_id: int + revision: int + variable_slots: int + termination: Termination + guarantee: Guarantee + has_solution: bool + solution_validated: bool + start_submitted: bool + elapsed_seconds: float +@dataclass(frozen=True) +class ScenarioCheck: + identity_valid: bool + candidate_examined: bool + objective_matches: bool + exact_witness_validated: bool + validation: object +@dataclass(frozen=True) +class ScenarioOutcome: + scenario: ScenarioId + state: ScenarioRunState + result: object + check: object + reuse_delta: ScenarioStatistics + elapsed_seconds: float + + +def _scenario_definitions(definitions,library): + data=[];keep=[] + def bounds(values,expected,entity_type,attribute): + result=[] + for item in values: + if not isinstance(item,expected): + raise TypeError("wrong scenario bound record type") + result.append(_ScenarioBounds(C.sizeof(_ScenarioBounds),0,_entity(getattr(item,attribute),library,entity_type), + int(item.lower is not None),int(item.upper is not None), + 0.0 if item.lower is None else float(item.lower),0.0 if item.upper is None else float(item.upper))) + return (_ScenarioBounds*len(result))(*result) + for definition in definitions: + if not isinstance(definition,ScenarioDefinition): + raise TypeError("definitions must contain ScenarioDefinition records") + name=_text(definition.name);terms=_terms(definition.objective_coefficients,library) + variables=bounds(definition.variable_bounds,ScenarioVariableBounds,Variable,"variable") + rows=bounds(definition.row_bounds,ScenarioRowBounds,Row,"row") + offset=definition.objective_offset + data.append(_ScenarioDefinition(C.sizeof(_ScenarioDefinition),0,name,terms,len(terms), + _OptionalNumber(offset is not None,0,0 if offset is None else float(offset)),variables,len(variables),rows,len(rows))) + keep.extend((name,terms,variables,rows)) + array=(_ScenarioDefinition*len(data))(*data);array._keepalive=keep;return array + + +class ScenarioBatchResult(_Owner): + """Owning history. copy_result() is independent and uses private mapped IDs.""" + _kind="scenario_batch" + def __init__(self,library,handle): + self._initialize(library,handle) + def _id(self,scenario): + if not isinstance(scenario,ScenarioId): + raise TypeError("scenario must be ScenarioId") + if scenario._library is not self._library: + raise ValueError("scenario belongs to another ABI instance") + return scenario._id() + @property + def info(self): + out=_record(self,"scenario_batch_info",_ScenarioInfo) + return ScenarioBatchInfo(out.model_id,out.revision,out.batch_id if out.has_batch else None, + out.scenario_count,out.outcome_count,ScenarioBatchCompletion(out.completion), + Termination(out.stop_reason) if out.has_stop_reason else None, + out.offending_scenario if out.has_offending_scenario else None,bool(out.all_resolved),out.attempted,out.resolved, + out.work,out.elapsed_seconds,ScenarioStatistics(**_metadata(out.reuse_statistics))) + message=property(lambda self:_copied_text(self,"scenario_batch_message")) + def scenario(self,index): + out=_ScenarioId();self._library.call("scenario_batch_id",self._open(),_integer(index,64),C.byref(out)) + return ScenarioId(out.batch_id,out.index,self._library) + def check(self,scenario): + id=self._id(scenario);out=_record(self,"scenario_batch_check",_ScenarioCheck,id) + if not out.has_check: + return None + validation=None + if out.candidate_examined: + data=_metadata(out.validation);data["valid"]=bool(data["valid"]);data["model_valid"]=bool(data["model_valid"]) + validation=Validation(**data,message=_copied_text(self,"scenario_batch_text",id,1)) + return ScenarioCheck(bool(out.identity_valid),bool(out.candidate_examined),bool(out.objective_matches), + bool(out.exact_witness_validated),validation) + def outcome(self,scenario): + out=_record(self,"scenario_batch_outcome",_ScenarioOutcome,self._id(scenario));info=None + if out.has_result: + data=_metadata(out.result);data["termination"]=Termination(data["termination"]);data["guarantee"]=Guarantee(data["guarantee"]) + for name in ("has_solution","solution_validated","start_submitted"): + data[name]=bool(data[name]) + info=ScenarioResultInfo(**data) + return ScenarioOutcome(ScenarioId(out.scenario.batch_id,out.scenario.index,self._library),ScenarioRunState(out.state),info, + self.check(scenario),ScenarioStatistics(**_metadata(out.reuse_delta)),out.elapsed_seconds) + def copy_result(self,scenario): + return _own_call(self,Result,"scenario_batch_copy_result",self._id(scenario)) + def map(self,original): + out=_Id();self._library.call("scenario_batch_map",self._open(),_entity(original,self._library,(Variable,Row)),C.byref(out)) + cls=Variable if out.kind==1 else Row + return cls(out.model_id,out.slot,self._library) + def value(self,scenario,original): + out=F64();self._library.call("scenario_batch_value",self._open(),self._id(scenario),_entity(original,self._library,Variable),C.byref(out)) + return out.value + def definition(self,scenario): + id=self._id(scenario);out=_record(self,"scenario_batch_definition",_ScenarioDefinitionInfo,id) + terms=_array(self,"scenario_batch_objective",_Term,id) + def bounds(kind,cls,entity_cls): + count=U64();self._library.call("scenario_batch_bounds",self._open(),id,kind,None,C.sizeof(_ScenarioBounds),0,C.byref(count)) + values=(_ScenarioBounds*count.value)() + self._library.call("scenario_batch_bounds",self._open(),id,kind,values,C.sizeof(_ScenarioBounds),count.value,C.byref(count)) + return tuple(cls(entity_cls(v.entity.model_id,v.entity.slot,self._library),v.lower if v.has_lower else None, + v.upper if v.has_upper else None) for v in values) + return ScenarioDefinition(_copied_text(self,"scenario_batch_text",id,0), + tuple((Variable(t.variable.model_id,t.variable.slot,self._library),t.coefficient) for t in terms), + out.objective_offset.value if out.objective_offset.present else None, + bounds(1,ScenarioVariableBounds,Variable),bounds(2,ScenarioRowBounds,Row)) + + +class LpEvidenceRequest(IntEnum): + AUTOMATIC=0; PRIMAL_RAY=1; FARKAS=2; BOTH=3 +class LpEvidenceState(IntEnum): + NOT_REQUESTED=0; AVAILABLE=1; UNAVAILABLE=2; REJECTED=3 +class LpEvidenceReason(IntEnum): + NONE=0; NOT_REQUESTED=1; UNSUPPORTED=2; NO_FEASIBLE_BASE=3; NO_IMPROVEMENT=4; NO_CONTRADICTION=5 + STOPPED=6; INVALID_BACKEND=7; FAILED_CHECKS=8; INCONSISTENT=9; INVALID_MODEL=10; RESOURCE_LIMIT=11; ALLOCATION=12 +class LpEvidenceCompletion(IntEnum): + COMPLETE=0; INTERRUPTED=1; REJECTED=2 +class LpEvidencePhase(IntEnum): + FEASIBLE_BASE=0; RECESSION=1; FARKAS=2 +class LpEvidenceSide(IntEnum): + LOWER=0; UPPER=1 +class LpEvidenceColumnKind(IntEnum): + SOURCE_VARIABLE=0; ROW_SIDE=1; VARIABLE_SIDE=2 +@dataclass +class LpEvidenceOptions: + solve: Options=field(default_factory=Options) + request: LpEvidenceRequest=LpEvidenceRequest.AUTOMATIC + recession: float=1e-7 + stationarity: float=1e-7 + minimum_improvement: float=1e-7 + minimum_contradiction: float=1e-7 + max_auxiliary_variables: int=1000000 + max_auxiliary_rows: int=1000000 + max_auxiliary_nonzeros: int=10000000 + max_retained_slots: int=50000000 + max_work: int=100000000 + max_auxiliary_solves: int=3 + def _marshal(self,library): + if not isinstance(self.solve,Options): + raise TypeError("solve must be Options") + out=_EvidenceOptions();library.call("evidence_options_default",C.byref(out),C.sizeof(out)) + solve=self.solve._marshal(library);out.solve=solve;out._keepalive=solve + out.request=int(LpEvidenceRequest(_integer(self.request,32,True))) + for name in ("recession","stationarity","minimum_improvement","minimum_contradiction"): + setattr(out,name,float(getattr(self,name))) + for name in ("max_auxiliary_variables","max_auxiliary_rows","max_auxiliary_nonzeros","max_retained_slots","max_work","max_auxiliary_solves"): + setattr(out,name,_integer(getattr(self,name),64)) + return out +@dataclass(frozen=True) +class LpEvidenceInfo: + model_id: int + revision: int + has_evidence: bool + completion: LpEvidenceCompletion + stop_reason: object + row_slots: int + column_slots: int + stage_count: int + attempted_calls: int + work: int + elapsed_seconds: float +@dataclass(frozen=True) +class LpEvidenceGroup: + state: LpEvidenceState + reason: LpEvidenceReason + message: str +@dataclass(frozen=True) +class LpEvidenceMetadata: + recession: float + stationarity: float + minimum_improvement: float + minimum_contradiction: float + primal_tolerance: float +@dataclass(frozen=True) +class LpPrimalEvidence: + base_check: object + direction_scale: object + normalized_objective_slope: object + max_variable_recession_violation: object + max_row_recession_violation: object +@dataclass(frozen=True) +class LpFarkasEvidence: + multiplier_scale: object + contradiction_margin: object + max_stationarity: object +@dataclass(frozen=True) +class LpEvidenceSlot: + """Original-slot diagnostics; consult group state for accepted evidence.""" + source: object + active: bool + side: object + base_value: object + direction: object + multiplier: object + contribution: object + selected_bound: object +@dataclass(frozen=True) +class LpEvidenceDiagnostics: + metadata: LpEvidenceMetadata + primal: LpPrimalEvidence + farkas: LpFarkasEvidence + columns: tuple + rows: tuple +@dataclass(frozen=True) +class LpEvidenceRawResult: + """Untrusted reported auxiliary fields; deliberately no has_solution API.""" + model_id: int + revision: int + value_count: int + mask_count: int + termination_code: int + guarantee_code: int + reported_solution_validated: bool + reported_start_submitted: bool + elapsed_seconds: float + objective: object + best_bound: object + absolute_gap: object + relative_gap: object + native_gap: object +@dataclass(frozen=True) +class LpEvidenceStageInfo: + index: int + private_model_id: int + private_revision: int + row_count: int + column_count: int + nonzeros: int + phase: LpEvidencePhase + attempted: bool + candidate_examined: bool + check: object + raw_result: object +@dataclass(frozen=True) +class LpEvidenceColumn: + private_variable: Variable + source: object + kind: LpEvidenceColumnKind + side: object +@dataclass(frozen=True) +class LpEvidenceRawValue: + slot: int + reported_value: object + reported_mask: object + + +def _evidence_validation(record,message): + data=_metadata(record);data["valid"]=bool(data["valid"]);data["model_valid"]=bool(data["model_valid"]) + return Validation(**data,message=message) + +def _evidence_source(record,library): + if record.reserved or record.kind not in (1,2): + raise RuntimeError("invalid evidence source ID") + return (Variable if record.kind==1 else Row)(record.model_id,record.slot,library) + +def _evidence_slot_record(record,library): + data=_lp_metadata(record);data["source"]=_evidence_source(record.source,library);data["active"]=bool(data["active"]) + data["side"]=LpEvidenceSide(data["side"]) if data.pop("has_side") else None + return LpEvidenceSlot(**data) + +def _evidence_array(owner,function,element,*args): + count=U64();owner._library.call(function,owner._open(),*args,None,C.sizeof(element),0,C.byref(count)) + out=(element*count.value)();owner._library.call(function,owner._open(),*args,out,C.sizeof(element),count.value,C.byref(count)) + return out + + +class LpEvidenceResult(_Owner): + """Owning numerical evidence analysis; not an original optimization Result.""" + _kind="lp_evidence" + def __init__(self,library,handle): + self._initialize(library,handle) + @property + def info(self): + out=_record(self,"lp_evidence_info",_EvidenceInfo);data=_lp_metadata(out) + data["has_evidence"]=bool(data["has_evidence"]);data["completion"]=LpEvidenceCompletion(data["completion"]) + data["stop_reason"]=Termination(data["stop_reason"]) if data.pop("has_stop_reason") else None + return LpEvidenceInfo(**data) + message=property(lambda self:_copied_text(self,"lp_evidence_text",0)) + def _group(self,index): + if not self.info.has_evidence: + return None + out=_record(self,"lp_evidence_group",_EvidenceGroup,index) + return LpEvidenceGroup(LpEvidenceState(out.state),LpEvidenceReason(out.reason),_copied_text(self,"lp_evidence_text",index+1)) + primal_ray=property(lambda self:self._group(0)) + farkas=property(lambda self:self._group(1)) + @property + def diagnostics(self): + if not self.info.has_evidence: + return None + metadata=LpEvidenceMetadata(**_lp_metadata(_record(self,"lp_evidence_metadata",_EvidenceMetadata))) + p=_record(self,"lp_evidence_primal",_EvidencePrimal);data=_lp_metadata(p) + data["base_check"]=_evidence_validation(p.base_check,_copied_text(self,"lp_evidence_text",3)) if data.pop("has_base_check") else None + primal=LpPrimalEvidence(**data);farkas=LpFarkasEvidence(**_lp_metadata(_record(self,"lp_evidence_farkas",_EvidenceFarkas))) + slots=lambda kind:tuple(_evidence_slot_record(r,self._library) for r in _evidence_array(self,"lp_evidence_slots",_EvidenceSlot,kind)) + return LpEvidenceDiagnostics(metadata,primal,farkas,slots(1),slots(2)) + def slot(self,source): + out=_record(self,"lp_evidence_slot",_EvidenceSlot,_entity(source,self._library,(Variable,Row))) + return _evidence_slot_record(out,self._library) + def _value(self,variable,field): + out=F64();self._library.call("lp_evidence_value",self._open(),_entity(variable,self._library,Variable),field,C.byref(out));return out.value + def base_value(self,variable): + """Requires Available primal-ray group; diagnostics retain base-only data.""" + return self._value(variable,0) + def direction_value(self,variable): + return self._value(variable,1) + def multiplier(self,source): + """Requires Available Farkas group; slot() provides raw diagnostics.""" + return _evidence_slot_record(_record(self,"lp_evidence_multiplier",_EvidenceSlot,_entity(source,self._library,(Variable,Row))),self._library) + def copy_stage(self,index): + return _own_call(self,LpEvidenceStage,"lp_evidence_copy_stage",_integer(index,64)) + + +class LpEvidenceStage(_Owner): + """Independent owning child: raw auxiliary diagnostics, never a Result.""" + _kind="lp_evidence_stage" + def __init__(self,library,handle): + self._initialize(library,handle) + @property + def info(self): + out=_record(self,"lp_evidence_stage_info",_EvidenceStage);data=_lp_metadata(out) + data["phase"]=LpEvidencePhase(data["phase"]);data["attempted"]=bool(data["attempted"]) + data["candidate_examined"]=bool(data["candidate_examined"]) + data["check"]=_evidence_validation(out.check,_copied_text(self,"lp_evidence_stage_text",3)) if out.candidate_examined else None + if data.pop("has_raw_result"): + raw=_lp_metadata(out.raw_result) + raw["reported_solution_validated"]=bool(raw["reported_solution_validated"]) + raw["reported_start_submitted"]=bool(raw["reported_start_submitted"]) + data["raw_result"]=LpEvidenceRawResult(**raw) + else:data["raw_result"]=None + return LpEvidenceStageInfo(**data) + @property + def columns(self): + out=[] + for r in _evidence_array(self,"lp_evidence_stage_columns",_EvidenceColumn): + out.append(LpEvidenceColumn(_evidence_source(r.private_variable,self._library),_evidence_source(r.source,self._library), + LpEvidenceColumnKind(r.kind),LpEvidenceSide(r.side) if r.has_side else None)) + return tuple(out) + @property + def raw_values(self): + return tuple(LpEvidenceRawValue(r.slot,r.reported_value.value if r.reported_value.present else None, + r.reported_mask if r.has_reported_mask else None) for r in _evidence_array(self,"lp_evidence_stage_raw_values",_EvidenceRawValue)) + raw_backend=property(lambda self:_copied_text(self,"lp_evidence_stage_text",0)) + raw_backend_version=property(lambda self:_copied_text(self,"lp_evidence_stage_text",1)) + raw_message=property(lambda self:_copied_text(self,"lp_evidence_stage_text",2)) + + +class LpSensitivityState(IntEnum): + NOT_REQUESTED=0; AVAILABLE=1; UNAVAILABLE=2; REJECTED=3 +class LpSensitivityReason(IntEnum): + NONE=0; NOT_REQUESTED=1; UNSUPPORTED=2; NOT_OPTIMAL=3; NO_BASIS=4; INVALID_SOURCE=5 + INVALID_BASIS=6; CHANGED_BASIS=7; REFERENCE_CHECKS=8; SYSTEM_CHECKS=9; INTERVAL_CHECKS=10 + RESOURCE_LIMIT=11; STOPPED=12; ALLOCATION=13; BACKEND=14 +class LpSensitivityCompletion(IntEnum): + COMPLETE=0; PARTIAL=1; INTERRUPTED=2; REJECTED=3 +class LpRangeEndKind(IntEnum): + FINITE=0; NEGATIVE_INFINITY=1; POSITIVE_INFINITY=2 +class LpSensitivitySide(IntEnum): + LOWER=0; UPPER=1; FIXED=2; FREE=3 +@dataclass(frozen=True) +class LpObjectiveParameter: + variable: Variable +@dataclass(frozen=True) +class LpEqualityRhsParameter: + row: Row +@dataclass(frozen=True) +class LpSensitivityTolerances: + primal_feasibility: float=1e-7 + dual_feasibility: float=1e-7 + stationarity: float=1e-7 + complementarity: float=1e-6 + objective_gap: float=1e-6 + system_absolute: float=1e-9 + system_relative: float=1e-9 +@dataclass(frozen=True) +class LpSensitivityLimits: + max_rows: int=4096 + max_columns: int=100000 + max_nonzeros: int=1000000 + max_requests: int=4096 + max_basis_solves: int=8194 + max_factor_entries: int=16777216 + max_retained_slots: int=20000000 + max_work: int=100000000 +@dataclass(frozen=True) +class LpSensitivityOptions: + parameters: tuple=() + backend: Backend=Backend.AUTO + time_limit_seconds: float=math.inf + cancellation: object=None + checks: LpSensitivityTolerances=field(default_factory=LpSensitivityTolerances) + limits: LpSensitivityLimits=field(default_factory=LpSensitivityLimits) + def _marshal(self,library): + if not isinstance(self.parameters,(tuple,list)): + raise TypeError("parameters must be a tuple or list") + if not isinstance(self.checks,LpSensitivityTolerances) or not isinstance(self.limits,LpSensitivityLimits): + raise TypeError("sensitivity checks/limits have the wrong type") + out=_SensitivityOptions();library.call("sensitivity_options_default",C.byref(out),C.sizeof(out)) + out.backend=int(Backend(_integer(self.backend,32,True)));out.time_limit_seconds=float(self.time_limit_seconds) + if self.cancellation is not None: + if not isinstance(self.cancellation,Cancellation) or self.cancellation._library is not library: + raise TypeError("cancellation belongs to another library or has the wrong type") + out.cancellation=self.cancellation._open() + for name,_ in _SensitivityChecksOptions._fields_[2:]: + setattr(out.checks,name,float(getattr(self.checks,name))) + for name,_ in _SensitivityLimits._fields_[2:]: + setattr(out.limits,name,_integer(getattr(self.limits,name),64)) + n=_integer(len(self.parameters),64);out.request_count=n + if n>out.limits.max_requests or n>out.limits.max_work: + # The v1 C admission gate checks these counts before dereferencing + # any element. A bounded sentinel allows an owning quota rejection + # without allocating a buffer already known to exceed the quota. + entries=(_SensitivityRequest*1)() + else: + entries=(_SensitivityRequest*n)() + for i,p in enumerate(self.parameters): + entries[i].struct_size=C.sizeof(_SensitivityRequest) + if isinstance(p,LpObjectiveParameter): + entries[i].kind=0;entries[i].entity=_entity(p.variable,library,Variable) + elif isinstance(p,LpEqualityRhsParameter): + entries[i].kind=1;entries[i].entity=_entity(p.row,library,Row) + else:raise TypeError("unknown sensitivity parameter descriptor") + out.requests=entries;out._keepalive=(entries,self.cancellation) + return out +@dataclass(frozen=True) +class LpSensitivityInfo: + model_id: int + revision: int + completion: LpSensitivityCompletion + reason: LpSensitivityReason + stop_reason: object + has_sensitivity: bool + has_basis: bool + guarantee: Guarantee + entry_count: int + factor_order_count: int + row_slots: int + column_slots: int + elapsed_seconds: float +@dataclass(frozen=True) +class LpSensitivityWork: + factor_setup_attempted: bool + basis_solves: int + coordinator_visits: int + retained_slots: int + preparation_visits: int +@dataclass(frozen=True) +class LpSensitivityGroup: + state: LpSensitivityState + reason: LpSensitivityReason + message: str +@dataclass(frozen=True) +class LpRangeEnd: + kind: LpRangeEndKind + value: object + def __post_init__(self): + if not isinstance(self.kind,LpRangeEndKind):raise TypeError("endpoint kind must be LpRangeEndKind") + if self.kind is LpRangeEndKind.FINITE: + if self.value is None or not math.isfinite(self.value):raise ValueError("finite endpoint requires a finite value") + elif self.value is not None:raise ValueError("infinite endpoint has no numeric value") +@dataclass(frozen=True) +class LpSensitivityLimiter: + entity: object + side: LpSensitivitySide + dual_condition: bool +@dataclass(frozen=True) +class LpIntervalCheckReport: + accepted: bool + inequalities: int + max_endpoint_violation: object + lower_direction_checked: bool + upper_direction_checked: bool + message: str +@dataclass(frozen=True) +class LpParameterInterval: + anchor: float + lower: LpRangeEnd + upper: LpRangeEnd + objective_slope: object + lower_limiter: object + upper_limiter: object + checks: LpIntervalCheckReport +@dataclass(frozen=True) +class LpSensitivityEntry: + index: int + parameter: object + group: LpSensitivityGroup + interval: object +@dataclass(frozen=True) +class LpSensitivityReferenceChecks: + """Copied diagnostics; default false flags do not prove a check ran.""" + primal: Validation + kkt: LpKktReport + basis_point_matches: bool + max_point_difference: object + max_system_residual: object + max_scaled_system_residual: object + + +class LpSensitivityResult(_Owner): + """Owning fixed-basis numerical ranges, distinct from the source solve.""" + _kind="sensitivity" + def __init__(self,library,handle): + self._initialize(library,handle) + def _text(self,field,index=0): + return _copied_text(self,"sensitivity_text",field,index) + @property + def info(self): + out=_record(self,"sensitivity_info",_SensitivityInfo);data=_lp_metadata(out) + data["completion"]=LpSensitivityCompletion(data["completion"]);data["reason"]=LpSensitivityReason(data["reason"]) + data["stop_reason"]=Termination(data["stop_reason"]) if data.pop("has_stop_reason") else None + data["has_sensitivity"]=bool(data["has_sensitivity"]);data["has_basis"]=bool(data["has_basis"]) + data["guarantee"]=Guarantee(data["guarantee"]) + if getattr(self,"_python_stop",None) is not None: + data.update(completion=LpSensitivityCompletion.INTERRUPTED,reason=LpSensitivityReason.STOPPED,stop_reason=self._python_stop) + data["elapsed_seconds"]=getattr(self,"_total_elapsed_seconds",data["elapsed_seconds"]) + return LpSensitivityInfo(**data) + @property + def message(self): + self._open() + if getattr(self,"_python_stop",None) is not None:return "Whole Python sensitivity allowance stopped during input cleanup" + return self._text(0) + @property + def work(self): + data=_lp_metadata(_record(self,"sensitivity_work",_SensitivityWork));data["factor_setup_attempted"]=bool(data["factor_setup_attempted"]) + return LpSensitivityWork(**data) + def copy_source_observed(self): + return _own_call(self,LpObservedResult,"sensitivity_copy_source_observed") + def copy_basis(self): + return _own_call(self,LpBasis,"sensitivity_copy_basis") + @property + def checks_options(self): + if not self.info.has_sensitivity:return None + return LpSensitivityTolerances(**_lp_metadata(_record(self,"sensitivity_checks_options",_SensitivityChecksOptions))) + @property + def reference_checks(self): + if not self.info.has_sensitivity:return None + r=_record(self,"sensitivity_reference_checks",_SensitivityReferenceChecks) + primal=_evidence_validation(r.primal,self._text(4));kkt=_lp_metadata(r.kkt) + for name in ("primal_valid","dual_signs_valid","stationarity_valid","complementarity_valid","gap_valid","accepted"): + kkt[name]=bool(kkt[name]) + return LpSensitivityReferenceChecks(primal,LpKktReport(**kkt,message=self._text(5)),bool(r.basis_point_matches), + *[getattr(r,n).value if getattr(r,n).present else None for n in + ("max_point_difference","max_system_residual","max_scaled_system_residual")]) + def _entry(self,r): + if not r.requested:return None + entity=_evidence_source(r.request.entity,self._library) + parameter=LpObjectiveParameter(entity) if r.request.kind==0 else LpEqualityRhsParameter(entity) + if getattr(self,"_python_stop",None) is not None: + return LpSensitivityEntry(r.index,parameter,LpSensitivityGroup(LpSensitivityState.UNAVAILABLE, + LpSensitivityReason.STOPPED,self.message),None) + group=LpSensitivityGroup(LpSensitivityState(r.group.state),LpSensitivityReason(r.group.reason),self._text(2,r.index)) + interval=None + if r.has_interval: + end=lambda e:LpRangeEnd(LpRangeEndKind(e.kind),e.value.value if e.value.present else None) + limiter=lambda l:LpSensitivityLimiter(_evidence_source(l.entity,self._library),LpSensitivitySide(l.side),bool(l.dual_condition)) + c=r.checks;checks=LpIntervalCheckReport(bool(c.accepted),c.inequalities, + c.max_endpoint_violation.value if c.max_endpoint_violation.present else None, + bool(c.lower_direction_checked),bool(c.upper_direction_checked),self._text(3,r.index)) + interval=LpParameterInterval(r.anchor,end(r.lower),end(r.upper),r.objective_slope.value if r.objective_slope.present else None, + limiter(r.lower_limiter) if r.has_lower_limiter else None,limiter(r.upper_limiter) if r.has_upper_limiter else None,checks) + return LpSensitivityEntry(r.index,parameter,group,interval) + def entry(self,index): + return self._entry(_record(self,"sensitivity_entry",_SensitivityEntry,_integer(index,64))) + @property + def entries(self): + if not self.info.has_sensitivity:return None + return tuple(self._entry(r) for r in _evidence_array(self,"sensitivity_entries",_SensitivityEntry)) + def objective(self,variable): + return self._entry(_record(self,"sensitivity_objective",_SensitivityEntry,_entity(variable,self._library,Variable))) + def equality_rhs(self,row): + return self._entry(_record(self,"sensitivity_equality_rhs",_SensitivityEntry,_entity(row,self._library,Row))) + @property + def factor_order(self): + if not self.info.has_sensitivity:return None + return tuple(_evidence_source(r,self._library) for r in _array(self,"sensitivity_factor_order",_Id)) + def active_slots(self,entity_type): + if entity_type not in (Variable,Row):raise TypeError("entity_type must be Variable or Row") + return tuple(bool(v) for v in _array(self,"sensitivity_active_slots",U8,1 if entity_type is Variable else 2)) + @property + def backend_version(self): + return self._text(1) if self.info.has_sensitivity else None diff --git a/python/tests/test_bulk.py b/python/tests/test_bulk.py new file mode 100644 index 0000000000..a44dafd583 --- /dev/null +++ b/python/tests/test_bulk.py @@ -0,0 +1,176 @@ +"""Atomic bulk C ABI/Python conformance; no optional numerical dependencies.""" +import ctypes as C +import gc +import math +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +from gecode_optimize import (ApiError, Backend, Library, Model, Options, RowSpec, + SparseRowBatch, Termination, VariableSpec, VariableType, load_library) +from gecode_optimize import binding as B + + +class BulkConformance(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.lib=load_library() + cls.highs=cls.lib.capabilities(Backend.HIGHS)["available"] + + def check_solution(self, result, optimum): + self.assertEqual(result.termination, Termination.OPTIMAL if self.highs else Termination.UNSUPPORTED, result.message) + if self.highs: + self.assertAlmostEqual(result.objective,optimum) + + def test_scalar_equivalence_names_and_history(self): + specs=[VariableSpec(VariableType.INTEGER,-3,7,"production π"), + VariableSpec(upper=10,name="recourse 😀")] + with Model(self.lib) as bulk, Model(self.lib) as scalar, tempfile.TemporaryDirectory() as directory: + dead=bulk.add_variable();bulk.remove(dead) + before=bulk.identity + variables=bulk.add_variables(specs) + self.assertEqual(bulk.identity,(before[0],before[1]+1)) + self.assertEqual([v.slot for v in variables],[1,2]) + sx=tuple(scalar.add_variable(s.type,s.lower,s.upper,s.name) for s in specs) + # Reversed mapping; coefficients +1e16+1-1e16 coalesce to exactly 1. + batch=SparseRowBatch([variables[1],variables[0]],[0,4,5],[1,1,1,0,0], + [1e16,1,-1e16,1,1],[2.5,0],[math.inf,4],["demand λ",""]) + before=bulk.identity + rows=bulk.add_rows_sparse(batch) + self.assertEqual(bulk.identity,(before[0],before[1]+1)) + scalar.add_row({sx[0]:1,sx[1]:1},lower=2.5,name="demand λ") + scalar.add_row({sx[1]:1},lower=0,upper=4) + bulk.set_objective({variables[0]:2,variables[1]:3},offset=.25) + scalar.set_objective({sx[0]:2,sx[1]:3},offset=.25) + # Generated file comments retain exact UTF-8 names, independent of + # input Python objects and temporary C-string/term arrays. + del specs,batch;gc.collect() + a=Path(directory)/'a.lp';b=Path(directory)/'b.lp';bulk.write(a);scalar.write(b) + self.assertEqual(a.read_bytes(),b.read_bytes()) + with bulk.solve(Options(backend=Backend.HIGHS)) as historical, scalar.solve(Options(backend=Backend.HIGHS)) as cold: + self.check_solution(historical,5.75);self.check_solution(cold,5.75) + identity=bulk.identity + more=bulk.add_rows([RowSpec({variables[0]:1},lower=4,name="edit")]) + self.assertEqual(bulk.identity,(identity[0],identity[1]+1)) + self.assertEqual(more[0].slot,rows[-1].slot+1) + with bulk.solve(Options(backend=Backend.HIGHS)) as current: + self.check_solution(current,8.25) + new=bulk.add_variables([VariableSpec(upper=1)]) + bulk.close() + self.assertEqual((historical.info['model_id'],historical.info['revision']),identity) + if self.highs: + self.assertEqual(historical.value(variables[0]),2) + with self.assertRaises(ApiError):historical.value(new[0]) + with self.assertRaises(ApiError):historical.value(dead) + + def test_all_types_row_sequence_and_single_c_call(self): + specs=[VariableSpec(t,lo,hi) for t,lo,hi in [ + (VariableType.CONTINUOUS,0,3),(VariableType.INTEGER,0,3), + (VariableType.BINARY,0,None),(VariableType.SEMI_CONTINUOUS,2,5), + (VariableType.SEMI_INTEGER,2.5,5)]] + with Model(self.lib) as m: + calls=[];original=self.lib.call + def count_calls(name,*args): + calls.append(name);return original(name,*args) + with patch.object(self.lib,'call',count_calls): + x=m.add_variables(specs) + self.assertEqual(calls,['model_add_variables']) + calls.clear();before=m.identity + with patch.object(self.lib,'call',count_calls): + rows=m.add_rows([RowSpec([(v,1)],lower=demand) for v,demand in zip(x,[1.5,1.5,.5,1,1])]) + self.assertEqual(calls,['model_add_rows']);self.assertEqual(m.identity[1],before[1]+1) + m.set_objective([(v,1) for v in x]) + with m.solve(Options(backend=Backend.HIGHS)) as result:self.check_solution(result,9.5) + calls.clear() + with patch.object(self.lib,'call',count_calls): + m.add_rows_sparse(SparseRowBatch(x,[0,5],list(range(5)),[1]*5,[0],[math.inf])) + self.assertEqual(calls,['model_add_rows_sparse']) + self.assertEqual(len(rows),5) + + def test_late_failures_are_atomic(self): + with Model(self.lib) as m, Model(self.lib) as foreign: + x=m.add_variable(upper=5);dead=m.add_variable();m.remove(dead);other=foreign.add_variable() + before=m.identity + for specs in ([VariableSpec(),VariableSpec(lower=math.nan)], + [VariableSpec(),VariableSpec(name='bad\0name')], + [VariableSpec(),VariableSpec(name='\ud800')], + [VariableSpec(),VariableSpec(type=999)], + [VariableSpec(),object()]): + with self.subTest(specs=specs),self.assertRaises((ApiError,ValueError,TypeError)): + m.add_variables(specs) + self.assertEqual(m.identity,before) + for bad in (RowSpec({other:1}),RowSpec({dead:1}),RowSpec({x:math.inf}), + RowSpec({x:1},lower=2,upper=1),RowSpec(name='\0')): + with self.subTest(bad=bad),self.assertRaises((ApiError,ValueError)): + m.add_rows([RowSpec({x:1}),bad]) + self.assertEqual(m.identity,before) + fresh=m.add_variables([VariableSpec()])[0] + self.assertEqual(fresh.slot,dead.slot+1) + # Wrong library instances are rejected in Python before entering C. + alias=Library(self.lib.path) + with Model(alias) as other_model: + alien=other_model.add_variable() + before=m.identity + with self.assertRaises(ValueError):m.add_rows([RowSpec({x:1}),RowSpec({alien:1})]) + with self.assertRaises(ValueError):m.add_rows_sparse(SparseRowBatch([alien])) + self.assertEqual(m.identity,before) + + def test_csr_malformed_dimensions_indices_and_unused_columns(self): + with Model(self.lib) as m, Model(self.lib) as foreign: + x=m.add_variable();dead=m.add_variable();m.remove(dead);other=foreign.add_variable() + bad=[SparseRowBatch([x],[],[],[],[],[]), + SparseRowBatch([x],[0,1],[0],[1],[0],[]), + SparseRowBatch([x],[0,1],[0],[],[0],[1]), + SparseRowBatch([x],[0,1],[0],[1],[0],[1],["a","b"]), + SparseRowBatch([x],[1,1],[0],[1],[0],[1]), + SparseRowBatch([x],[0,2,1],[0],[1],[0,0],[1,1]), + SparseRowBatch([x],[0,1],[1],[1],[0],[1]), + SparseRowBatch([x],[0,1],[0],[math.nan],[0],[1]), + SparseRowBatch([x,x]),SparseRowBatch([dead]),SparseRowBatch([other])] + before=m.identity + for batch in bad: + with self.subTest(batch=batch),self.assertRaises(ApiError):m.add_rows_sparse(batch) + self.assertEqual(m.identity,before) + for value in (-1,2**64,True,1.0): + with self.subTest(value=value),self.assertRaises((OverflowError,TypeError)): + m.add_rows_sparse(SparseRowBatch([x],[0,1],[value],[1],[0],[1])) + self.assertEqual(m.identity,before) + for batch in (SparseRowBatch(),SparseRowBatch([x])): + self.assertEqual(m.add_rows_sparse(batch),()) + self.assertEqual(m.add_variables([]),());self.assertEqual(m.add_rows([]),()) + self.assertEqual(m.identity,before) + m.close() + with self.assertRaises(RuntimeError):m.add_variables([]) + with self.assertRaises(RuntimeError):m.add_rows([]) + with self.assertRaises(RuntimeError):m.add_rows_sparse(SparseRowBatch()) + + def test_sparse_many_nonzeros_and_constant_contradiction(self): + # Large enough to catch scalar dispatch but small enough for ordinary CI. + with Model(self.lib) as m: + x=m.add_variables([VariableSpec(upper=2)]*1024) + calls=[];original=self.lib.call + def record(name,*args):calls.append(name);return original(name,*args) + with patch.object(self.lib,'call',record): + rows=m.add_rows_sparse(SparseRowBatch(x,list(range(1025)),list(range(1024)), + [1]*1024,[1]*1024,[2]*1024)) + self.assertEqual(calls,['model_add_rows_sparse']);self.assertEqual(len(rows),1024) + # Empty contradictory row must not disappear during batch conversion. + m.add_rows([RowSpec(lower=1)]) + with m.solve(Options(backend=Backend.HIGHS)) as result: + self.assertEqual(result.termination,Termination.INFEASIBLE if self.highs else Termination.UNSUPPORTED) + + def test_c_name_copy_and_output_preflight(self): + with Model(self.lib) as m, tempfile.TemporaryDirectory() as directory: + name=C.create_string_buffer('original π'.encode()) + spec=B._VariableSpec(C.sizeof(B._VariableSpec),int(VariableType.CONTINUOUS),0,0,1,C.cast(name,C.c_char_p)) + before=m.identity;out=(B._Id*1)();out[0].slot=123 + for capacity,output,error in ((0,out,6),(0,None,6),(1,None,1)): + with self.assertRaises(ApiError) as failure: + self.lib.call('model_add_variables',m._open(),C.byref(spec),1,output,capacity) + self.assertEqual(failure.exception.code,error);self.assertEqual(out[0].slot,123) + self.assertEqual(m.identity,before) + self.lib.call('model_add_variables',m._open(),C.byref(spec),1,out,1) + name.value=b'changed';del name,spec;gc.collect() + file=Path(directory)/'names.lp';m.write(file) + self.assertIn('original π'.encode().hex(),file.read_text()) diff --git a/python/tests/test_conformance.py b/python/tests/test_conformance.py new file mode 100644 index 0000000000..a271e6c912 --- /dev/null +++ b/python/tests/test_conformance.py @@ -0,0 +1,438 @@ +"""Run with PYTHONPATH=python GECODE_OPTIMIZE_LIBRARY=/path/to/library python3 -m unittest discover -s python/tests -v.""" +import concurrent.futures +import math +import tempfile +import threading +import unittest +from pathlib import Path +from unittest.mock import patch + +from gecode_optimize import (ApiError, Backend, Cancellation, GlobalConstraint, Guarantee, Indicator, Model, + Options, Session, Termination, VariableType, load_library) + + +class Conformance(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.lib = load_library() + cls.highs = cls.lib.capabilities(Backend.HIGHS)["available"] + cls.native = cls.lib.capabilities(Backend.NATIVE)["available"] + + def assert_solution(self, result, objective, values=()): + if not self.highs: + self.assertEqual(result.termination, Termination.UNSUPPORTED) + self.assertFalse(result.has_solution) + self.assertIsNone(result.objective) + self.assertIsNone(result.best_bound) + self.assertTrue(result.message) + return + self.assertEqual(result.termination, Termination.OPTIMAL, result.message) + self.assertTrue(result.info["solution_validated"]) + self.assertAlmostEqual(result.objective, objective, places=6) + for variable, expected in values: + self.assertAlmostEqual(result.value(variable), expected, places=6) + + def test_lp_continuous_recourse_and_result_lifetime(self): + # Analytic optimum: x + y >= 2.5, x integer, y >= 0, + # min 2x + 3y + 0.25 => x=2, y=0.5, objective=5.75. + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, upper=5) + y = model.add_variable(upper=5) + dead = model.add_variable(VariableType.BINARY) + model.remove(dead) + model.add_row({x: 1, y: 1}, lower=2.5) + model.set_objective({x: 2, y: 3}, offset=.25) + result = model.solve(Options(backend=Backend.HIGHS)) + identity = model.identity + self.assertTrue(model.closed) + with result: + self.assert_solution(result, 5.75, [(x, 2), (y, .5)]) + self.assertEqual((result.info["model_id"], result.info["revision"]), identity) + self.assertEqual(result.backend, "HiGHS") + records = result.values + self.assertEqual(records[2], {"active": False, "present": False, "value": None}) + self.assertEqual(records[0]["present"], self.highs) + if self.highs: + self.assertTrue(result.backend_version) + with self.assertRaises(ApiError): + result.value(dead) + else: + with self.assertRaises(ApiError) as error: + result.value(x) + self.assertEqual(error.exception.code, 7) + result.close() # sequential close is idempotent + with self.assertRaises(RuntimeError): + result.info + + def test_lp_fractional_and_maximum_offset(self): + with Model(self.lib) as model: + x = model.add_variable(upper=10) + model.add_row({x: 2}, lower=3, upper=5) + model.set_objective({x: 4}, maximize=True, offset=-7) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 3, [(x, 2.5)]) + + def test_domains_and_semi_zero_exception(self): + # Independent one-variable optima exercise every public type. + cases = [(VariableType.CONTINUOUS, 0, 3, 1.5, 1.5), + (VariableType.INTEGER, 0, 3, 1.5, 2), + (VariableType.BINARY, 0, 1, .5, 1), + (VariableType.SEMI_CONTINUOUS, 2, 5, 1, 2), + (VariableType.SEMI_INTEGER, 2.5, 5, 1, 3), + (VariableType.SEMI_CONTINUOUS, 2, 5, 0, 0), + (VariableType.SEMI_INTEGER, 2.5, 5, 0, 0)] + for kind, lower, upper, demand, optimum in cases: + with self.subTest(kind=kind, demand=demand), Model(self.lib) as model: + x = model.add_variable(kind, lower, upper) + model.add_row({x: 1}, lower=demand) + model.set_objective({x: 1}) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, optimum, [(x, optimum)]) + + def test_session_edits_and_snapshot_history(self): + with Model(self.lib) as model, Session(self.lib) as session: + x = model.add_variable(VariableType.INTEGER, upper=8) + row = model.add_row({x: 1}, lower=2) + model.set_objective({x: 1}, offset=3) + first = session.solve(model, Options(backend=Backend.HIGHS)) + with first: + self.assert_solution(first, 5, [(x, 2)]) + model.set_bounds(row, 3, math.inf) + model.set_bounds(x, 3, 8) + model.set_objective_coefficient(x, 2) + model.set_objective_offset(-1) + model.set_name(x, "quantity") + model.set_name(row, "demand") + with session.solve(model, Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 5, [(x, 3)]) + if self.highs: + self.assertEqual(result.info["revision"], model.identity[1]) + self.assertLess(first.info["revision"], result.info["revision"]) + self.assertEqual(first.value(x), 2) + self.assertEqual(session.statistics["model_loads"], 1) + self.assertEqual(session.statistics["incremental_updates"], 1) + model.set_coefficient(row, x, 2) + with session.solve(model, Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 5, [(x, 3)]) + if self.highs: + self.assertEqual(session.statistics["model_loads"], 2) + session.reset() + with session.solve(model, Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 5) + model.remove(row) + model.set_objective() + model.remove(x) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 0) + + def test_api_errors_and_safe_integer_conversion(self): + with Model(self.lib) as model, Model(self.lib) as foreign: + x = model.add_variable(upper=3) + y = foreign.add_variable() + with self.assertRaises(ApiError): + model.add_row({y: 1}) + row = model.add_row({x: 1}, lower=1) + with self.assertRaises(TypeError): + model.set_coefficient(x, row, 1) + with self.assertRaises(ApiError): + model.remove(x) + with self.assertRaises(ApiError): + model.set_bounds(x, math.nan, 1) + with self.assertRaises(ApiError): + model.set_objective({x: math.inf}) + with self.assertRaises(ValueError): + model.add_variable(name="bad\0name") + with self.assertRaises(ValueError): + model.add_variable(type=99) + for options, error in [(Options(node_limit=-1), OverflowError), + (Options(node_limit=2**64), OverflowError), + (Options(threads=2**31), OverflowError), + (Options(random_seed=.5), TypeError), + (Options(threads=True), TypeError), + (Options(time_limit_seconds=math.nan), ApiError), + (Options(integrality_tolerance=.5), ApiError), + (Options(primal_start={x: math.inf}), ApiError)]: + with self.subTest(options=options), self.assertRaises(error): + model.solve(options) + model.remove(row) + model.remove(x) + with self.assertRaises(ApiError): + model.set_bounds(x, 0, 1) + with self.assertRaises(RuntimeError): + model.add_variable() + + def test_starts_cancellation_options_and_guarantees(self): + with Model(self.lib) as model, Session(self.lib) as session, Cancellation(self.lib) as token: + x = model.add_variable(VariableType.INTEGER, upper=8) + model.set_objective({x: 1}, maximize=True) + with model.solve(Options(backend=Backend.HIGHS, primal_start={x: 6})) as result: + self.assert_solution(result, 8) + self.assertEqual(result.info["start_submitted"], self.highs) + token.cancel() + with session.solve(model, Options(backend=Backend.HIGHS, cancellation=token)) as result: + self.assertEqual(result.termination, Termination.CANCELLED) + self.assertFalse(result.has_solution) + self.assertIsNone(result.objective) + with session.solve(model, Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 8) + with model.solve(Options(backend=Backend.HIGHS, guarantee=Guarantee.CERTIFIED)) as result: + self.assertEqual(result.termination, Termination.UNSUPPORTED) + with model.solve(Options(backend=Backend.HIGHS, time_limit_seconds=0)) as result: + self.assertEqual(result.termination, Termination.TIME_LIMIT) + token.close() + with self.assertRaises(RuntimeError): + model.solve(Options(cancellation=token)) + + def test_infeasible_unbounded_and_explicit_native(self): + with Model(self.lib) as model: + x = model.add_variable(upper=1) + model.add_row({x: 1}, lower=2) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assertEqual(result.termination, Termination.INFEASIBLE if self.highs else Termination.UNSUPPORTED) + self.assertIsNone(result.objective) + with Model(self.lib) as model: + x = model.add_variable() + model.set_objective({x: -1}) + with model.solve(Options(backend=Backend.HIGHS)) as result: + expected = (Termination.UNBOUNDED, Termination.INFEASIBLE_OR_UNBOUNDED) if self.highs else (Termination.UNSUPPORTED,) + self.assertIn(result.termination, expected) + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, upper=4) + model.set_objective({x: 1}, maximize=True, offset=-1) + with model.solve(Options(backend=Backend.NATIVE, guarantee=Guarantee.EXACT)) as result: + native = self.lib.capabilities(Backend.NATIVE)["available"] + self.assertEqual(result.termination, Termination.OPTIMAL if native else Termination.UNSUPPORTED) + if native: + self.assertEqual(result.objective, 3) + self.assertEqual(result.value(x), 4) + + def test_read_prepares_owner_before_allocating_c_model(self): + class AllocationFailure(Model): + def __new__(cls): + raise MemoryError("owner allocation failed") + + class InitializationFailure(Model): + def _initialize(self, library, handle=None): + raise MemoryError("owner initialization failed") + + for owner in (AllocationFailure, InitializationFailure): + with self.subTest(owner=owner.__name__): + with patch.object(self.lib, "call", wraps=self.lib.call) as call: + with self.assertRaises(MemoryError): + owner.read("not-read.lp", self.lib) + call.assert_not_called() + + def test_io_roundtrip_and_failure_preserves_destination(self): + with tempfile.TemporaryDirectory() as directory, Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, upper=8, name="quantity") + model.add_row({x: 2}, lower=3, upper=9, name="demand") + model.set_objective({x: 3}, maximize=True, offset=-1.25) + for extension in ("lp", "mps"): + path = Path(directory) / ("model." + extension) + model.write(path) + with Model.read(path, self.lib) as imported, imported.solve(Options(backend=Backend.HIGHS)) as result: + self.assertNotEqual(imported.identity[0], model.identity[0]) + self.assert_solution(result, 10.75) + if self.highs: + with self.assertRaises(ApiError): + result.value(x) + path.write_text("preserve me", encoding="utf8") + with self.assertRaises(ApiError): + Model.read(path, self.lib) + self.assertEqual(path.read_text(), "preserve me") + bad = Path(directory) / "model.unsupported" + bad.write_text("unchanged", encoding="utf8") + with self.assertRaises(ApiError): + model.write(bad) + self.assertEqual(bad.read_text(), "unchanged") + + def test_global_builders_auto_routing_and_sessions(self): + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, 0, 2) + y = model.add_variable(VariableType.INTEGER, 0, 2) + distinct = model.add_all_different([x, y], name="distinct") + self.assertIsInstance(distinct, GlobalConstraint) + table = model.add_table([x, y], [(0, 1), (2, 0)]) + # Index/result/array aliases retain their exact meaning: x=2 is + # outside this element's indices, so the only solution is (0,1). + model.add_element(x, [x, y], x) + model.add_cumulative([x, x], [0, 1], [100, 0], capacity=0) + successors = [model.add_variable(VariableType.INTEGER, v, v) for v in [2, 3, 1]] + model.add_circuit(successors, index_base=1) + model.set_objective({x: 1, y: 2}) + model.set_name(distinct, "renamed") + for backend in (Backend.AUTO, Backend.NATIVE): + with model.solve(Options(backend=backend)) as result: + self.assertEqual(result.termination, Termination.OPTIMAL if self.native else Termination.UNSUPPORTED) + if self.native: + self.assertEqual(result.objective, 2) + self.assertEqual((result.value(x), result.value(y)), (0, 1)) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assertEqual(result.termination, Termination.UNSUPPORTED) + # The persistent numerical session keeps its declared route. + with Session(self.lib) as session: + with session.solve(model) as result: + self.assertEqual(result.termination, Termination.UNSUPPORTED) + with session.solve(model, Options(backend=Backend.NATIVE)) as result: + # A persistent numerical session never changes backend; + # explicit Native is available on Model.solve instead. + self.assertEqual(result.termination, Termination.UNSUPPORTED) + with self.assertRaises(ApiError): + model.remove(x) + with self.assertRaises(TypeError): + model.set_bounds(distinct, 0, 1) + with tempfile.TemporaryDirectory() as directory: + with self.assertRaises(ApiError): + model.write(Path(directory) / "globals.lp") + model.remove(table) + with self.assertRaises(ApiError): + model.remove(table) + with self.assertRaises(ApiError): + model.set_name(table, "deleted") + + def test_global_aliases_bases_and_zero_cases(self): + def check(model, feasible): + with model.solve(Options(backend=Backend.NATIVE)) as result: + expected = Termination.OPTIMAL if feasible else Termination.INFEASIBLE + self.assertEqual(result.termination, expected if self.native else Termination.UNSUPPORTED) + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, 0, 2) + model.add_all_different([x, x]) + check(model, False) + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, 0, 2) + model.add_table([x, x], [(0, 1)]) + check(model, False) + with Model(self.lib) as model: + index = model.add_variable(VariableType.INTEGER, -2, -2) + model.add_element(index, [index], index, index_base=-2) + check(model, True) + for tuples, feasible in [([], False), ([()], True)]: + with Model(self.lib) as model: + model.add_table([], tuples) + model.add_all_different([]) + model.add_cumulative([], [], [], 0) + check(model, feasible) + with Model(self.lib) as model: + x = model.add_variable(VariableType.INTEGER, 1, 2) + model.add_circuit([x, x], index_base=1) + check(model, False) + + def test_global_errors_are_atomic(self): + with Model(self.lib) as model, Model(self.lib) as foreign: + x = model.add_variable(VariableType.INTEGER, 0, 2) + y = foreign.add_variable(VariableType.INTEGER, 0, 2) + continuous = model.add_variable(upper=2) + dead = model.add_variable(VariableType.INTEGER, 0, 2) + model.remove(dead) + before = model.identity + failures = [ + (lambda: model.add_all_different([y]), ApiError), + (lambda: model.add_all_different([dead]), ApiError), + (lambda: model.add_all_different([continuous]), ApiError), + (lambda: model.add_table([x], [(1, 2)]), ValueError), + (lambda: model.add_table([x], [(2**63,)]), OverflowError), + (lambda: model.add_table([x], [(2**53+1,)]), ApiError), + (lambda: model.add_table([x], [(1.0,)]), TypeError), + (lambda: model.add_element(x, [x], x, index_base=2**63), OverflowError), + (lambda: model.add_element(x, [x], x, index_base=True), TypeError), + (lambda: model.add_cumulative([x], [], [1], 1), ApiError), + (lambda: model.add_cumulative([x], [-1], [1], 1), ApiError), + (lambda: model.add_cumulative([x], [1], [1], -1), ApiError), + (lambda: model.add_circuit([]), ApiError), + (lambda: model.add_circuit([x], index_base=2**53+1), ApiError), + ] + for action, error in failures: + with self.assertRaises(error): + action() + self.assertEqual(model.identity, before) + global_id = model.add_all_different([x]) + with self.assertRaises(ApiError): + foreign.remove(global_id) + model.remove(global_id) + model.remove(x) + + def test_indicator_guards_removal_and_boolean_semantics(self): + for active in (False, True): + with Model(self.lib) as model: + b = model.add_variable(VariableType.BINARY, int(active), int(active)) + x = model.add_variable(VariableType.INTEGER, 0, 4) + model.set_objective({x: 1}) + before = model.identity + for action, error in [ + (lambda: model.add_indicator(b, 1, {x: 1}, lower=3), TypeError), + (lambda: model.add_indicator(x, active, {x: 1}, lower=3), ApiError), + (lambda: model.add_indicator(b, active, {x: math.inf}, lower=3), ApiError), + (lambda: model.add_boolean_and(b, [x]), ApiError), + ]: + with self.assertRaises(error): + action() + self.assertEqual(model.identity, before) + indicator = model.add_indicator(b, active, {x: 1}, lower=3) + self.assertIsInstance(indicator, Indicator) + self.assertIsNotNone(indicator.inactive_gate) + with self.assertRaises(ApiError): + model.set_bounds(x, 0, 5) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 3, [(x, 3)]) + with tempfile.TemporaryDirectory() as directory: + with self.assertRaises(ApiError): + model.write(Path(directory) / "indicator.lp") + model.remove(indicator) + with self.assertRaises(ApiError): + model.remove(indicator) + model.remove(indicator.inactive_gate) + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 0, [(x, 0)]) + tautology = model.add_indicator(b, active) + self.assertIsNone(tautology.inactive_gate) + model.remove(tautology) + for left in (0, 1): + for right in (0, 1): + with Model(self.lib) as model: + a = model.add_variable(VariableType.BINARY, left, left) + b = model.add_variable(VariableType.BINARY, right, right) + conjunction = model.add_variable(VariableType.BINARY) + disjunction = model.add_variable(VariableType.BINARY) + true = model.add_variable(VariableType.BINARY) + false = model.add_variable(VariableType.BINARY) + self.assertIsNone(model.add_boolean_and(conjunction, [a, b, a])) + model.add_boolean_or(disjunction, [a, b, b]) + model.add_boolean_and(true) + model.add_boolean_or(false) + model.add_boolean_and(a, [a, a]) # aliased output/input + with model.solve(Options(backend=Backend.HIGHS)) as result: + self.assert_solution(result, 0, [(conjunction, left & right), + (disjunction, left | right), + (true, 1), (false, 0)]) + + def test_thread_local_errors_and_independent_solves(self): + barrier = threading.Barrier(2) + def error_worker(which): + if which == 0: + code = self.lib._functions["model_destroy"](0) + else: + code = self.lib._functions["model_create"](None) + barrier.wait(timeout=5) + text = self.lib._dll.gecode_opt_v1_last_error().decode() + return code, text + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + a, b = list(executor.map(error_worker, range(2))) + self.assertEqual(a[0], 2) + self.assertIn("handle", a[1]) + self.assertEqual(b[0], 1) + self.assertIn("pointer", b[1]) + def solve_worker(lower): + with Model(self.lib) as model, Session(self.lib) as session: + x = model.add_variable(VariableType.INTEGER, lower, 20) + model.set_objective({x: 1}) + with session.solve(model, Options(backend=Backend.HIGHS)) as result: + return result.termination, result.objective + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + results = list(executor.map(solve_worker, [2, 7])) + expected = [(Termination.OPTIMAL, 2), (Termination.OPTIMAL, 7)] if self.highs else [(Termination.UNSUPPORTED, None)] * 2 + self.assertEqual(results, expected) + + +if __name__ == "__main__": + unittest.main() diff --git a/python/tests/test_lp_basis.py b/python/tests/test_lp_basis.py new file mode 100644 index 0000000000..7167d9d359 --- /dev/null +++ b/python/tests/test_lp_basis.py @@ -0,0 +1,141 @@ +"""Owning LP basis factories and explicit submission semantics across the ABI.""" +import ctypes as C +from dataclasses import FrozenInstanceError +import math +import unittest +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Library, Model, + Options, Row, Session, Termination as T, VariableType, load_library, LpObservationOptions as LO, + LpBasis, LpBasisOrigin as Origin, LpBasisStatus as B, LpBasisSubmissionState as S) +from gecode_optimize import binding as b + +class LpBasisTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library();cls.available=cls.library.lp_observation_capabilities().available + def model(self): + m=Model(self.library);x=m.add_variable();y=m.add_variable();dead=m.add_variable();m.remove(dead) + deleted=m.add_row();m.remove(deleted);row=m.add_row([(x,1),(y,1)],lower=4) + m.set_objective([(x,2),(y,3)],offset=7) + return m,x,y,row,dead,deleted + def basis(self,m):return LpBasis.from_model(m,[B.BASIC,B.LOWER,None],[None,B.LOWER]) + def test_factories_copies_and_history(self): + m,x,y,row,dead,deleted=self.model() + with m,Session(self.library) as session,self.basis(m) as basis: + self.assertEqual(basis.info.origin,Origin.CALLER) + self.assertEqual(basis.columns,(B.BASIC,B.LOWER,None));self.assertEqual(basis.rows,(None,B.LOWER)) + self.assertEqual(basis.column(x),B.BASIC);self.assertEqual(basis.row(row),B.LOWER) + with self.assertRaises(FrozenInstanceError):basis.info.origin=Origin.OBSERVATIONS + for bad in (deleted,Row(row.model_id+1,row.slot,self.library)): + with self.assertRaises(ApiError):basis.row(bad) + with self.assertRaises(ApiError):basis.column(dead) + with self.assertRaises(TypeError):basis.row(x) + with session.solve_lp_with_basis(m,basis) as solved: + self.assertEqual(solved.termination,T.OPTIMAL if self.available else T.UNSUPPORTED) + self.assertEqual(solved.submission.state,S.ACCEPTED if self.available else S.NOT_ATTEMPTED) + self.assertEqual(solved.submission.statuses_changed,False if self.available else None) + copied=solved.copy_basis();observed=solved.copy_observed();ordinary=observed.copy_result() + if self.available: + with LpBasis.from_observed(observed) as exported: + self.assertEqual(exported.info.origin,Origin.OBSERVATIONS) + with m.solve_lp_with_basis(exported) as second: + self.assertEqual(second.termination,T.OPTIMAL) + else: + with self.assertRaises(ApiError):LpBasis.from_observed(observed) + revision=copied.info.revision;m.set_bounds(row,5,math.inf) + with session.solve_lp_with_basis(m,copied) as stale: + self.assertEqual(stale.termination,T.INVALID_MODEL);self.assertFalse(stale.submission.backend_attempted) + self.assertEqual(stale.info['requested_revision'],revision) + with stale.copy_basis() as retained:self.assertEqual(retained.info.revision,revision) + with session.solve_lp_observed(m) as fresh: + if self.available: + with fresh.copy_result() as result:self.assertEqual(result.objective,17) + with copied,observed,ordinary: + self.assertEqual(copied.column(x),B.BASIC) + self.assertEqual(copied.info.revision,revision) + if self.available:self.assertEqual(ordinary.objective,15);self.assertEqual(ordinary.value(x),4) + with self.assertRaises(RuntimeError):copied.column(x) + def test_source_library_and_options(self): + m,*_=self.model();other,*_=self.model() + with m,other,self.basis(m) as basis,Session(self.library) as session: + with other.solve_lp_with_basis(basis) as foreign:self.assertEqual(foreign.termination,T.INVALID_MODEL) + for solve in (Options(backend=Backend.NATIVE),Options(guarantee=Guarantee.EXACT),Options(guarantee=Guarantee.CERTIFIED)): + with m.solve_lp_with_basis(basis,LO(solve=solve)) as out: + self.assertEqual(out.termination,T.UNSUPPORTED);self.assertFalse(out.submission.backend_attempted) + for invalid in (Options(),object()): + with self.assertRaises(TypeError):m.solve_lp_with_basis(basis,invalid) + with self.assertRaises(TypeError):m.solve_lp_with_basis(object()) + another=Library(self.library.path) + with Model(another) as alien: + with self.assertRaises(TypeError):alien.solve_lp_with_basis(basis) + with self.assertRaises(TypeError):session.solve_lp_with_basis(alien,basis) + with self.assertRaises(TypeError):LpBasis.from_observed(object()) + def test_counts_statuses_and_c_records(self): + m,x,*_=self.model() + with m: + for columns,rows in (([],[]),([None,B.LOWER,None],[None,B.BASIC]),([B.BASIC,B.LOWER,B.LOWER],[None,B.LOWER]),([B.LOWER,B.LOWER,None],[None,B.LOWER])): + with self.assertRaises(ApiError):LpBasis.from_model(m,columns,rows) + for invalid in (True,0.5,object()): + with self.assertRaises(TypeError):LpBasis.from_model(m,[invalid],[]) + for invalid in (-1,99): + with self.assertRaises(ValueError):LpBasis.from_model(m,[invalid],[]) + with self.basis(m) as basis: + for mutate in (lambda o:setattr(o,'struct_size',C.sizeof(o)-1),lambda o:setattr(o,'reserved',1), + lambda o:setattr(o,'basis',2),lambda o:setattr(o.solve,'reserved',1)): + options=LO()._marshal(self.library);mutate(options);out=b.U64(99) + with self.assertRaises(ApiError) as error:self.library.call('solve_lp_with_basis',m._open(),basis._open(),C.byref(options),C.byref(out)) + self.assertEqual(error.exception.code,1);self.assertEqual(out.value,0) + with self.assertRaises(ApiError):m.solve_lp_with_basis(basis,LO(solve=Options(primal_start=[(x,4)]))) + out=b._BasisInfo() + with self.assertRaises(ApiError):self.library.call('basis_info',basis._open(),C.byref(out),C.sizeof(out)-1) + values=(b.I32*2)(77,88);needed=b.U64() + with self.assertRaises(ApiError) as error:self.library.call('basis_statuses',basis._open(),1,values,2,C.byref(needed)) + self.assertEqual(error.exception.code,6);self.assertEqual(tuple(values),(77,88));self.assertEqual(needed.value,3) + with self.assertRaises(ApiError):self.library.call('basis_statuses',basis._open(),0,None,0,C.byref(needed)) + def test_cancellation_limits_and_reset(self): + m,*_=self.model() + with m,self.basis(m) as basis,Session(self.library) as session,Cancellation(self.library) as cancel: + cancel.cancel() + for options,expected in ((Options(time_limit_seconds=0),T.TIME_LIMIT),(Options(cancellation=cancel),T.CANCELLED)): + with session.solve_lp_with_basis(m,basis,LO(solve=options)) as out: + self.assertEqual(out.termination,expected if self.available else T.UNSUPPORTED) + self.assertFalse(out.submission.backend_attempted) + with out.copy_observed() as observed:self.assertFalse(observed.has_solution) + with session.solve_lp_with_basis(m,basis) as out:self.assertEqual(out.termination,T.OPTIMAL if self.available else T.UNSUPPORTED) + def test_singular_repair_and_final_basis_distinction(self): + with Model(self.library) as m: + x=m.add_variable();y=m.add_variable();m.add_row([(x,1),(y,1)],1,1);m.add_row([(x,2),(y,2)],2,2) + m.set_objective([(x,1),(y,2)]) + with LpBasis.from_model(m,[B.BASIC,B.BASIC],[B.LOWER,B.LOWER]) as basis,m.solve_lp_with_basis(basis) as out: + self.assertEqual(out.submission.state,S.REPAIRED if self.available else S.NOT_ATTEMPTED) + self.assertEqual(out.submission.statuses_changed,True if self.available else None) + if self.available: + with out.copy_observed() as observed,observed.copy_result() as ordinary:self.assertEqual(ordinary.objective,1) + m,*_=self.model() + with m,LpBasis.from_model(m,[B.LOWER,B.LOWER,None],[None,B.BASIC]) as logical,m.solve_lp_with_basis(logical) as out: + if self.available: + self.assertEqual(out.submission.state,S.ACCEPTED);self.assertFalse(out.submission.statuses_changed) + with out.copy_observed() as observed:self.assertEqual(observed.observations.columns[0].basis,B.BASIC) + def test_requested_basis_survives_unrequested_export(self): + m,*_=self.model() + with m,self.basis(m) as basis,m.solve_lp_with_basis(basis,LO(basis=False,duals=False)) as out: + with out.copy_basis() as copy:self.assertEqual(copy.columns,basis.columns) + with out.copy_observed() as observed: + with self.assertRaises(ApiError) as error:LpBasis.from_observed(observed) + self.assertEqual(error.exception.code,3) + with observed.copy_result() as result: + self.assertEqual(result.termination,T.OPTIMAL if self.available else T.UNSUPPORTED) + + def test_empty_and_zero_row_max(self): + with Model(self.library) as m,LpBasis.from_model(m,[],[]) as basis,m.solve_lp_with_basis(basis) as out: + self.assertEqual(basis.columns,());self.assertEqual(basis.rows,());self.assertFalse(out.submission.backend_attempted) + self.assertEqual(out.termination,T.OPTIMAL if self.available else T.UNSUPPORTED) + with Model(self.library) as m: + x=m.add_variable(lower=0,upper=5);m.set_objective([(x,2)],maximize=True,offset=7) + with LpBasis.from_model(m,[B.UPPER],[]) as basis,m.solve_lp_with_basis(basis) as out: + if self.available: + with out.copy_observed() as observed,observed.copy_result() as ordinary:self.assertEqual(ordinary.objective,17) + with Model(self.library) as m: + m.add_variable(VariableType.INTEGER,0,1) + with self.assertRaises(ApiError):LpBasis.from_model(m,[B.LOWER],[]) + +if __name__=='__main__':unittest.main() diff --git a/python/tests/test_lp_evidence.py b/python/tests/test_lp_evidence.py new file mode 100644 index 0000000000..946e5954e2 --- /dev/null +++ b/python/tests/test_lp_evidence.py @@ -0,0 +1,196 @@ +"""Numerical LP evidence boundaries, private raw stages, and historical ownership.""" +import ctypes as C +from dataclasses import FrozenInstanceError +import math +import unittest +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Library, Model, + Options, Row, Session, Termination as T, Variable, VariableType as V, load_library, + LpEvidenceOptions as EO, LpEvidenceRequest as Request, LpEvidenceState as State, + LpEvidenceReason as Reason, LpEvidenceCompletion as Completion, LpEvidencePhase as Phase, + LpEvidenceSide as Side, LpEvidenceColumnKind as Kind) +from gecode_optimize import binding as b + +class LpEvidenceTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library();cls.available=cls.library.capabilities(Backend.HIGHS)['available'] + def ray_model(self): + m=Model(self.library);dead=m.add_variable();m.remove(dead) + x=m.add_variable();y=m.add_variable(lower=-math.inf) + gone=m.add_row();m.remove(gone);row=m.add_row([(x,1),(y,-1)],0,0) + m.set_objective([(x,-1)],offset=7) + return m,x,y,row,dead,gone + def test_ray_groups_and_owning_raw_stage(self): + m,x,y,row,dead,gone=self.ray_model();identity=m.identity + with m,m.analyze_lp_evidence(EO(request=Request.BOTH)) as result: + info=result.info;self.assertTrue(info.has_evidence);self.assertEqual((info.model_id,info.revision),identity) + self.assertEqual(info.stage_count,3);self.assertEqual((info.column_slots,info.row_slots),(3,2)) + self.assertEqual(m.identity,identity) + diag=result.diagnostics;self.assertEqual(len(diag.columns),3);self.assertFalse(diag.columns[0].active) + self.assertIsNone(diag.columns[0].base_value);self.assertIsNone(diag.columns[0].direction) + self.assertFalse(diag.rows[0].active);self.assertEqual(diag.columns[x.slot].source,x) + with self.assertRaises(FrozenInstanceError):info.work=0 + with self.assertRaises(FrozenInstanceError):diag.columns[0].direction=1 + if self.available: + self.assertEqual(info.completion,Completion.COMPLETE);self.assertIsNone(info.stop_reason);self.assertEqual(info.attempted_calls,3) + self.assertEqual(result.primal_ray.state,State.AVAILABLE);self.assertEqual(result.farkas.state,State.UNAVAILABLE) + self.assertEqual((result.direction_value(x),result.direction_value(y)),(1,1));self.assertEqual(result.base_value(x),0) + self.assertEqual(diag.primal.normalized_objective_slope,-1);self.assertTrue(diag.primal.base_check.valid) + self.assertEqual(result.slot(row).direction,0) + else: + self.assertEqual(info.stop_reason,T.UNSUPPORTED);self.assertEqual(info.attempted_calls,0) + self.assertEqual(result.primal_ray.state,State.REJECTED);self.assertIsNone(diag.primal.base_check) + self.assertIsNone(diag.primal.normalized_objective_slope) + with self.assertRaises(ApiError):result.direction_value(x) + for invalid in (dead,gone,Variable(x.model_id+1,x.slot,self.library)): + with self.assertRaises(ApiError):result.slot(invalid) + with self.assertRaises(TypeError):result.base_value(row) + with self.assertRaises(ApiError):result.multiplier(row) + child=result.copy_stage(1);stage=child.info;columns=child.columns;values=child.raw_values + self.assertEqual(stage.phase,Phase.RECESSION);self.assertNotEqual(stage.private_model_id,identity[0]);self.assertEqual(stage.column_count,2) + self.assertEqual(columns[0].source,x);self.assertEqual(columns[1].source,y) + self.assertEqual(columns[0].kind,Kind.SOURCE_VARIABLE);self.assertIsNone(columns[0].side) + self.assertEqual(columns[0].private_variable.model_id,stage.private_model_id) + self.assertFalse(hasattr(child,'has_solution'));self.assertFalse(hasattr(child,'copy_result')) + if self.available: + self.assertTrue(stage.attempted);self.assertTrue(stage.candidate_examined);self.assertTrue(stage.check.valid) + self.assertTrue(stage.raw_result.reported_solution_validated);self.assertEqual(stage.raw_result.termination_code,int(T.OPTIMAL)) + self.assertEqual(stage.raw_result.objective,-1);self.assertEqual(stage.raw_result.model_id,stage.private_model_id) + self.assertEqual(values[0].reported_value,1);self.assertEqual(values[0].reported_mask,1) + else: + self.assertFalse(stage.attempted);self.assertIsNone(stage.raw_result);self.assertIsNone(stage.check);self.assertEqual(values,()) + m.set_objective([(y,1)]);m.remove(row);m.remove(x) + self.assertEqual(result.slot(x),diag.columns[x.slot]) + with child: + self.assertEqual(child.info,stage);self.assertEqual(child.columns,columns);self.assertEqual(child.raw_values,values) + self.assertEqual(child.raw_backend,'HiGHS' if self.available else '') + self.assertEqual(diag.metadata.primal_tolerance,1e-7) + with self.assertRaises(RuntimeError):child.info + with self.assertRaises(RuntimeError):result.info + def test_requests_and_public_solve_counts(self): + for request,count in ((Request.AUTOMATIC,2),(Request.PRIMAL_RAY,2),(Request.FARKAS,1),(Request.BOTH,3)): + with Model(self.library) as m: + x=m.add_variable();m.set_objective([(x,-1)]) + with m.analyze_lp_evidence(EO(request=request)) as result: + self.assertEqual(result.info.attempted_calls,count if self.available else 0) + if request==Request.FARKAS:self.assertEqual(result.primal_ray.state,State.NOT_REQUESTED) + if request==Request.PRIMAL_RAY:self.assertEqual(result.farkas.state,State.NOT_REQUESTED) + if request==Request.AUTOMATIC: + with result.copy_stage(2) as unused: + self.assertFalse(unused.info.attempted);self.assertIsNone(unused.info.raw_result) + with Model(self.library) as empty,empty.analyze_lp_evidence(EO(request=Request.BOTH)) as result: + # Includes local empty/constant solve decisions, not raw vendor runs. + self.assertEqual(result.info.attempted_calls,3 if self.available else 0) + if self.available: + self.assertEqual(result.primal_ray.state,State.UNAVAILABLE);self.assertEqual(result.farkas.state,State.UNAVAILABLE) + self.assertEqual(result.diagnostics.columns,());self.assertTrue(result.diagnostics.primal.base_check.valid) + def test_farkas_signs_sides_and_auxiliary_coordinates(self): + for upper in (False,True): + for maximize in (False,True): + with Model(self.library) as m: + x=m.add_variable(lower=0 if upper else -math.inf,upper=math.inf if upper else 0) + row=m.add_row([(x,1)],lower=-math.inf if upper else 1,upper=-1 if upper else math.inf) + m.set_objective([(x,3)],maximize=maximize,offset=1e16) + with m.analyze_lp_evidence(EO(request=Request.FARKAS)) as result: + self.assertEqual(result.primal_ray.state,State.NOT_REQUESTED) + if self.available: + self.assertEqual(result.farkas.state,State.AVAILABLE) + yr=result.multiplier(row);zc=result.multiplier(x) + self.assertEqual(yr.multiplier,-1 if upper else 1);self.assertEqual(zc.multiplier,1 if upper else -1) + self.assertEqual(yr.side,Side.UPPER if upper else Side.LOWER) + self.assertEqual(zc.side,Side.LOWER if upper else Side.UPPER) + self.assertEqual(yr.contribution+zc.contribution,1);self.assertEqual(zc.selected_bound,0) + self.assertEqual(result.diagnostics.farkas.contradiction_margin,1) + else:self.assertIsNone(result.diagnostics.farkas.contradiction_margin) + with result.copy_stage(0) as stage: + maps=stage.columns;self.assertEqual(len(maps),2) + self.assertEqual(maps[0].source,row);self.assertEqual(maps[0].kind,Kind.ROW_SIDE) + self.assertEqual(maps[1].source,x);self.assertEqual(maps[1].kind,Kind.VARIABLE_SIDE) + if self.available:self.assertAlmostEqual(stage.info.raw_result.objective,0.5) + with Model(self.library) as m: + x=m.add_variable(lower=-math.inf);lower=m.add_row([(x,1)],lower=1);upper=m.add_row([(x,1)],upper=0) + with m.analyze_lp_evidence(EO(request=Request.FARKAS)) as result: + if self.available: + zero=result.multiplier(x);self.assertEqual(zero.multiplier,0);self.assertIsNone(zero.side);self.assertIsNone(zero.selected_bound) + self.assertEqual(zero.contribution,0);self.assertEqual(result.multiplier(lower).multiplier,1);self.assertEqual(result.multiplier(upper).multiplier,-1) + with Model(self.library) as m: + row=m.add_row(upper=-2) + with m.analyze_lp_evidence() as result: + if self.available:self.assertEqual(result.multiplier(row).multiplier,-1);self.assertEqual(result.diagnostics.farkas.contradiction_margin,2) + self.assertEqual(result.diagnostics.columns,()) + def test_direction_sense_offset_and_unavailable_bounded(self): + for upper in (False,True): + for maximize in (False,True): + with Model(self.library) as m: + x=m.add_variable(lower=-math.inf if upper else 0,upper=0 if upper else math.inf) + coefficient=(1 if upper else -1)*(-1 if maximize else 1) + m.set_objective([(x,coefficient)],maximize=maximize,offset=1e16) + with m.analyze_lp_evidence() as result: + if self.available:self.assertEqual(result.direction_value(x),-1 if upper else 1);self.assertEqual(result.diagnostics.primal.normalized_objective_slope,-1) + with Model(self.library) as m: + x=m.add_variable(upper=1);m.set_objective([(x,1)]) + with m.analyze_lp_evidence(EO(request=Request.BOTH)) as result: + if self.available: + self.assertEqual(result.primal_ray.state,State.UNAVAILABLE);self.assertEqual(result.farkas.state,State.UNAVAILABLE) + self.assertTrue(result.diagnostics.primal.base_check.valid) + with self.assertRaises(ApiError):result.base_value(x) + with self.assertRaises(ApiError):result.direction_value(x) + def test_limits_cancel_and_unsupported_scope(self): + with Model(self.library) as m,Cancellation(self.library) as cancel: + x=m.add_variable();m.set_objective([(x,-1)]);cancel.cancel() + for options,reason in ((EO(solve=Options(time_limit_seconds=0)),T.TIME_LIMIT), + (EO(solve=Options(cancellation=cancel)),T.CANCELLED),(EO(solve=Options(node_limit=0)),T.NODE_LIMIT), + (EO(max_work=0),T.ITERATION_LIMIT),(EO(max_auxiliary_variables=0),T.MEMORY_LIMIT), + (EO(max_auxiliary_rows=0),T.MEMORY_LIMIT),(EO(max_auxiliary_nonzeros=0),T.MEMORY_LIMIT), + (EO(max_retained_slots=0),T.MEMORY_LIMIT),(EO(max_auxiliary_solves=0),T.ITERATION_LIMIT if self.available else T.UNSUPPORTED)): + with m.analyze_lp_evidence(options) as result: + self.assertEqual(result.info.stop_reason,reason);self.assertEqual(result.info.attempted_calls,0) + if not result.info.has_evidence:self.assertIsNone(result.primal_ray);self.assertIsNone(result.farkas);self.assertIsNone(result.diagnostics) + with m.analyze_lp_evidence(EO(max_auxiliary_solves=1)) as result: + self.assertEqual(result.info.attempted_calls,1 if self.available else 0) + self.assertNotEqual(result.primal_ray.state,State.AVAILABLE) + for solve in (Options(backend=Backend.NATIVE),Options(guarantee=Guarantee.EXACT),Options(guarantee=Guarantee.CERTIFIED),Options(primal_start=[(x,0)])): + with m.analyze_lp_evidence(EO(solve=solve)) as result: + self.assertEqual(result.info.stop_reason,T.UNSUPPORTED);self.assertEqual(result.info.attempted_calls,0) + for kind in ('fixed_integer','semi','global','indicator'): + with Model(self.library) as m: + x=m.add_variable(V.INTEGER if kind=='fixed_integer' else V.SEMI_CONTINUOUS if kind=='semi' else V.CONTINUOUS,1,1) + if kind=='global':m.add_all_different([]) + if kind=='indicator': + gate=m.add_variable(V.BINARY);m.add_indicator(gate,True,[(x,1)],lower=1) + with m.analyze_lp_evidence() as result:self.assertEqual(result.info.stop_reason,T.UNSUPPORTED) + def test_c_layout_buffers_wrong_kind_and_python_types(self): + m,x,*_=self.ray_model() + with m: + for mutate in (lambda o:setattr(o,'struct_size',1),lambda o:setattr(o,'reserved',1),lambda o:setattr(o,'reserved_flags',1), + lambda o:setattr(o,'request',99),lambda o:setattr(o.solve,'struct_size',1),lambda o:setattr(o.solve,'reserved',1)): + native=EO()._marshal(self.library);mutate(native);out=b.U64(99) + with self.assertRaises(ApiError):self.library.call('analyze_lp_evidence',m._open(),C.byref(native),C.byref(out)) + self.assertEqual(out.value,0) + for opts in (EO(stationarity=-1),EO(recession=math.inf),EO(minimum_contradiction=math.nan)): + with self.assertRaises(ApiError):m.analyze_lp_evidence(opts) + for opts in (Options(),object()): + with self.assertRaises(TypeError):m.analyze_lp_evidence(opts) + for value in (True,0.5): + with self.assertRaises(TypeError):m.analyze_lp_evidence(EO(max_auxiliary_solves=value)) + other=Library(self.library.path) + with m.analyze_lp_evidence() as result,result.copy_stage(0) as child: + for owner in (result,child): + ordinary=b._Info() + with self.assertRaises(ApiError):self.library.call('result_info',owner._open(),C.byref(ordinary),C.sizeof(ordinary)) + out=b._EvidenceStage() + with self.assertRaises(ApiError):self.library.call('lp_evidence_stage_info',child._open(),C.byref(out),C.sizeof(out)-1) + with self.assertRaises(ApiError):self.library.call('lp_evidence_stage_info',result._open(),C.byref(out),C.sizeof(out)) + needed=b.U64();slots=(b._EvidenceSlot*1)();slots[0].active=77 + with self.assertRaises(ApiError) as error:self.library.call('lp_evidence_slots',result._open(),1,slots,C.sizeof(b._EvidenceSlot),1,C.byref(needed)) + self.assertEqual(error.exception.code,6);self.assertEqual(slots[0].active,77);self.assertEqual(needed.value,3) + with self.assertRaises(ApiError):self.library.call('lp_evidence_slots',result._open(),1,None,C.sizeof(b._EvidenceSlot)-1,0,C.byref(needed)) + with self.assertRaises(ApiError):self.library.call('lp_evidence_stage_text',child._open(),99,None,0,C.byref(needed)) + with self.assertRaises(ApiError):result.copy_stage(99) + with self.assertRaises(ValueError):result.slot(Variable(x.model_id,x.slot,other)) + with self.assertRaises(TypeError):result.slot(object()) + with self.assertRaises(FrozenInstanceError):child.info.phase=Phase.FARKAS + raw=b._EvidenceRawValue();self.library.call('lp_evidence_stage_raw_values',child._open(),None,C.sizeof(raw),0,C.byref(needed)) + if self.available:self.assertGreater(needed.value,0) + +if __name__=='__main__':unittest.main() diff --git a/python/tests/test_lp_observations.py b/python/tests/test_lp_observations.py new file mode 100644 index 0000000000..5bab164dda --- /dev/null +++ b/python/tests/test_lp_observations.py @@ -0,0 +1,175 @@ +"""Original-coordinate LP observations and owning C/Python boundary tests.""" +import ctypes as C +from dataclasses import FrozenInstanceError +import math +import unittest + +from gecode_optimize import ( + ApiError, Backend, Cancellation, Guarantee, Library, Model, Options, Row, + Session, Termination, VariableType, load_library, LpObservationOptions, + LpObservationState as State, LpObservationReason as Reason, LpBasisStatus, + LpDualSource, QuadraticModel) +from gecode_optimize import binding as b + + +class LpObservationsTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library() + cls.available=cls.library.lp_observation_capabilities().available + + def model(self, maximize=False, offset=7): + m=Model(self.library) + x=m.add_variable(lower=0,upper=10);y=m.add_variable(lower=0,upper=10) + dead=m.add_variable(lower=0,upper=10);m.remove(dead) + removed=m.add_row();m.remove(removed) + row=m.add_row([(x,1),(y,1)],lower=-math.inf if maximize else 3, + upper=3 if maximize else math.inf) + objective=[(x,4 if maximize else 1),(y,1 if maximize else 2)] + m.set_objective(objective,maximize=maximize,offset=offset) + return m,x,y,row,dead,removed + + def test_analytic_signs_offsets_and_copied_history(self): + for maximize in (False,True): + for offset in (0,7,1e16): + with self.subTest(maximize=maximize,offset=offset): + m,x,y,row,dead,removed=self.model(maximize,offset) + with m,Session(self.library) as session: + observed=session.solve_lp_observed(m) + data=observed.observations + ordinary=observed.copy_result() + self.assertEqual(data.model_id,x.model_id) + self.assertEqual(len(data.rows),2);self.assertEqual(len(data.columns),3) + self.assertFalse(data.rows[0].active);self.assertIsNone(data.rows[0].dual) + with self.assertRaises(ValueError):data.row(removed) + with self.assertRaises(ValueError):data.column(dead) + with self.assertRaises(ValueError):data.row(Row(row.model_id+1,row.slot,self.library)) + with self.assertRaises(TypeError):data.row(x) + with self.assertRaises(FrozenInstanceError):data.rows[1].dual=99 + if self.available: + self.assertEqual(observed.termination,Termination.OPTIMAL) + self.assertEqual(data.dual_point.state,State.AVAILABLE) + self.assertTrue(data.checks.accepted) + self.assertAlmostEqual(data.row(row).dual,4 if maximize else 1) + self.assertAlmostEqual(data.column(y).reduced_cost,-3 if maximize else 1) + self.assertEqual(data.column(y).basis,LpBasisStatus.LOWER) + self.assertAlmostEqual(data.row(row).activity,3) + self.assertAlmostEqual(data.checks.normalized_gap,0) + self.assertIsNone(data.row(row).lower_slack if maximize else data.row(row).upper_slack) + self.assertAlmostEqual(data.row(row).upper_slack if maximize else data.row(row).lower_slack,0) + self.assertEqual(ordinary.value(x),3) + self.assertIsNotNone(data.metadata.backend_dual_tolerance) + else: + self.assertEqual(observed.termination,Termination.UNSUPPORTED) + self.assertEqual(data.dual_point.reason,Reason.UNSUPPORTED) + self.assertIsNone(data.row(row).dual);self.assertIsNone(data.checks.normalized_gap) + m.set_bounds(row,-math.inf if maximize else 4,4 if maximize else math.inf) + observed.close() + # Frozen data and separately copied Result own their history. + self.assertEqual(data.row(row).activity,3 if self.available else None) + if self.available:self.assertEqual(ordinary.value(x),3) + ordinary.close() + with self.assertRaises(RuntimeError):observed.copy_result() + + def test_constant_row_and_request_groups(self): + m,x,y,row,_,_=self.model() + with m: + constant=m.add_row(lower=-1,upper=1) + for duals,basis in ((True,True),(False,True),(True,False),(False,False)): + with m.solve_lp_observed(LpObservationOptions(duals=duals,basis=basis)) as result: + data=result.observations + if not duals: + self.assertEqual(data.dual_point.state,State.NOT_REQUESTED) + self.assertIsNone(data.row(row).dual);self.assertIsNone(data.column(y).reduced_cost) + self.assertIsNone(data.checks.max_stationarity) + elif self.available: + self.assertEqual(data.row(constant).dual,0) + self.assertEqual(data.row(constant).dual_source,LpDualSource.DERIVED_CONSTANT_ROW) + if not basis:self.assertEqual(data.basis.state,State.NOT_REQUESTED) + elif self.available: + self.assertEqual(data.basis.state,State.UNAVAILABLE) + self.assertEqual(data.basis.reason,Reason.ELIDED_CONSTANT_ROWS) + self.assertIsNone(data.row(constant).basis) + + def test_session_edits_interruption_no_stale_data(self): + m,x,_,row,_,_=self.model() + with m,Session(self.library) as session,Cancellation(self.library) as cancellation: + with session.solve_lp_observed(m) as old: + original=old.observations + m.set_bounds(row,4,math.inf) + with session.solve_lp_observed(m) as changed: + if self.available:self.assertEqual(changed.observations.row(row).activity,4) + self.assertNotEqual(changed.observations.revision,original.revision) + cancellation.cancel() + for options in (Options(time_limit_seconds=0),Options(cancellation=cancellation)): + with session.solve_lp_observed(m,LpObservationOptions(solve=options)) as stopped: + self.assertEqual(stopped.termination, + (Termination.CANCELLED if options.cancellation else Termination.TIME_LIMIT) if self.available else Termination.UNSUPPORTED) + data=stopped.observations + self.assertIsNone(data.row(row).activity);self.assertIsNone(data.row(row).dual) + self.assertIsNone(data.column(x).basis);self.assertFalse(data.checks.accepted) + self.assertIsNone(data.checks.max_stationarity) + self.assertEqual(original.row(row).activity,3 if self.available else None) + + def test_unsupported_scope_and_types(self): + m,x,_,row,_,_=self.model() + with m: + for solve in (Options(backend=Backend.NATIVE),Options(guarantee=Guarantee.EXACT),Options(guarantee=Guarantee.CERTIFIED)): + with m.solve_lp_observed(LpObservationOptions(solve=solve)) as out: + self.assertEqual(out.termination,Termination.UNSUPPORTED) + self.assertFalse(out.has_solution);self.assertIsNone(out.observations.row(row).dual) + global_id=m.add_all_different([]) + with m.solve_lp_observed() as out:self.assertEqual(out.termination,Termination.UNSUPPORTED) + m.remove(global_id);m.add_variable(VariableType.INTEGER,0,0) + with m.solve_lp_observed() as out:self.assertEqual(out.termination,Termination.UNSUPPORTED) + for options in (Options(),LpObservationOptions(duals=1),LpObservationOptions(solve=object())): + with self.assertRaises(TypeError):m.solve_lp_observed(options) + for value in (-1,math.inf,math.nan): + with self.assertRaises(ApiError):m.solve_lp_observed(LpObservationOptions(stationarity=value)) + with Session(self.library) as session,QuadraticModel(self.library) as qp: + with self.assertRaises(TypeError):session.solve_lp_observed(qp) + + def test_c_sizes_flags_buffers_and_handle_kinds(self): + m,x,y,row,_,_=self.model() + with m,m.solve_lp_observed() as result: + library=self.library + for mutate in (lambda o:setattr(o,"struct_size",C.sizeof(o)-1),lambda o:setattr(o,"reserved",1), + lambda o:setattr(o,"duals",2),lambda o:setattr(o,"basis",-1), + lambda o:setattr(o.solve,"struct_size",C.sizeof(o.solve)-1),lambda o:setattr(o.solve,"reserved",1)): + native=LpObservationOptions()._marshal(library);mutate(native);output=b.U64(99) + with self.assertRaises(ApiError) as caught:library.call("solve_lp_observed",m._open(),C.byref(native),C.byref(output)) + self.assertEqual(caught.exception.code,1);self.assertEqual(output.value,0) + out=b._LpInfo() + with self.assertRaises(ApiError):library.call("lp_observed_result_info",result._open(),C.byref(out),C.sizeof(out)-1) + with self.assertRaises(ApiError) as caught:library.call("lp_observed_result_info",m._open(),C.byref(out),C.sizeof(out)) + self.assertEqual(caught.exception.code,2) + with self.assertRaises(ApiError):library.call("result_info",result._open(),C.byref(b._Info()),C.sizeof(b._Info)) + buffer=(b._LpRow*1)();C.memset(buffer,0x5a,C.sizeof(buffer));before=bytes(buffer);needed=b.U64() + with self.assertRaises(ApiError) as caught:library.call("lp_observed_result_rows",result._open(),buffer,C.sizeof(b._LpRow),1,C.byref(needed)) + self.assertEqual(caught.exception.code,6);self.assertEqual(needed.value,2);self.assertEqual(bytes(buffer),before) + record=b._LpRow();library.call("lp_observed_result_row",result._open(),row._id(),C.byref(record),C.sizeof(record)) + self.assertEqual(record.struct_size,C.sizeof(record));self.assertEqual(record.reserved,0) + self.assertEqual(record.dual.reserved,0) + if not self.available:self.assertEqual((record.dual.present,record.dual.value),(0,0)) + count=b.U64();library.call("lp_observed_result_text",result._open(),0,None,0,C.byref(count)) + text=C.create_string_buffer(count.value);library.call("lp_observed_result_text",result._open(),0,text,count.value,C.byref(count)) + self.assertEqual(text.raw[-1],0) + + def test_empty_available_rows_are_distinct_from_unavailable_duals(self): + with Model(self.library) as model,model.solve_lp_observed() as result: + data=result.observations + self.assertEqual(data.rows,());self.assertEqual(data.columns,()) + self.assertEqual(data.primal_rows.state,State.AVAILABLE if self.available else State.UNAVAILABLE) + self.assertEqual(data.dual_point.state,State.UNAVAILABLE) + self.assertIsNone(data.checks.normalized_gap) + with result.copy_result() as ordinary: + self.assertEqual(ordinary.termination,Termination.OPTIMAL if self.available else Termination.UNSUPPORTED) + + def test_capabilities_are_copied_immutable(self): + caps=self.library.lp_observation_capabilities() + self.assertEqual(caps.available,caps.duals);self.assertEqual(caps.available,caps.basis_export) + self.assertTrue(caps.limitations);self.assertIsInstance(caps.limitations,tuple) + with self.assertRaises(FrozenInstanceError):caps.available=False + + +if __name__=="__main__":unittest.main() diff --git a/python/tests/test_lp_sensitivity.py b/python/tests/test_lp_sensitivity.py new file mode 100644 index 0000000000..bf8a842f21 --- /dev/null +++ b/python/tests/test_lp_sensitivity.py @@ -0,0 +1,204 @@ +"""Original-basis numerical ranges through owning C/Python records.""" +import ctypes as C +from dataclasses import FrozenInstanceError, replace +import math +import unittest +from unittest.mock import patch +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Library, Model, Options, Row, Variable, + VariableType, load_library, LpObservationOptions, LpBasisStatus, LpSensitivityOptions as SO, + LpSensitivityLimits as Limits, LpSensitivityTolerances as Checks, LpObjectiveParameter as Obj, + LpEqualityRhsParameter as Rhs, LpSensitivityCompletion as Complete, LpSensitivityReason as Reason, + LpSensitivityState as State, LpRangeEndKind as End, LpRangeEnd, Termination) +from gecode_optimize import binding as b + +class LpSensitivityTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library();cls.available=cls.library.lp_observation_capabilities().available + def model(self,maximize=False): + m=Model(self.library);dead=m.add_variable();m.remove(dead);x=m.add_variable();y=m.add_variable();z=m.add_variable(upper=1) + gone=m.add_row();m.remove(gone);row=m.add_row([(x,1),(y,1)],3,3) + m.set_objective([(x,-2 if maximize else 2),(y,-1 if maximize else 1)],maximize=maximize,offset=7) + return m,x,y,z,row,dead,gone + def test_analytic_endpoints_and_history(self): + for maximize in (False,True): + m,x,y,z,row,dead,gone=self.model(maximize) + with m,m.solve_lp_observed() as source: + original=source.info + with source.analyze_sensitivity(SO(parameters=(Obj(x),Obj(y),Rhs(row)))) as result: + self.assertEqual(result.info.model_id,x.model_id);self.assertEqual(result.info.guarantee,Guarantee.NUMERICAL) + self.assertEqual(result.work.preparation_visits,3);copied=result.copy_source_observed() + if not self.available: + self.assertEqual(result.info.completion,Complete.REJECTED);self.assertIsNone(result.entries) + self.assertFalse(result.work.factor_setup_attempted) + with self.assertRaises(ApiError) as error:result.copy_basis() + self.assertEqual(error.exception.code,9) + copied.close();continue + self.assertEqual(result.info.completion,Complete.COMPLETE);self.assertIsNone(result.info.stop_reason) + a,c,r=result.entries;self.assertTrue(all(e.group.state is State.AVAILABLE and e.interval.checks.accepted for e in result.entries)) + if maximize: + self.assertEqual(a.interval.lower.kind,End.NEGATIVE_INFINITY);self.assertEqual(a.interval.upper.value,-1) + self.assertEqual(c.interval.lower.value,-2);self.assertEqual(c.interval.upper.kind,End.POSITIVE_INFINITY) + else: + self.assertEqual(a.interval.lower.value,1);self.assertEqual(a.interval.upper.kind,End.POSITIVE_INFINITY) + self.assertEqual(c.interval.lower.kind,End.NEGATIVE_INFINITY);self.assertEqual(c.interval.upper.value,2) + self.assertEqual(r.interval.anchor,3);self.assertEqual(r.interval.lower.value,0) + self.assertEqual(r.interval.upper.kind,End.POSITIVE_INFINITY);self.assertIsNone(r.interval.upper.value) + self.assertEqual(r.interval.objective_slope,-1 if maximize else 1) + self.assertEqual(result.objective(x),a);self.assertEqual(result.equality_rhs(row),r);self.assertIsNone(result.objective(z)) + self.assertEqual(result.factor_order,(y,));self.assertEqual(result.active_slots(Variable),(False,True,True,True)) + self.assertEqual(result.active_slots(Row),(False,True));self.assertTrue(result.reference_checks.primal.valid) + self.assertTrue(result.reference_checks.kkt.accepted);self.assertTrue(result.reference_checks.basis_point_matches) + self.assertIsNotNone(result.reference_checks.max_system_residual) + work=result.work;result.entries;result.reference_checks;result.factor_order;self.assertEqual(work,result.work) + basis=result.copy_basis();saved=result.entries;checks=result.reference_checks + for bad in (dead,Variable(x.model_id+1,x.slot,self.library)): + with self.assertRaises(ApiError):result.objective(bad) + with self.assertRaises(ApiError):result.equality_rhs(gone) + with self.assertRaises(TypeError):result.objective(row) + with self.assertRaises(FrozenInstanceError):r.interval.anchor=99 + m.set_objective_offset(999) + with copied,basis,copied.copy_result() as ordinary: + self.assertEqual(copied.info,original);self.assertEqual(ordinary.objective,4 if maximize else 10) + self.assertEqual(basis.column(y),LpBasisStatus.BASIC) + self.assertTrue(saved[0].interval.checks.accepted);self.assertTrue(checks.kkt.accepted) + with self.assertRaises(RuntimeError):result.entry(0) + def test_singletons_zero_coefficients_and_factor_entities(self): + with Model(self.library) as m: + x=m.add_variable(upper=2);z=m.add_variable(upper=1);r=m.add_row([(x,1)],1,1);q=m.add_row([(x,2)],2,2) + m.set_objective([(x,1)]) + with m.solve_lp_observed() as source,source.analyze_sensitivity(SO(parameters=(Rhs(r),Rhs(q),Obj(z)))) as result: + if not self.available:self.assertEqual(result.info.completion,Complete.REJECTED);return + self.assertEqual(result.info.completion,Complete.COMPLETE) + for entry,anchor in zip(result.entries[:2],(1,2)): + self.assertEqual(entry.interval.lower.value,anchor);self.assertEqual(entry.interval.upper.value,anchor) + self.assertEqual(result.objective(z).interval.anchor,0) + self.assertEqual(len(result.factor_order),2);self.assertTrue(any(isinstance(v,Row) for v in result.factor_order)) + def test_rejections_and_source_preservation(self): + m,x,_,_,row,*_=self.model() + with m,m.solve_lp_observed() as source: + for options in (SO(parameters=(Obj(x),),backend=Backend.NATIVE),SO(parameters=(Obj(x),Obj(x))), + SO(parameters=(Obj(Variable(x.model_id+1,x.slot,self.library)),))): + with source.analyze_sensitivity(options) as result,result.copy_source_observed() as copied: + self.assertEqual(result.info.completion,Complete.REJECTED);self.assertEqual(copied.info,source.info) + self.assertFalse(result.work.factor_setup_attempted) + for observation in (LpObservationOptions(basis=False),LpObservationOptions(duals=False),LpObservationOptions(solve=Options(time_limit_seconds=0))): + with m.solve_lp_observed(observation) as weak,weak.analyze_sensitivity(SO(parameters=(Obj(x),))) as result: + self.assertEqual(result.info.completion,Complete.REJECTED);self.assertFalse(result.work.factor_setup_attempted) + m.set_bounds(row,0,4) + with m.solve_lp_observed() as ranged,ranged.analyze_sensitivity(SO(parameters=(Rhs(row),))) as result: + self.assertEqual(result.info.completion,Complete.REJECTED) + for kind in (VariableType.INTEGER,VariableType.SEMI_CONTINUOUS): + with Model(self.library) as m: + x=m.add_variable(kind,1,2);m.add_row([(x,1)],1,2) + with m.solve_lp_observed() as source,source.analyze_sensitivity(SO(parameters=(Obj(x),))) as result: + self.assertEqual(result.info.completion,Complete.REJECTED) + def test_quotas_cancel_and_invalid_precedence(self): + m,x,*_=self.model() + with m,m.solve_lp_observed() as source,Cancellation(self.library) as token: + self.assertFalse(token.cancelled) + cases=((SO(parameters=(Obj(x),),time_limit_seconds=0),Termination.TIME_LIMIT), + (SO(parameters=(Obj(x),),limits=Limits(max_work=0)),Termination.ITERATION_LIMIT), + (SO(parameters=(Obj(x),),limits=Limits(max_requests=0)),Termination.MEMORY_LIMIT)) + for options,stop in cases: + with source.analyze_sensitivity(options) as result: + self.assertEqual(result.info.completion,Complete.INTERRUPTED);self.assertEqual(result.info.stop_reason,stop) + self.assertEqual(result.work.preparation_visits,0);self.assertFalse(result.work.factor_setup_attempted) + token.cancel();self.assertTrue(token.cancelled) + with source.analyze_sensitivity(SO(parameters=(Obj(x),),cancellation=token)) as result:self.assertEqual(result.info.stop_reason,Termination.CANCELLED) + for options in (SO(),SO(parameters=(Obj(x),),time_limit_seconds=-1,cancellation=token), + SO(parameters=(Obj(x),),checks=Checks(stationarity=math.nan),cancellation=token)): + with source.analyze_sensitivity(options) as result: + self.assertEqual(result.info.completion,Complete.REJECTED);self.assertEqual(result.info.reason,Reason.INVALID_SOURCE) + self.assertIsNone(result.info.stop_reason) + if self.available: + with source.analyze_sensitivity(SO(parameters=(Obj(x),),limits=Limits(max_work=1))) as result: + self.assertEqual(result.work.preparation_visits,1);self.assertEqual(result.work.coordinator_visits,0) + self.assertEqual(result.info.reason,Reason.RESOURCE_LIMIT);self.assertFalse(result.work.factor_setup_attempted) + def test_python_final_cleanup_clear(self): + m,x,y,z,row,*_=self.model() + with m,m.solve_lp_observed() as source,Cancellation(self.library) as token: + if not self.available:return + for cancel in (False,True): + # C++ uses its real monotonic clock. Only the outer Python clock + # advances after a successful C analysis, without a timing race. + calls=iter((0.0,0.0,0.0 if cancel else 2.0));own_call=b._own_call + def finish(*args): + result=own_call(*args) + if cancel and args[2]=='analyze_lp_sensitivity':token.cancel() + return result + with patch.object(b.time,'monotonic',side_effect=lambda:next(calls)),patch.object(b,'_own_call',side_effect=finish): + result=source.analyze_sensitivity(SO(parameters=(Obj(x),Rhs(row)),time_limit_seconds=1,cancellation=token)) + with result: + self.assertEqual(result.info.completion,Complete.INTERRUPTED);self.assertEqual(result.info.reason,Reason.STOPPED) + self.assertEqual(result.info.stop_reason,Termination.CANCELLED if cancel else Termination.TIME_LIMIT) + self.assertTrue(result.info.has_sensitivity) + for entry in (*result.entries,result.entry(0),result.objective(x),result.equality_rhs(row)): + self.assertIsNone(entry.interval);self.assertEqual(entry.group.state,State.UNAVAILABLE) + self.assertIsNone(result.objective(z));self.assertTrue(result.reference_checks.kkt.accepted) + with result.copy_source_observed() as copied:self.assertEqual(copied.info,source.info) + with result.copy_basis() as basis:self.assertEqual(basis.column(y),LpBasisStatus.BASIC) + def test_abi_records_buffers_and_types(self): + m,x,*_=self.model() + with m,m.solve_lp_observed() as source: + for mutate in (lambda o:setattr(o,'struct_size',0),lambda o:setattr(o,'reserved',1), + lambda o:setattr(o.checks,'struct_size',0),lambda o:setattr(o.limits,'reserved',1), + lambda o:setattr(o.requests[0],'struct_size',0),lambda o:setattr(o.requests[0],'reserved_flags',1)): + o=SO(parameters=(Obj(x),))._marshal(self.library);mutate(o);h=b.U64(99) + with self.assertRaises(ApiError) as error:self.library.call('analyze_lp_sensitivity',source._open(),C.byref(o),C.byref(h)) + self.assertEqual(error.exception.code,1);self.assertEqual(h.value,0) + for invalid in (Options(),object()): + with self.assertRaises(TypeError):source.analyze_sensitivity(invalid) + for params in ((object(),),(Obj(1),),(Obj(x),Rhs(x))): + with self.assertRaises(TypeError):source.analyze_sensitivity(SO(parameters=params)) + another=Library(self.library.path) + with Model(another) as other: + alien=other.add_variable() + with self.assertRaises(ValueError):source.analyze_sensitivity(SO(parameters=(Obj(alien),))) + with source.analyze_sensitivity(SO(parameters=(Obj(x),))) as result: + info=b._SensitivityInfo() + with self.assertRaises(ApiError):self.library.call('sensitivity_info',result._open(),C.byref(info),C.sizeof(info)-1) + if self.available: + needed=b.U64();entry=b._SensitivityEntry();C.memset(C.byref(entry),0xA5,C.sizeof(entry)) + with self.assertRaises(ApiError) as error:self.library.call('sensitivity_entries',result._open(),C.byref(entry),C.sizeof(entry),0,C.byref(needed)) + self.assertEqual(error.exception.code,6);self.assertEqual(entry.struct_size,0xa5a5a5a5a5a5a5a5) + for kind,value in ((End.FINITE,None),(End.FINITE,math.inf),(End.POSITIVE_INFINITY,0)): + with self.assertRaises(ValueError):LpRangeEnd(kind,value) + def test_real_partial_interval_is_not_complete(self): + with Model(self.library) as m: + y=m.add_variable(lower=-math.inf);w=m.add_variable(upper=1) + m.add_row([(y,1),(w,1e14)],1,1);m.set_objective([(y,100),(w,1e16-2)]) + with m.solve_lp_observed() as source,source.analyze_sensitivity(SO(parameters=(Obj(y),Obj(w)))) as result: + if not self.available:self.assertEqual(result.info.completion,Complete.REJECTED);return + with source.copy_result() as ordinary:self.assertEqual(ordinary.objective,98) + self.assertEqual(result.info.completion,Complete.PARTIAL) + rejected,accepted=result.entries + self.assertEqual(rejected.group.state,State.REJECTED);self.assertEqual(rejected.group.reason,Reason.INTERVAL_CHECKS) + self.assertIsNone(rejected.interval);self.assertEqual(accepted.group.state,State.AVAILABLE) + self.assertEqual(accepted.interval.upper.value,1e16);self.assertEqual(result.entry(1),accepted) + self.assertEqual(result.objective(y),rejected);self.assertTrue(result.reference_checks.kkt.accepted) + def test_cancellation_owner_close_and_shared_copy(self): + with Cancellation(self.library) as token,token.copy() as copied: + self.assertFalse(copied.cancelled);token.cancel();token.close();self.assertTrue(copied.cancelled) + with copied.copy() as second:copied.close();self.assertTrue(second.cancelled) + m,x,*_=self.model() + with m,m.solve_lp_observed() as source: + if not self.available:return + for cancel in (False,True): + with Cancellation(self.library) as token: + own_call=b._own_call + def finish(*args): + result=own_call(*args) + if args[2]=='analyze_lp_sensitivity': + if cancel:token.cancel() + token.close() + return result + with patch.object(b,'_own_call',side_effect=finish): + result=source.analyze_sensitivity(SO(parameters=(Obj(x),),cancellation=token)) + with result: + self.assertTrue(result.info.has_sensitivity) + self.assertEqual(result.info.completion,Complete.INTERRUPTED if cancel else Complete.COMPLETE) + self.assertEqual(result.info.stop_reason,Termination.CANCELLED if cancel else None) + self.assertEqual(result.entry(0).group.state,State.UNAVAILABLE if cancel else State.AVAILABLE) + self.assertTrue(result.reference_checks.kkt.accepted) +if __name__=='__main__':unittest.main() diff --git a/python/tests/test_native_starts.py b/python/tests/test_native_starts.py new file mode 100644 index 0000000000..770317f679 --- /dev/null +++ b/python/tests/test_native_starts.py @@ -0,0 +1,90 @@ +"""Native complete starts through the existing owning C/Python boundary.""" +import unittest + +from gecode_optimize import (Backend, Cancellation, Guarantee, Model, Options, + Termination, VariableType, load_library) + + +class NativeStarts(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.lib = load_library() + cls.native = cls.lib.capabilities(Backend.NATIVE)["available"] + + def options(self, start, **kwargs): + return Options(backend=Backend.NATIVE, guarantee=Guarantee.EXACT, + primal_start=start, **kwargs) + + def test_both_senses_activation_values_and_owning_history(self): + for active in (False, True): + for maximize in (False, True): + with self.subTest(active=active, maximize=maximize), Model(self.lib) as model: + b = model.add_variable(VariableType.BINARY) + x = model.add_variable(VariableType.INTEGER, 0, 4) + gate = model.add_indicator(b, active, {x: 1}, lower=3).inactive_gate + model.set_objective({x: 1, b: -10}, maximize=maximize, offset=3) + feasible = [(q, v) for q in (0, 1) for v in range(5) + if q != int(active) or v >= 3] + key = lambda pair: pair[1] - 10*pair[0] + 3 + best = (max if maximize else min)(feasible, key=key) + poor = (min if maximize else max)(feasible, key=key) + start = {b: poor[0], x: poor[1]} # omit live derived gate + result = model.solve(self.options(start)) + identity = model.identity + start.clear() + model.set_objective({}, offset=91) + with result: + self.assertEqual(result.termination, Termination.OPTIMAL if self.native else Termination.UNSUPPORTED) + self.assertEqual(result.info["start_submitted"], self.native) + self.assertEqual((result.info["model_id"], result.info["revision"]), identity) + if self.native: + self.assertTrue(result.info["solution_validated"]) + self.assertEqual(result.objective, key(best)) + self.assertEqual(result.best_bound, key(best)) + self.assertEqual((result.value(b), result.value(x)), best) + self.assertEqual(result.value(gate), int(best[0] != int(active))) + + def test_exact_input_errors_partial_starts_and_zero_budget(self): + with Model(self.lib) as model, Cancellation(self.lib) as token: + b = model.add_variable(VariableType.BINARY) + x = model.add_variable(VariableType.INTEGER, 0, 4) + gate = model.add_indicator(b, True, {x: 1}, lower=3).inactive_gate + # Each rejected complete point violates a different original rule. + cases = [({b: 0, x: 4, gate: 0}, Termination.INVALID_MODEL), + ({b: 1-1e-12, x: 3}, Termination.INVALID_MODEL), + ({b: 1, x: 2}, Termination.INVALID_MODEL), + ({b: 0}, Termination.UNSUPPORTED)] + for start, expected in cases: + with self.subTest(start=start), model.solve(self.options(start)) as result: + self.assertEqual(result.termination, expected if self.native else Termination.UNSUPPORTED) + self.assertFalse(result.has_solution) + self.assertFalse(result.info["start_submitted"]) + if self.native: + token.cancel() + for changes, expected in [({"time_limit_seconds": 0}, Termination.TIME_LIMIT), + ({"node_limit": 0}, Termination.NODE_LIMIT), + ({"cancellation": token}, Termination.CANCELLED)]: + with model.solve(self.options({b: 0, x: 4}, **changes)) as result: + self.assertEqual(result.termination, expected) + self.assertFalse(result.has_solution) + self.assertFalse(result.info["start_submitted"]) + + def test_removed_gate_requires_explicit_value_and_is_not_rederived(self): + with Model(self.lib) as model: + b = model.add_variable(VariableType.BINARY) + x = model.add_variable(VariableType.INTEGER, 0, 4) + indicator = model.add_indicator(b, True, {x: 1}, lower=3) + gate = indicator.inactive_gate + model.remove(indicator) + model.set_objective({}, offset=11) + with model.solve(self.options({b: 0, x: 4})) as incomplete: + self.assertEqual(incomplete.termination, Termination.UNSUPPORTED) + self.assertFalse(incomplete.has_solution) + # This gate=0 contradicts its old, now removed equation at b=0. + with model.solve(self.options({b: 0, x: 4, gate: 0})) as complete: + self.assertEqual(complete.termination, Termination.OPTIMAL if self.native else Termination.UNSUPPORTED) + if self.native: + self.assertTrue(complete.info["start_submitted"]) + self.assertEqual(complete.objective, 11) + self.assertEqual(complete.value(gate), 0) + self.assertEqual(complete.value(x), 4) diff --git a/python/tests/test_quadratic.py b/python/tests/test_quadratic.py new file mode 100644 index 0000000000..3954caf3a9 --- /dev/null +++ b/python/tests/test_quadratic.py @@ -0,0 +1,245 @@ +"""Distinct finite-box QP binding conformance, with analytic original oracles.""" +import ctypes as C +from dataclasses import FrozenInstanceError +import math +import unittest + +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Library, + Model, Options, QuadraticModel, QuadraticOptions, QuadraticResult, Result, + Session, Termination, WeightedSquare, load_library) + + +class Quadratic(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.lib=load_library() + cls.available=cls.lib.quadratic_capabilities()["available"] + + def assert_completed(self, result): + self.assertIsInstance(result,QuadraticResult) + self.assertNotIsInstance(result,Result) + self.assertEqual(result.termination,Termination.OPTIMAL if self.available else Termination.UNSUPPORTED) + self.assertEqual(result.has_solution,self.available) + self.assertEqual(result.info["guarantee"],Guarantee.NUMERICAL) + checks=result.checks + if self.available: + self.assertTrue(checks.primal_valid and checks.objective_valid and checks.kkt_available) + self.assertTrue(checks.kkt_valid and checks.bound_valid) + self.assertLessEqual(checks.gap_upper_bound,1e-6) + self.assertIsNotNone(checks.max_stationarity) + self.assertIsNotNone(checks.max_complementarity) + else: + self.assertFalse(checks.primal_valid or checks.objective_valid or checks.kkt_available) + self.assertFalse(checks.kkt_valid or checks.bound_valid) + for field in ("original_objective","normalized_lower_bound","gap_upper_bound","max_stationarity","max_complementarity"): + self.assertIsNone(getattr(checks,field)) + for field in ("objective","best_bound","absolute_gap","relative_gap","vendor_objective","vendor_dual_estimate", + "original_gradient","square_residuals"): + self.assertIsNone(getattr(result,field)) + + def test_both_senses_original_objective_gradient_bounds_and_offsets(self): + # Independent closed form: x*=2-l/(2*w), f=c+l*x+w*(x-2)^2. + for maximize in (False,True): + for weight in (0.5,1,2): + for linear in (-1,0,1): + with self.subTest(maximize=maximize,weight=weight,linear=linear),QuadraticModel(self.lib) as model: + x=model.add_continuous(-4,4,name="decision λ") + square=WeightedSquare({x:1},-2,weight,"residual π") + sign=-1 if maximize else 1 + setter=model.maximize_concave_squares if maximize else model.minimize_squares + setter([square],{x:sign*linear},offset=-13) + with model.solve() as result: + self.assert_completed(result) + if not self.available: + continue + optimum=2-linear/(2*weight) + objective=-13+sign*(linear*optimum+weight*(optimum-2)**2) + self.assertAlmostEqual(result.value(x),optimum,places=6) + self.assertAlmostEqual(result.objective,objective,places=6) + self.assertAlmostEqual(result.checks.original_objective,objective,places=6) + self.assertAlmostEqual(result.square_residuals[0],optimum-2,places=6) + self.assertAlmostEqual(result.original_gradient[x.slot],0,places=6) + self.assertLessEqual(sign*result.best_bound,sign*objective+1e-12) + self.assertLessEqual(result.checks.normalized_lower_bound,sign*objective+1e-12) + self.assertEqual(result.info["regularization"],0) + self.assertIsInstance(result.message,str) + self.assertTrue(result.backend_version) + with self.assertRaises(FrozenInstanceError): result.checks.bound_valid=False + + def test_rows_mutations_tombstones_and_historical_ownership(self): + with QuadraticModel(self.lib) as model: + dead=model.add_continuous(0,1);model.remove(dead) + x=model.add_continuous(-4,4) + square=WeightedSquare({x:1},-2,2) + model.minimize_squares([square],{x:4},offset=-7) + identity=model.identity + retained=model.solve() + self.assert_completed(retained) + self.assertEqual((retained.info["model_id"],retained.info["revision"]),identity) + square.offset=99;square.terms={};square.weight=99 # Inputs were copied. + row=model.add_row({x:1},lower=2) + model.set_coefficient(row,x,2);model.set_bounds(row,4,math.inf) + with model.solve() as result: + self.assert_completed(result) + if self.available: + self.assertAlmostEqual(result.value(x),2) + self.assertAlmostEqual(result.objective,1) + model.remove(row);model.set_bounds(x,3,4) + with model.solve() as result: + self.assert_completed(result) + if self.available:self.assertAlmostEqual(result.value(x),3) + model.minimize_squares();model.remove(x) + with retained: + self.assertEqual(retained.values[dead.slot],{"active":False,"present":False,"value":None}) + if self.available: + self.assertAlmostEqual(retained.value(x),1) + self.assertAlmostEqual(retained.objective,-1) + self.assertEqual(retained.original_gradient[dead.slot],0) + with self.assertRaises(ApiError):retained.value(dead) + else: + with self.assertRaises(ApiError) as error:retained.value(x) + self.assertEqual(error.exception.code,7) + with self.assertRaises(RuntimeError):retained.checks + + def test_empty_and_constant_square_and_huge_offset(self): + with QuadraticModel(self.lib) as model: + model.minimize_squares([WeightedSquare((),3,2)],offset=-7) + with model.solve() as result: + self.assert_completed(result) + if self.available: + self.assertEqual(result.values,()) + self.assertEqual(result.original_gradient,()) + self.assertEqual(result.square_residuals,(3,)) + self.assertEqual(result.objective,11) + with QuadraticModel(self.lib) as model: + x=model.add_continuous(0,2) + model.minimize_squares([WeightedSquare({x:1},-1)],linear={x:2},offset=1e16) + with model.solve() as result: + self.assert_completed(result) + if self.available: + self.assertLessEqual(result.checks.gap_upper_bound,1e-6) + self.assertGreater(result.absolute_gap,result.checks.gap_upper_bound) + self.assertEqual(result.objective,1e16) + + def test_coupled_squares_and_equality_original_gradient(self): + with QuadraticModel(self.lib) as model: + x=model.add_continuous(-2,2);y=model.add_continuous(-2,2) + # Under x+y=1, minimize 2(x-y)^2 + (x+y-2)^2. + model.add_row({x:1,y:1},lower=1,upper=1) + model.minimize_squares([WeightedSquare([(x,2),(x,-1),(y,-1)],weight=2), + WeightedSquare({x:1,y:1},offset=-2)],offset=7) + with model.solve() as result: + self.assert_completed(result) + if self.available: + self.assertAlmostEqual(result.value(x),0.5) + self.assertAlmostEqual(result.value(y),0.5) + self.assertAlmostEqual(result.objective,8) + self.assertEqual(len(result.square_residuals),2) + self.assertAlmostEqual(result.square_residuals[0],0) + self.assertAlmostEqual(result.square_residuals[1],-1) + # A constrained optimum has a nonzero original gradient. + self.assertAlmostEqual(result.original_gradient[x.slot],-2) + self.assertAlmostEqual(result.original_gradient[y.slot],-2) + + def test_rejected_mutations_preserve_objective_and_revision(self): + with QuadraticModel(self.lib) as model,QuadraticModel(self.lib) as foreign: + x=model.add_continuous(-4,4);y=foreign.add_continuous(-4,4) + model.minimize_squares([WeightedSquare({x:1},-2)]) + revision=model.identity + bad=[WeightedSquare({y:1}),WeightedSquare({x:math.nan}),WeightedSquare({x:1},weight=-1), + WeightedSquare({x:1},weight=0),WeightedSquare({x:1},offset=math.inf)] + for square in bad: + with self.assertRaises(ApiError):model.minimize_squares([square]) + self.assertEqual(model.identity,revision) + with self.assertRaises(ApiError):model.minimize_squares([WeightedSquare({x:1})],{y:1}) + with self.assertRaises(ApiError):model.remove(x) + with self.assertRaises(ApiError):model.set_bounds(x,0,math.inf) + with self.assertRaises(ApiError):model.add_continuous(math.nan,1) + with self.assertRaises(ValueError):model.minimize_squares([WeightedSquare({x:1},name="bad\0name")]) + with self.assertRaises(TypeError):model.minimize_squares([object()]) + self.assertEqual(model.identity,revision) + with model.solve() as result: + self.assert_completed(result) + if self.available: + self.assertAlmostEqual(result.value(x),2) + with self.assertRaises(ApiError):result.value(y) + model.minimize_squares();model.remove(x) + with self.assertRaises(ApiError):model.add_row({x:1}) + + def test_distinct_classes_and_library_ownership(self): + with QuadraticModel(self.lib) as model,Model(self.lib) as linear,Session(self.lib) as session: + self.assertNotIsInstance(model,Model) + with self.assertRaises(TypeError):session.solve(model) + with self.assertRaises(TypeError):model.solve(Options()) + x=model.add_continuous(0,1) + with self.assertRaises(ApiError):linear.add_row({x:1}) + second=Library(self.lib.path) + with QuadraticModel(second) as foreign: + y=foreign.add_continuous(0,1) + with self.assertRaises(ValueError):model.add_row({y:1}) + with self.assertRaises(ValueError):model.minimize_squares([WeightedSquare({y:1})]) + # Even direct C misuse cannot erase the quadratic objective. + out=C.c_uint64() + with self.assertRaises(ApiError) as error:self.lib.call("solve",model._open(),None,C.byref(out)) + self.assertEqual(error.exception.code,2) + self.assertEqual(out.value,0) + + def test_limits_cancellation_unsupported_and_bad_option_fields(self): + with QuadraticModel(self.lib) as model,Cancellation(self.lib) as cancel: + x=model.add_continuous(-4,4);model.minimize_squares([WeightedSquare({x:1},-2)]) + unsupported=[Options(backend=Backend.NATIVE),Options(guarantee=Guarantee.EXACT), + Options(guarantee=Guarantee.CERTIFIED),Options(threads=2),Options(random_seed=1),Options(node_limit=1), + Options(primal_start={x:2})] + for solve in unsupported: + with model.solve(QuadraticOptions(solve)) as result: + self.assertEqual(result.termination,Termination.UNSUPPORTED) + self.assertFalse(result.has_solution) + self.assertIsNone(result.checks.gap_upper_bound) + for solve in (Options(time_limit_seconds=0),Options(cancellation=cancel)): + if solve.cancellation:cancel.cancel() + with model.solve(QuadraticOptions(solve)) as result: + self.assertEqual(result.termination,Termination.CANCELLED if solve.cancellation else Termination.TIME_LIMIT) + self.assertFalse(result.has_solution) + self.assertIsNone(result.objective) + self.assertFalse(result.checks.kkt_available) + self.assertIsNone(result.checks.max_stationarity) + self.assertIsNone(result.checks.max_complementarity) + for options in (QuadraticOptions(optimality_tolerance=math.nan),QuadraticOptions(stationarity_tolerance=-1), + QuadraticOptions(complementarity_tolerance=math.inf)): + with self.assertRaises(ApiError):model.solve(options) + for options in (QuadraticOptions(iteration_limit=-1),QuadraticOptions(max_auxiliary_variables=2**64)): + with self.assertRaises(OverflowError):model.solve(options) + with self.assertRaises(TypeError):model.solve(QuadraticOptions(iteration_limit=True)) + with self.assertRaises(TypeError):model.solve(QuadraticOptions(solve=object())) + with model.solve(QuadraticOptions(max_auxiliary_variables=0)) as result: + self.assertEqual(result.termination,Termination.UNSUPPORTED) + self.assertFalse(result.has_solution) + + def test_iteration_limit_keeps_candidate_separate_from_optimality(self): + with QuadraticModel(self.lib) as model: + x=model.add_continuous(-4,4) + model.minimize_squares([WeightedSquare({x:1},-2)]) + with model.solve(QuadraticOptions(iteration_limit=0)) as result: + self.assertEqual(result.termination,Termination.ITERATION_LIMIT if self.available else Termination.UNSUPPORTED) + self.assertEqual(result.info["qp_iterations"],0) + if result.has_solution: + self.assertTrue(result.checks.primal_valid and result.checks.objective_valid) + self.assertAlmostEqual(result.objective,(result.value(x)-2)**2) + self.assertFalse(result.checks.kkt_valid) + self.assertGreater(result.checks.gap_upper_bound,1e-6) + + def test_infeasible_rows_have_no_successful_original_checks(self): + with QuadraticModel(self.lib) as model: + x=model.add_continuous(0,1) + model.minimize_squares([WeightedSquare({x:1})]) + model.add_row({x:1},lower=2) + with model.solve() as result: + self.assertEqual(result.termination,Termination.INFEASIBLE if self.available else Termination.UNSUPPORTED) + self.assertFalse(result.has_solution) + self.assertFalse(result.checks.primal_valid or result.checks.objective_valid or result.checks.kkt_valid) + self.assertIsNone(result.objective) + self.assertIsNone(result.checks.gap_upper_bound) + + +if __name__=="__main__": + unittest.main() diff --git a/python/tests/test_regular.py b/python/tests/test_regular.py new file mode 100644 index 0000000000..d0a45509ab --- /dev/null +++ b/python/tests/test_regular.py @@ -0,0 +1,129 @@ +"""Independent finite-word oracles for typed Regular C/Python semantics.""" +import ctypes as C +from dataclasses import FrozenInstanceError +from itertools import product +import math +import unittest +from gecode_optimize import (ApiError,Backend,Guarantee,Library,Model,Options, + RegularTransition as Edge,Session,Termination as T,VariableType as V,load_library) +from gecode_optimize import binding as b + + +def language(length,initial,edges,finals): + # Enumerate paths first, independently of a proposed assignment's transition lookup. + frontier={(initial,())} + for _ in range(length): + frontier={(e.to_state,word+(e.symbol,)) for state,word in frontier for e in edges if e.from_state==state} + return {word for state,word in frontier if state in finals} + +class RegularTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library();cls.native=cls.library.capabilities(Backend.NATIVE)['available'] + def test_automaton_word_oracle_both_senses_aliases_and_routing(self): + cases=[(2,0,[Edge(0,-1,0),Edge(0,1,1),Edge(1,-1,1),Edge(1,1,0)],[0,0]), + (3,0,[Edge(0,-1,1),Edge(1,1,2)],[2]), + (1,0,[],[0]),(1,0,[],[]), + ((1<<64)-1,(1<<64)-2,[Edge((1<<64)-2,-1,(1<<64)-2)],[(1<<64)-2])] + for states,initial,edges,finals in cases: + for positions in ((),(0,),(0,1),(0,1,0)): + for maximize in (False,True): + with self.subTest(states=states,positions=positions,maximize=maximize),Model(self.library) as m: + variables=[m.add_variable(V.INTEGER,-1,1) for _ in range(max(positions,default=-1)+1)] + word=[variables[i] for i in positions] + m.add_regular(word,states,initial,edges,finals) + coefficients=[2,-3][:len(variables)] + m.set_objective(list(zip(variables,coefficients)),maximize=maximize,offset=-4) + accepted=language(len(word),initial,edges,finals) + candidates=[(sum(c*x for c,x in zip(coefficients,values))-4,values) + for values in product((-1,0,1),repeat=len(variables)) if tuple(values[i] for i in positions) in accepted] + options=Options(backend=Backend.AUTO,guarantee=Guarantee.EXACT) + with m.solve(options) as out: + self.assertEqual(out.termination,(T.OPTIMAL if candidates else T.INFEASIBLE) if self.native else T.UNSUPPORTED) + if candidates and self.native: + best=(max if maximize else min)(value for value,_ in candidates) + self.assertEqual(out.objective,best);self.assertEqual(out.best_bound,best) + actual=tuple(out.value(v) for v in variables) + self.assertIn((best,actual),candidates) + with m.solve(Options(backend=Backend.HIGHS)) as out: + self.assertEqual(out.termination,T.UNSUPPORTED);self.assertFalse(out.has_solution) + def test_mixed_globals_rows_removal_and_historical_result(self): + edges=[Edge(0,-1,0),Edge(0,1,1),Edge(1,-1,1),Edge(1,1,0)] + for maximize,expected in ((False,7),(True,13)): + with Model(self.library) as m: + x,y,z=[m.add_variable(V.INTEGER,-1,1) for _ in range(3)] + regular=m.add_regular([x,y,z],2,0,edges,[0,0],name='even π') + m.add_all_different([x,y]);m.add_row([(x,1),(y,1),(z,1)],lower=-1) + m.set_objective([(x,2),(y,-1),(z,3)],maximize=maximize,offset=7) + before=m.identity[1];m.set_name(regular,'renamed');self.assertEqual(m.identity[1],before+1) + with self.assertRaises(ApiError):m.remove(z) + result=m.solve(Options(backend=Backend.NATIVE,guarantee=Guarantee.EXACT)) + with Session(self.library) as session,session.solve(m) as unsupported:self.assertEqual(unsupported.termination,T.UNSUPPORTED) + m.remove(regular) + with self.assertRaises(ApiError):m.remove(regular) + with result: + if self.native: + self.assertEqual(result.termination,T.OPTIMAL);self.assertEqual(result.objective,expected) + self.assertEqual((result.value(x),result.value(y),result.value(z)),(-1,1,1) if not maximize else (1,-1,1)) + else:self.assertEqual(result.termination,T.UNSUPPORTED) + def test_atomic_invalid_model_data_and_python_integer_checks(self): + with Model(self.library) as m,Model(self.library) as other: + x=m.add_variable(V.INTEGER,-1,1);foreign=other.add_variable(V.INTEGER,-1,1) + dead=m.add_variable(V.INTEGER,-1,1);m.remove(dead);continuous=m.add_variable() + valid=[Edge(0,-1,1)] + invalid=[([foreign],2,0,valid,[1]),([dead],2,0,valid,[1]),([continuous],2,0,valid,[1]), + ([x],0,0,[],[]),([x],2,2,[],[]),([x],2,0,valid,[2]), + ([x],2,0,[Edge(2,-1,1)],[1]),([x],2,0,[Edge(0,-1,2)],[1]), + ([x],2,0,valid+valid,[1]),([x],2,0,valid+[Edge(0,-1,0)],[1]), + ([x],2,0,[Edge(0,(1<<53)+1,1)],[1])] + revision=m.identity[1] + for args in invalid: + with self.assertRaises(ApiError):m.add_regular(*args) + self.assertEqual(m.identity[1],revision) + for value in (True,0.5,'1'): + with self.assertRaises(TypeError):m.add_regular([x],value,0,valid,[1]) + with self.assertRaises(TypeError):m.add_regular([x],2,0,[Edge(0,value,1)],[1]) + for value in (-1,1<<64): + with self.assertRaises(OverflowError):m.add_regular([x],value,0,valid,[1]) + with self.assertRaises(TypeError):m.add_regular([x],2,0,[(0,-1,1)],[1]) + with self.assertRaises(FrozenInstanceError):valid[0].symbol=1 + with self.assertRaises(ValueError):m.add_regular([x],2,0,valid,[1],name='bad\0name') + another=Library(self.library.path) + with Model(another) as foreign_library: + with self.assertRaises(ValueError):foreign_library.add_regular([x],2,0,valid,[1]) + g=m.add_regular([x],2,0,valid,[1]);self.assertEqual(m.identity[1],revision+1);m.remove(g) + def test_c_layout_size_reserved_counts_and_no_partial_mutation(self): + with Model(self.library) as m: + x=m.add_variable(V.INTEGER,-1,1);ids=(b._Id*1)(x._id());edges=(b._RegularTransition*2)() + for e in edges:e.struct_size=C.sizeof(e);e.from_state=0;e.symbol=-1;e.to_state=1 + edges[1].symbol=1;finals=(b.U64*1)(1);revision=m.identity[1] + def call(variables=ids,n=1,transitions=edges,count=2,size=C.sizeof(b._RegularTransition),states=2,final=finals,nfinal=1,name=b'ok'): + out=b._Id(99,99,99,99) + try:self.library.call('model_add_regular',m._open(),variables,n,states,0,transitions,count,size,final,nfinal,name,C.byref(out)) + finally: + self.assertEqual(bytes(out),bytes(b._Id()));self.assertEqual(m.identity[1],revision) + for kwargs in ({'size':C.sizeof(b._RegularTransition)-1},{'variables':None}, {'n':(1<<64)-1}, + {'transitions':None},{'count':(1<<64)-1},{'final':None},{'nfinal':(1<<64)-1},{'name':b'\xc0\x80'}): + with self.assertRaises(ApiError) as error:call(**kwargs) + self.assertEqual(error.exception.code,1) + for field,value in (('struct_size',0),('reserved',1)): + original=getattr(edges[1],field);setattr(edges[1],field,value) + with self.assertRaises(ApiError) as error:call() + self.assertEqual(error.exception.code,1);setattr(edges[1],field,original) + edges[1].to_state=2 + with self.assertRaises(ApiError) as error:call() + self.assertEqual(error.exception.code,3) + # No edge arrays are required for an empty deterministic language. + g=m.add_regular([],1,0,[],[0]);m.remove(g) + def test_exact_symbol_endpoints_and_semicontinuous_scope(self): + with Model(self.library) as m: + x=m.add_variable(V.INTEGER,-1,1) + for symbol in (-(1<<53),1<<53): + g=m.add_regular([x],1,0,[Edge(0,symbol,0)],[0]);m.remove(g) + with Model(self.library) as m: + x=m.add_variable(V.SEMI_INTEGER,2,3);m.add_regular([x],1,0,[Edge(0,0,0),Edge(0,3,0)],[0]);m.set_objective([(x,1)],maximize=True,offset=-2) + with m.solve(Options(backend=Backend.AUTO,guarantee=Guarantee.EXACT)) as out: + self.assertEqual(out.termination,T.OPTIMAL if self.native else T.UNSUPPORTED) + if self.native:self.assertEqual(out.objective,1);self.assertEqual(out.value(x),3) + +if __name__=='__main__':unittest.main() diff --git a/python/tests/test_runtime.py b/python/tests/test_runtime.py new file mode 100644 index 0000000000..5d5f7b3d0e --- /dev/null +++ b/python/tests/test_runtime.py @@ -0,0 +1,53 @@ +"""Packaged-library selection is independent of the process working directory.""" +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +from gecode_optimize import _runtime + + +class RuntimeTest(unittest.TestCase): + def test_absent_bundle_preserves_external_library_workflow(self): + with tempfile.TemporaryDirectory() as temporary: + package = Path(temporary) / "package" + package.mkdir() + (Path(temporary) / "libgecodeoptimize_c.dylib").touch() + with patch.object(_runtime, "__file__", str(package / "_runtime.py")): + self.assertIsNone(_runtime.bundled_library_path()) + + def test_exact_platform_entry_and_incomplete_bundle(self): + for platform, name in (("darwin", "libgecodeoptimize_c.dylib"), + ("linux", "libgecodeoptimize_c.so"), + ("win32", "gecodeoptimize_c.dll")): + with self.subTest(platform=platform), tempfile.TemporaryDirectory() as temporary: + package = Path(temporary) + native = package / "_native" + native.mkdir() + with patch.object(_runtime, "__file__", str(package / "_runtime.py")), \ + patch.object(_runtime.sys, "platform", platform): + with self.assertRaisesRegex(RuntimeError, "incomplete"): + _runtime.bundled_library_path() + entry = native / name + entry.touch() + self.assertEqual(_runtime.bundled_library_path(), str(entry.resolve())) + + def test_bundle_cannot_redirect_to_an_external_file(self): + with tempfile.TemporaryDirectory() as temporary: + package = Path(temporary) + native = package / "_native" + native.mkdir() + outside = package / "external.dylib" + outside.touch() + try: + (native / "libgecodeoptimize_c.dylib").symlink_to(outside) + except OSError: + self.skipTest("creating symlinks is unavailable on this host") + with patch.object(_runtime, "__file__", str(package / "_runtime.py")), \ + patch.object(_runtime.sys, "platform", "darwin"): + with self.assertRaisesRegex(RuntimeError, "outside"): + _runtime.bundled_library_path() + + +if __name__ == "__main__": + unittest.main() diff --git a/python/tests/test_scenarios.py b/python/tests/test_scenarios.py new file mode 100644 index 0000000000..58e04f5164 --- /dev/null +++ b/python/tests/test_scenarios.py @@ -0,0 +1,231 @@ +"""Scenario boundaries, independent hand/exhaustive oracles, and owning history.""" +import ctypes as C +from dataclasses import FrozenInstanceError +import math +import unittest +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Library, Model, + Options, Result, Row, Session, Termination as T, Variable, VariableType as V, load_library, + ScenarioDefinition as D, ScenarioVariableBounds as VB, ScenarioRowBounds as RB, + ScenarioOptions as SO, ScenarioReuse as Reuse, ScenarioBatchCompletion as Completion, + ScenarioRunState as State, ScenarioId) +from gecode_optimize import binding as b + +class ScenarioTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.library=load_library() + def model(self): + m=Model(self.library);x=m.add_variable(V.INTEGER,0,8);y=m.add_variable(V.INTEGER,0,8) + dead=m.add_variable();m.remove(dead);gone=m.add_row();m.remove(gone) + row=m.add_row([(x,1),(y,1)],lower=4);m.set_objective([(x,2),(y,3)],offset=7) + return m,x,y,row,dead,gone + def available(self,backend):return self.library.capabilities(backend)['available'] + def test_analytic_history_and_cold_reuse(self): + for backend in (Backend.HIGHS,Backend.NATIVE): + for reuse in (Reuse.AUTOMATIC,Reuse.COLD): + m,x,y,row,dead,gone=self.model() + defs=[D('base'),D('cap',variable_bounds=[VB(x,upper=1)]), + D('cost π',[(x,4),(y,1)],-10),D('rhs',row_bounds=[RB(row,lower=6)]), + D('infeasible',variable_bounds=[VB(x,upper=1),VB(y,upper=1)])] + original=m.identity + with m,m.solve_scenarios(defs,SO(solve=Options(backend=backend,guarantee=Guarantee.EXACT if backend==Backend.NATIVE else Guarantee.NUMERICAL),reuse=reuse)) as batch: + ids=[batch.scenario(i) for i in range(5)];info=batch.info + self.assertEqual((info.model_id,info.revision),original);self.assertNotEqual(info.batch_id,original[0]) + self.assertEqual(m.identity,original) + saved=tuple(batch.definition(id) for id in ids);self.assertEqual(saved,tuple(defs)) + with self.assertRaises(FrozenInstanceError):info.work=1 + with self.assertRaises(FrozenInstanceError):saved[0].name='changed' + private=batch.map(x);private_row=batch.map(row) + self.assertEqual(private.model_id,info.batch_id);self.assertEqual(private_row.slot,row.slot) + for bad in (dead,gone,Variable(x.model_id+1,x.slot,self.library)): + with self.assertRaises(ApiError):batch.map(bad) + with self.assertRaises(TypeError):batch.map(ids[0]) + if self.available(backend): + self.assertTrue(info.all_resolved);self.assertEqual(info.completion,Completion.COMPLETE) + self.assertIsNone(info.stop_reason);self.assertEqual(info.attempted,5);self.assertEqual(info.resolved,5) + for id,obj,values in zip(ids,[15,18,-6,19],[(4,0),(1,3),(0,4),(6,0)]): + outcome=batch.outcome(id);self.assertEqual(outcome.result.termination,T.OPTIMAL) + self.assertEqual(outcome.result.revision,id.index+1);self.assertTrue(outcome.check.candidate_examined) + self.assertTrue(outcome.check.validation.valid);self.assertTrue(outcome.check.objective_matches) + self.assertEqual((batch.value(id,x),batch.value(id,y)),values) + with batch.copy_result(id) as child: + self.assertEqual(child.objective,obj);self.assertEqual(child.value(private),values[0]) + with self.assertRaises(ApiError):child.value(x) + bad=batch.outcome(ids[-1]);self.assertEqual(bad.result.termination,T.INFEASIBLE) + self.assertFalse(bad.check.candidate_examined);self.assertIsNone(bad.check.validation) + with self.assertRaises(ApiError):batch.value(ids[-1],x) + child=batch.copy_result(ids[0]);metadata=batch.outcome(ids[0]) + if backend==Backend.HIGHS and reuse==Reuse.AUTOMATIC: + self.assertEqual(info.reuse_statistics.solve_calls,5) + self.assertGreater(info.reuse_statistics.incremental_updates,0) + else:self.assertEqual(info.reuse_statistics.solve_calls,0) + else: + self.assertEqual(info.stop_reason,T.UNSUPPORTED);self.assertFalse(info.all_resolved) + self.assertEqual(batch.outcome(ids[0]).result.termination,T.UNSUPPORTED) + self.assertEqual(batch.outcome(ids[1]).state,State.NOT_STARTED) + self.assertIsNone(batch.outcome(ids[1]).result);self.assertIsNone(batch.check(ids[1])) + with self.assertRaises(ApiError):batch.copy_result(ids[1]) + child=batch.copy_result(ids[0]);metadata=batch.outcome(ids[0]) + m.set_bounds(row,7,math.inf);m.set_objective([(y,3)]);m.remove(row);m.remove(x) + self.assertEqual(batch.definition(ids[1]),defs[1]);self.assertEqual(batch.map(x),private) + with m.solve_scenarios([D()]) as later: + if later.info.batch_id is not None: + with self.assertRaises(ApiError):later.outcome(ids[0]) + with child: + self.assertEqual(child.info['model_id'],private.model_id) + if self.available(backend):self.assertEqual(child.value(private),4);self.assertEqual(child.objective,15) + self.assertEqual(saved[2].name,'cost π');self.assertEqual(metadata.scenario,ids[0]) + with self.assertRaises(RuntimeError):batch.outcome(ids[0]) + def test_small_exhaustive_min_max(self): + for backend in (Backend.HIGHS,Backend.NATIVE): + if not self.available(backend):continue + for maximize in (False,True): + with Model(self.library) as m: + x=m.add_variable(V.INTEGER,-2,2);y=m.add_variable(V.INTEGER,-2,2) + row=m.add_row([(x,2),(y,-1)],lower=-2,upper=2);m.set_objective([(x,1),(y,2)],maximize=maximize,offset=5) + defs=[];expected=[] + for lower in (-2,0,1): + for c in (-3,0,4): + defs.append(D(objective_coefficients=[(x,c)],objective_offset=-7,variable_bounds=[VB(y,lower=lower)])) + choices=[(c*a+2*d-7,a,d) for a in range(-2,3) for d in range(lower,3) if -2<=2*a-d<=2] + expected.append((max if maximize else min)(v[0] for v in choices)) + with m.solve_scenarios(defs,SO(solve=Options(backend=backend))) as result: + self.assertTrue(result.info.all_resolved) + for i,obj in enumerate(expected): + with result.copy_result(result.scenario(i)) as child:self.assertEqual(child.objective,obj) + def test_continuous_recourse_and_unbounded_status(self): + with Model(self.library) as m: + x=m.add_variable(V.CONTINUOUS,0,math.inf);y=m.add_variable(V.CONTINUOUS,0,10) + row=m.add_row([(x,1),(y,1)],lower=3);m.set_objective([(x,2),(y,3)],offset=7) + defs=[D(),D(variable_bounds=[VB(x,upper=1)]), + D(objective_coefficients=[(x,4)]),D(row_bounds=[RB(row,lower=4)])] + with m.solve_scenarios(defs,SO(solve=Options(backend=Backend.HIGHS))) as batch: + if self.available(Backend.HIGHS): + self.assertTrue(batch.info.all_resolved) + for i,objective in enumerate((13,15,16,15)): + with batch.copy_result(batch.scenario(i)) as child:self.assertAlmostEqual(child.objective,objective) + else:self.assertEqual(batch.info.stop_reason,T.UNSUPPORTED) + with m.solve_scenarios([D()],SO(solve=Options(backend=Backend.NATIVE))) as batch: + self.assertEqual(batch.info.stop_reason,T.UNSUPPORTED) + with Model(self.library) as m: + x=m.add_variable(V.CONTINUOUS,0,math.inf);m.set_objective([(x,-1)]) + with m.solve_scenarios([D(),D(variable_bounds=[VB(x,upper=2)])],SO(solve=Options(backend=Backend.HIGHS))) as batch: + if self.available(Backend.HIGHS): + self.assertTrue(batch.info.all_resolved) + first=batch.outcome(batch.scenario(0));self.assertEqual(first.result.termination,T.UNBOUNDED) + with batch.copy_result(batch.scenario(0)) as unbounded: + # Unbounded can retain a finite feasible point; that is + # independent of the status and not an attained optimum. + if unbounded.has_solution: + self.assertTrue(first.check.candidate_examined);self.assertTrue(first.check.validation.valid) + self.assertEqual(unbounded.objective,-batch.value(batch.scenario(0),x)) + else:self.assertIsNone(unbounded.objective) + self.assertIsNone(unbounded.relative_gap) + with batch.copy_result(batch.scenario(1)) as finite:self.assertEqual(finite.objective,-2) + else:self.assertEqual(batch.info.stop_reason,T.UNSUPPORTED) + def test_empty_and_limits(self): + m,x,y,row,*_=self.model() + with m,Cancellation(self.library) as cancel: + with m.solve_scenarios([]) as empty: + self.assertTrue(empty.info.all_resolved);self.assertEqual(empty.info.attempted,0) + with self.assertRaises(ApiError):empty.scenario(0) + cancel.cancel() + cases=[(SO(solve=Options(time_limit_seconds=0)),T.TIME_LIMIT), + (SO(solve=Options(cancellation=cancel)),T.CANCELLED), + (SO(solve=Options(time_limit_seconds=0),max_scenarios=0),T.TIME_LIMIT), + (SO(solve=Options(cancellation=cancel),max_scenarios=0),T.CANCELLED), + (SO(solve=Options(node_limit=0)),T.NODE_LIMIT), + (SO(solve=Options(node_limit=1)),T.UNSUPPORTED), + (SO(max_scenarios=1),T.MEMORY_LIMIT),(SO(max_patch_entries=0),T.MEMORY_LIMIT), + (SO(max_saved_value_slots=1),T.MEMORY_LIMIT),(SO(max_work=0),T.ITERATION_LIMIT)] + for options,reason in cases: + with m.solve_scenarios([D(objective_coefficients=[(x,2)]),D()],options) as result: + self.assertEqual(result.info.stop_reason,reason);self.assertFalse(result.info.all_resolved) + self.assertEqual(result.info.attempted,0);self.assertIsNone(result.info.batch_id) + self.assertTrue(result.message) + if self.available(Backend.NATIVE): + with m.solve_scenarios([D()],SO(solve=Options(backend=Backend.NATIVE,node_limit=100000))) as result: + self.assertTrue(result.info.all_resolved) + def test_rejected_semantics_and_kinds(self): + m,x,y,row,dead,gone=self.model() + with m: + bad=[D(objective_coefficients=[(x,1),(x,2)]),D(objective_coefficients=[(dead,1)]), + D(objective_coefficients=[(Variable(x.model_id+10,x.slot,self.library),1)]), + D(objective_coefficients=[(x,math.nan)]),D(objective_offset=math.inf), + D(variable_bounds=[VB(x,lower=9)]),D(variable_bounds=[VB(x,lower=math.nan)]), + D(variable_bounds=[VB(x,lower=1),VB(x,upper=2)]),D(row_bounds=[RB(gone,lower=1)]), + D(row_bounds=[RB(row,upper=1),RB(row,lower=0)])] + for definition in bad: + with m.solve_scenarios([D(),definition]) as result: + self.assertEqual(result.info.completion,Completion.REJECTED);self.assertEqual(result.info.stop_reason,T.INVALID_MODEL) + self.assertEqual(result.info.offending_scenario,1);self.assertEqual(result.info.attempted,0) + for options in (SO(solve=Options(primal_start=[(x,4),(y,0)])),SO(solve=Options(guarantee=Guarantee.CERTIFIED))): + with m.solve_scenarios([D()],options) as result:self.assertEqual(result.info.stop_reason,T.UNSUPPORTED) + with m.solve_scenarios([D()]) as result: + id=result.scenario(0) + for wrong in (ScenarioId(id.batch_id+1,0,self.library),ScenarioId(id.batch_id,9,self.library)): + for fn in (result.outcome,result.check,result.definition,result.copy_result): + with self.assertRaises(ApiError):fn(wrong) + with self.assertRaises(TypeError):result.outcome(x) + with Session(self.library) as session: + info=b._ScenarioInfo() + with self.assertRaises(ApiError):self.library.call('scenario_batch_info',session._open(),C.byref(info),C.sizeof(info)) + for kind in ('semi','indicator','global','deleted_global'): + with Model(self.library) as m: + x=m.add_variable(V.SEMI_INTEGER if kind=='semi' else V.INTEGER,1,2) + if kind=='indicator': + gate=m.add_variable(V.BINARY);m.add_indicator(gate,True,[(x,1)],lower=1) + if kind in ('global','deleted_global'): + g=m.add_all_different([x]) + if kind=='deleted_global':m.remove(g) + with m.solve_scenarios([D()]) as result:self.assertEqual(result.info.stop_reason,T.UNSUPPORTED) + def test_record_sizes_arrays_presence_and_copy(self): + m,x,y,row,*_=self.model() + with m: + base=SO()._marshal(self.library);definition=b._scenario_definitions([D('saved',[(x,0)],0,[VB(x,upper=7)],[RB(row,lower=2)])],self.library) + for mutate in (lambda o:setattr(o,'struct_size',C.sizeof(o)-1),lambda o:setattr(o,'reserved',1), + lambda o:setattr(o,'reserved_flags',1),lambda o:setattr(o,'reuse',2), + lambda o:setattr(o.solve,'struct_size',0),lambda o:setattr(o.solve,'reserved',1)): + native=SO()._marshal(self.library);mutate(native);out=b.U64(99) + with self.assertRaises(ApiError):self.library.call('solve_scenarios',m._open(),definition,1,C.sizeof(b._ScenarioDefinition),C.byref(native),C.byref(out)) + self.assertEqual(out.value,0) + for key,val in (('struct_size',1),('reserved',1)): + data=b._scenario_definitions([D()],self.library);setattr(data[0],key,val);out=b.U64(99) + with self.assertRaises(ApiError):self.library.call('solve_scenarios',m._open(),data,1,C.sizeof(b._ScenarioDefinition),C.byref(base),C.byref(out)) + self.assertEqual(out.value,0) + for mutate in (lambda d:setattr(d[0].objective_offset,'present',2),lambda d:setattr(d[0].objective_offset,'reserved',1), + lambda d:setattr(d[0].variable_bounds[0],'struct_size',0),lambda d:setattr(d[0].variable_bounds[0],'has_upper',2), + lambda d:setattr(d[0].row_bounds[0],'reserved',1)): + data=b._scenario_definitions([D(variable_bounds=[VB(x,upper=7)],row_bounds=[RB(row,lower=2)])],self.library);mutate(data);out=b.U64() + with self.assertRaises(ApiError):self.library.call('solve_scenarios',m._open(),data,1,C.sizeof(b._ScenarioDefinition),C.byref(base),C.byref(out)) + token=b.U64();self.library.call('solve_scenarios',m._open(),definition,1,C.sizeof(b._ScenarioDefinition),C.byref(base),C.byref(token)) + definition[0].objective_offset.value=99;definition[0].variable_bounds[0].upper=1 + with b.ScenarioBatchResult(self.library,token.value) as result: + id=result.scenario(0);copied=result.definition(id);self.assertEqual(copied.objective_offset,0);self.assertEqual(copied.variable_bounds[0].upper,7) + info=b._ScenarioInfo() + with self.assertRaises(ApiError):self.library.call('scenario_batch_info',result._open(),C.byref(info),C.sizeof(info)-1) + needed=b.U64();raw=(b._ScenarioBounds*1)();raw[0].upper=123 + with self.assertRaises(ApiError):self.library.call('scenario_batch_bounds',result._open(),id._id(),1,raw,C.sizeof(b._ScenarioBounds)-1,1,C.byref(needed)) + self.assertEqual(raw[0].upper,123) + self.library.call('scenario_batch_bounds',result._open(),id._id(),1,raw,C.sizeof(b._ScenarioBounds),1,C.byref(needed)) + self.assertEqual(raw[0].reserved,0);self.assertEqual(raw[0].has_lower,0);self.assertEqual(raw[0].lower,0);self.assertEqual(raw[0].upper,7) + with self.assertRaises(ApiError):self.library.call('scenario_batch_text',result._open(),id._id(),2,None,0,C.byref(needed)) + def test_python_type_library_and_immutability(self): + m,x,*_=self.model() + with m: + terms=[(x,1)];bounds=[VB(x,upper=3)];definition=D(objective_coefficients=terms,variable_bounds=bounds) + terms.clear();bounds.clear();self.assertEqual(len(definition.objective_coefficients),1);self.assertEqual(len(definition.variable_bounds),1) + for definitions in ([object()],[D(name='bad\0name')],[D(variable_bounds=[object()])],[D(row_bounds=[VB(x,upper=1)])]): + with self.assertRaises((TypeError,ValueError)):m.solve_scenarios(definitions) + for option in (Options(),object()): + with self.assertRaises(TypeError):m.solve_scenarios([],option) + for value in (True,0.5): + with self.assertRaises(TypeError):m.solve_scenarios([],SO(max_work=value)) + other=Library(self.library.path) + with Model(other) as foreign: + alien=foreign.add_variable() + with self.assertRaises(ValueError):m.solve_scenarios([D(objective_coefficients=[(alien,1)])]) + with m.solve_scenarios([D()]) as result: + with self.assertRaises(ValueError):result.outcome(ScenarioId(result.info.batch_id,0,other)) + +if __name__=='__main__':unittest.main() diff --git a/python/tests/test_workflows.py b/python/tests/test_workflows.py new file mode 100644 index 0000000000..e7b9e94f14 --- /dev/null +++ b/python/tests/test_workflows.py @@ -0,0 +1,291 @@ +"""C ABI-backed pool/repair conformance; no timing/performance claims.""" +import concurrent.futures +from dataclasses import FrozenInstanceError +import math +import threading +import time +import unittest + +from gecode_optimize import (ApiError, Backend, Cancellation, Guarantee, Model, Options, + PoolCompletion, PoolOptions, RelaxationSelection, RelaxationSide, RepairOptions, + Termination, VariableType, load_library) + + +class Workflows(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.lib=load_library() + cls.highs=cls.lib.capabilities(Backend.HIGHS)["available"] + cls.native=cls.lib.capabilities(Backend.NATIVE)["available"] + + def test_ranked_projection_recourse_and_independent_result_lifetime(self): + with Model(self.lib) as model: + x=model.add_variable(VariableType.INTEGER,-1,1) + y=model.add_variable(upper=4) + dead=model.add_variable();model.remove(dead) + model.add_row({x:1,y:1},lower=2) + model.set_objective({x:2,y:1},offset=5) + identity=model.identity + with model.solve_pool(PoolOptions(Options(backend=Backend.HIGHS),5,[x])) as pool: + self.assertEqual((pool.info["model_id"],pool.info["revision"]),identity) + self.assertEqual(pool.projection,(x,)) + if not self.highs: + self.assertEqual(pool.termination,Termination.UNSUPPORTED) + self.assertEqual(pool.info["entry_count"],0) + self.assertFalse(pool.exhausted) + with self.assertRaises(ApiError): pool.entry_result(0) + return + self.assertEqual(pool.completion,PoolCompletion.EXHAUSTED) + self.assertEqual(pool.ranked_prefix,3) + self.assertEqual(pool.info["attempt_count"],4) + for i in range(3): + record=pool.entry(i) + self.assertEqual(record.projection_values,(i-1,)) + self.assertTrue(record.rank_established) + with self.assertRaises(FrozenInstanceError): record.rank_established=False + with pool.entry_result(i) as result: + self.assertEqual(result.termination,Termination.UNKNOWN) + self.assertIsNone(result.best_bound) + self.assertAlmostEqual(result.value(y),3-i) + self.assertAlmostEqual(result.objective,6+i) + self.assertEqual(result.values[dead.slot],{"active":False,"present":False,"value":None}) + self.assertEqual(pool.attempt(3).termination,Termination.INFEASIBLE) + self.assertFalse(pool.attempt(3).candidate_accepted) + retained=pool.entry_result(0) + model.set_bounds(x,1,1) + with retained: + self.assertEqual(retained.info["model_id"],identity[0]) + self.assertAlmostEqual(retained.value(x),-1) + self.assertAlmostEqual(retained.objective,6) + with self.assertRaises(RuntimeError): pool.entry(0) + + def test_pool_requested_limit_maximize_ties_and_explicit_native(self): + for native in (False,True): + available=self.native if native else self.highs + options=Options(backend=Backend.NATIVE if native else Backend.HIGHS, + guarantee=Guarantee.EXACT if native else Guarantee.NUMERICAL) + with self.subTest(native=native),Model(self.lib) as model: + x=model.add_variable(VariableType.INTEGER,-2,0) + y=model.add_variable(VariableType.BINARY) + model.set_objective({x:2},maximize=True,offset=-3) + with model.solve_pool(PoolOptions(options,2,[x,y])) as pool: + self.assertEqual(pool.termination,Termination.SOLUTION_LIMIT if available else Termination.UNSUPPORTED) + self.assertFalse(pool.exhausted) + if available: + self.assertEqual(pool.ranked_prefix,2) + self.assertNotEqual(pool.entry(0).projection_values,pool.entry(1).projection_values) + for i in (0,1): + with pool.entry_result(i) as result: self.assertEqual(result.objective,-3) + + def test_empty_models_zero_items_and_projection_presence(self): + with Model(self.lib) as model: + model.set_objective(offset=-7) + with model.solve_pool(PoolOptions(Options(backend=Backend.HIGHS),5,[])) as pool: + self.assertEqual(pool.projection,()) + if self.highs: + self.assertTrue(pool.exhausted) + self.assertEqual(pool.info["entry_count"],1) + self.assertEqual(pool.entry(0).projection_values,()) + with pool.entry_result(0) as result: + self.assertEqual(result.values,[]) + self.assertEqual(result.objective,-7) + else: self.assertEqual(pool.termination,Termination.UNSUPPORTED) + with model.relax_feasibility(RepairOptions(Options(backend=Backend.HIGHS),(),True)) as repair: + self.assertEqual(repair.variable_map,()) + self.assertEqual(repair.original_values,()) + self.assertEqual(repair.info["item_count"],0) + if self.highs: + self.assertTrue(repair.has_repair) + self.assertTrue(repair.original_validation.valid) + self.assertEqual(repair.weighted_violation,0) + self.assertEqual(repair.original_objective,-7) + else: self.assertEqual(repair.termination,Termination.UNSUPPORTED) + x=model.add_variable(VariableType.INTEGER,0,1) + with model.solve_pool(PoolOptions(projection=[])) as pool: + self.assertEqual(pool.termination,Termination.UNSUPPORTED) + with model.solve_pool(PoolOptions(max_solutions=0)) as pool: + self.assertEqual(pool.termination,Termination.INVALID_MODEL) + + def test_repair_original_private_mapping_stages_and_history(self): + with Model(self.lib) as model: + dead=model.add_variable();model.remove(dead) + x=model.add_variable(VariableType.INTEGER,0,2) + y=model.add_variable(upper=1) + demand=model.add_row({x:1,y:1},lower=4,name="demand λ") + model.set_objective({x:2,y:1},offset=-9) + identity=model.identity + with model.relax_feasibility(RepairOptions(Options(backend=Backend.HIGHS), + [RelaxationSelection(demand,RelaxationSide.LOWER,2)],True)) as repair: + self.assertEqual((repair.info["source_model_id"],repair.info["source_revision"]),identity) + mapping=repair.variable_map + self.assertFalse(mapping[dead.slot].active) + self.assertEqual(mapping[x.slot].source,x) + self.assertNotEqual(mapping[x.slot].private.model_id,x.model_id) + item=repair.item(0) + self.assertEqual(item.source,demand) + self.assertEqual(item.name,"demand λ") + self.assertEqual(item.slack.model_id,mapping[x.slot].private.model_id) + if not self.highs: + self.assertEqual(repair.termination,Termination.UNSUPPORTED) + self.assertFalse(repair.has_repair) + self.assertIsNone(item.activity) + self.assertFalse(repair.original_values[x.slot]["present"]) + with self.assertRaises(ApiError) as error: repair.final_result() + self.assertEqual(error.exception.code,7) + return + self.assertEqual(repair.termination,Termination.OPTIMAL) + self.assertTrue(repair.has_repair) + self.assertTrue(repair.info["minimum_violation_established"]) + self.assertTrue(repair.info["original_objective_optimized"]) + self.assertAlmostEqual(repair.minimum_weighted_violation,2) + self.assertAlmostEqual(repair.weighted_violation,2) + self.assertAlmostEqual(repair.original_objective,-4) + self.assertAlmostEqual(item.violation,1) + self.assertAlmostEqual(item.activity,3) + self.assertAlmostEqual(item.weighted_violation,2) + self.assertFalse(repair.original_validation.valid) + self.assertTrue(repair.original_validation.model_valid) + self.assertAlmostEqual(repair.original_validation.max_row_violation,1) + self.assertAlmostEqual(repair.original_value(x),2) + self.assertEqual(repair.original_values[dead.slot],{"active":False,"present":False,"value":None}) + self.assertEqual(repair.info["completed_stages"],2) + self.assertTrue(repair.stage(0).completed) + self.assertAlmostEqual(repair.stage(0).retention_bound,2) + self.assertEqual(len(repair.objective_values),2) + self.assertIsNotNone(repair.violation_lock) + with self.assertRaises(ApiError): repair.original_value(mapping[x.slot].private) + with self.assertRaises(ApiError): repair.original_value(dead) + retained=repair.final_result();stage=repair.stage_result(0) + model.set_bounds(x,0,1) + with retained,stage: + self.assertEqual(retained.termination,Termination.UNKNOWN) + self.assertIsNone(retained.best_bound) + self.assertAlmostEqual(retained.value(mapping[x.slot].private),2) + self.assertAlmostEqual(retained.value(item.slack),1) + with self.assertRaises(ApiError): retained.value(x) + self.assertEqual(stage.info["model_id"],mapping[x.slot].private.model_id) + with self.assertRaises(RuntimeError): repair.original_value(x) + + def test_repair_binary_bounds_remain_intrinsic_and_semis_are_explicit(self): + with Model(self.lib) as model: + x=model.add_variable(VariableType.BINARY,.25,.75) + model.set_objective({x:1}) + selections=[RelaxationSelection(x,side) for side in RelaxationSide] + with model.relax_feasibility(RepairOptions(Options(backend=Backend.HIGHS),selections,True)) as repair: + if self.highs: + self.assertTrue(repair.has_repair) + self.assertAlmostEqual(repair.minimum_weighted_violation,.25) + self.assertAlmostEqual(repair.original_value(x),0) + self.assertAlmostEqual(repair.original_validation.max_bound_violation,.25) + else: self.assertEqual(repair.termination,Termination.UNSUPPORTED) + with Model(self.lib) as model: + semi=model.add_variable(VariableType.SEMI_INTEGER,2,4) + with model.relax_feasibility(RepairOptions(selections=[RelaxationSelection(semi)])) as repair: + self.assertEqual(repair.termination,Termination.UNSUPPORTED) + self.assertFalse(repair.has_repair) + + def test_invalid_inputs_status_and_ownership(self): + with Model(self.lib) as model,Model(self.lib) as foreign: + x=model.add_variable(VariableType.INTEGER,0,1) + other=foreign.add_variable(VariableType.INTEGER,0,1) + dead=model.add_variable(VariableType.INTEGER,0,1);model.remove(dead) + row=model.add_row({x:1},lower=1) + identity=model.identity + for projection in ([other],[dead],[x,x]): + with model.solve_pool(PoolOptions(projection=projection)) as pool: + self.assertEqual(pool.termination,Termination.INVALID_MODEL) + with self.assertRaises(TypeError): model.solve_pool(PoolOptions(projection=[row])) + with self.assertRaises(OverflowError): model.solve_pool(PoolOptions(max_solutions=2**64)) + for source in (other,dead): + with model.relax_feasibility(RepairOptions(selections=[RelaxationSelection(source)])) as repair: + self.assertEqual(repair.termination,Termination.INVALID_MODEL) + for penalty in (0,-1,math.nan,math.inf): + with self.assertRaises(ApiError): + model.relax_feasibility(RepairOptions(selections=[RelaxationSelection(row,penalty=penalty)])) + with self.assertRaises(ValueError): model.relax_feasibility(RepairOptions(selections=[RelaxationSelection(row,9)])) + with self.assertRaises(TypeError): model.relax_feasibility(RepairOptions(optimize_original_objective=1)) + with self.assertRaises(TypeError): model.relax_feasibility(Options()) + with self.assertRaises(TypeError): model.solve_pool(Options()) + self.assertEqual(model.identity,identity) + + def test_repair_failed_refinement_preserves_only_established_evidence(self): + with Model(self.lib) as model: + x=model.add_variable() + model.set_objective({x:1},maximize=True) + with model.relax_feasibility(RepairOptions(Options(backend=Backend.HIGHS),(),True)) as repair: + if not self.highs: + self.assertEqual(repair.termination,Termination.UNSUPPORTED) + else: + self.assertEqual(repair.termination,Termination.UNBOUNDED) + self.assertTrue(repair.info["minimum_violation_established"]) + self.assertFalse(repair.info["original_objective_optimized"]) + self.assertEqual(repair.info["completed_stages"],1) + self.assertTrue(repair.has_repair) + self.assertEqual(repair.minimum_weighted_violation,0) + self.assertTrue(repair.stage(0).completed) + self.assertFalse(repair.stage(1).completed) + with repair.stage_result(1) as stage: + self.assertEqual(stage.termination,Termination.UNBOUNDED) + with repair.final_result() as retained: + self.assertEqual(retained.termination,Termination.UNKNOWN) + self.assertIsNone(retained.best_bound) + with Model(self.lib) as model: + x=model.add_variable(VariableType.INTEGER,.25,.75) + with model.relax_feasibility(RepairOptions(Options(backend=Backend.HIGHS))) as repair: + self.assertEqual(repair.termination,Termination.INFEASIBLE if self.highs else Termination.UNSUPPORTED) + self.assertFalse(repair.has_repair) + self.assertFalse(repair.info["minimum_violation_established"]) + self.assertIsNone(repair.minimum_weighted_violation) + + def test_cancellation_limits_missing_capabilities_and_no_fallback(self): + with Model(self.lib) as model,Cancellation(self.lib) as token: + x=model.add_variable(VariableType.INTEGER,0,1) + token.cancel() + with model.solve_pool(PoolOptions(Options(cancellation=token))) as pool: + self.assertEqual(pool.termination,Termination.CANCELLED) + self.assertEqual(pool.info["entry_count"],0) + self.assertIsNotNone(pool.message) + with model.relax_feasibility(RepairOptions(Options(cancellation=token))) as repair: + self.assertEqual(repair.termination,Termination.CANCELLED) + self.assertFalse(repair.has_repair) + self.assertEqual(repair.variable_map[0].source,x) + self.assertIsNone(repair.variable_map[0].private) + for method,wrapper in ((model.solve_pool,PoolOptions),(model.relax_feasibility,RepairOptions)): + with method(wrapper(Options(time_limit_seconds=0))) as result: + self.assertEqual(result.termination,Termination.TIME_LIMIT) + with method(wrapper(Options(guarantee=Guarantee.CERTIFIED))) as result: + self.assertEqual(result.termination,Termination.UNSUPPORTED) + with model.solve_pool(PoolOptions(Options(node_limit=1),max_solutions=2)) as pool: + self.assertEqual(pool.termination,Termination.UNSUPPORTED) + + def test_cancel_and_destroy_source_during_pool_call(self): + # Many requested classes prevent a vacuous already-completed oracle. + # A backend-disabled build still checks its owning Unsupported outcome. + model=Model(self.lib) + for _ in range(16): model.add_variable(VariableType.BINARY) + identity=model.identity + with Cancellation(self.lib) as token,concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: + entered=threading.Event() + function=self.lib._functions["pool_solve"] + def observed(*args): + entered.set() + return function(*args) + self.lib._functions["pool_solve"]=observed + try: + future=executor.submit(model.solve_pool,PoolOptions(Options(backend=Backend.HIGHS, + cancellation=token,time_limit_seconds=3),max_solutions=10000)) + self.assertTrue(entered.wait(1)) + time.sleep(.02) + if self.highs: self.assertFalse(future.done(),"fixture completed before testing in-flight destruction") + token.cancel();model.close() + with future.result(timeout=4) as pool: + self.assertEqual((pool.info["model_id"],pool.info["revision"]),identity) + self.assertEqual(pool.termination,Termination.CANCELLED if self.highs else Termination.UNSUPPORTED) + self.assertFalse(pool.exhausted) + finally: + self.lib._functions["pool_solve"]=function + model.close() + + +if __name__=="__main__": + unittest.main() diff --git a/test/flatzinc-capture/capture.cpp b/test/flatzinc-capture/capture.cpp new file mode 100644 index 0000000000..3ad67219ca --- /dev/null +++ b/test/flatzinc-capture/capture.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::FlatZinc; +namespace C=Gecode::FlatZinc::Capture; +namespace { +unsigned checked=0; +std::shared_ptr good(const std::string& text) { + auto r=C::parse_string(text);++checked; + if(r.status!=C::Status::Complete){ + std::cerr<raw_variables.size()==3&&r->raw_domains.size()==1&&r->raw_constraints.size()==2); + assert(variable(*r,C::Type::Integer,1).alias&&variable(*r,C::Type::Integer,1).target.index==0); + assert(variable(*r,C::Type::Integer,2).assigned&&variable(*r,C::Type::Integer,2).value.integer==3); + assert(variable(*r,C::Type::Integer,2,false).alias&&!variable(*r,C::Type::Integer,2,false).assigned); + assert(r->raw_domains[0].arguments[0].reference.index==1&&r->raw_domains[0].arguments[1].set.lower==2); + assert(r->domains.size()==2&&r->coverage.size()==2&&r->coverage[0].kind==C::CoverageKind::AliasEquality); + assert(r->coverage[1].raw_constraint==1&&r->constraints.size()==1); + assert(r->solve.method==C::Method::Minimize&&r->solve.objective.reference.index==1); + assert(r->output.size()==1&&r->output[0].name=="x"); + auto b=good("var bool: b; var bool: c=true; var {false}: d=b; constraint bool_eq(b,c); constraint bool2int(b,1); solve satisfy;"); + assert(variable(*b,C::Type::Boolean,1).value.boolean); + assert(b->raw_domains.size()==1&&b->raw_domains[0].arguments[0].reference.type==C::Type::Boolean); + assert(b->domains.back().arguments[1].set.lower==1&&!b->solve.has_objective); + auto typed=good("int: n=7; bool: p=true; float: f=1.25; set of int: s={2,7}; array[1..1] of var int: a=[n]; array[1..1] of var bool: b=[p]; array[1..1] of var float: c=[f]; array[1..1] of var set of int: d=[s]; solve maximize f;"); + assert(variable(*typed,C::Type::Integer,0).value.integer==7); + assert(variable(*typed,C::Type::Boolean,0).value.boolean); + assert(variable(*typed,C::Type::Float,0).value.floating==1.25); + assert(variable(*typed,C::Type::Set,0).value.set.values.size()==2); + assert(typed->solve.objective.floating==1.25&&typed->raw_variables.size()==4); + for(const auto& literal:std::vector>{{"23",23},{"-23",-23},{"0o10",8},{"010",10},{"08",8},{"0x1a",26}}){ + auto k=good("solve minimize "+literal.first+";");assert(k->raw_variables.empty()&&k->solve.objective.integer==literal.second); + } + auto f=good("var 1.0..2.0: f; var 1.5..3.0: g=f; var set of {1,3}: s; var set of int: t=s; solve maximize g;"); + assert(f->raw_variables.size()==4&&f->raw_domains.size()==2&&f->solve.objective.reference.type==C::Type::Float); + auto a=good("var 0..5: x; array[1..3] of var 1..4: a :: output_array([0..2])=[x,x,3]; constraint custom(a, [x,3], true); solve minimize a[3];"); + assert(a->raw_variables.size()==2&&a->raw_domains.size()==3&&a->raw_constraints[0].arguments[0].elements.size()==3); + assert(a->solve.objective.reference.index==1&&a->output.size()==1); + assert(a->output[0].expression.elements[1].elements[0].reference.index==0); + assert(a->output[0].expression.elements[1].elements[1].reference.index==0); + auto empty=good("array[1..0] of var 1..2: a :: output_array([1..0]); solve satisfy;"); + assert(empty->raw_variables.empty()&&empty->output[0].expression.elements[1].elements.empty()); + auto reif=good("var bool: b; var 0..3: x; constraint int_le_reif(x,2,b); solve :: int_search([x],input_order,indomain_min,complete) satisfy;"); + assert(reif->raw_constraints[0].id=="int_le_reif"&&reif->solve.annotations.size()==1); + auto annotations=good(R"(var 0..1: x :: one([1,2]) :: two(1,2) :: quoted("Hello,\n World\t\"quoted\"!"); solve satisfy;)"); + const auto& anns=annotations->declaration_annotations[0].annotations; + assert(anns[0].elements.size()==1&&anns[0].elements[0].kind==C::ValueKind::Array&&anns[0].elements[0].elements.size()==2); + assert(anns[1].elements.size()==2&&anns[1].elements[0].kind==C::ValueKind::Integer); + assert(anns[2].elements[0].text=="Hello,\n World\t\"quoted\"!"); + const auto& output_ann=a->declaration_annotations.back().annotations[0]; + assert(output_ann.elements.size()==1&&output_ann.elements[0].kind==C::ValueKind::Array); + auto canonical=good("var {3,1,3}: x; solve satisfy;"); + assert((variable(*canonical,C::Type::Integer,0).domain.integers.values==std::vector{1,3})); + auto params=good("array[1..2] of bool: flags=[true,false]; constraint custom(flags[2]); solve satisfy;"); + assert(params->raw_constraints[0].arguments[0].kind==C::ValueKind::Boolean&&!params->raw_constraints[0].arguments[0].boolean); + std::ostringstream chain;chain<<"array[1..512] of var int: a;"; + for(int i=512;i>1;--i)chain<<"constraint int_eq(a["<variables.size()==512&&normalized->coverage.size()==1023); + for(std::size_t i=1;i<512;++i)assert(normalized->variables[i].alias&&normalized->variables[i].target.index==0&&!normalized->raw_variables[i].alias); + registry().add("capture_test_never_post",poster); + auto unknown=good("constraint capture_test_never_post(1); solve satisfy;"); + assert(posted==0&&unknown->raw_constraints[0].id=="capture_test_never_post"); +} +void malformed_cases(){ + for(const auto& s:std::vector{ + "", "var int: x;", "constraint int_eq(); solve satisfy;", "constraint int_eq(1); solve satisfy;", + "constraint int_eq(true,1); solve satisfy;", "constraint bool2int(1,true); solve satisfy;", + "constraint foo(missing); solve satisfy;", "var int: x=missing; solve satisfy;", + "int: x :: ignored = 1; solve satisfy;", + "array[1..1] of int: x :: ignored = [1]; solve satisfy;", + "int: x=true; solve satisfy;", "bool: x=1; solve satisfy;", "float: x=false; solve satisfy;", "set of int: x=1; solve satisfy;", + "var int: x=true; solve satisfy;", "var bool: x=1; solve satisfy;", "var float: x=false; solve satisfy;", "var set of int: x=1; solve satisfy;", + "var int: x; var int: x; solve satisfy;", "solve minimize missing;", "solve minimize missing[-1];", + "array[1..1] of var int: a; solve minimize a[-1];", "array[1..1] of var int: a; solve minimize a[2];", + "int: a=1; solve minimize a[1];", "array[1..1] of var bool: a; solve minimize a[1];", + "array[1..2] of var int: a=[1]; solve satisfy;", "array[1..1] of var int: a=[true]; solve satisfy;", + "array[0..1] of var int: a; solve satisfy;", "array[1..1] of var int: a :: output_array([true]); solve satisfy;", + "array[1..1] of var int: a :: output_array([1..2]); solve satisfy;", + "var int: a :: output_array([1..1]); solve satisfy;", + "array[1..0] of var int: a :: output_array([]); solve satisfy;", + "constraint foo(missing[missing]); solve satisfy;", "var int: x :: foo([1,2; solve satisfy;", + "solve :: name(\"unfinished) satisfy;", + "solve minimize 9999999999999999999999999;", "solve minimize 1.0e999;", "solve minimize 1.0e-999;"})reject(s); + reject("constraint gecode_on_restart_status(1); solve satisfy;",C::Status::Unsupported); + reject(std::string("solve satisfy;\0",15)); + C::Options o;o.max_input_bytes=4;reject("solve satisfy;",C::Status::ResourceLimit,o); + o={};o.max_array_elements=1;reject("array[1..2] of var int: a; solve satisfy;",C::Status::ResourceLimit,o); + o={};o.max_variables=1;reject("array[1..2] of var int: a; solve satisfy;",C::Status::ResourceLimit,o); + reject("var int: x; var int: y; solve satisfy;",C::Status::ResourceLimit,o); + o={};o.max_constraints=0;reject("constraint int_eq(1,1); solve satisfy;",C::Status::ResourceLimit,o); + reject("var 1..2: x=1; solve satisfy;",C::Status::ResourceLimit,o); + o.max_constraints=1;reject("var 1..2: x=1; constraint int_eq(x,1); solve satisfy;",C::Status::ResourceLimit,o); + o.max_constraints=0;reject("var 1.0..2.0: x=1.5; solve satisfy;",C::Status::ResourceLimit,o); + o={};o.max_value_depth=2;reject("solve :: a(b(c(1))) satisfy;",C::Status::ResourceLimit,o); + reject(R"(solve :: unsupported("\123") satisfy;)",C::Status::Unsupported); + reject(std::string("solve :: text(\"\xc0\xaf\") satisfy;")); + auto unicode=good(u8"solve :: text(\"λ😀\") satisfy;");assert(unicode->solve.annotations[0].elements[0].text==u8"λ😀"); + std::istringstream input("solve maximize 9;");input.exceptions(std::ios::failbit|std::ios::badbit); + auto r=C::parse(input);assert(r.status==C::Status::Complete&&r.records->solve.objective.integer==9); + struct BadBuffer:std::streambuf{int_type underflow()override{throw std::runtime_error("broken source");}} buffer; + std::istream broken(&buffer);broken.exceptions(std::ios::badbit); + auto failed=C::parse(broken);assert(failed.status==C::Status::InvalidInput&&!failed.records); + std::istringstream exact("solve satisfy;");C::Options exact_options;exact_options.max_input_bytes=14; + auto equal=C::parse(exact,exact_options);assert(equal.status==C::Status::Complete); + std::istringstream over("solve satisfy; ");auto too_long=C::parse(over,exact_options);assert(too_long.status==C::Status::ResourceLimit&&!too_long.records); +} +void legacy_case(){ + std::istringstream input("var 1..3: x :: output_var; constraint int_eq(x,2); solve satisfy;"); + Printer printer;std::ostringstream errors;std::unique_ptr space(Gecode::FlatZinc::parse(input,printer,errors)); + assert(space&&errors.str().empty()&&space->iv.size()==1&&space->iv[0].assigned()&&space->iv[0].val()==2); +} +} +int main(int argc,char**){ + semantic_cases();malformed_cases();if(argc==1)legacy_case(); + for(int n=0;n<20;++n){good("var int: x; array[1..2] of var int: a=[x,x]; solve satisfy;");reject("var int: x; array[1..2] of var int: a=[x]; solve satisfy;");} + const std::string source="var {1,3}: x :: output_var; array[1..2] of var int: a :: output_array([1..2])=[x,2]; constraint int_le(x,3); solve minimize x;"; + for(std::size_t n=0;n correct{true};std::vector workers; + for(int n=0;n<4;++n)workers.emplace_back([&]{for(int k=0;k<8;++k){auto r=C::parse_string(source);if(r.status!=C::Status::Complete||!r.records||r.records->raw_variables.size()!=2)correct=false;}}); + for(auto& worker:workers)worker.join();assert(correct); + std::cout<<"FlatZinc capture "< +#include +#include + namespace Test { namespace FlatZinc { namespace { + const std::string first_y_prefix = "x = 1;\ny = "; + const std::string remembered_suffix = + ";\n----------\nx = 2;\ny = 1.0;\n----------\n" + "x = 3;\ny = 2.0;\n----------\n==========\n"; + + bool restart_float_output(const std::string& output) { + // At the first solution, status=1 allows the bool_clause to hold + // without y equalling the remembered value: y has no declared bounds. + // Later status=4 forces that equality, so all subsequent output stays + // exact, including the remembered values, solution order and markers. + if (output.compare(0,first_y_prefix.size(),first_y_prefix) != 0) + return false; + const std::size_t end = output.find(";\n",first_y_prefix.size()); + if ((end == std::string::npos) || + (output.compare(end,std::string::npos,remembered_suffix) != 0)) + return false; + const std::string spelling = output.substr(first_y_prefix.size(), + end-first_y_prefix.size()); + // Restrict the stream parser to decimal/scientific output spelling; + // implementations can otherwise also accept hexadecimal numbers. + if (spelling.find_first_not_of("0123456789+-.eE") != std::string::npos) + return false; + std::istringstream token(spelling); + token.imbue(std::locale::classic()); + double value = 0; + token >> std::noskipws >> value; + return !token.fail() && token.eof() && std::isfinite(value); + } + + /// Exercise the checker independently of the solver's chosen first y. + class OutputCheckTest : public Base { + public: + OutputCheckTest(void) + : Base("FlatZinc::on_restart::sol_float::OutputCheck") {} + virtual bool run(void) { + const char* accepted[] = { + "1.0", "-1.79769313486231e+308", "0", "+0.0", "-.125", + "1e+3", "1.7976931348623157e+308" + }; + for (const char* token : accepted) + if (!restart_float_output(first_y_prefix+token+remembered_suffix)) + return false; + const char* rejected[] = { + "", " ", "nan", "-nan", "NaN", "inf", "+inf", "-infinity", + "1e309", "-1e309", "1 2", "1.0junk", "1.0 ", " 1.0", + "0x1p0", "1e", "--1", "1;\n", "1\n2" + }; + for (const char* token : rejected) + if (restart_float_output(first_y_prefix+token+remembered_suffix)) + return false; + const std::string good = first_y_prefix+"1.0"+remembered_suffix; + const char* originals[] = { + "x = 1", "x = 2", "x = 3", "y = 1.0;\n----------\nx = 3", + "y = 2.0", "----------", "==========" + }; + const char* replacements[] = { + "x = 2", "x = 3", "x = 2", "y = 2.0;\n----------\nx = 3", + "y = 1.0", "---------", "=====UNKNOWN=====" + }; + for (std::size_t i=0; i +#include +#include +#include +#include + +using namespace Gecode; +namespace { +void check(bool okay) { if (!okay) throw std::runtime_error("brancher lifecycle regression"); } +class State : public Space { +public: + IntVarArray x; + explicit State(int size) : x(*this,size,0,1) { + for(int i=0;i ids() { + std::vector result; + for(Space::Branchers b(*this);b();++b) result.push_back(b.brancher().id()); + return result; + } + unsigned int propagators() { + unsigned int count=0; + for(Space::Propagators p(*this);p();++p) { (void)&p.propagator();++count; } + return count; + } + unsigned int idle_propagators() { + unsigned int count=0; + for(Space::IdlePropagators p(*this);p();++p) { (void)&p.propagator();++count; } + return count; + } +}; +} +int main() { + State empty(0); + check(empty.ids().empty() && empty.status()==SS_SOLVED && empty.choice()==nullptr); + check(empty.propagators()==0 && empty.idle_propagators()==0); + std::unique_ptr empty_clone(static_cast(empty.clone())); + check(empty_clone->ids().empty() && empty_clone->status()==SS_SOLVED); + + State original(3);check(original.status()==SS_BRANCH); + const auto original_ids=original.ids();check(original_ids.size()==3); + std::unique_ptr first(original.choice()); + std::unique_ptr child(static_cast(original.clone())); + child->commit(*first,0);check(child->status()==SS_BRANCH && child->x[0].val()==0); + std::unique_ptr second(child->choice()); + check(child->ids()==std::vector({original_ids[1],original_ids[2]})); + Archive archive;second->archive(archive); + std::unique_ptr restored(child->choice(archive)); + std::unique_ptr grandchild(static_cast(child->clone())); + grandchild->commit(*restored,1); + check(grandchild->status()==SS_BRANCH && grandchild->x[1].val()==1); + std::unique_ptr third(grandchild->choice()); + grandchild->commit(*third,0);check(grandchild->status()==SS_SOLVED); + check(grandchild->choice()==nullptr && grandchild->ids().empty()); + + // Look up a later brancher, then wrap around to an earlier one without + // calling choice(), which would delete the exhausted actors. + std::unique_ptr wrap(static_cast(original.clone())); + wrap->commit(*third,0);wrap->commit(*first,0); + check(wrap->x[0].val()==0 && wrap->x[2].val()==0 && wrap->status()==SS_BRANCH); + std::unique_ptr missing_middle(static_cast(original.clone())); + BrancherGroup middle;middle.move(*missing_middle,original_ids[1]);middle.kill(*missing_middle); + bool no_middle=false; + try { missing_middle->commit(*second,0); } catch(const SpaceNoBrancher&) { no_middle=true; } + check(no_middle && missing_middle->ids().size()==2); + missing_middle->commit(*third,0);missing_middle->commit(*first,0); + check(missing_middle->status()==SS_SOLVED); + + std::unique_ptr killed(static_cast(original.clone())); + BrancherGroup removal; + for (auto id : {original_ids[1],original_ids[0],original_ids[2]}) { + removal.move(*killed,id);removal.kill(*killed); + } + check(killed->ids().empty() && killed->status()==SS_SOLVED); + bool missing=false; + try { killed->commit(*first,0); } catch(const SpaceNoBrancher&) { missing=true; } + check(missing); + std::unique_ptr killed_clone(static_cast(killed->clone())); + check(killed_clone->status()==SS_SOLVED && killed_clone->ids().empty()); + + State failed(2);failed.fail(); + check(failed.status()==SS_FAILED && failed.choice()==nullptr && failed.ids().empty()); + State constrained(3);rel(constrained,constrained.x[0],IRT_LQ,constrained.x[1]); + check(constrained.propagators()>0); + check(constrained.status()==SS_BRANCH && constrained.idle_propagators()>0); + Search::Options options;options.threads=1;options.c_d=3;options.a_d=2; + DFS search(&original,options);unsigned int seen=0,mask=0; + while(std::unique_ptr solution{search.next()}) { + ++seen;mask |= 1U << (solution->x[0].val()+2*solution->x[1].val()+4*solution->x[2].val()); + } + check(seen==8 && mask==255 && !search.stopped()); +} diff --git a/test/optimize/bulk.cpp b/test/optimize/bulk.cpp new file mode 100644 index 0000000000..75c5e89f2a --- /dev/null +++ b/test/optimize/bulk.cpp @@ -0,0 +1,178 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Deterministic allocation failures exercise the public all-or-nothing boundary. +namespace Allocation { +long fail_after = -1; +std::size_t maximum = std::numeric_limits::max(), largest = 0; +} +void* operator new(std::size_t bytes) { + Allocation::largest = std::max(Allocation::largest, bytes); + if (bytes > Allocation::maximum || Allocation::fail_after == 0) throw std::bad_alloc(); + if (Allocation::fail_after > 0) --Allocation::fail_after; + if (void* memory = std::malloc(bytes ? bytes : 1)) return memory; + throw std::bad_alloc(); +} +void* operator new[](std::size_t bytes) { return ::operator new(bytes); } +void operator delete(void* memory) noexcept { std::free(memory); } +void operator delete[](void* memory) noexcept { std::free(memory); } +void operator delete(void* memory, std::size_t) noexcept { std::free(memory); } +void operator delete[](void* memory, std::size_t) noexcept { std::free(memory); } + +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); +std::string fingerprint(const Model& model) { + const auto source = model.snapshot(); std::ostringstream out; + out.precision(17); out << source.model_id << ':' << source.revision; + for (const auto& v : source.variables) + out << '/' << v.variable.model_id << ':' << v.variable.id << ':' << int(v.type) + << ':' << v.lower << ':' << v.upper << ':' << v.active << ':' << v.name; + for (const auto& r : source.rows) { + out << '/' << r.constraint.model_id << ':' << r.constraint.id << ':' << r.lower << ':' << r.upper << ':' << r.active << ':' << r.name; + for (const auto& t : r.terms) out << ':' << t.variable.model_id << ',' << t.variable.id << ',' << t.coefficient; + } + out << '/' << int(source.objective.sense) << ':' << source.objective.offset; + for (const auto& t : source.objective.terms) out << ':' << t.variable.id << ',' << t.coefficient; + return out.str(); +} +template void rejects_unchanged(Model& model, Action action) { + const auto before = fingerprint(model); + bool caught = false; + try { action(); } catch (const ModelError&) { caught = true; } + assert(caught && fingerprint(model) == before); +} + +void scalar_and_bulk_equivalence() { + Model model; + const auto removed = model.add_integer(0, 1); model.remove(removed); + const auto old = model.snapshot(); const auto revision = model.revision(); + const std::vector specs{ + {VariableType::Integer, -3, 7, "integer"}, {VariableType::Continuous, -inf, inf, "free"}, + {VariableType::Binary, .2, .8, "empty integer domain"}, + {VariableType::SemiContinuous, 2, 9, "semi"}, {VariableType::SemiInteger, 2.5, 7, "semi integer"}}; + const auto variables = model.add_variables(specs); + assert(model.revision() == revision + 1 && variables.size() == specs.size()); + for (std::size_t i = 0; i < variables.size(); ++i) { + const auto& value = model.variable(variables[i]); + assert(variables[i].model_id == model.id() && variables[i].id == i + 1); + assert(value.type == specs[i].type && value.lower == specs[i].lower && value.upper == specs[i].upper && value.name == specs[i].name); + } + assert(old.variables.size() == 1 && !old.variables[0].active); + const std::vector rows{ + {{{variables[0], 1e16}, {variables[1], 2}, {variables[0], 1}, {variables[0], -1e16}}, -3, 8, "compensated"}, + {{}, -inf, inf, "empty"}, {{{variables[4], 3}, {variables[4], -3}}, 1, inf, "contradiction"}}; + const auto before = model.revision(); const auto handles = model.add_rows(rows); + assert(model.revision() == before + 1 && handles.size() == 3); + assert(model.row(handles[0]).terms.size() == 2 && model.row(handles[0]).terms[0].coefficient == 1); + assert(model.row(handles[1]).terms.empty() && model.row(handles[2]).terms.empty()); + Model scalar; const auto sv = scalar.add_variables(specs); + for (std::size_t i = 0; i < rows.size(); ++i) { + auto terms = rows[i].terms; for (auto& term : terms) term.variable = sv[term.variable.id - 1]; + const auto handle = scalar.add_row(terms, rows[i].lower, rows[i].upper, rows[i].name); + const auto& actual = model.row(handles[i]); const auto& expected = scalar.row(handle); + assert(actual.lower == expected.lower && actual.upper == expected.upper && actual.name == expected.name); + assert(actual.terms.size() == expected.terms.size()); + for (std::size_t k = 0; k < actual.terms.size(); ++k) + assert(actual.terms[k].coefficient == expected.terms[k].coefficient && actual.terms[k].variable.id == expected.terms[k].variable.id + 1); + } + validate_structure(model.snapshot()); + const auto unchanged = fingerprint(model); + assert(model.add_variables({}).empty() && model.add_rows({}).empty() && model.add_rows_sparse({}).empty()); + assert(fingerprint(model) == unchanged); +} + +void csr_semantics_and_rejections() { + Model model; + auto vars = model.add_variables({{VariableType::Integer, -2, 2, "x"}, {VariableType::Integer, 0, 3, "y"}}); + auto gone = model.add_integer(0, 1); model.remove(gone); + const auto removed = model.add_row({}, -inf, inf); model.remove(removed); + SparseRowBatch rows; + rows.columns = {vars[1], vars[0]}; // explicit mapping differs from slot order + rows.row_start = {0, 4, 4, 5}; rows.column = {1, 0, 1, 1, 0}; + rows.coefficient = {1e16, 2, 1, -1e16, -3}; rows.lower = {-1, -inf, -9}; rows.upper = {4, inf, 0}; + rows.names = {"row", "empty", "bound"}; + const auto revision = model.revision(); const auto added = model.add_rows_sparse(rows); + assert(model.revision() == revision + 1 && added.size() == 3 && added[0].id == 1); + assert(model.row(added[0]).terms.size() == 2 && model.row(added[0]).terms[0].variable == vars[0]); + assert(model.row(added[0]).terms[0].coefficient == 1 && model.row(added[0]).terms[1].coefficient == 2); + for (int x = -2; x <= 2; ++x) for (int y = 0; y <= 3; ++y) { + const auto checked = validate(model.snapshot(), {double(x), double(y), 0}, 0, 0); + assert(checked.valid == (-1 <= x + 2*y && x + 2*y <= 4)); + } + const auto bad = [&](auto change) { auto malformed = rows; change(malformed); rejects_unchanged(model, [&] { model.add_rows_sparse(malformed); }); }; + bad([](auto& r) { r.row_start.clear(); }); bad([](auto& r) { r.row_start[0] = 1; }); + bad([](auto& r) { r.row_start.back() = 4; }); bad([](auto& r) { r.row_start[1] = 6; }); + bad([](auto& r) { r.row_start[2] = 3; }); bad([](auto& r) { r.upper.pop_back(); }); + bad([](auto& r) { r.names.pop_back(); }); bad([](auto& r) { r.column.pop_back(); }); + bad([](auto& r) { r.column.back() = 2; }); bad([](auto& r) { r.coefficient.back() = inf; }); + bad([](auto& r) { r.lower.back() = 1; }); bad([](auto& r) { r.columns.push_back(r.columns[0]); }); + bad([&](auto& r) { r.columns.push_back(gone); }); + Model foreign; const auto other = foreign.add_binary(); bad([&](auto& r) { r.columns.push_back(other); }); + rejects_unchanged(model, [&] { model.add_rows({{{{vars[0], 1}}, 0, 1, {}}, {{{other, 0}}, 0, 1, {}}}); }); + rejects_unchanged(model, [&] { model.add_variables({{VariableType::Integer, 0, 1, {}}, {VariableType::Binary, -1, 1, {}}}); }); + rejects_unchanged(model, [&] { model.add_variables({{static_cast(-1), 0, 1, {}}}); }); + Model moved = std::move(model); + bool caught = false; try { model.add_variables({}); } catch (const ModelError&) { caught = true; } assert(caught); + assert(moved.row(added[0]).constraint.model_id == moved.id()); +} + +void allocation_atomicity() { + for (int operation = 0; operation < 3; ++operation) { + bool succeeded = false; unsigned failures = 0; + for (long stop = 0; stop < 100 && !succeeded; ++stop) { + Model model; auto x = model.add_integer(0, 3); + auto original = model.add_row({{x, 2}}, 0, 6, "existing"); model.minimize({{x, 1}}, 2); + const auto* variable_view = &model.variable(x); const auto* row_view = &model.row(original); + const auto before = fingerprint(model); + std::vector variables(3, {VariableType::Integer, -2, 2, std::string(100, 'v')}); + std::vector rows(3, {{{x, 2}, {x, -1}}, 0, 6, std::string(100, 'r')}); + SparseRowBatch sparse; sparse.columns = {x}; sparse.row_start = {0, 1, 2, 3}; sparse.column = {0, 0, 0}; + sparse.coefficient = {1, 2, 3}; sparse.lower = {0, 0, 0}; sparse.upper = {3, 6, 9}; sparse.names = {std::string(100, 's'), "b", "c"}; + Allocation::fail_after = stop; + try { + if (operation == 0) (void) model.add_variables(variables); + else if (operation == 1) (void) model.add_rows(rows); + else (void) model.add_rows_sparse(sparse); + Allocation::fail_after = -1; succeeded = true; + } catch (const std::bad_alloc&) { + Allocation::fail_after = -1; ++failures; + assert(fingerprint(model) == before); + assert(&model.variable(x) == variable_view && &model.row(original) == row_view); + } + } + assert(succeeded && failures > 3); + } +} + +void sparse_scale() { + constexpr std::size_t n = 16384; + Model model; std::vector specs(n, {VariableType::Integer, 0, 1, {}}); + Allocation::largest = 0; Allocation::maximum = 4 * 1024 * 1024; + const auto variables = model.add_variables(specs); + SparseRowBatch input; input.columns = variables; input.row_start.resize(n + 1); + input.column.resize(n); input.coefficient.assign(n, 1); input.lower.assign(n, 0); input.upper.assign(n, 1); + for (std::size_t i = 0; i <= n; ++i) input.row_start[i] = i; + for (std::size_t i = 0; i < n; ++i) input.column[i] = n - 1 - i; + const auto rows = model.add_rows_sparse(input); + Allocation::maximum = std::numeric_limits::max(); + assert(rows.size() == n && model.revision() == 2); + const auto snapshot = model.snapshot(); std::size_t nonzeros = 0; + for (const auto& row : snapshot.rows) nonzeros += row.terms.size(); + assert(nonzeros == n && Allocation::largest < 4 * 1024 * 1024); +} +} +int main() { + scalar_and_bulk_equivalence(); csr_semantics_and_rejections(); allocation_atomicity(); sparse_scale(); + std::cout << "Atomic bulk/CSR equivalence, allocation failure and 16K sparse construction pass\n"; +} diff --git a/test/optimize/c_api.c b/test/optimize/c_api.c new file mode 100644 index 0000000000..0869081887 --- /dev/null +++ b/test/optimize/c_api.c @@ -0,0 +1,677 @@ +/* Compile this file as C99, then link the shared C ABI library. */ +#include +#include +#include +#include + +#define CHECK(test) do { if(!(test)){fprintf(stderr,"FAIL line %d: %s (%s)\n",__LINE__,#test,gecode_opt_v1_last_error());return 1;} } while(0) +#define OK(call) CHECK((call)==GECODE_OPT_OK) +static int near(double a,double b){return isfinite(a)&&fabs(a-b)<1e-6;} + +static int bulk(void) { + gecode_opt_handle m=0,foreign=0,historical=0,current=0; + gecode_opt_id dead,other,vars[5],rows[2],sentinel[2],mapping[2]; + gecode_opt_variable_spec_v1 specs[5];gecode_opt_row_spec_v1 rs[2];gecode_opt_sparse_row_batch_v1 csr; + gecode_opt_term ts[4];gecode_opt_options_v1 options;gecode_opt_result_info_v1 info; + uint64_t owner=0,revision=0,after=0,start[3]={0,3,4},column[4]={1,1,1,0}; + double coefficient[4]={1e16,1,-1e16,1},lower[2]={2,0},upper[2]={INFINITY,4},value=0; + int32_t available=0,lp=0,mip=0,present=0;size_t i; + char name[]="retained";const char* names[2]={"demand",NULL}; + memset(specs,0,sizeof(specs));memset(rs,0,sizeof(rs));memset(&csr,0,sizeof(csr)); + memset(sentinel,0x5a,sizeof(sentinel));memcpy(rows,sentinel,sizeof(rows)); + for(i=0;i<5;++i){specs[i].struct_size=sizeof(specs[i]);specs[i].type=(int32_t)i;specs[i].upper=i==2?1:5;} + specs[3].lower=2;specs[4].lower=2.5;specs[0].name=name; + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_create(&foreign)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,1,"hole",&dead)); + OK(gecode_opt_v1_model_remove_variable(m,dead)); + OK(gecode_opt_v1_model_add_variable(foreign,GECODE_OPT_CONTINUOUS,0,1,"",&other)); + OK(gecode_opt_v1_model_identity(m,&owner,&revision)); + CHECK(gecode_opt_v1_model_add_variables(m,specs,5,NULL,0)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(gecode_opt_v1_model_add_variables(m,specs,5,NULL,5)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_variables(m,specs,5,rows,2)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(memcmp(rows,sentinel,sizeof(rows))==0); + CHECK(gecode_opt_v1_model_add_variables(m,NULL,1,vars,5)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_variables(m,specs,UINT64_MAX,vars,5)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_variables(m,specs,5,vars,UINT64_MAX)==GECODE_OPT_INVALID_ARGUMENT); + specs[4].struct_size--;CHECK(gecode_opt_v1_model_add_variables(m,specs,5,vars,5)==GECODE_OPT_INVALID_ARGUMENT);specs[4].struct_size++; + specs[4].reserved=1;CHECK(gecode_opt_v1_model_add_variables(m,specs,5,vars,5)==GECODE_OPT_INVALID_ARGUMENT);specs[4].reserved=0; + specs[4].type=99;CHECK(gecode_opt_v1_model_add_variables(m,specs,5,vars,5)==GECODE_OPT_INVALID_ARGUMENT);specs[4].type=4; + specs[4].lower=NAN;CHECK(gecode_opt_v1_model_add_variables(m,specs,5,vars,5)==GECODE_OPT_MODEL_ERROR);specs[4].lower=2.5; + {const char* bad[]={"\xc0\x80","\xed\xa0\x80","\xf4\x90\x80\x80","\x80","\xe2"}; + for(i=0;i1); + CHECK(gecode_opt_v1_pool_message(pool,message,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL&&message[0]=='!'); + if(highs){ + CHECK(pi.completion==GECODE_OPT_POOL_EXHAUSTED&&pi.entry_count==3&&pi.ranked_prefix==3&&pi.attempt_count==4); + OK(gecode_opt_v1_pool_entry_info(pool,0,&ei,sizeof(ei)));CHECK(ei.rank_established&&ei.projection_count==1); + CHECK(gecode_opt_v1_pool_entry_projection(pool,0,&point,0,&needed)==GECODE_OPT_BUFFER_TOO_SMALL&&point==99); + OK(gecode_opt_v1_pool_entry_projection(pool,0,&point,1,&needed));CHECK(point==-1); + OK(gecode_opt_v1_pool_attempt_info(pool,3,&ai,sizeof(ai)));CHECK(ai.termination==GECODE_OPT_INFEASIBLE&&!ai.candidate_accepted); + OK(gecode_opt_v1_pool_entry_result(pool,0,&entry)); + OK(gecode_opt_v1_result_info(entry,&result_info,sizeof(result_info)));CHECK(result_info.termination==GECODE_OPT_UNKNOWN); + OK(gecode_opt_v1_result_number(entry,GECODE_OPT_BEST_BOUND,&present,&value));CHECK(!present&&value==0); + OK(gecode_opt_v1_result_values(entry,values,active,available,3,&needed));CHECK(!active[2]&&!available[2]&&values[2]==0); + }else CHECK(pi.completion==GECODE_OPT_POOL_INCOMPLETE&&pi.entry_count==0); + OK(gecode_opt_v1_pool_destroy(pool));CHECK(gecode_opt_v1_pool_destroy(pool)==GECODE_OPT_INVALID_HANDLE); + po.max_solutions=1;OK(gecode_opt_v1_pool_solve(m,&po,&pool));OK(gecode_opt_v1_pool_info(pool,&pi,sizeof(pi))); + if(highs)CHECK(pi.completion==GECODE_OPT_POOL_REQUESTED_LIMIT&&pi.termination==GECODE_OPT_SOLUTION_LIMIT&&pi.entry_count==1); + OK(gecode_opt_v1_pool_destroy(pool)); + /* Keep a historical entry across source edits and destruction. */ + OK(gecode_opt_v1_model_set_row_bounds(m,row,6,INFINITY)); + selection.source=row;selection.side=GECODE_OPT_RELAX_LOWER;selection.reserved=0;selection.penalty=2; + ro.solve.backend=GECODE_OPT_HIGHS;ro.selections=&selection;ro.selection_count=1;ro.optimize_original_objective=1; + ro.struct_size--;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT&&repair==0);ro.struct_size++; + ro.reserved=1;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);ro.reserved=0; + ro.selection_count=UINT64_MAX;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);ro.selection_count=1; + ro.selections=NULL;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);ro.selections=&selection; + selection.reserved=1;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);selection.reserved=0; + selection.source.reserved=1;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);selection.source.reserved=0; + selection.side=7;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);selection.side=GECODE_OPT_RELAX_LOWER; + selection.penalty=NAN;CHECK(gecode_opt_v1_repair_solve(m,&ro,&repair)==GECODE_OPT_INVALID_ARGUMENT);selection.penalty=2; + selection.source=other;OK(gecode_opt_v1_repair_solve(m,&ro,&repair));OK(gecode_opt_v1_repair_info(repair,&ri,sizeof(ri))); + CHECK(ri.termination==GECODE_OPT_INVALID_MODEL);OK(gecode_opt_v1_repair_destroy(repair));selection.source=row; + OK(gecode_opt_v1_repair_solve(m,&ro,&repair));OK(gecode_opt_v1_repair_info(repair,&ri,sizeof(ri))); + CHECK(ri.termination==(highs?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED));CHECK(ri.source_model_id==owner&&ri.variable_slots==3); + CHECK(gecode_opt_v1_pool_destroy(repair)==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_repair_variable_map(repair,sources,mapped,active,3,&needed));CHECK(needed==3&&!active[2]); + CHECK(sources[0].model_id==owner&&mapped[0].model_id!=owner&&mapped[0].model_id==ri.private_model_id); + OK(gecode_opt_v1_repair_item_info(repair,0,&item,sizeof(item)));CHECK(item.source.kind==GECODE_OPT_ROW_ID&&item.source.slot==row.slot); + CHECK(item.slack.model_id==ri.private_model_id&&near(item.penalty,2)); + if(highs){ + CHECK(ri.has_repair&&ri.minimum_violation_established&&ri.original_objective_optimized&&ri.completed_stages==2); + OK(gecode_opt_v1_repair_number(repair,GECODE_OPT_REPAIR_VIOLATION,&present,&value));CHECK(present&&near(value,2)); + OK(gecode_opt_v1_repair_original_value(repair,x,&value));CHECK(near(value,1)); + CHECK(gecode_opt_v1_repair_original_value(repair,mapped[0],&value)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_repair_original_value(repair,dead,&value)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_repair_validation(repair,&validation,sizeof(validation)));CHECK(!validation.valid&&validation.model_valid&&near(validation.max_row_violation,1)); + OK(gecode_opt_v1_repair_stage_info(repair,0,&si,sizeof(si)));CHECK(si.completed&&si.retention_bound.present); + OK(gecode_opt_v1_repair_stage_result(repair,0,&stage));OK(gecode_opt_v1_repair_final_result(repair,&final)); + OK(gecode_opt_v1_repair_violation_lock(repair,&present,&lock));CHECK(present&&lock.model_id==ri.private_model_id); + OK(gecode_opt_v1_repair_original_values(repair,values,active,available,3,&needed));CHECK(available[0]&&!available[2]&&!active[2]); + }else{ + CHECK(!ri.has_repair);CHECK(gecode_opt_v1_repair_final_result(repair,&final)==GECODE_OPT_NO_SOLUTION&&final==0); + CHECK(!item.activity.present&&item.activity.value==0); + } + values[0]=99;active[0]=9;available[0]=9; + CHECK(gecode_opt_v1_repair_original_values(repair,values,active,available,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(needed==3&&values[0]==99&&active[0]==9&&available[0]==9); + CHECK(gecode_opt_v1_repair_text(repair,GECODE_OPT_REPAIR_MESSAGE,1,NULL,0,&needed)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_repair_stage_result(repair,UINT64_MAX,&token)==GECODE_OPT_INVALID_ARGUMENT&&token==0); + OK(gecode_opt_v1_repair_destroy(repair));OK(gecode_opt_v1_model_destroy(m));OK(gecode_opt_v1_model_destroy(foreign)); + if(highs){ + OK(gecode_opt_v1_result_number(entry,GECODE_OPT_OBJECTIVE,&present,&value));CHECK(present&&near(value,6)); + OK(gecode_opt_v1_result_value(entry,x,&value));CHECK(near(value,-1));OK(gecode_opt_v1_result_destroy(entry)); + OK(gecode_opt_v1_result_value(final,mapped[0],&value));CHECK(near(value,1)); + CHECK(gecode_opt_v1_result_value(final,x,&value)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_result_info(stage,&result_info,sizeof(result_info)));CHECK(result_info.model_id==mapped[0].model_id); + OK(gecode_opt_v1_result_destroy(stage));OK(gecode_opt_v1_result_destroy(final)); + } + /* Cancellation and zero deadlines are workflow outcomes without a fallback. */ + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_cancellation_create(&token));OK(gecode_opt_v1_cancellation_cancel(token)); + OK(gecode_opt_v1_pool_options_default(&po,sizeof(po)));po.solve.cancellation=token; + OK(gecode_opt_v1_pool_solve(m,&po,&pool));OK(gecode_opt_v1_pool_info(pool,&pi,sizeof(pi)));CHECK(pi.termination==GECODE_OPT_CANCELLED&&pi.entry_count==0); + OK(gecode_opt_v1_pool_destroy(pool));OK(gecode_opt_v1_cancellation_destroy(token)); + OK(gecode_opt_v1_repair_options_default(&ro,sizeof(ro)));ro.solve.time_limit_seconds=0; + OK(gecode_opt_v1_repair_solve(m,&ro,&repair));OK(gecode_opt_v1_repair_info(repair,&ri,sizeof(ri)));CHECK(ri.termination==GECODE_OPT_TIME_LIMIT&&!ri.has_repair); + OK(gecode_opt_v1_repair_destroy(repair)); + /* Native exact enumeration is explicit and needs no persistent session. */ + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,-1,0,"x",&x)); + OK(gecode_opt_v1_pool_options_default(&po,sizeof(po)));po.solve.backend=GECODE_OPT_NATIVE;po.solve.guarantee=GECODE_OPT_EXACT; + OK(gecode_opt_v1_pool_solve(m,&po,&pool));OK(gecode_opt_v1_pool_info(pool,&pi,sizeof(pi))); + CHECK(pi.termination==(native?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + if(native)CHECK(pi.entry_count==2&&pi.completion==GECODE_OPT_POOL_EXHAUSTED&&pi.guarantee==GECODE_OPT_EXACT); + OK(gecode_opt_v1_pool_destroy(pool));OK(gecode_opt_v1_model_destroy(m)); + return 0; +} + +static int globals_and_logic(void) { + gecode_opt_handle m=0,foreign=0,r=0,session=0; + gecode_opt_id x,y,index,other,g,table,element,cumulative,circuit,successors[2],ids[2]; + gecode_opt_result_info_v1 info; + gecode_opt_options_v1 options; + gecode_opt_term objective[2]; + uint64_t owner=0,before=0,after=0; + int32_t native=0,highs=0,lp=0,mip=0,present=0; + int64_t tuples[4]={0,1,1,0},durations[2]={0,1},heights[2]={100,0}; + double value=0; + OK(gecode_opt_v1_capabilities(GECODE_OPT_NATIVE,&native,&lp,&mip)); + OK(gecode_opt_v1_capabilities(GECODE_OPT_HIGHS,&highs,&lp,&mip)); + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_create(&foreign)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,0,1,"x",&x)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,0,1,"y",&y)); + OK(gecode_opt_v1_model_add_variable(foreign,GECODE_OPT_INTEGER,0,1,"other",&other)); + ids[0]=x;ids[1]=other; + OK(gecode_opt_v1_model_identity(m,&owner,&before)); + CHECK(gecode_opt_v1_model_add_all_different(m,ids,2,"foreign",&g)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_add_all_different(m,NULL,1,"null",&g)==GECODE_OPT_INVALID_ARGUMENT); + ids[1]=y; + CHECK(gecode_opt_v1_model_add_table(m,ids,2,tuples,3,2,"arity",&g)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_table(m,ids,2,NULL,4,2,"null",&g)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_table(m,ids,2,tuples,0,UINT64_MAX,"overflow",&g)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_cumulative(m,ids,2,durations,1,heights,2,0,"length",&g)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_cumulative(m,ids,2,durations,2,heights,2,-1,"capacity",&g)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_add_circuit(m,ids,2,INT64_MAX,"base",&g)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_identity(m,&owner,&after));CHECK(before==after); + OK(gecode_opt_v1_model_add_all_different(m,ids,2,"distinct",&g));CHECK(g.kind==GECODE_OPT_GLOBAL_ID); + CHECK(gecode_opt_v1_model_remove_variable(m,x)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_remove_global(m,x)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_remove_global(foreign,g)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_set_global_name(m,g,"renamed")); + OK(gecode_opt_v1_model_add_table(m,ids,2,tuples,4,2,"allowed",&table)); + /* One-based element index selects x, which also aliases the result. */ + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,1,1,"index",&index)); + OK(gecode_opt_v1_model_add_element(m,index,ids,2,x,1,"element",&element)); + ids[1]=x; + OK(gecode_opt_v1_model_add_cumulative(m,ids,2,durations,2,heights,2,0,"zero usage",&cumulative)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,2,2,"s0",&successors[0])); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,1,1,"s1",&successors[1])); + OK(gecode_opt_v1_model_add_circuit(m,successors,2,1,"cycle",&circuit)); + objective[0].variable=x;objective[0].coefficient=1;objective[1].variable=y;objective[1].coefficient=2; + OK(gecode_opt_v1_model_set_objective(m,objective,2,GECODE_OPT_MINIMIZE,0)); + OK(gecode_opt_v1_options_default(&options,sizeof(options))); + OK(gecode_opt_v1_solve(m,&options,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==(native?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + if(native){OK(gecode_opt_v1_result_number(r,GECODE_OPT_OBJECTIVE,&present,&value));CHECK(present&&near(value,1));} + OK(gecode_opt_v1_result_destroy(r));options.backend=GECODE_OPT_HIGHS; + OK(gecode_opt_v1_solve(m,&options,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_result_destroy(r)); + options.backend=GECODE_OPT_AUTO;OK(gecode_opt_v1_session_create(&session)); + OK(gecode_opt_v1_session_solve(session,m,&options,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_result_destroy(r));OK(gecode_opt_v1_session_destroy(session)); + OK(gecode_opt_v1_model_remove_global(m,table)); + CHECK(gecode_opt_v1_model_remove_global(m,table)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_set_global_name(m,table,"dead")==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_destroy(m));OK(gecode_opt_v1_model_destroy(foreign)); + + /* Zero-arity table distinguishes no tuples (false) from one empty tuple (true). */ + {int rows; + for(rows=0;rows<=1;++rows){ + OK(gecode_opt_v1_model_create(&m)); + OK(gecode_opt_v1_model_add_table(m,NULL,0,NULL,0,(uint64_t)rows,"zero arity",&g)); + OK(gecode_opt_v1_solve(m,NULL,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==(native?(rows?GECODE_OPT_OPTIMAL:GECODE_OPT_INFEASIBLE):GECODE_OPT_UNSUPPORTED)); + OK(gecode_opt_v1_result_destroy(r));OK(gecode_opt_v1_model_destroy(m)); + } + } + /* A bounded indicator keeps its domain guard and exposes its gate lifetime. */ + {gecode_opt_id b,indicator,gate,a,o;gecode_opt_term term;int32_t has_gate=0; + OK(gecode_opt_v1_model_create(&m)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_BINARY,1,1,"b",&b)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,0,4,"x",&x)); + term.variable=x;term.coefficient=1; + OK(gecode_opt_v1_model_identity(m,&owner,&before)); + CHECK(gecode_opt_v1_model_add_indicator(m,b,2,&term,1,3,INFINITY,"bad",&indicator,&has_gate,&gate)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_indicator(m,b,1,&term,1,3,INFINITY,"bad",&indicator,NULL,&gate)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_boolean_and(m,b,&x,1,"integer")==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_identity(m,&owner,&after));CHECK(before==after); + OK(gecode_opt_v1_model_add_indicator(m,b,1,&term,1,3,INFINITY,"guard",&indicator,&has_gate,&gate)); + CHECK(indicator.kind==GECODE_OPT_INDICATOR_ID&&has_gate&&gate.kind==GECODE_OPT_VARIABLE_ID); + CHECK(gecode_opt_v1_model_set_variable_bounds(m,x,0,5)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_remove_indicator(m,x)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_model_set_objective(m,&term,1,GECODE_OPT_MINIMIZE,0));options.backend=GECODE_OPT_HIGHS; + OK(gecode_opt_v1_solve(m,&options,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==(highs?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + if(highs){OK(gecode_opt_v1_result_value(r,x,&value));CHECK(near(value,3));} + OK(gecode_opt_v1_result_destroy(r));OK(gecode_opt_v1_model_remove_indicator(m,indicator)); + CHECK(gecode_opt_v1_model_remove_indicator(m,indicator)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_remove_variable(m,gate)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_BINARY,0,1,"and",&a)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_BINARY,0,1,"or",&o)); + OK(gecode_opt_v1_model_add_boolean_and(m,a,NULL,0,"empty and")); + OK(gecode_opt_v1_model_add_boolean_or(m,o,NULL,0,"empty or")); + ids[0]=a;ids[1]=a;OK(gecode_opt_v1_model_add_boolean_and(m,a,ids,2,"alias")); + OK(gecode_opt_v1_solve(m,&options,&r));OK(gecode_opt_v1_result_info(r,&info,sizeof(info))); + CHECK(info.termination==(highs?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + if(highs){OK(gecode_opt_v1_result_value(r,x,&value));CHECK(near(value,0)); + OK(gecode_opt_v1_result_value(r,a,&value));CHECK(near(value,1));OK(gecode_opt_v1_result_value(r,o,&value));CHECK(near(value,0));} + OK(gecode_opt_v1_result_destroy(r));OK(gecode_opt_v1_model_destroy(m)); + } + return 0; +} + +static int native_starts(void) { + gecode_opt_handle model=0,result=0,old=0; + gecode_opt_id b,x,gate,indicator; + gecode_opt_term terms[2];gecode_opt_start start[3]; + gecode_opt_options_v1 options;gecode_opt_result_info_v1 info; + int32_t native=0,lp=0,mip=0,has_gate=0,present=0;int maximize; + double value=0; + OK(gecode_opt_v1_capabilities(GECODE_OPT_NATIVE,&native,&lp,&mip)); + OK(gecode_opt_v1_model_create(&model)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_BINARY,0,1,"b",&b)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,4,"x",&x)); + terms[0].variable=x;terms[0].coefficient=1; + OK(gecode_opt_v1_model_add_indicator(model,b,1,terms,1,3,INFINITY,"enabled demand",&indicator,&has_gate,&gate)); + CHECK(has_gate);terms[1].variable=b;terms[1].coefficient=-10; + OK(gecode_opt_v1_options_default(&options,sizeof(options))); + options.backend=GECODE_OPT_NATIVE;options.guarantee=GECODE_OPT_EXACT; + options.primal_start=start;options.primal_start_count=2; + start[0].variable=b;start[1].variable=x;start[2].variable=gate; + for(maximize=0;maximize!=2;++maximize) { + /* The deliberately poor original point omits its live derived gate. */ + start[0].value=maximize?1:0;start[1].value=maximize?3:4; + OK(gecode_opt_v1_model_set_objective(model,terms,2,maximize?GECODE_OPT_MAXIMIZE:GECODE_OPT_MINIMIZE,3)); + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==(native?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + CHECK(info.start_submitted==native&&info.has_solution==native); + if(native) { + CHECK(info.solution_validated&&info.guarantee==GECODE_OPT_EXACT); + OK(gecode_opt_v1_result_number(result,GECODE_OPT_OBJECTIVE,&present,&value));CHECK(present&&value==(maximize?7:-4)); + OK(gecode_opt_v1_result_number(result,GECODE_OPT_BEST_BOUND,&present,&value));CHECK(present&&value==(maximize?7:-4)); + OK(gecode_opt_v1_result_value(result,b,&value));CHECK(value==(maximize?0:1)); + OK(gecode_opt_v1_result_value(result,x,&value));CHECK(value==(maximize?4:3)); + OK(gecode_opt_v1_result_value(result,gate,&value));CHECK(value==(maximize?1:0)); + } + if(!maximize)old=result;else OK(gecode_opt_v1_result_destroy(result)); + } + if(native) { + start[0].value=0;start[1].value=4;start[2].value=0;options.primal_start_count=3; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_INVALID_MODEL&&!info.start_submitted&&!info.has_solution);OK(gecode_opt_v1_result_destroy(result)); + options.primal_start_count=1; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_UNSUPPORTED&&!info.start_submitted);OK(gecode_opt_v1_result_destroy(result)); + options.primal_start_count=2;start[0].value=1-1e-12;start[1].value=3; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_INVALID_MODEL&&!info.has_solution);OK(gecode_opt_v1_result_destroy(result)); + start[0].value=0;start[1].value=4;options.has_node_limit=1;options.node_limit=0; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_NODE_LIMIT&&!info.start_submitted&&!info.has_solution);OK(gecode_opt_v1_result_destroy(result)); + options.has_node_limit=0; + OK(gecode_opt_v1_model_remove_indicator(model,indicator)); + OK(gecode_opt_v1_model_set_objective(model,NULL,0,GECODE_OPT_MINIMIZE,11)); + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_result_destroy(result)); + /* Removed gate is ordinary state: accept explicit zero even though b=0. */ + options.primal_start_count=3; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_OPTIMAL&&info.start_submitted); + start[1].value=99;start[2].value=99; + OK(gecode_opt_v1_result_value(result,x,&value));CHECK(value==4); + OK(gecode_opt_v1_result_value(result,gate,&value));CHECK(value==0); + OK(gecode_opt_v1_result_destroy(result)); + } + OK(gecode_opt_v1_model_destroy(model)); + if(native){OK(gecode_opt_v1_result_value(old,x,&value));CHECK(value==3); + OK(gecode_opt_v1_result_number(old,GECODE_OPT_OBJECTIVE,&present,&value));CHECK(present&&value==-4);} + OK(gecode_opt_v1_result_destroy(old));return 0; +} + +static int quadratic(void) { + gecode_opt_handle m=0,other_model=0,linear=0,result=0,old=0,cancel=0,session=0; + gecode_opt_id x,dead,other,row; + gecode_opt_term term,linear_term; + gecode_opt_weighted_square_v1 square; + gecode_opt_quadratic_options_v1 options; + gecode_opt_quadratic_info_v1 info; + gecode_opt_quadratic_checks_v1 checks; + gecode_opt_result_info_v1 linear_info; + uint64_t owner=0,revision=0,after=0,needed=0; + int32_t available=0,present=0; + double value=0,values[2]={44,55};uint8_t active[2]={7,7},valid[2]={7,7}; + memset(&square,0,sizeof(square));square.struct_size=sizeof(square);square.weight=2;square.offset=-2; + OK(gecode_opt_v1_quadratic_capabilities(&available)); + CHECK(gecode_opt_v1_quadratic_capabilities(NULL)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_options_default(&options,sizeof(options)-1)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_quadratic_options_default(&options,sizeof(options))); + CHECK(options.struct_size==sizeof(options)&&options.solve.struct_size==sizeof(options.solve)); + CHECK(options.reserved==0&&options.solve.reserved==0); + CHECK(options.iteration_limit==100000&&near(options.optimality_tolerance,1e-6)); + CHECK(gecode_opt_v1_quadratic_model_create(NULL)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_quadratic_model_create(&m));OK(gecode_opt_v1_quadratic_model_create(&other_model)); + OK(gecode_opt_v1_model_create(&linear));OK(gecode_opt_v1_session_create(&session)); + OK(gecode_opt_v1_quadratic_model_add_continuous(m,0,1,"hole",&dead)); + OK(gecode_opt_v1_quadratic_model_remove_variable(m,dead)); + OK(gecode_opt_v1_quadratic_model_add_continuous(m,-4,4,"x",&x)); + OK(gecode_opt_v1_quadratic_model_add_continuous(other_model,-4,4,"foreign",&other)); + CHECK(gecode_opt_v1_quadratic_model_add_continuous(m,0,INFINITY,"",&row)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_quadratic_model_add_continuous(m,NAN,1,"",&row)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_destroy(m)==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_quadratic_model_destroy(linear)==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_solve(m,NULL,&result)==GECODE_OPT_INVALID_HANDLE&&result==0); + CHECK(gecode_opt_v1_session_solve(session,m,NULL,&result)==GECODE_OPT_INVALID_HANDLE&&result==0); + CHECK(gecode_opt_v1_pool_solve(m,NULL,&result)==GECODE_OPT_INVALID_HANDLE&&result==0); + CHECK(gecode_opt_v1_repair_solve(m,NULL,&result)==GECODE_OPT_INVALID_HANDLE&&result==0); + CHECK(gecode_opt_v1_quadratic_solve(linear,NULL,&result)==GECODE_OPT_INVALID_HANDLE&&result==0); + CHECK(gecode_opt_v1_model_set_variable_bounds(m,x,0,1)==GECODE_OPT_INVALID_HANDLE); + term.variable=x;term.coefficient=1;square.terms=&term;square.term_count=1; + linear_term.variable=x;linear_term.coefficient=4; + /* 2(x-2)^2 + 4x - 7 has minimum -1 at x=1. */ + OK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,&linear_term,1,GECODE_OPT_MINIMIZE,-7)); + OK(gecode_opt_v1_quadratic_model_identity(m,&owner,&revision)); + square.struct_size--;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT);square.struct_size++; + square.reserved=1;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT);square.reserved=0; + square.terms=NULL;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT);square.terms=&term; + CHECK(gecode_opt_v1_quadratic_model_set_objective(m,NULL,1,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,UINT64_MAX,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,1,0,0)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,99,0)==GECODE_OPT_INVALID_ARGUMENT); + square.weight=0;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_MODEL_ERROR);square.weight=2; + square.offset=INFINITY;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_MODEL_ERROR);square.offset=-2; + square.name="\xe2";CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_INVALID_ARGUMENT);square.name=NULL; + term.variable=other;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_MODEL_ERROR); + term.variable=dead;CHECK(gecode_opt_v1_quadratic_model_set_objective(m,&square,1,NULL,0,0,0)==GECODE_OPT_MODEL_ERROR);term.variable=x; + CHECK(gecode_opt_v1_quadratic_model_remove_variable(m,x)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_quadratic_model_identity(m,&owner,&after));CHECK(after==revision); + OK(gecode_opt_v1_quadratic_solve(m,NULL,&result)); + OK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info))); + CHECK(info.result.model_id==owner&&info.result.revision==revision&&info.result.variable_slots==2); + CHECK(info.result.reserved==0); + CHECK(info.result.termination==(available?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + CHECK(gecode_opt_v1_result_info(result,&linear_info,sizeof(linear_info))==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_result_destroy(result)==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info)-1)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_result_checks(result,&checks,sizeof(checks)-1)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_quadratic_result_checks(result,&checks,sizeof(checks))); + CHECK(checks.reserved==0&&checks.max_stationarity.reserved==0&&checks.original_objective.reserved==0); + OK(gecode_opt_v1_quadratic_result_values(result,NULL,NULL,NULL,0,&needed));CHECK(needed==2); + CHECK(gecode_opt_v1_quadratic_result_values(result,values,active,valid,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(values[0]==44&&active[0]==7&&valid[0]==7); + CHECK(gecode_opt_v1_quadratic_result_values(result,values,NULL,valid,2,&needed)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_quadratic_result_values(result,values,active,valid,2,&needed)); + CHECK(!active[0]&&!valid[0]&&values[0]==0&&active[1]); + OK(gecode_opt_v1_quadratic_result_number(result,GECODE_OPT_OBJECTIVE,&present,&value)); + CHECK(present==available); + if(available){ + CHECK(near(value,-1)&&near(values[1],1)&&valid[1]); + CHECK(checks.primal_valid&&checks.objective_valid&&checks.kkt_available&&checks.kkt_valid&&checks.bound_valid); + CHECK(checks.original_objective.present&&near(checks.original_objective.value,-1)); + CHECK(checks.gap_upper_bound.present&&checks.gap_upper_bound.value<=options.optimality_tolerance); + CHECK(checks.max_stationarity.present&&checks.max_complementarity.present); + CHECK(checks.square_count==1&&checks.gradient_slots==2); + OK(gecode_opt_v1_quadratic_result_array(result,GECODE_OPT_QP_SQUARE_RESIDUALS,values,2,&needed));CHECK(needed==1&&near(values[0],-1)); + values[0]=44;CHECK(gecode_opt_v1_quadratic_result_array(result,GECODE_OPT_QP_ORIGINAL_GRADIENT,values,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL);CHECK(values[0]==44); + OK(gecode_opt_v1_quadratic_result_array(result,GECODE_OPT_QP_ORIGINAL_GRADIENT,values,2,&needed));CHECK(near(values[0],0)&&near(values[1],0)); + CHECK(gecode_opt_v1_quadratic_result_value(result,other,&value)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_quadratic_result_value(result,dead,&value)==GECODE_OPT_MODEL_ERROR); + }else{ + CHECK(!checks.primal_valid&&!checks.objective_valid&&!checks.kkt_available&&!checks.kkt_valid&&!checks.bound_valid); + CHECK(!checks.original_objective.present&&!checks.normalized_lower_bound.present&&!checks.gap_upper_bound.present); + CHECK(!checks.max_stationarity.present&&!checks.max_complementarity.present&&checks.gradient_slots==0); + CHECK(gecode_opt_v1_quadratic_result_value(result,x,&value)==GECODE_OPT_NO_SOLUTION); + } + CHECK(gecode_opt_v1_quadratic_result_array(result,99,NULL,0,&needed)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_quadratic_result_number(result,99,&present,&value)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_quadratic_result_number(result,GECODE_OPT_QP_VENDOR_OBJECTIVE,&present,&value)); + CHECK(present==available); + {char buffer[256];buffer[0]='Z'; + OK(gecode_opt_v1_quadratic_result_text(result,GECODE_OPT_BACKEND_NAME,NULL,0,&needed));CHECK(needed>1); + CHECK(gecode_opt_v1_quadratic_result_text(result,GECODE_OPT_BACKEND_NAME,buffer,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL);CHECK(buffer[0]=='Z'); + OK(gecode_opt_v1_quadratic_result_text(result,GECODE_OPT_QP_CHECK_MESSAGE,buffer,sizeof(buffer),&needed));} + old=result;result=0; + OK(gecode_opt_v1_quadratic_model_add_row(m,&term,1,2,INFINITY,"demand",&row)); + OK(gecode_opt_v1_quadratic_model_set_coefficient(m,row,x,2)); + OK(gecode_opt_v1_quadratic_model_set_row_bounds(m,row,4,INFINITY)); + OK(gecode_opt_v1_quadratic_solve(m,&options,&result)); + if(available){OK(gecode_opt_v1_quadratic_result_value(result,x,&value));CHECK(near(value,2));} + OK(gecode_opt_v1_quadratic_result_destroy(result)); + OK(gecode_opt_v1_quadratic_model_remove_row(m,row)); + options.struct_size--;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_INVALID_ARGUMENT&&result==0);options.struct_size++; + options.solve.struct_size--;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_INVALID_ARGUMENT);options.solve.struct_size++; + options.reserved=1;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_INVALID_ARGUMENT);options.reserved=0; + options.solve.reserved=1;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_INVALID_ARGUMENT);options.solve.reserved=0; + options.optimality_tolerance=NAN;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_MODEL_ERROR);options.optimality_tolerance=1e-6; + options.max_lifted_nonzeros=UINT64_MAX;CHECK(gecode_opt_v1_quadratic_solve(m,&options,&result)==GECODE_OPT_INVALID_ARGUMENT);options.max_lifted_nonzeros=2000000; + options.solve.backend=GECODE_OPT_NATIVE; + OK(gecode_opt_v1_quadratic_solve(m,&options,&result));OK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info))); + CHECK(info.result.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_quadratic_result_destroy(result));options.solve.backend=GECODE_OPT_AUTO; + options.solve.guarantee=GECODE_OPT_EXACT; + OK(gecode_opt_v1_quadratic_solve(m,&options,&result));OK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info))); + CHECK(info.result.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_quadratic_result_destroy(result));options.solve.guarantee=GECODE_OPT_NUMERICAL; + OK(gecode_opt_v1_cancellation_create(&cancel));OK(gecode_opt_v1_cancellation_cancel(cancel));options.solve.cancellation=cancel; + OK(gecode_opt_v1_quadratic_solve(m,&options,&result));OK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info))); + CHECK(info.result.termination==GECODE_OPT_CANCELLED); + OK(gecode_opt_v1_quadratic_result_checks(result,&checks,sizeof(checks))); + CHECK(!checks.kkt_available&&!checks.max_stationarity.present&&!checks.max_complementarity.present); + OK(gecode_opt_v1_quadratic_result_destroy(result)); + OK(gecode_opt_v1_cancellation_destroy(cancel));options.solve.cancellation=0; + options.solve.time_limit_seconds=0; + OK(gecode_opt_v1_quadratic_solve(m,&options,&result));OK(gecode_opt_v1_quadratic_result_info(result,&info,sizeof(info))); + CHECK(info.result.termination==GECODE_OPT_TIME_LIMIT);OK(gecode_opt_v1_quadratic_result_destroy(result)); + OK(gecode_opt_v1_quadratic_model_destroy(m));OK(gecode_opt_v1_quadratic_model_destroy(other_model)); + OK(gecode_opt_v1_model_destroy(linear));OK(gecode_opt_v1_session_destroy(session)); + OK(gecode_opt_v1_quadratic_result_info(old,&info,sizeof(info)));CHECK(info.result.revision==revision); + if(available){OK(gecode_opt_v1_quadratic_result_value(old,x,&value));CHECK(near(value,1));} + OK(gecode_opt_v1_quadratic_result_destroy(old)); + CHECK(gecode_opt_v1_quadratic_result_destroy(old)==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_quadratic_model_identity(m,&owner,&revision)==GECODE_OPT_INVALID_HANDLE); + return 0; +} + +int main(void){ + gecode_opt_options_v1 options; + gecode_opt_handle model=0,foreign=0,session=0,result=0,old=0,cancel=0; + gecode_opt_id x,dead,other,row; + gecode_opt_term term; + gecode_opt_result_info_v1 info; + int32_t available=0,lp=0,mip=0,present=0; + uint64_t owner=0,revision=0,needed=0; + double value=0; + CHECK(gecode_opt_v1_abi_version()==1); + CHECK(globals_and_logic()==0); + CHECK(workflows()==0);CHECK(bulk()==0);CHECK(quadratic()==0); + CHECK(gecode_opt_v1_options_default(NULL,sizeof(options))==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_options_default(&options,sizeof(options)-1)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_options_default(&options,sizeof(options))); + CHECK(options.struct_size==sizeof(options)&&options.threads==1); + CHECK(gecode_opt_v1_capabilities(-1,&available,&lp,&mip)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_capabilities(GECODE_OPT_HIGHS,&available,&lp,&mip)); + CHECK(gecode_opt_v1_model_create(NULL)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_model_create(&model));OK(gecode_opt_v1_model_create(&foreign)); + CHECK(model!=foreign&&model!=0); + CHECK(gecode_opt_v1_model_add_variable(model,-1,0,1,"bad",&x)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,NAN,1,"bad",&x)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,6,"x",&x)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_BINARY,0,1,"dead",&dead)); + OK(gecode_opt_v1_model_remove_variable(model,dead)); + CHECK(gecode_opt_v1_model_set_variable_bounds(model,dead,0,1)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_add_variable(foreign,GECODE_OPT_INTEGER,0,6,"other",&other)); + term.variable=other;term.coefficient=1; + CHECK(gecode_opt_v1_model_add_row(model,&term,1,2,INFINITY,"foreign",&row)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_model_add_row(model,NULL,1,2,INFINITY,"null",&row)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_add_row(model,&term,UINT64_MAX,2,INFINITY,"count",&row)==GECODE_OPT_INVALID_ARGUMENT); + term.variable=x;term.coefficient=INFINITY; + CHECK(gecode_opt_v1_model_add_row(model,&term,1,2,INFINITY,"inf",&row)==GECODE_OPT_INVALID_ARGUMENT); + term.coefficient=1; + OK(gecode_opt_v1_model_add_row(model,&term,1,2,INFINITY,"demand",&row)); + CHECK(row.kind==GECODE_OPT_ROW_ID&&x.kind==GECODE_OPT_VARIABLE_ID); + CHECK(gecode_opt_v1_model_set_variable_bounds(model,row,0,1)==GECODE_OPT_INVALID_ARGUMENT); + term.coefficient=2; + OK(gecode_opt_v1_model_set_objective(model,&term,1,GECODE_OPT_MINIMIZE,-3)); + CHECK(gecode_opt_v1_model_set_objective(model,&term,1,-1,0)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_model_remove_variable(model,x)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_model_identity(model,&owner,&revision));CHECK(owner==x.model_id&&revision>0); + OK(gecode_opt_v1_session_create(&session)); + CHECK(gecode_opt_v1_model_destroy(session)==GECODE_OPT_INVALID_HANDLE); + options.backend=GECODE_OPT_HIGHS; + OK(gecode_opt_v1_session_solve(session,model,&options,&result)); + OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==(available?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + CHECK(info.has_solution==available); + OK(gecode_opt_v1_result_number(result,GECODE_OPT_OBJECTIVE,&present,&value)); + CHECK(present==available);CHECK(available?near(value,1):value==0); + CHECK(gecode_opt_v1_result_info(result,&info,sizeof(info)-1)==GECODE_OPT_INVALID_ARGUMENT); + CHECK(gecode_opt_v1_result_number(result,-1,&present,&value)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_result_text(result,GECODE_OPT_BACKEND_NAME,NULL,0,&needed));CHECK(needed>1); + {char buffer[128];buffer[0]='Z'; + CHECK(gecode_opt_v1_result_text(result,GECODE_OPT_BACKEND_NAME,buffer,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(buffer[0]=='Z'&&gecode_opt_v1_last_error()[0]); + OK(gecode_opt_v1_result_text(result,GECODE_OPT_BACKEND_NAME,buffer,sizeof(buffer),&needed));CHECK(strcmp(buffer,"HiGHS")==0); + CHECK(gecode_opt_v1_last_error()[0]=='\0');} + if(available){ + double values[2]={88,99};uint8_t active[2]={7,7},valid[2]={7,7}; + OK(gecode_opt_v1_result_values(result,NULL,NULL,NULL,0,&needed));CHECK(needed==2); + CHECK(gecode_opt_v1_result_values(result,values,active,valid,1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + CHECK(values[0]==88&&active[0]==7&&valid[0]==7); + OK(gecode_opt_v1_result_values(result,values,active,valid,2,&needed)); + CHECK(active[0]&&valid[0]&&near(values[0],2));CHECK(!active[1]&&!valid[1]&&values[1]==0); + CHECK(gecode_opt_v1_result_value(result,other,&value)==GECODE_OPT_MODEL_ERROR); + CHECK(gecode_opt_v1_result_value(result,dead,&value)==GECODE_OPT_MODEL_ERROR); + old=result;result=0; + OK(gecode_opt_v1_model_set_variable_bounds(model,x,4,6)); + OK(gecode_opt_v1_session_solve(session,model,&options,&result)); + OK(gecode_opt_v1_result_number(result,GECODE_OPT_OBJECTIVE,&present,&value));CHECK(present&&near(value,5)); + OK(gecode_opt_v1_result_value(old,x,&value));CHECK(near(value,2)); + {gecode_opt_session_statistics_v1 stats; + OK(gecode_opt_v1_session_statistics(session,&stats,sizeof(stats)));CHECK(stats.model_loads==1&&stats.incremental_updates==1);} + OK(gecode_opt_v1_result_destroy(old)); + }else CHECK(gecode_opt_v1_result_value(result,x,&value)==GECODE_OPT_NO_SOLUTION); + OK(gecode_opt_v1_result_destroy(result)); + options.reserved=1; + CHECK(gecode_opt_v1_solve(model,&options,&result)==GECODE_OPT_INVALID_ARGUMENT);CHECK(result==0); + options.reserved=0;options.backend=99; + CHECK(gecode_opt_v1_solve(model,&options,&result)==GECODE_OPT_INVALID_ARGUMENT); + options.backend=GECODE_OPT_HIGHS;options.primal_start_count=1;options.primal_start=NULL; + CHECK(gecode_opt_v1_solve(model,&options,&result)==GECODE_OPT_INVALID_ARGUMENT); + options.primal_start_count=0;options.time_limit_seconds=NAN; + CHECK(gecode_opt_v1_solve(model,&options,&result)==GECODE_OPT_MODEL_ERROR); + options.time_limit_seconds=INFINITY;options.guarantee=GECODE_OPT_CERTIFIED; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_UNSUPPORTED);OK(gecode_opt_v1_result_destroy(result));options.guarantee=GECODE_OPT_NUMERICAL; + OK(gecode_opt_v1_cancellation_create(&cancel));OK(gecode_opt_v1_cancellation_cancel(cancel));options.cancellation=cancel; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==GECODE_OPT_CANCELLED);OK(gecode_opt_v1_result_destroy(result)); + OK(gecode_opt_v1_cancellation_destroy(cancel));options.cancellation=0; + {int32_t native=0;OK(gecode_opt_v1_capabilities(GECODE_OPT_NATIVE,&native,&lp,&mip));options.backend=GECODE_OPT_NATIVE; + OK(gecode_opt_v1_solve(model,&options,&result));OK(gecode_opt_v1_result_info(result,&info,sizeof(info))); + CHECK(info.termination==(native?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED));OK(gecode_opt_v1_result_destroy(result));} + options.backend=GECODE_OPT_HIGHS; + OK(gecode_opt_v1_solve(model,&options,&result)); + OK(gecode_opt_v1_session_destroy(session));OK(gecode_opt_v1_model_destroy(model));OK(gecode_opt_v1_model_destroy(foreign)); + CHECK(gecode_opt_v1_model_destroy(model)==GECODE_OPT_INVALID_HANDLE); + CHECK(gecode_opt_v1_model_identity(model,&owner,&revision)==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_result_info(result,&info,sizeof(info)));CHECK(info.model_id==x.model_id); + if(available){OK(gecode_opt_v1_result_value(result,x,&value));CHECK(near(value,4));} + OK(gecode_opt_v1_result_destroy(result));CHECK(gecode_opt_v1_result_destroy(result)==GECODE_OPT_INVALID_HANDLE); + CHECK(native_starts()==0); + puts("C99 ABI ownership, error, session and backend contracts passed");return 0; +} diff --git a/test/optimize/constraints.cpp b/test/optimize/constraints.cpp new file mode 100644 index 0000000000..eae3b5bafb --- /dev/null +++ b/test/optimize/constraints.cpp @@ -0,0 +1,257 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include + +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); + +template void rejects(Action action) { + bool rejected = false; + try { action(); } catch (const ModelError&) { rejected = true; } + assert(rejected); +} + +bool linear_rows(const ModelSnapshot& model, const std::vector& values, + long double tolerance = 0.0L) { + for (const auto& row : model.rows) { + if (!row.active) continue; + long double value = 0; + for (const auto& term : row.terms) + value += static_cast(term.coefficient) * values[term.variable.id]; + if (value < static_cast(row.lower) - tolerance || + value > static_cast(row.upper) + tolerance) return false; + } + return true; +} + +void indicator_equivalence() { + for (bool active : {false, true}) + for (int kind = 0; kind < 3; ++kind) { + Model model; + auto b = model.add_binary("b"); + auto x = model.add_integer(-3, 3, "x"); + auto y = model.add_integer(-2, 2, "y"); + const double lower = kind == 1 ? -inf : -2.0; + const double upper = kind == 0 ? inf : 4.0; + const auto before = model.revision(); + auto formulation = add_indicator(model, b, active, + {{x, 2}, {y, -3}, {b, 1}}, lower, upper); + assert(model.revision() == before + 1); + assert(formulation.inactive_gate); + const auto snapshot = model.snapshot(); + validate_structure(snapshot); + assert(formulation.rows.size() == (kind == 2 ? 3U : 2U)); + for (int bv = 0; bv <= 1; ++bv) + for (int xv = -3; xv <= 3; ++xv) + for (int yv = -2; yv <= 2; ++yv) + for (int gv = 0; gv <= 1; ++gv) { + std::vector values(snapshot.variables.size()); + values[b.id] = bv; values[x.id] = xv; values[y.id] = yv; + values[formulation.inactive_gate->id] = gv; + const double original = 2 * xv - 3 * yv + bv; + const bool enabled = bv == static_cast(active); + const bool expected = (gv == static_cast(!enabled)) && + (!enabled || (original >= lower && original <= upper)); + assert(linear_rows(snapshot, values) == expected); + assert(validate(snapshot, values, 0.0, 0.0).valid == expected); + } + } +} + +void semi_domains_and_redundancy() { + for (auto type : {VariableType::SemiContinuous, VariableType::SemiInteger}) { + Model model; + auto b = model.add_binary(); + auto x = model.add_variable(type, 3, 6); + auto formulation = add_indicator(model, b, true, {{x, 1}}, 2, inf); + assert(formulation.lower_m && *formulation.lower_m >= 2); + auto snapshot = model.snapshot(); + assert(snapshot.indicators[0].domains[0].lower == 0.0); + for (int bv = 0; bv <= 1; ++bv) + for (int xv : {0, 3, 4, 5, 6}) { + std::vector values(snapshot.variables.size()); + values[b.id] = bv; values[x.id] = xv; + values[formulation.inactive_gate->id] = 1 - bv; + assert(validate(snapshot, values, 0, 0).valid == (bv == 0 || xv >= 2)); + } + } + Model model; + auto b = model.add_binary(); + auto x = model.add_continuous(0, inf); + // An unbounded upper endpoint is irrelevant to this lower-side relaxation. + auto redundant = add_indicator(model, b, true, {{x, 1}}, 0, inf); + assert(redundant.lower_m == 0.0 && !redundant.inactive_gate); + auto tautology = add_indicator(model, b, false, {{x, 1}}, -inf, inf); + assert(tautology.rows.empty() && !tautology.inactive_gate); + auto snapshot = model.snapshot(); + validate_structure(snapshot); + assert(validate(snapshot, {1, 1e100}, 0, 0).valid); + + Model constants; + auto c = constants.add_binary(); + auto impossible = add_indicator(constants, c, true, {}, 1, inf); + auto empty = constants.snapshot(); + assert(validate(empty, {0, 1}, 0, 0).valid); + assert(!validate(empty, {1, 0}, 0, 0).valid); + assert(impossible.inactive_gate); +} + +void preserve_active_arithmetic_and_check_original_logic() { + Model model; + auto b = model.add_binary(); + auto x = model.add_continuous(-1e12, 1e12); + const double tiny = 1e-9; + auto formulation = add_indicator(model, b, true, {{b, tiny}, {x, 1}}, tiny, inf); + const auto snapshot = model.snapshot(); + const auto& generated = model.row(formulation.rows.back()); + assert(generated.lower == tiny); + assert(generated.terms[0].variable == b && generated.terms[0].coefficient == tiny); + assert(*formulation.lower_m >= 1e12); + assert(validate(snapshot, {1, 0, 0}, 0, 0).valid); + assert(!validate(snapshot, {1, -1e-10, 0}, 0, 0).valid); + + // A near-zero gate can satisfy numerical M rows while violating the logic. + // Original metadata must reject it for either activation value. + for (bool active : {false, true}) { + Model guarded; + auto enabled = guarded.add_binary(); + auto amount = guarded.add_continuous(0, 1e12); + auto condition = add_indicator(guarded, enabled, active, {{amount, 1}}, 1e12, inf); + const auto original = guarded.snapshot(); + std::vector values(original.variables.size()); + values[enabled.id] = active ? 1.0 - 5e-8 : 5e-8; + values[amount.id] = 1e12 - 10000; + values[condition.inactive_gate->id] = 5e-8; + assert(linear_rows(original, values, 1e-7L)); + const auto checked = validate(original, values, 1e-7, 1e-6); + assert(!checked.valid && checked.model_valid && checked.max_indicator_violation >= 10000); + } +} + +void mutation_guards_and_snapshot_validation() { + Model model; + auto b = model.add_binary(); + auto x = model.add_continuous(-5, 5); + auto condition = add_indicator(model, b, true, {{x, 1}}, 2, 3); + const auto original = model.snapshot(); + model.set_bounds(x, -3, 4); + model.set_bounds(x, -5, 5); + const auto revision = model.revision(); + rejects([&] { model.set_bounds(x, -6, 5); }); + rejects([&] { model.set_bounds(x, -5, 6); }); + rejects([&] { model.set_bounds(*condition.inactive_gate, 0, 0); }); + rejects([&] { model.set_bounds(condition.rows.back(), 0, 9); }); + rejects([&] { model.set_coefficient(condition.rows.front(), b, 2); }); + rejects([&] { model.remove(condition.rows.front()); }); + rejects([&] { model.remove(b); }); + assert(model.revision() == revision); + auto bad = original; + bad.variables[x.id].lower = -6; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.rows[condition.rows.back().id].upper = 4; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.indicators[0].lower_m = 0; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.indicators[0].domains[0].lower = -100; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.variables[b.id].type = VariableType::Integer; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.indicators[0].active = false; + rejects([&] { validate_structure(bad); }); + bad = original; + bad.indicators.clear(); + rejects([&] { validate_structure(bad); }); + assert(validate(original, {1, 2, 0}, 0, 0).valid); + remove_indicator(model, condition.indicator); + assert(model.revision() == revision + 1); + assert(!model.snapshot().indicators[0].active); + model.set_bounds(x, -20, 20); + model.remove(*condition.inactive_gate); + model.remove(x); + validate_structure(model.snapshot()); + rejects([&] { remove_indicator(model, condition.indicator); }); + Model moved(std::move(model)); + validate_structure(moved.snapshot()); + assert(moved.snapshot().indicators.size() == 1); +} + +void errors_are_atomic() { + Model model, other; + auto b = model.add_binary(); + auto x = model.add_continuous(-inf, inf); + auto integer = model.add_integer(0, 1); + auto foreign = other.add_binary(); + const auto before = model.snapshot(); + rejects([&] { add_indicator(model, b, true, {{x, 1}}, 0, inf); }); + rejects([&] { add_indicator(model, b, true, {{x, -1}}, -inf, 0); }); + rejects([&] { add_indicator(model, integer, true, {}, 0, 1); }); + rejects([&] { add_indicator(model, b, true, {{foreign, 0}}, 0, 1); }); + rejects([&] { add_indicator(model, foreign, true, {}, 0, 1); }); + rejects([&] { add_indicator(model, b, true, {}, 2, 1); }); + rejects([&] { add_indicator(model, b, true, {}, std::nan(""), 1); }); + rejects([&] { add_boolean_and(model, b, {foreign}); }); + rejects([&] { add_boolean_or(model, integer, {}); }); + rejects([&] { remove_indicator(model, Indicator{other.id(), 0}); }); + assert(model.revision() == before.revision); + auto after = model.snapshot(); + assert(after.variables.size() == before.variables.size() && after.rows.empty() && after.indicators.empty()); + model.set_bounds(x, -2, 2); + const auto revision = model.revision(); + rejects([&] { + add_indicator(model, b, true, {{x, std::numeric_limits::max()}}, -1, 1); + }); + assert(model.revision() == revision && model.snapshot().rows.empty()); +} + +void boolean_truth_tables() { + for (bool conjunction : {false, true}) + for (int count = 0; count <= 4; ++count) + for (bool alias_result : {false, true}) { + Model model; + auto result = model.add_binary("result"); + std::vector inputs; + for (int i = 0; i < count; ++i) + inputs.push_back(alias_result && i == 0 ? result : model.add_binary()); + if (count > 1) inputs.push_back(inputs.back()); // Duplicate is idempotent. + const auto revision = model.revision(); + const auto rows = conjunction ? add_boolean_and(model, result, inputs) + : add_boolean_or(model, result, inputs); + assert(!rows.empty() && model.revision() == revision + 1); + const auto snapshot = model.snapshot(); + validate_structure(snapshot); + for (unsigned mask = 0; mask < (1U << snapshot.variables.size()); ++mask) { + std::vector values(snapshot.variables.size()); + for (std::size_t i = 0; i < values.size(); ++i) values[i] = (mask >> i) & 1U; + bool expected = conjunction; + for (auto input : inputs) + expected = conjunction ? expected && values[input.id] != 0.0 + : expected || values[input.id] != 0.0; + const bool correct = values[result.id] == static_cast(expected); + assert(linear_rows(snapshot, values) == correct); + assert(validate(snapshot, values, 0, 0).valid == correct); + } + } +} +} + +int main() { + indicator_equivalence(); + semi_domains_and_redundancy(); + preserve_active_arithmetic_and_check_original_logic(); + mutation_guards_and_snapshot_validation(); + errors_are_atomic(); + boolean_truth_tables(); +} diff --git a/test/optimize/consumer/CMakeLists.txt b/test/optimize/consumer/CMakeLists.txt new file mode 100644 index 0000000000..c81544e6fa --- /dev/null +++ b/test/optimize/consumer/CMakeLists.txt @@ -0,0 +1,56 @@ +cmake_minimum_required(VERSION 3.21) +project(OptimizeInstalledConsumer LANGUAGES C CXX) +option(EXPECT_BACKEND_DISABLED "Installed package intentionally has no HiGHS adapter" OFF) +set(PACKAGE_MODE "standalone" CACHE STRING "standalone, combined, or native-only") +if(PACKAGE_MODE STREQUAL "standalone") + find_package(GecodeOptimize CONFIG REQUIRED) + add_executable(consumer main.cpp) + target_link_libraries(consumer PRIVATE Gecode::optimize) +elseif(PACKAGE_MODE STREQUAL "combined") + find_package(Gecode CONFIG REQUIRED COMPONENTS int optimize) + add_executable(consumer main.cpp) + target_link_libraries(consumer PRIVATE Gecode::gecodeint Gecode::optimize) + target_compile_definitions(consumer PRIVATE CHECK_NATIVE=1) +elseif(PACKAGE_MODE STREQUAL "native-only") + # This must configure even if the installed producer enabled HiGHS. + set(CMAKE_DISABLE_FIND_PACKAGE_highs TRUE) + find_package(Gecode CONFIG REQUIRED COMPONENTS int) + add_executable(consumer main.cpp) + target_link_libraries(consumer PRIVATE Gecode::gecodeint) + target_compile_definitions(consumer PRIVATE CHECK_NATIVE=1 NATIVE_ONLY=1) +else() + message(FATAL_ERROR "Unknown PACKAGE_MODE") +endif() +if(EXPECT_BACKEND_DISABLED) + target_compile_definitions(consumer PRIVATE EXPECT_BACKEND_DISABLED=1) +endif() +enable_testing() +add_test(NAME installed-consumer COMMAND consumer) +if(NOT PACKAGE_MODE STREQUAL "native-only") + add_executable(c-consumer ../c_api.c) + set_target_properties(c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-c-consumer COMMAND c-consumer) + add_executable(lp-c-consumer ../lp_observations_c.c) + set_target_properties(lp-c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(lp-c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-lp-c-consumer COMMAND lp-c-consumer) + add_executable(scenarios-c-consumer ../scenarios_c.c) + set_target_properties(scenarios-c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(scenarios-c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-scenarios-c-consumer COMMAND scenarios-c-consumer) + add_executable(lp-evidence-c-consumer ../lp_evidence_c.c) + set_target_properties(lp-evidence-c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(lp-evidence-c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-lp-evidence-c-consumer COMMAND lp-evidence-c-consumer) + add_executable(lp-sensitivity-c-consumer ../lp_sensitivity_c.c) + set_target_properties(lp-sensitivity-c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(lp-sensitivity-c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-lp-sensitivity-c-consumer COMMAND lp-sensitivity-c-consumer) + foreach(c_test lp_basis regular) + add_executable(${c_test}-c-consumer ../${c_test}_c_api.c) + set_target_properties(${c_test}-c-consumer PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF) + target_link_libraries(${c_test}-c-consumer PRIVATE Gecode::optimize_c) + add_test(NAME installed-${c_test}-c-consumer COMMAND ${c_test}-c-consumer) + endforeach() +endif() diff --git a/test/optimize/consumer/main.cpp b/test/optimize/consumer/main.cpp new file mode 100644 index 0000000000..4e255c85bb --- /dev/null +++ b/test/optimize/consumer/main.cpp @@ -0,0 +1,182 @@ +#ifdef CHECK_NATIVE +#include +class NativeModel : public Gecode::Space { +public: + Gecode::IntVar x; + NativeModel() : x(*this,0,1) {} + NativeModel(NativeModel& other) : Gecode::Space(other) { x.update(*this,other.x); } + Gecode::Space* copy() override { return new NativeModel(*this); } +}; +#endif +#ifndef NATIVE_ONLY +#include +#include +#include +#endif + +int main() { +#ifdef CHECK_NATIVE + NativeModel native; + Gecode::rel(native,native.x,Gecode::IRT_EQ,1); + if (native.status()==Gecode::SS_FAILED || !native.x.assigned() || native.x.val()!=1) return 1; +#endif +#ifndef NATIVE_ONLY + Gecode::Optimize::Model model; + auto x=model.add_variables({{Gecode::Optimize::VariableType::Integer,2,5,"x"}}).front(); + model.add_rows({{{{x,1}},2,5,"bounds"}}); + Gecode::Optimize::SparseRowBatch sparse; + sparse.columns={x};sparse.row_start={0,1};sparse.column={0};sparse.coefficient={1};sparse.lower={2};sparse.upper={5}; + model.add_rows_sparse(sparse); + model.minimize({{x,3}}); + auto prepared=Gecode::Optimize::presolve_integer(model); + if (!prepared.model || prepared.status!=Gecode::Optimize::PresolveStatus::Fixpoint + || prepared.model->original().model_id!=model.id()) return 7; + auto result=Gecode::Optimize::solve(model); +#ifdef EXPECT_BACKEND_DISABLED + if (result.termination!=Gecode::Optimize::Termination::Unsupported || result.has_solution()) return 2; +#else + if (!result.has_solution() || result.termination!=Gecode::Optimize::Termination::Optimal + || result.value(x)!=2 || *result.objective!=6) return 2; + Gecode::Optimize::SolveSession session; + if (!session.solve(model).has_solution()) return 3; + model.set_bounds(x,3,5); + auto edited=session.solve(model); + if (!edited.has_solution() || *edited.objective!=9 || session.statistics().model_loads!=1) return 4; + auto conflict=Gecode::Optimize::analyze_conflict(model); + if (conflict.status!=Gecode::Optimize::ConflictStatus::Feasible) return 5; + auto reduced=Gecode::Optimize::solve(prepared.model->reduced()); + auto recovered=prepared.model->postsolve(reduced); + if (!recovered.exact_witness_validated || recovered.solution.value(x)!=2 + || recovered.solution.termination!=Gecode::Optimize::Termination::Unknown) return 8; + Gecode::Optimize::PoolOptions pool_options; pool_options.max_solutions=4; + auto pool=Gecode::Optimize::solve_pool(model,pool_options); + if (!pool.exhausted() || pool.entries.size()!=3 || pool.ranked_prefix!=3 + || pool.entries[0].solution.objective!=9 || pool.entries[2].solution.objective!=15) return 9; +#endif +#ifdef CHECK_NATIVE + Gecode::Optimize::SolveOptions native_options; + native_options.backend=Gecode::Optimize::Backend::Native; + native_options.guarantee=Gecode::Optimize::Guarantee::Exact; + native_options.primal_start={{x,5}}; + auto native_result=Gecode::Optimize::solve(model,native_options); + if (!native_result.has_solution() || !native_result.start_submitted || native_result.guarantee!=Gecode::Optimize::Guarantee::Exact) return 6; + Gecode::Optimize::Model regular; + auto letter=regular.add_integer(-1,1); + Gecode::Optimize::add_regular(regular,{letter},2,0,{{0,-1,1}},{1},"signed word"); + regular.minimize({{letter,1}}); + native_options.primal_start.clear(); + auto accepted=Gecode::Optimize::solve(regular,native_options); + if (!accepted.has_solution() || accepted.objective!=-1 || accepted.best_bound!=accepted.objective) return 17; +#endif + auto hybrid=Gecode::Optimize::solve_native_lp(model); + if (Gecode::Optimize::native_lp_capabilities().available) { + if (!hybrid.result.has_solution() || hybrid.result.termination!=Gecode::Optimize::Termination::Optimal) return 10; + } else if (hybrid.result.termination!=Gecode::Optimize::Termination::Unsupported) return 11; + auto frontier=Gecode::Optimize::solve_native_search(model); +#ifdef CHECK_NATIVE + if (!frontier.result.has_solution() || frontier.result.termination!=Gecode::Optimize::Termination::Optimal + || frontier.result.best_bound!=frontier.result.objective) return 12; +#else + if (frontier.result.termination!=Gecode::Optimize::Termination::Unsupported) return 12; +#endif + auto neighborhood=Gecode::Optimize::solve_native_neighborhoods(model); + if (!neighborhood.neighborhood.requested) return 22; +#ifdef CHECK_NATIVE + if (!neighborhood.search.result.has_solution() + || neighborhood.search.result.termination!=Gecode::Optimize::Termination::Optimal + || neighborhood.neighborhood.budget_nodes!=neighborhood.search.frontier.admitted_nodes + +neighborhood.search.branching.probe_status_calls+neighborhood.neighborhood.status_attempts) return 22; +#else + if (neighborhood.search.result.termination!=Gecode::Optimize::Termination::Unsupported) return 22; +#endif + Gecode::Optimize::NativeSearchOptions branching_options; + branching_options.branching=Gecode::Optimize::NativeBranchingSettings{}; + auto branching=Gecode::Optimize::solve_native_search(model,branching_options); + if (!branching.branching.requested) return 14; +#ifdef CHECK_NATIVE + if (!branching.result.has_solution() || branching.result.termination!=Gecode::Optimize::Termination::Optimal + || branching.branching.budget_nodes!=branching.frontier.admitted_nodes+branching.branching.probe_status_calls) return 14; +#else + if (branching.result.termination!=Gecode::Optimize::Termination::Unsupported) return 14; +#endif + Gecode::Optimize::Model lp; + auto lx=lp.add_continuous(),ly=lp.add_continuous(); + auto demand=lp.add_row({{lx,1},{ly,1}},4,std::numeric_limits::infinity()); + lp.minimize({{lx,2},{ly,3}},7); + auto observed=Gecode::Optimize::solve_lp_observed(lp); +#ifdef EXPECT_BACKEND_DISABLED + if (Gecode::Optimize::lp_observation_capabilities().available + || observed.result.termination!=Gecode::Optimize::Termination::Unsupported) return 15; +#else + if (!observed.observations || observed.result.termination!=Gecode::Optimize::Termination::Optimal + || observed.result.objective!=15 || !observed.observations->checks().accepted + || observed.observations->row(demand).dual!=2 + || observed.observations->column(ly).reduced_cost!=1) return 15; + Gecode::Optimize::LpBasisSolveOptions basis_options; + basis_options.basis=Gecode::Optimize::make_lp_basis(*observed.observations); + auto basis_result=Gecode::Optimize::solve_lp_with_basis(lp,basis_options); + if (basis_result.observed.result.termination!=Gecode::Optimize::Termination::Optimal + || basis_result.observed.result.objective!=15 + || !basis_result.submission.backend_attempted + || (basis_result.submission.state!=Gecode::Optimize::LpBasisSubmissionState::Accepted + && basis_result.submission.state!=Gecode::Optimize::LpBasisSubmissionState::Repaired)) return 16; + Gecode::Optimize::LpSensitivityOptions sensitivity_options; + sensitivity_options.parameters={Gecode::Optimize::LpObjectiveParameter{lx}}; + auto sensitivity=Gecode::Optimize::analyze_lp_sensitivity(observed,sensitivity_options); + if (sensitivity.completion!=Gecode::Optimize::LpSensitivityCompletion::Complete + || !sensitivity.sensitivity) return 21; + const auto* range=sensitivity.sensitivity->objective(lx); + if (!range || range->group.state!=Gecode::Optimize::LpSensitivityState::Available + || !range->interval || range->interval->lower.value!=0 + || range->interval->upper.value!=3 || range->interval->objective_slope!=4 + || sensitivity.sensitivity->original().result.objective!=15) return 21; +#endif + std::vector scenarios(2); + scenarios[1].objective_offset=-5; + auto batch=Gecode::Optimize::solve_scenarios(lp,scenarios); +#ifdef EXPECT_BACKEND_DISABLED + if (batch.stop_reason!=Gecode::Optimize::Termination::Unsupported || batch.all_resolved()) return 18; +#else + if (!batch.all_resolved() || !batch.batch || batch.outcomes.size()!=2 + || !batch.outcomes[0].result || !batch.outcomes[1].result + || batch.outcomes[0].result->objective!=15 || batch.outcomes[1].result->objective!=3 + || batch.value(batch.batch->scenario(1),lx)!=4) return 18; +#endif + Gecode::Optimize::ScenarioBatchOptions certified_scenarios; + certified_scenarios.solve.guarantee=Gecode::Optimize::Guarantee::Certified; + auto unsupported_batch=Gecode::Optimize::solve_scenarios(lp,scenarios,certified_scenarios); + if (unsupported_batch.stop_reason!=Gecode::Optimize::Termination::Unsupported + || unsupported_batch.batch || unsupported_batch.attempted!=0) return 19; + Gecode::Optimize::QuadraticModel quadratic; + Gecode::Optimize::Model infeasible_lp; + auto bounded=infeasible_lp.add_continuous(0,1); + auto impossible=infeasible_lp.add_row({{bounded,1}},2,std::numeric_limits::infinity()); + Gecode::Optimize::LpEvidenceOptions evidence_options; + evidence_options.request=Gecode::Optimize::LpEvidenceRequest::Farkas; + auto evidence=Gecode::Optimize::analyze_lp_evidence(infeasible_lp,evidence_options); +#ifdef EXPECT_BACKEND_DISABLED + if (evidence.stop_reason!=Gecode::Optimize::Termination::Unsupported || evidence.attempted_calls) return 20; +#else + if (evidence.completion!=Gecode::Optimize::LpEvidenceCompletion::Complete || !evidence.evidence + || evidence.evidence->farkas().state!=Gecode::Optimize::LpEvidenceState::Available + || evidence.evidence->row_multiplier(impossible).multiplier!=1 + || evidence.evidence->column_multiplier(bounded).multiplier!=-1 + || evidence.evidence->farkas_data().contradiction_margin!=1 || evidence.attempted_calls!=1) return 20; +#endif + auto qx=quadratic.add_continuous(-2,3,"qx"); + quadratic.minimize_squares({{{{qx,1}},-1,2,"square"}}, {}, 3); + auto qp=Gecode::Optimize::solve_quadratic(quadratic); +#ifdef EXPECT_BACKEND_DISABLED + if (Gecode::Optimize::quadratic_capabilities().available + || qp.result.termination!=Gecode::Optimize::Termination::Unsupported + || qp.result.has_solution()) return 13; +#else + if (!Gecode::Optimize::quadratic_capabilities().available || !qp.result.has_solution() + || qp.result.termination!=Gecode::Optimize::Termination::Optimal + || std::abs(qp.result.value(qx)-1)>1e-7 || !qp.result.objective + || std::abs(*qp.result.objective-3)>1e-7 || !qp.checks.bound_valid + || !qp.checks.gap_upper_bound || *qp.checks.gap_upper_bound>1e-6) return 13; +#endif +#endif + return 0; +} diff --git a/test/optimize/diagnostics.cpp b/test/optimize/diagnostics.cpp new file mode 100644 index 0000000000..4ab583279f --- /dev/null +++ b/test/optimize/diagnostics.cpp @@ -0,0 +1,299 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +constexpr double inf = std::numeric_limits::infinity(); + +#ifdef GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER +namespace { +int calls = 0, interrupt_at = 0, corrupt_at = 0, contradict_at = 0, cancel_at = 0; +O::Termination interrupted_reason = O::Termination::TimeLimit; +std::vector limits; +void reset() { + calls = interrupt_at = corrupt_at = contradict_at = cancel_at = 0; + interrupted_reason = O::Termination::TimeLimit; + limits.clear(); +} +} +namespace Gecode { namespace Optimize { +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options) { + ++calls; + assert(model.objective.terms.empty() && model.objective.offset == 0); + assert(options.primal_start.empty() && options.relative_gap == 0 && options.absolute_gap == 0); + limits.push_back(options.time_limit_seconds); + if (limits.size() > 1) assert(limits.back() <= limits[limits.size()-2]); + SolveResult result; + result.model_id = model.model_id; result.revision = model.revision; + result.backend = "deterministic oracle"; result.backend_version = "test"; + for (const auto& variable : model.variables) result.active_variables.push_back(variable.active); + result.termination = Termination::Infeasible; + assert(model.variables.size() == 1); + for (double value : {-10.0, -3.0, -2.0, -1.0, 0.0, 0.25, 0.5, 0.75, 1.0, 2.0, 3.0, 10.0}) { + std::vector witness{value}; + if (!validate(model, witness).valid) continue; + result.values = std::move(witness); + result.solution_validated = true; + result.objective = 0; + result.termination = Termination::Optimal; + break; + } + if (calls == corrupt_at || calls == contradict_at) { + result.solution_validated = true; result.values = {3}; result.objective = 0; + result.termination = calls == contradict_at ? Termination::Infeasible : Termination::Optimal; + } + if (calls == interrupt_at) result.termination = interrupted_reason; + if (calls == cancel_at) options.cancellation->cancel(); + return result; +} +}} +#endif + +namespace { +// Independent reconstruction from the attribution contract: begin with a free +// continuous system and restore only reported groups, rather than using the +// implementation's deletion operation. +O::ModelSnapshot rebuild(const O::ModelSnapshot& original, + const std::vector& groups, + std::size_t omit = std::numeric_limits::max()) { + auto model = original; + model.objective = {}; + for (auto& variable : model.variables) if (variable.active) { + variable.type = O::VariableType::Continuous; + variable.lower = -inf; variable.upper = inf; + } + for (auto& row : model.rows) if (row.active) { row.active = false; row.terms.clear(); } + for (auto& indicator : model.indicators) indicator.active = false; + for (std::size_t i = 0; i < groups.size(); ++i) if (i != omit) { + const auto& group = groups[i]; + switch (group.kind) { + case O::ConflictGroupKind::Row: model.rows[group.row->id] = original.rows[group.row->id]; break; + case O::ConflictGroupKind::LowerBound: + model.variables[group.variable->id].lower = original.variables[group.variable->id].lower; break; + case O::ConflictGroupKind::UpperBound: + model.variables[group.variable->id].upper = original.variables[group.variable->id].upper; break; + case O::ConflictGroupKind::Integrality: + model.variables[group.variable->id].type = O::VariableType::Integer; break; + case O::ConflictGroupKind::VariableDomain: + model.variables[group.variable->id] = original.variables[group.variable->id]; break; + case O::ConflictGroupKind::IndicatorComponent: + for (auto handle : group.grouped_variables) model.variables[handle.id] = original.variables[handle.id]; + for (auto handle : group.generated_rows) model.rows[handle.id] = original.rows[handle.id]; + for (auto handle : group.indicators) model.indicators[handle.id] = original.indicators[handle.id]; + break; + } + } + return model; +} + +O::ConflictOptions evidence_options() { + O::ConflictOptions options; + options.retain_deletion_witnesses = true; + return options; +} + +void verify(const O::ModelSnapshot& original, const O::ConflictResult& result) { + assert(result.irreducible() && result.infeasibility_established); + assert(result.termination == O::Termination::Infeasible && result.guarantee == O::Guarantee::Numerical); + assert(result.model_id == original.model_id && result.revision == original.revision); + const auto conflict = rebuild(original, result.groups); + O::validate_structure(conflict); +#ifndef GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER + assert(O::solve(conflict).termination == O::Termination::Infeasible); +#endif + for (std::size_t i = 0; i < result.groups.size(); ++i) { + assert(result.groups[i].necessity_verified); + auto deleted = rebuild(original, result.groups, i); + O::validate_structure(deleted); + assert(O::validate(deleted, result.groups[i].deletion_witness).valid); + } +} + +void preflight() { + O::Model model; + auto x = model.add_integer(0, 4); + model.add_row({{x, 1}}, 5, inf); + auto options = evidence_options(); + options.solve.time_limit_seconds = 0; + auto result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Unknown && result.termination == O::Termination::TimeLimit); + assert(!result.infeasibility_established && result.oracle_calls == 0 && result.groups.empty()); + options.solve.time_limit_seconds = inf; + options.solve.cancellation = std::make_shared(); + options.solve.cancellation->cancel(); + result = O::analyze_conflict(model, options); + assert(result.termination == O::Termination::Cancelled && result.oracle_calls == 0); + options = {}; options.solve.node_limit = 2; + assert(O::analyze_conflict(model, options).status == O::ConflictStatus::Unsupported); + options = {}; options.solve.guarantee = O::Guarantee::Exact; + assert(O::analyze_conflict(model, options).status == O::ConflictStatus::Unsupported); + options.solve.guarantee = O::Guarantee::Certified; + assert(O::analyze_conflict(model, options).status == O::ConflictStatus::Unsupported); + options = {}; options.solve.feasibility_tolerance = -1; + assert(O::analyze_conflict(model, options).status == O::ConflictStatus::InvalidModel); + auto malformed = model.snapshot(); malformed.variables[x.id].variable.model_id = 0; + assert(O::analyze_conflict(malformed).status == O::ConflictStatus::InvalidModel); +} + +#ifndef GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER +void actual_oracles() { + const auto options = evidence_options(); + O::Model rows; + auto x = rows.add_continuous(-inf, inf, "quantity"); + auto lower = rows.add_row({{x, 1}}, 2, inf, "demand"); + auto upper = rows.add_row({{x, 1}}, -inf, 1, "capacity"); + rows.add_row({{x, 1}}, -inf, 10, "redundant"); + rows.maximize({{x, 7}}, -8); + const auto original = rows.snapshot(); + auto ignored_start = options; ignored_start.solve.primal_start = {{x, 0}}; + auto result = O::analyze_conflict(rows, ignored_start); + verify(original, result); + assert(result.groups.size() == 2 && result.groups[0].row->id == lower.id && result.groups[1].row->id == upper.id); + assert(rows.revision() == original.revision && rows.row(lower).active && rows.row(upper).active); + assert(rows.snapshot().objective.offset == -8 && rows.snapshot().objective.sense == O::ObjectiveSense::Maximize); + auto without_witnesses = O::analyze_conflict(rows); + assert(without_witnesses.irreducible()); + for (const auto& group : without_witnesses.groups) assert(group.deletion_witness.empty()); + + O::Model bound; + auto y = bound.add_continuous(0, 10, "stock"); + bound.add_row({{y, 1}}, 11, inf, "required"); + result = O::analyze_conflict(bound, options); verify(bound.snapshot(), result); + assert(result.groups.size() == 2 && result.groups[0].kind == O::ConflictGroupKind::Row && + result.groups[1].kind == O::ConflictGroupKind::UpperBound && *result.groups[1].variable == y); + + O::Model integer; + auto n = integer.add_integer(0.25, 0.75, "count"); + result = O::analyze_conflict(integer, options); verify(integer.snapshot(), result); + assert(result.groups.size() == 3); + assert(result.groups[0].kind == O::ConflictGroupKind::LowerBound && + result.groups[1].kind == O::ConflictGroupKind::UpperBound && + result.groups[2].kind == O::ConflictGroupKind::Integrality); + assert(integer.variable(n).type == O::VariableType::Integer && integer.variable(n).lower == 0.25); + + O::Model binary; + auto bit = binary.add_binary(); binary.set_bounds(bit, 0.25, 0.75); + result = O::analyze_conflict(binary, options); verify(binary.snapshot(), result); + assert(result.groups.size() == 1 && result.groups[0].kind == O::ConflictGroupKind::VariableDomain); + + for (auto type : {O::VariableType::SemiContinuous, O::VariableType::SemiInteger}) { + O::Model semi; + auto s = semi.add_variable(type, 3, 6); + semi.add_row({{s, 1}}, type == O::VariableType::SemiContinuous ? 1 : 3.25, + type == O::VariableType::SemiContinuous ? 2 : 3.75); + result = O::analyze_conflict(semi, options); verify(semi.snapshot(), result); + assert(result.groups.size() == 2 && result.groups[1].kind == O::ConflictGroupKind::VariableDomain); + } + + O::Model constant; + constant.add_row({}, 1, inf, "constant contradiction"); + result = O::analyze_conflict(constant, options); verify(constant.snapshot(), result); + assert(result.groups.size() == 1 && result.groups[0].kind == O::ConflictGroupKind::Row); + O::Model empty; + auto dead = empty.add_binary(); empty.remove(dead); + result = O::analyze_conflict(empty, options); + assert(result.status == O::ConflictStatus::Feasible && !result.infeasibility_established); + assert(result.feasible_witness.size() == 1 && std::isnan(result.feasible_witness[dead.id])); + + O::Model unbounded; + auto free = unbounded.add_continuous(-inf, inf); + unbounded.minimize({{free, -1}}); + result = O::analyze_conflict(unbounded, options); + assert(result.status == O::ConflictStatus::Feasible && result.oracle_calls == 1); + assert(O::validate(unbounded.snapshot(), result.feasible_witness).valid); + + O::Model indicators; + auto b = indicators.add_binary("enabled"); auto c = indicators.add_binary("other"); + auto amount = indicators.add_continuous(0, 5); + indicators.set_bounds(b, 1, 1); indicators.set_bounds(c, 1, 1); + auto first = O::add_indicator(indicators, b, true, {{amount, 1}}, 4, inf); + auto second = O::add_indicator(indicators, c, true, {{amount, 1}}, -inf, 3); + indicators.add_row({}, -inf, 1, "irrelevant"); + const auto indicator_snapshot = indicators.snapshot(); + result = O::analyze_conflict(indicators, options); verify(indicator_snapshot, result); + assert(result.groups.size() == 1 && result.groups[0].kind == O::ConflictGroupKind::IndicatorComponent); + assert(result.groups[0].indicators.size() == 2 && result.groups[0].grouped_variables.size() == 5); + assert(indicators.revision() == indicator_snapshot.revision && indicators.row(first.rows.front()).active && + indicators.row(second.rows.front()).active); + // Removed indicator tombstones must not impose a hidden nonrelaxable domain. + O::remove_indicator(indicators, first.indicator); O::remove_indicator(indicators, second.indicator); + result = O::analyze_conflict(indicators, options); + assert(result.status == O::ConflictStatus::Feasible); + + O::Model chained; + auto enable = chained.add_binary(); chained.set_bounds(enable, 0, 0); + auto first_amount = chained.add_continuous(0, 4); + auto second_amount = chained.add_continuous(0, 2); + auto gate_owner = O::add_indicator(chained, enable, true, {{first_amount, 1}}, 2, inf); + O::add_indicator(chained, *gate_owner.inactive_gate, true, {{second_amount, 1}}, 3, inf); + // An independent, harmless component must disappear from the conflict. + auto unrelated = chained.add_binary(); + O::add_indicator(chained, unrelated, true, {}, -inf, inf); + result = O::analyze_conflict(chained, options); verify(chained.snapshot(), result); + assert(result.groups.size() == 1 && result.groups[0].indicators.size() == 2); + assert(result.groups[0].grouped_variables.size() == 5); +} +#else +void coordinator() { + O::Model model; + auto x = model.add_continuous(-10, 10); + model.add_row({{x, 1}}, 2, inf); model.add_row({{x, 1}}, -inf, 1); + auto options = evidence_options(); options.solve.time_limit_seconds = 100; + options.solve.primal_start = {{x, 0}}; + reset(); + auto result = O::analyze_conflict(model, options); verify(model.snapshot(), result); + assert(result.oracle_calls == 5 && result.groups.size() == 2); + reset(); interrupt_at = 2; + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Incomplete && result.infeasibility_established && !result.irreducible()); + assert(result.termination == O::Termination::TimeLimit && result.groups.size() == 4 && calls == 2); + reset(); interrupt_at = 5; + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Incomplete && result.groups.size() == 3 && calls == 5); + assert(result.groups.back().kind == O::ConflictGroupKind::UpperBound); + assert(result.groups[0].necessity_verified && result.groups[1].necessity_verified); + reset(); interrupt_at = 1; interrupted_reason = O::Termination::InfeasibleOrUnbounded; + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Unknown && !result.infeasibility_established && result.groups.empty()); + reset(); corrupt_at = 2; + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Incomplete && result.termination == O::Termination::NumericalFailure); + assert(result.groups.size() == 4); + reset(); contradict_at = 1; + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Error && result.termination == O::Termination::NumericalFailure); + assert(!result.infeasibility_established && result.groups.empty()); + reset(); cancel_at = 2; + options.solve.cancellation = std::make_shared(); + result = O::analyze_conflict(model, options); + assert(result.status == O::ConflictStatus::Incomplete && result.termination == O::Termination::Cancelled); + assert(result.groups.size() == 4 && calls == 2); +} +#endif +} + +int main() { + preflight(); +#ifdef GECODE_DIAGNOSTICS_TEST_FAKE_SOLVER + coordinator(); +#else + if (!O::capabilities().available) { + O::Model model; model.add_integer(0.25, 0.75); + auto result = O::analyze_conflict(model); + assert(result.status == O::ConflictStatus::Unsupported && !result.infeasibility_established); + std::cout << "Unavailable diagnostic backend contract passed\n"; + return 0; + } + actual_oracles(); +#endif + std::cout << "Numerical conflict groups, irreducibility witnesses and budgets passed\n"; +} diff --git a/test/optimize/fast_benchmark.cpp b/test/optimize/fast_benchmark.cpp new file mode 100644 index 0000000000..0e82de8b28 --- /dev/null +++ b/test/optimize/fast_benchmark.cpp @@ -0,0 +1,756 @@ +/* Small solver regression panel. Build separately; run via fast_regression.py. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace fs=std::filesystem; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +using Clock=std::chrono::steady_clock; +Clock::time_point deadline; +unsigned checks=0; +void require(bool value,const std::string& message){++checks;if(!value)throw std::runtime_error(message);} +void near(double a,double b){require(std::isfinite(a)&&std::isfinite(b)&&std::abs(a-b)<=1e-6,"oracle mismatch");} +O::SolveOptions options(){O::SolveOptions o;o.threads=1;o.random_seed=1701;o.relative_gap=o.absolute_gap=0; + o.time_limit_seconds=std::max(0.0,std::chrono::duration(deadline-Clock::now()).count());return o;} +O::SolveResult optimal(const O::Model& m,double expected){auto r=O::solve(m,options()); + require(r.termination==O::Termination::Optimal&&r.has_solution(),"expected validated numerical optimum: "+r.message); + require(O::validate(m.snapshot(),r.values).valid,"independent original-model validation failed"); + near(*r.objective,expected);return r;} +std::string quote(const std::string& value){std::ostringstream out;out<<'"';for(unsigned char c:value){ + if(c=='"'||c=='\\')out<<'\\'< objectives; + std::string backend={}; + std::string backend_version={}; + std::string guarantee="numerical"; +}; +Outcome run(const std::string& name,const fs::path& work,const fs::path& fixtures){ + if(name=="native_neighborhoods"){ + O::Model m;const auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary(); + m.add_row({{z,1},{y,-1}},-inf,0);m.minimize({{x,100},{y,-20},{z,1}},-9); + double oracle=inf; + for(int a=0;a<2;++a)for(int b=0;b<2;++b)for(int c=0;c<2;++c) + if(c<=b)oracle=std::min(oracle,100.0*a-20.0*b+c-9); + O::NativeNeighborhoodOptions opts;opts.search.solve=options(); + opts.search.solve.backend=O::Backend::Native;opts.search.solve.guarantee=O::Guarantee::Exact; + opts.search.solve.random_seed=0;opts.search.order=O::NativeSearchOrder::DepthFirst; + opts.neighborhood.radius=1;opts.neighborhood.time_limit_seconds=opts.search.solve.time_limit_seconds; + const auto answer=O::solve_native_neighborhoods(m,opts); + const auto& r=answer.search.result;const auto& n=answer.neighborhood; + require(r.termination==O::Termination::Optimal&&r.has_solution(),"native neighborhood optimum missing: "+r.message); + require(O::validate(m.snapshot(),r.values).valid,"neighborhood original witness invalid"); + near(oracle,-29);near(*r.objective,oracle);near(r.value(x),0);near(r.value(y),1);near(r.value(z),0); + require(r.best_bound&&*r.best_bound==oracle,"neighborhood global bound mismatch"); + require(n.attempts==1&&n.accepted_improvements==1&&n.status_attempts>0,"neighborhood produced no improvement"); + require(n.completed_status_calls<=n.status_attempts&&n.status_attempts<=opts.neighborhood.max_status_calls, + "neighborhood local accounting mismatch"); + require(n.budget_nodes==answer.search.frontier.admitted_nodes+answer.search.branching.probe_status_calls+n.status_attempts&& + n.budget_nodes==answer.search.branching.budget_nodes,"neighborhood shared accounting mismatch"); + Outcome out;out.objectives={*r.objective};out.backend=r.backend;out.backend_version=r.backend_version;out.guarantee="exact"; + return out; + } + if(name=="lp_sensitivity"){ + Outcome out;out.status="sensitivity_checked"; + for(const bool maximize:{false,true}){ + const double sign=maximize?-1:1; + O::Model m;const auto x=m.add_continuous(),y=m.add_continuous(); + const auto row=m.add_row({{x,1},{y,1}},3,3); + m.set_objective({{x,2*sign},{y,sign}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,7); + O::LpObservationOptions observed_options;observed_options.solve=options(); + const auto observed=O::solve_lp_observed(m,observed_options); + require(observed.result.termination==O::Termination::Optimal&&observed.observations, + "sensitivity source missing optimal observations"); + require(O::validate(m.snapshot(),observed.result.values).valid,"sensitivity source witness invalid"); + near(observed.result.value(x),0);near(observed.result.value(y),3);near(*observed.result.objective,7+3*sign); + out.backend=observed.result.backend;out.backend_version=observed.result.backend_version; + O::LpSensitivityOptions opts;opts.time_limit_seconds=options().time_limit_seconds; + opts.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{y},O::LpEqualityRhsParameter{row}}; + const auto result=O::analyze_lp_sensitivity(observed,opts); + require(result.completion==O::LpSensitivityCompletion::Complete&&result.sensitivity&& + result.work.factor_setup_attempted&&result.work.basis_solves>=2,"sensitivity analysis incomplete"); + const auto& data=*result.sensitivity; + require(data.checks().primal.valid&&data.checks().kkt.accepted&&data.checks().basis_point_matches, + "sensitivity reference was not independently checked"); + const auto interval=[&](const O::LpSensitivityEntry* entry)->const O::LpParameterInterval&{ + require(entry&&entry->group.state==O::LpSensitivityState::Available&&entry->interval&&entry->interval->checks.accepted, + "sensitivity interval unavailable");return *entry->interval; + }; + const auto finite=[&](const O::LpRangeEnd& end,double value){ + require(end.kind==O::LpRangeEndKind::Finite&&end.value,"sensitivity finite endpoint missing");near(*end.value,value); + }; + const auto infinite=[&](const O::LpRangeEnd& end,O::LpRangeEndKind kind){ + require(end.kind==kind&&!end.value,"sensitivity infinity tag/value mismatch"); + }; + const auto& cx=interval(data.objective(x));const auto& cy=interval(data.objective(y)); + const auto& rhs=interval(data.equality_rhs(row)); + if(maximize){infinite(cx.lower,O::LpRangeEndKind::NegativeInfinity);finite(cx.upper,-1); + finite(cy.lower,-2);infinite(cy.upper,O::LpRangeEndKind::PositiveInfinity); + }else{finite(cx.lower,1);infinite(cx.upper,O::LpRangeEndKind::PositiveInfinity); + infinite(cy.lower,O::LpRangeEndKind::NegativeInfinity);finite(cy.upper,2);} + finite(rhs.lower,0);infinite(rhs.upper,O::LpRangeEndKind::PositiveInfinity); + require(cx.objective_slope&&cy.objective_slope&&rhs.objective_slope,"sensitivity objective slope missing"); + near(*cx.objective_slope,0);near(*cy.objective_slope,3);near(*rhs.objective_slope,sign); + // Original feasible segment x=t,y=b-t: y-basic stays feasible iff b>=0; + // its optimum value is 7+sign*b until the two cost coefficients tie. + for(double b:{0.0,1.0,5.0})near(7+sign*b,*observed.result.objective+*rhs.objective_slope*(b-3)); + opts.time_limit_seconds=options().time_limit_seconds;opts.limits.max_work=0; + const auto capped=O::analyze_lp_sensitivity(observed,opts); + require(capped.reason==O::LpSensitivityReason::ResourceLimit&&!capped.work.factor_setup_attempted, + "sensitivity quota did not reject before factorization"); + if(capped.sensitivity)for(const auto& e:capped.sensitivity->entries()) + require(e.group.state!=O::LpSensitivityState::Available&&!e.interval,"sensitivity quota exposed interval"); + m.set_bounds(row,4,4); + require(data.revision()!=m.revision()&&data.original().observations->source().rows[row.id].lower==3, + "sensitivity historical source changed");near(interval(data.equality_rhs(row)).anchor,3); + } + return out; + } + if(name=="lp_evidence"){ + Outcome out;out.status="evidence_checked"; + const auto history=[&](const O::LpEvidenceResult& result,const O::Model& source,std::size_t calls){ + require(result.completion==O::LpEvidenceCompletion::Complete&&result.evidence&& + result.model_id==source.id()&&result.revision==source.revision()&& + result.attempted_calls==calls,"LP evidence completion/identity/call count mismatch"); + require(result.evidence->stages().size()==calls,"LP evidence stages lost"); + for(const auto& stage:result.evidence->stages()){ + require(stage.attempted&&stage.auxiliary_model&&stage.auxiliary_result&& + stage.auxiliary_model->model_id!=source.id(),"LP auxiliary provenance missing"); + const auto& raw=*stage.auxiliary_result; + require(raw.model_id==stage.auxiliary_model->model_id&&raw.revision==stage.auxiliary_model->revision&& + raw.backend=="HiGHS"&&raw.guarantee==O::Guarantee::Numerical&& + raw.termination==O::Termination::Optimal&&stage.candidate_examined&&stage.auxiliary_check.valid, + "LP auxiliary result was not independently checked in private coordinates"); + require(O::validate(*stage.auxiliary_model,raw.values).valid,"LP private witness invalid"); + out.backend=raw.backend;out.backend_version=raw.backend_version; + } + }; + for(const bool maximize:{false,true}){ + O::Model m;const auto x=m.add_continuous(),y=m.add_continuous(2,2); + const auto row=m.add_row({{x,1},{y,-1}},-2,inf); + m.set_objective({{x,maximize?2.0:-2.0},{y,3}}, + maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,123); + O::LpEvidenceOptions opts;opts.solve=options();opts.request=O::LpEvidenceRequest::PrimalRay; + const auto recovered=O::analyze_lp_evidence(m,opts);history(recovered,m,2); + const auto& e=*recovered.evidence; + require(e.primal_ray().state==O::LpEvidenceState::Available&& + e.farkas().state==O::LpEvidenceState::NotRequested,"LP primal evidence unavailable"); + const double bx=e.base_value(x),by=e.base_value(y),dx=e.direction_value(x),dy=e.direction_value(y); + require(std::isfinite(bx)&&bx>=0&&bx-by>=-2,"LP base point violates original inequalities"); + near(by,2);near(dx,1);near(dy,0); + near(e.primal_data().row_direction.at(row.id),dx-dy); + require(e.primal_data().normalized_objective_slope.has_value(),"LP ray slope missing"); + near(*e.primal_data().normalized_objective_slope,-2); + for(double t:{0.0,1.0,100.0}){ + require(bx+t*dx>=0&&bx+t*dx-(by+t*dy)>=-2,"LP ray leaves original row/bound region"); + near(by+t*dy,2); + } + m.set_bounds(x,0,0); + near(e.direction_value(x),1); + require(e.revision()!=m.revision()&&O::validate(e.source(),e.primal_data().base_point).valid, + "LP evidence lost its historical original model"); + } + O::Model infeasible;const auto x=infeasible.add_continuous(0,1); + const auto row=infeasible.add_row({{x,1}},2,inf);infeasible.maximize({{x,7}},-45); + O::LpEvidenceOptions opts;opts.solve=options();opts.request=O::LpEvidenceRequest::Farkas; + const auto recovered=O::analyze_lp_evidence(infeasible,opts);history(recovered,infeasible,1); + const auto& e=*recovered.evidence; + require(e.farkas().state==O::LpEvidenceState::Available&& + e.primal_ray().state==O::LpEvidenceState::NotRequested,"LP Farkas evidence unavailable"); + const auto& r=e.row_multiplier(row);const auto& c=e.column_multiplier(x); + require(r.active&&c.active&&r.side==O::LpEvidenceSide::Lower&&c.side==O::LpEvidenceSide::Upper, + "LP Farkas finite-side signs reversed"); + near(r.multiplier,1);near(c.multiplier,-1);near(r.multiplier+c.multiplier,0); + near(r.contribution,2*r.multiplier);near(c.contribution,c.multiplier); + require(e.farkas_data().contradiction_margin.has_value(),"LP contradiction margin missing"); + near(*e.farkas_data().contradiction_margin,1); + near(r.contribution+c.contribution,1); + // The signed inequalities sum to 0 >= 1. This is numerical evidence, + // and neither that margin nor the ray slope is a source objective value. + return out; + } + if(name=="scenario_batches"){ + O::Model m;const auto x=m.add_continuous(0,4); + const auto row=m.add_row({{x,1}},1,inf);m.minimize({{x,2}},3); + std::vector definitions(4); + definitions[1].variable_bounds={{x,3,{}}}; + definitions[2].objective_coefficients={{x,-1}};definitions[2].objective_offset=-7; + definitions[3].row_bounds={{row,2,3}}; + const std::vector expected={5,9,-11,7},values={1,3,4,2}; + Outcome out; + for(auto reuse:{O::ScenarioReuse::Automatic,O::ScenarioReuse::Cold}){ + O::ScenarioBatchOptions opts;opts.solve=options();opts.reuse=reuse; + const auto batch=O::solve_scenarios(m,definitions,opts); + require(batch.all_resolved()&&batch.batch&&batch.outcomes.size()==4,"scenario batch did not complete: "+batch.message); + for(std::size_t i=0;i<4;++i){ + const auto& outcome=batch.outcomes[i]; + require(outcome.result&&outcome.result->has_solution()&&outcome.check&&outcome.check->candidate_examined + &&outcome.check->identity_valid&&outcome.check->objective_matches&&outcome.check->validation.valid, + "scenario original witness check missing"); + const auto& r=*outcome.result; + require(r.model_id==batch.batch->id()&&r.model_id!=m.id()&&r.revision==i+1,"scenario identities collapsed"); + near(*r.objective,expected[i]);near(batch.value(outcome.scenario,x),values[i]); + if(reuse==O::ScenarioReuse::Automatic)out.objectives.push_back(*r.objective); + out.backend=r.backend;out.backend_version=r.backend_version; + } + if(reuse==O::ScenarioReuse::Automatic)require(batch.reuse_statistics.model_loads==1,"scenario compatible edits reloaded the model"); + } + return out; + } + if(name=="native_regular"){ + O::Model m;std::vector word; + for(int i=0;i<3;++i)word.push_back(m.add_integer(-1,1)); + constexpr std::uint64_t odd=1000000000; + O::add_regular(m,word,odd+1,0,{{0,-1,0},{0,1,odd},{odd,-1,odd},{odd,1,0}},{0}); + double lower=inf,upper=-inf; + for(int a:{-1,1})for(int b:{-1,1})for(int c:{-1,1}) + if(((a==1)+(b==1)+(c==1))%2==0){lower=std::min(lower,double(a+b+c));upper=std::max(upper,double(a+b+c));} + Outcome out;out.guarantee="exact"; + for(auto sense:{O::ObjectiveSense::Minimize,O::ObjectiveSense::Maximize}){ + m.set_objective({{word[0],1},{word[1],1},{word[2],1}},sense); + auto opts=options();opts.random_seed=0;opts.guarantee=O::Guarantee::Exact; + const auto r=O::solve(m,opts); + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.guarantee==O::Guarantee::Exact,"Regular solve failed: "+r.message); + int positives=0; + for(auto x:word){const auto v=r.value(x);require(v==-1||v==1,"missing Regular transition admitted zero");positives+=v==1;} + require(positives%2==0&&r.objective==(sense==O::ObjectiveSense::Minimize?lower:upper)&&r.best_bound==r.objective, + "Regular witness or optimum differs from signed parity enumeration"); + out.backend=r.backend;out.backend_version=r.backend_version;out.objectives.push_back(*r.objective); + } + return out; + } + if(name=="lp_observations"){ + const auto caps=O::lp_observation_capabilities(); + require(caps.available&&caps.duals&&caps.basis_export,"LP observations unavailable"); + Outcome out; + for(const bool maximize:{false,true}){ + O::Model m;auto x=m.add_continuous(),y=m.add_continuous(); + auto row=m.add_row({{x,1},{y,1}},maximize?-inf:4,maximize?4:inf); + if(maximize)m.maximize({{x,2},{y,3}},7);else m.minimize({{x,2},{y,3}},7); + O::LpObservationOptions opts;opts.solve=options();auto solved=O::solve_lp_observed(m,opts); + const auto& r=solved.result; + require(r.termination==O::Termination::Optimal&&r.has_solution()&&solved.observations, + "LP observations solve incomplete: "+r.message); + const auto& obs=*solved.observations; + require(O::validate(m.snapshot(),r.values).valid,"LP observation original witness invalid"); + // Independent analytic primal and dual witnesses: (4,0), pi=2 for min; + // (0,4), pi=3 for max. Both have zero primal-dual gap, including offset. + const double pi=maximize?3:2,expected=maximize?19:15; + near(r.value(x),maximize?0:4);near(r.value(y),maximize?4:0);near(*r.objective,expected); + require(obs.primal_rows().state==O::LpObservationState::Available + &&obs.dual_point().state==O::LpObservationState::Available + &&obs.basis().state==O::LpObservationState::Available&&obs.checks().accepted, + "LP observation group unavailable or independent KKT check failed"); + const auto& activity=obs.row(row);const auto& cx=obs.column(x);const auto& cy=obs.column(y); + require(activity.activity&&activity.dual&&cx.reduced_cost&&cy.reduced_cost + &&activity.basis&&cx.basis&&cy.basis,"LP original coordinates missing"); + near(*activity.activity,4);near(*activity.dual,pi); + near(*cx.reduced_cost,2-pi);near(*cy.reduced_cost,3-pi); + require(maximize?(!activity.lower_slack&&activity.upper_slack): + (activity.lower_slack&&!activity.upper_slack),"LP infinite side has a slack"); + near(maximize?*activity.upper_slack:*activity.lower_slack,0); + require(obs.checks().dual_objective_estimate&&obs.checks().normalized_gap, + "LP dual objective or gap missing"); + near(*obs.checks().dual_objective_estimate,expected);near(*obs.checks().normalized_gap,0); + require(obs.metadata().backend==r.backend&&obs.metadata().backend_version==r.backend_version, + "LP observation backend attribution mismatch"); + O::LpBasisSolveOptions reuse;reuse.observations.solve=options();reuse.basis=O::make_lp_basis(obs); + const auto started=O::solve_lp_with_basis(m,reuse); + require(started.submission.backend_attempted&& + (started.submission.state==O::LpBasisSubmissionState::Accepted|| + started.submission.state==O::LpBasisSubmissionState::Repaired),"LP basis was not submitted"); + require(started.observed.result.termination==O::Termination::Optimal&&started.observed.result.has_solution() + &&O::validate(m.snapshot(),started.observed.result.values).valid,"LP basis solve original witness invalid"); + near(*started.observed.result.objective,expected); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + }return out; + } + if(name=="lp_min_offset"){ + O::Model m;auto x=m.add_continuous(),y=m.add_continuous(); + m.add_row({{x,1},{y,1}},5,inf);m.add_row({{x,2},{y,1}},6,inf);m.minimize({{x,3},{y,2}},-7); + auto r=optimal(m,4);near(r.value(x),1);near(r.value(y),4);return {"optimal",{*r.objective}}; + } + if(name=="lp_max_offset"){ + O::Model m;auto x=m.add_continuous(),y=m.add_continuous(); + m.add_row({{x,1},{y,2}},-inf,6);m.add_row({{x,2},{y,1}},-inf,6);m.maximize({{x,2},{y,3}},5); + auto r=optimal(m,15);near(r.value(x),2);near(r.value(y),2);return {"optimal",{*r.objective}}; + } + if(name=="bounded_integer"){ + O::Model m;const auto variables=m.add_variables({{O::VariableType::Integer,-3,7,"n"},{O::VariableType::Integer,0,5,"k"}}); + auto n=variables[0],k=variables[1];require(m.revision()==1,"bulk variable posting was not one atomic revision"); + O::SparseRowBatch rows;rows.columns={k,n};rows.row_start={0,2};rows.column={1,0}; + rows.coefficient={2,3};rows.lower={7};rows.upper={inf};m.add_rows_sparse(rows); + require(m.revision()==2,"CSR row posting was not one atomic revision");m.minimize({{n,4},{k,5}},2); + double oracle=inf;for(int i=-3;i<=7;++i)for(int j=0;j<=5;++j)if(2*i+3*j>=7)oracle=std::min(oracle,4.0*i+5*j+2); + auto r=optimal(m,oracle);return {"optimal",{*r.objective}}; + } + if(name=="mixed_recourse"){ + Outcome out; + for(const int demand:{3,7,11,17,19,23}){ + O::Model m;auto open=m.add_binary(),n=m.add_integer(0,5),y=m.add_continuous(0,25); + m.add_row({{y,1},{open,-25}},-inf,0);m.add_row({{n,3},{y,1}},demand,inf); + m.minimize({{open,7},{n,3},{y,1.5}},-4); + double oracle=inf;for(int b=0;b<=1;++b)for(int k=0;k<=5;++k){const double recourse=std::max(0,demand-3*k); + if(recourse<=25*b)oracle=std::min(oracle,-4+7*b+3*k+1.5*recourse);} + auto r=optimal(m,oracle);near(r.value(y),std::max(0.0,demand-3*r.value(n)));out.objectives.push_back(*r.objective); + }return out; + } + if(name=="indicators_boolean"){ + O::Model m;auto b=m.add_binary(),one=m.add_binary(),both=m.add_binary(),either=m.add_binary();auto q=m.add_continuous(0,10); + m.set_bounds(one,1,1);O::add_boolean_and(m,both,{b,one});O::add_boolean_or(m,either,{b,both}); + O::add_indicator(m,b,true,{{q,1}},7,inf);O::add_indicator(m,b,false,{{q,1}},-inf,3); + m.minimize({{both,-20},{q,1}});auto r=optimal(m,-13);near(r.value(b),1);near(r.value(q),7);near(r.value(either),1); + return {"optimal",{*r.objective}}; + } + if(name=="semis"){ + O::Model m;auto sc=m.add_variable(O::VariableType::SemiContinuous,3,8),si=m.add_variable(O::VariableType::SemiInteger,2.5,7); + auto a=m.add_row({{sc,1}},1,inf),b=m.add_row({{si,1}},1,inf);m.minimize({{sc,2},{si,1}},-1); + auto active=optimal(m,8);near(active.value(sc),3);near(active.value(si),3); + m.set_bounds(a,0,inf);m.set_bounds(b,0,inf);auto zero=optimal(m,-1);near(zero.value(sc),0);near(zero.value(si),0); + return {"optimal",{*active.objective,*zero.objective}}; + } + if(name=="multiobjective"){ + O::Model m;auto x=m.add_integer(0,4),y=m.add_integer(0,4);m.add_row({{x,1},{y,1}},4,inf);m.minimize({{x,7}}); + O::ObjectiveData first{{{x,1},{y,1}},10,O::ObjectiveSense::Minimize}; + O::ObjectiveData second{{{y,1}},-3,O::ObjectiveSense::Maximize}; + auto opts=options();opts.primal_start={{x,3}}; + auto r=O::solve_lexicographic(m,{{first,0,0,"total"},{second,0,0,"prefer_y"}},opts); + require(r.completed_numerically()&&r.has_solution()&&r.objective_values.size()==2,"lexicographic workflow incomplete"); + near(r.objective_values[0],14);near(r.objective_values[1],1);near(r.final_solution.value(x),0);near(r.final_solution.value(y),4); + require(O::validate(m.snapshot(),r.final_solution.values).valid,"lexicographic original validation failed"); + return {"optimal",r.objective_values}; + } + if(name=="infeasible"){ + O::Model m;auto x=m.add_integer(0,0.5);m.add_row({{x,1}},0.25,inf);auto r=O::solve(m,options()); + require(r.termination==O::Termination::Infeasible&&!r.has_solution(),"infeasible discrete interval misclassified");return {"infeasible",{}}; + } + if(name=="unbounded"){ + O::Model m;auto x=m.add_continuous(-inf,inf);m.minimize({{x,1}});auto r=O::solve(m,options()); + require(r.termination==O::Termination::Unbounded,"explicit improving ray misclassified");return {"unbounded",{}}; + } + if(name=="edits_io"){ + O::Model m;auto x=m.add_continuous(4,20,"quantity");m.minimize({{x,2}},-3);auto before=optimal(m,5); + m.set_bounds(x,5,20);auto after=optimal(m,7);near(before.value(x),4);require(after.revision>before.revision,"edit revision not advanced"); + Outcome out{"optimal",{*before.objective,*after.objective}}; + for(const auto& ext:{".lp",".mps"}){const auto path=work/(std::string("edited")+ext);O::write_model(m,path.string());auto copy=O::read_model(path.string()); + auto r=optimal(copy,7);require(copy.id()!=m.id(),"import reused model identity");out.objectives.push_back(*r.objective);} + auto cancellation=O::read_model((fixtures/"cancellation.lp").string());auto r=optimal(cancellation,-1);out.objectives.push_back(*r.objective); + auto precision=O::read_model((fixtures/"precision.lp").string()); + require(!O::validate(precision.snapshot(),{1},0,0).valid&&O::validate(precision.snapshot(),{2},0,0).valid,"precision witnesses changed"); + for(const auto& ext:{".lp",".mps"}){const auto path=work/(std::string("precision")+ext);O::write_model(precision,path.string());auto copy=O::read_model(path.string()); + require(!O::validate(copy.snapshot(),{1},0,0).valid&&O::validate(copy.snapshot(),{2},0,0).valid,"roundtrip lost precision");} + return out; + } + if(name=="limit_contracts"){ + O::Model m;auto x=m.add_continuous(1,2);m.minimize({{x,1}});auto opts=options();opts.time_limit_seconds=0; + require(O::solve(m,opts).termination==O::Termination::TimeLimit,"zero deadline ignored"); + opts=options();opts.cancellation=std::make_shared();opts.cancellation->cancel(); + require(O::solve(m,opts).termination==O::Termination::Cancelled,"cancellation ignored"); + opts=options();opts.guarantee=O::Guarantee::Certified; + require(O::solve(m,opts).termination==O::Termination::Unsupported,"numerical result mislabeled certified"); + return {"contract_pass",{}}; + } + if(name=="session_reoptimization"){ + O::Model m;auto x=m.add_continuous(0,100),y=m.add_continuous(0,100); + const auto demand=m.add_row({{x,1},{y,1}},4,inf);m.minimize({{x,2},{y,3}},-3); + O::SolveSession session;Outcome out; + const auto check=[&](O::SolveSession& state,const O::Model& model,double expected,O::SolveOptions opts){ + auto r=state.solve(model,opts); + require(r.termination==O::Termination::Optimal&&r.has_solution(),"session did not reach validated optimum: "+r.message); + require(O::validate(model.snapshot(),r.values).valid,"session original validation failed");near(*r.objective,expected); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version;return r; + }; + const auto first=check(session,m,5,options()); + m.set_bounds(demand,8,inf);check(session,m,13,options()); + m.set_bounds(x,0,3);check(session,m,18,options()); + m.maximize({{x,-4},{y,-2}},10);check(session,m,-6,options()); + const auto stats=session.statistics(); + require(stats.model_loads==1&&stats.incremental_updates==3&&stats.basis_warm_starts>=1,"session failed compatible LP state reuse"); + near(first.value(x),4);near(*first.objective,5);require(first.revisionid)=original.rows.at(group.row->id);} + else {require(group.variable.has_value(),"domain attribution missing");const auto id=group.variable->id; + require(group.variable->model_id==model.id(),"foreign conflict variable"); + if(group.kind==O::ConflictGroupKind::LowerBound)subset.variables.at(id).lower=original.variables.at(id).lower; + else if(group.kind==O::ConflictGroupKind::UpperBound)subset.variables.at(id).upper=original.variables.at(id).upper; + else if(group.kind==O::ConflictGroupKind::Integrality)subset.variables.at(id).type=O::VariableType::Integer; + else require(false,"unexpected conflict grouping");} + } + require(result.groups[omitted].necessity_verified,"conflict group necessity not established"); + require(O::validate(subset,result.groups[omitted].deletion_witness).valid,"conflict deletion witness fails independent reconstruction"); + } + return result; + }; + O::Model bound;auto x=bound.add_continuous(0,10);auto demand=bound.add_row({{x,1}},11,inf);bound.maximize({{x,7}},-5); + const auto before=bound.snapshot();auto result=diagnose(bound); + require(result.groups.size()==2&&result.groups[0].kind==O::ConflictGroupKind::Row&&result.groups[0].row->id==demand.id&& + result.groups[1].kind==O::ConflictGroupKind::UpperBound&&*result.groups[1].variable==x,"wrong bound/row conflict"); + require(bound.revision()==before.revision&&bound.row(demand).active&&bound.snapshot().objective.offset==-5,"diagnostics mutated original model"); + O::Model integral;auto n=integral.add_integer(0.25,0.75);result=diagnose(integral); + require(result.groups.size()==3&&result.groups[0].kind==O::ConflictGroupKind::LowerBound&& + result.groups[1].kind==O::ConflictGroupKind::UpperBound&&result.groups[2].kind==O::ConflictGroupKind::Integrality,"fractional interval integrality conflict lost"); + for(const auto& group:result.groups)require(group.variable&&*group.variable==n,"wrong integrality conflict variable"); + return out; + } + if(name=="native_exact_reified"){ + O::Model m;auto b=m.add_binary(),n=m.add_integer(-3,3),semi=m.add_variable(O::VariableType::SemiInteger,2,4); + auto on=O::add_indicator(m,b,true,{{n,2},{semi,-1},{b,1}},-2,1); + O::add_indicator(m,b,false,{{n,1},{semi,1}},-inf,2); + require(on.inactive_gate.has_value(),"expected exposed inactive gate"); + const std::vector objective{{n,-2},{semi,3},{b,-4},{*on.inactive_gate,1}}; + double lower=inf,upper=-inf; + for(int active=0;active<=1;++active)for(int count=-3;count<=3;++count)for(int amount:{0,2,3,4}){ + const int row=2*count-amount+active; + if((active&& (row < -2||row > 1))||(!active&&count+amount>2))continue; + const double value=-2*count+3*amount-4*active+(1-active)-7; + lower=std::min(lower,value);upper=std::max(upper,value); + } + Outcome out;out.guarantee="exact"; + for(auto sense:{O::ObjectiveSense::Minimize,O::ObjectiveSense::Maximize}){ + m.set_objective(objective,sense,-7);auto opts=options();opts.backend=O::Backend::Native;opts.guarantee=O::Guarantee::Exact;opts.random_seed=0; + auto r=O::solve(m,opts); + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.guarantee==O::Guarantee::Exact,"native Exact route failed: "+r.message); + require(r.backend=="Gecode native"&&!r.backend_version.empty(),"native route misattributed to another backend"); + require(O::validate(m.snapshot(),r.values,0,0).valid,"native original witness failed"); + const auto active=r.value(b),count=r.value(n),amount=r.value(semi); + require((active==0||active==1)&&count==std::trunc(count)&&(amount==0||amount==2||amount==3||amount==4),"native integer domains changed"); + require(active==1?(2*count-amount+active>=-2&&2*count-amount+active<=1):count+amount<=2,"native reification differs from logical oracle"); + require(r.value(*on.inactive_gate)==1-active,"native exposed gate mapping failed"); + require(*r.objective==(sense==O::ObjectiveSense::Minimize?lower:upper)&&r.best_bound==r.objective&&r.absolute_gap==0,"native exact objective/bound differs from exhaustive oracle"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="native_globals"){ + O::Model m;std::vector starts,successors; + for(int i=0;i<3;++i){starts.push_back(m.add_integer(0,4));successors.push_back(m.add_integer(-2,0));} + auto index=m.add_integer(-1,1),selected=m.add_integer(0,4); + O::add_all_different(m,starts); + O::add_cumulative(m,starts,{2,2,2},{1,1,1},1); + O::add_table(m,{starts[0],starts[1]},{{0,2},{2,4},{4,0}}); + O::add_element(m,index,starts,selected,-1); + O::add_circuit(m,successors,-2); + double lower=inf,upper=-inf; + // Enumerate original schedules and the two possible three-node cycles. + for(int a=0;a<=4;++a)for(int b=0;b<=4;++b)for(int c=0;c<=4;++c){ + if(std::abs(a-b)<2||std::abs(a-c)<2||std::abs(b-c)<2)continue; + if(!((a==0&&b==2)||(a==2&&b==4)||(a==4&&b==0)))continue; + for(int chosen:{a,b,c})for(int next:{-1,0}){ + const double objective=4*a+2*b+c+3*chosen+next; + lower=std::min(lower,objective);upper=std::max(upper,objective); + } + } + Outcome out;out.guarantee="exact"; + for(auto sense:{O::ObjectiveSense::Minimize,O::ObjectiveSense::Maximize}){ + m.set_objective({{starts[0],4},{starts[1],2},{starts[2],1},{selected,3},{successors[0],1}},sense); + auto opts=options();opts.random_seed=0;opts.guarantee=O::Guarantee::Exact; + // Auto must preserve typed globals and select the native compiler. + auto r=O::solve(m,opts); + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.guarantee==O::Guarantee::Exact,"native global solve failed: "+r.message); + require(r.backend=="Gecode native"&&!r.backend_version.empty(),"global dispatch lost native provenance"); + require(O::validate(m.snapshot(),r.values,0,0).valid,"native global witness failed original predicates"); + require(*r.objective==(sense==O::ObjectiveSense::Minimize?lower:upper)&&r.best_bound==r.objective,"native global objective differs from exhaustive schedule oracle"); + out.backend=r.backend;out.backend_version=r.backend_version;out.objectives.push_back(*r.objective); + } + return out; + } + if(name=="c_api_ownership"){ + struct Owners {gecode_opt_handle model=0,session=0,first=0,second=0; + ~Owners(){if(first)gecode_opt_v1_result_destroy(first);if(second)gecode_opt_v1_result_destroy(second); + if(session)gecode_opt_v1_session_destroy(session);if(model)gecode_opt_v1_model_destroy(model);}} owned; + const auto ok=[](int error){require(error==GECODE_OPT_OK,std::string("C ABI error: ")+gecode_opt_v1_last_error());}; + require(gecode_opt_v1_abi_version()==1,"wrong C ABI version"); + ok(gecode_opt_v1_model_create(&owned.model));ok(gecode_opt_v1_session_create(&owned.session)); + gecode_opt_id x,y,row; + ok(gecode_opt_v1_model_add_variable(owned.model,GECODE_OPT_INTEGER,0,5,"units",&x)); + ok(gecode_opt_v1_model_add_variable(owned.model,GECODE_OPT_CONTINUOUS,0,5,"recourse",&y)); + gecode_opt_term terms[]={{x,1},{y,1}}; + ok(gecode_opt_v1_model_add_row(owned.model,terms,2,2.5,inf,"demand",&row)); + terms[0].coefficient=2;terms[1].coefficient=3; + ok(gecode_opt_v1_model_set_objective(owned.model,terms,2,GECODE_OPT_MINIMIZE,.25)); + gecode_opt_options_v1 opts;ok(gecode_opt_v1_options_default(&opts,sizeof opts)); + opts.backend=GECODE_OPT_HIGHS;opts.time_limit_seconds=options().time_limit_seconds;opts.relative_gap=opts.absolute_gap=0; + ok(gecode_opt_v1_session_solve(owned.session,owned.model,&opts,&owned.first)); + ok(gecode_opt_v1_model_set_variable_bounds(owned.model,x,3,5)); + opts.time_limit_seconds=options().time_limit_seconds; + ok(gecode_opt_v1_session_solve(owned.session,owned.model,&opts,&owned.second)); + ok(gecode_opt_v1_session_destroy(owned.session));owned.session=0; + ok(gecode_opt_v1_model_destroy(owned.model));owned.model=0; + Outcome out; + for(auto pair:{std::pair{owned.first,5.75},{owned.second,6.25}}){ + gecode_opt_result_info_v1 info;ok(gecode_opt_v1_result_info(pair.first,&info,sizeof info)); + require(info.termination==GECODE_OPT_OPTIMAL&&info.has_solution&&info.solution_validated,"C ABI historical result lost validity"); + int32_t present=0;double objective=0;ok(gecode_opt_v1_result_number(pair.first,GECODE_OPT_OBJECTIVE,&present,&objective)); + require(present,"C ABI objective absent");near(objective,pair.second);out.objectives.push_back(objective); + double xv=0,yv=0;ok(gecode_opt_v1_result_value(pair.first,x,&xv));ok(gecode_opt_v1_result_value(pair.first,y,&yv)); + near(xv,pair.first==owned.first?2:3);near(yv,pair.first==owned.first?.5:0); + near(2*xv+3*yv+.25,objective); + } + return out; + } + if(name=="feasibility_repair"){ + O::Model m;auto x=m.add_continuous(0,1),y=m.add_continuous(0,1); + const auto demand=m.add_row({{x,1},{y,1}},3,inf,"demand");m.minimize({{y,1}},-2); + const auto original=m.snapshot();O::RelaxationOptions opts;opts.solve=options(); + opts.rows={{demand,O::RelaxationSide::Lower,1}};opts.optimize_original_objective=true; + auto repair=O::relax_feasibility(m,opts); + require(repair.termination==O::Termination::Optimal&&repair.has_repair()&&repair.minimum_violation_established&&repair.original_objective_optimized,"repair workflow failed: "+repair.message); + near(*repair.minimum_weighted_violation,1);near(*repair.weighted_violation,1);near(*repair.original_objective,-1); + require(repair.source_model_id==m.id()&&repair.source_revision==m.revision()&&repair.private_model&&repair.private_model->model_id!=m.id(),"repair source/private identity collapsed"); + require(m.revision()==original.revision&&m.row(demand).lower==3,"repair mutated original model"); + require(!repair.original_validation.valid&&!O::validate(original,repair.original_values).valid,"infeasible original point relabeled feasible"); + require(O::validate(*repair.private_model,repair.workflow.final_solution.values).valid,"private repair failed original checking"); + require(repair.items.size()==1&&repair.items[0].source_row&&repair.items[0].source_row->id==demand.id,"repair row attribution lost"); + near(*repair.items[0].violation,1); + // A zero-violation minimum leaves several repairs; phase two must select y=0. + m.set_bounds(demand,1,inf);opts.solve=options();auto feasible=O::relax_feasibility(m,opts); + require(feasible.has_repair()&&feasible.original_objective_optimized&&feasible.original_validation.valid,"zero violation refinement failed"); + near(*feasible.weighted_violation,0);near(*feasible.original_objective,-2); + return {"optimal",{*repair.weighted_violation,*repair.original_objective,*feasible.weighted_violation,*feasible.original_objective}}; + } + if(name=="native_checked_lp") { + O::Model m;auto n=m.add_integer(-3,7),k=m.add_integer(0,5); + m.add_row({{n,2},{k,3}},7,12); + double low=inf,high=-inf; + for(int x=-3;x<=7;++x)for(int y=0;y<=5;++y)if(2*x+3*y>=7&&2*x+3*y<=12) { + low=std::min(low,4.0*x+5*y+2);high=std::max(high,4.0*x+5*y+2); + } + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + m.set_objective({{n,4},{k,5}},maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,2); + O::NativeLpOptions opts;opts.solve=options();opts.solve.random_seed=0;opts.solve.guarantee=O::Guarantee::Exact; + opts.frequency=O::NativeLpFrequency::AfterBoundChanges;opts.bound_change_interval=2; + const auto solved=O::solve_native_lp(m,opts);const auto& r=solved.result; + require(r.termination==O::Termination::Optimal&&r.has_solution(),"native LP solve failed: "+r.message); + require(r.objective==std::optional(maximum?high:low)&&r.best_bound==r.objective&&r.absolute_gap==0,"native LP completion disagrees with enumeration"); + require(O::validate(m.snapshot(),r.values).valid,"native LP original witness invalid"); + require(solved.relaxation.lp_calls>0&&solved.relaxation.valid_bounds>0,"native LP bypassed numerical relaxation or checked deductions"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="solution_pool") { + O::Model m;auto n=m.add_integer(0,2),q=m.add_continuous(0,10); + m.add_row({{n,2},{q,1}},4,inf);m.minimize({{n,1},{q,1}},-1); + O::PoolOptions opts;opts.solve=options();opts.max_solutions=5; + const auto all=O::solve_pool(m,opts); + require(all.exhausted()&&all.termination==O::Termination::Optimal&&all.entries.size()==3&&all.ranked_prefix==3,"projection pool exhaustion failed: "+all.message); + require(all.attempts.size()==4&&all.attempts.back().termination==O::Termination::Infeasible,"pool exhaustion evidence missing"); + Outcome out; + for(std::size_t i=0;i{2-static_cast(i)},"projection pool rank/identity mismatch"); + require(r.model_id==m.id()&&r.revision==m.revision()&&r.has_solution()&&O::validate(m.snapshot(),r.values).valid,"pool original witness lost"); + require(r.termination==O::Termination::Unknown&&!r.best_bound&&!r.absolute_gap,"restricted pool optimum mislabeled original scalar optimum"); + near(*r.objective,1+i);near(r.value(n),2-i);near(r.value(q),2*i); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + opts.solve=options();opts.max_solutions=2;const auto limited=O::solve_pool(m,opts); + require(!limited.exhausted()&&limited.completion==O::PoolCompletion::RequestedLimit&&limited.termination==O::Termination::SolutionLimit&&limited.entries.size()==2,"requested pool limit falsely implied exhaustion"); + return out; + } + if(name=="integer_presolve") { + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + O::Model m;const auto removed=m.add_integer(-3,3);m.remove(removed); + const auto fixed=m.add_integer(2,2),y=m.add_integer(-2,2); + m.add_row({{fixed,3},{y,-2}},4,8,"range"); + m.set_objective({{fixed,-3},{y,2}},maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,11); + O::PresolveOptions presolve;presolve.time_limit_seconds=options().time_limit_seconds; + const auto prepared=O::presolve_integer(m,presolve); + require(prepared.status==O::PresolveStatus::Fixpoint&&prepared.model&&prepared.fixed_variables==1,"integer presolve did not produce equivalent fixed substitution"); + require(prepared.model->reduced().model_id!=m.id(),"presolve reduced/original identities collapsed"); + auto opts=options();opts.backend=O::Backend::Native;opts.guarantee=O::Guarantee::Exact;opts.random_seed=0; + const auto reduced=O::solve_native(prepared.model->reduced(),opts); + require(reduced.termination==O::Termination::Optimal&&reduced.has_solution(),"presolved native solve failed"); + const auto restored=prepared.model->postsolve(reduced); + require(restored.exact_witness_validated&&restored.solution.has_solution(),"presolve original reconstruction failed"); + const auto& r=restored.solution; + require(r.model_id==m.id()&&r.revision==m.revision()&&!r.active_variables[removed.id],"postsolve historical identity/mask lost"); + require(r.termination==O::Termination::Unknown&&!r.best_bound&&!r.absolute_gap,"postsolve copied reduced scalar proof without coordination"); + double oracle=maximum?-inf:inf;for(int value=-2;value<=2;++value)if(4<=6-2*value&&6-2*value<=8) + oracle=maximum?std::max(oracle,5.0+2*value):std::min(oracle,5.0+2*value); + require(r.objective==std::optional(oracle)&&r.value(fixed)==2,"postsolve offset/substitution disagrees with original enumeration"); + require(O::validate(prepared.model->original(),r.values,0,0).valid,"postsolve exact original witness rejected"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="native_frontier_bounds") { + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + O::Model m;auto x=m.add_binary(),y=m.add_binary(); + m.set_objective({{x,maximum?-2.0:2.0},{y,maximum?-1.0:1.0}}, + maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,maximum?17:-17); + O::NativeSearchOptions opts;opts.solve=options();opts.solve.random_seed=0;opts.solve.guarantee=O::Guarantee::Exact; + const auto complete=O::solve_native_search(m,opts); + const auto optimum=maximum?17.0:-17.0; + require(complete.result.termination==O::Termination::Optimal&&complete.result.has_solution()&&complete.result.objective==optimum&&complete.result.best_bound==optimum,"best-bound frontier completion failed"); + opts.order=O::NativeSearchOrder::DepthFirst;opts.solve=options();opts.solve.random_seed=0; + opts.solve.guarantee=O::Guarantee::Exact;opts.solve.node_limit=4; + const auto interrupted=O::solve_native_search(m,opts);const auto& r=interrupted.result; + require(r.termination==O::Termination::NodeLimit&&r.has_solution()&&r.objective==(maximum?15:-15),"frontier failed to retain timely incumbent at quota"); + require(r.best_bound==optimum&&r.absolute_gap==2&&interrupted.frontier.unresolved_regions>=2,"frontier lost the better unresolved sibling bound"); + require(O::validate(m.snapshot(),r.values,0,0).valid&&interrupted.relaxation.lp_calls==0,"native frontier witness or route changed"); + out.objectives.insert(out.objectives.end(),{*complete.result.objective,*r.objective,*r.best_bound}); + out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="native_binary_branching") { + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + O::Model m;auto x=m.add_binary(),y=m.add_binary(); + m.set_objective({{x,maximum?-2.0:2.0},{y,maximum?-1.0:1.0}}, + maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,maximum?17:-17); + O::NativeSearchOptions opts;opts.solve=options();opts.solve.random_seed=0;opts.solve.guarantee=O::Guarantee::Exact; + opts.branching=O::NativeBranchingSettings{}; + const auto solved=O::solve_native_search(m,opts);const auto& r=solved.result; + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.objective==(maximum?17:-17)&&r.best_bound==r.objective,"binary reliability optimum disagrees with enumeration"); + const auto& b=solved.branching; + require(b.requested&&b.manual_splits>0&&b.published_pairs>0&&b.probe_status_calls>=2,"binary reliability probes/selection were bypassed"); + require(b.budget_nodes==solved.frontier.admitted_nodes+b.probe_status_calls&&b.probe_lp_calls==0,"branch probe budget/subset accounting failed"); + require(O::validate(m.snapshot(),r.values,0,0).valid,"binary reliability original witness invalid"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="native_complete_start") { + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + O::Model m;auto b=m.add_binary(),x=m.add_integer(0,4); + const auto indicator=O::add_indicator(m,b,true,{{x,1}},3,inf); + require(indicator.inactive_gate.has_value(),"native start fixture has no live gate"); + m.set_objective({{x,1},{b,-10}},maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,3); + auto opts=options();opts.backend=O::Backend::Native;opts.guarantee=O::Guarantee::Exact;opts.random_seed=0; + opts.primal_start={{b,maximum?1.0:0.0},{x,maximum?3.0:4.0}}; + const auto r=O::solve_native(m,opts); + double oracle=maximum?-inf:inf; + for(int flag=0;flag<=1;++flag)for(int value=0;value<=4;++value)if(!flag||value>=3) + oracle=maximum?std::max(oracle,value-10.0*flag+3):std::min(oracle,value-10.0*flag+3); + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.start_submitted,"complete native start was not accepted"); + require(r.objective==oracle&&r.best_bound==oracle,"native start search failed to improve to original optimum"); + require(r.value(*indicator.inactive_gate)==1-r.value(b)&&O::validate(m.snapshot(),r.values,0,0).valid,"native start result violates original gate/model"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="convex_quadratic") { + Outcome out; + for(bool maximum:{false,true}) { + O::QuadraticModel m;auto x=m.add_continuous(-2,3),y=m.add_continuous(-2,3); + m.add_row({{x,1},{y,1}},1,1); + const std::vector squares={{{{x,1}},0,1,"x2"},{{{y,1}},0,1,"y2"}}; + if(maximum)m.maximize_concave_squares(squares,{},3);else m.minimize_squares(squares,{},3); + O::QuadraticOptions opts;opts.solve=options();opts.solve.random_seed=0; + const auto solved=O::solve_quadratic(m,opts);const auto& r=solved.result; + require(r.termination==O::Termination::Optimal&&r.has_solution(),"quadratic solve failed: "+r.message); + // x+y=1 => x^2+y^2 = 1/2 + 2*(x-1/2)^2, an independent exact optimum. + near(r.value(x),0.5);near(r.value(y),0.5);near(*r.objective,maximum?2.5:3.5); + require(solved.checks.kkt_valid&&solved.checks.bound_valid&&solved.checks.gap_upper_bound + &&*solved.checks.gap_upper_bound>=0&&*solved.checks.gap_upper_bound<=1e-6,"quadratic original optimality checks unavailable"); + require(O::validate_quadratic(m.snapshot(),r.values).primal_valid,"quadratic original point invalid"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + if(name=="native_root_covers") { + Outcome out;out.guarantee="exact"; + for(bool maximum:{false,true}) { + O::Model m;auto x=m.add_binary(),y=m.add_binary();m.add_row({{x,3},{y,3}},-inf,5); + m.set_objective({{x,maximum?2.0:-2.0},{y,maximum?2.0:-2.0}},maximum?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,17); + O::NativeLpOptions opts;opts.solve=options();opts.solve.random_seed=0;opts.solve.guarantee=O::Guarantee::Exact; + opts.root_cover_cuts=O::NativeRootCoverSettings{}; + const auto solved=O::solve_native_lp(m,opts);const auto& r=solved.result; + // 3(x+y)<=5 for binary x,y is exactly x+y<=1. + require(r.termination==O::Termination::Optimal&&r.has_solution()&&r.objective==(maximum?19:15)&&r.best_bound==r.objective,"root cover solve disagrees with binary enumeration"); + const auto& root=solved.relaxation.root_cover; + require(root.requested&&root.cuts==1&&root.nonzeros==2&&root.augmentations==1&&root.lp_calls>=1,"verified root cover preparation was bypassed"); + require(solved.relaxation.lp_calls>=root.lp_calls&&solved.relaxation.valid_bounds>=root.valid_bounds,"root LP subset accounting was lost"); + require(O::validate(m.snapshot(),r.values,0,0).valid,"root cover original witness invalid"); + out.objectives.push_back(*r.objective);out.backend=r.backend;out.backend_version=r.backend_version; + } + return out; + } + throw std::runtime_error("unknown required case: "+name); +} +} +int main(int argc,char** argv){ + const auto start=Clock::now();std::string name; + try{ + if(argc!=9||std::string(argv[1])!="--case"||std::string(argv[3])!="--work-dir"||std::string(argv[5])!="--fixtures"||std::string(argv[7])!="--seconds") + throw std::runtime_error("usage: optimize-fast-benchmark --case NAME --work-dir DIR --fixtures DIR --seconds SECONDS"); + name=argv[2];const double seconds=std::stod(argv[8]);require(std::isfinite(seconds)&&seconds>0&&seconds<=28,"invalid budget"); + deadline=start+std::chrono::duration_cast(std::chrono::duration(seconds)); + const bool native=name=="native_exact_reified"||name=="native_globals"||name=="native_regular"||name=="native_checked_lp"||name=="integer_presolve"||name=="native_frontier_bounds"||name=="native_root_covers"||name=="native_binary_branching"||name=="native_complete_start"||name=="native_neighborhoods"; + const auto backend=name=="convex_quadratic"?O::quadratic_capabilities(): + (name=="native_checked_lp"||name=="native_root_covers")?O::native_lp_capabilities():O::capabilities(native?O::Backend::Native:O::Backend::Highs); + require(backend.available&&(name=="convex_quadratic"?backend.quadratic_programming: + backend.mixed_integer_linear&&(native?backend.exact_solving:backend.linear_programming)),"required case backend unavailable"); + auto result=run(name,argv[4],argv[6]);require(Clock::now()(Clock::now()-start).count()<<",\"objectives\":["; + for(std::size_t i=0;i (x<=1) means x>=2, so the minimum is x=2. +% Testing the false branch distinguishes equivalence from one-way implication. +var -2..3: x :: output_var; +var bool: b :: output_var; +constraint int_le_reif(x,1,b); +constraint bool_eq(b,false); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v1-reified-signed-alias.fzn b/test/optimize/flatzinc-fixtures/cli-v1-reified-signed-alias.fzn new file mode 100644 index 0000000000..d6dfa5b649 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v1-reified-signed-alias.fzn @@ -0,0 +1,8 @@ +% CLI fixture v1: false <-> (-2*x+y-x<=-1) means y>=3*x. +% Enumerating x in -1..2 and y in -2..2 gives the unique minimum (x,y)=(-1,-2). +var -1..2: x :: output_var; +var -2..2: y :: output_var; +var bool: b :: output_var; +constraint int_lin_le_reif([-2,1,-1],[x,y,x],-1,b); +constraint bool_eq(b,false); +solve minimize y; diff --git a/test/optimize/flatzinc-fixtures/cli-v1-satisfy-hidden.fzn b/test/optimize/flatzinc-fixtures/cli-v1-satisfy-hidden.fzn new file mode 100644 index 0000000000..5ebffe92e1 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v1-satisfy-hidden.fzn @@ -0,0 +1,6 @@ +% CLI fixture v1: hidden=2 and hidden+x=3 imply x=1; hidden must not be printed. +var 0..2: hidden; +var 0..2: x :: output_var; +constraint int_plus(hidden,x,3); +constraint int_eq(hidden,2); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v1-unbounded-domain.fzn b/test/optimize/flatzinc-fixtures/cli-v1-unbounded-domain.fzn new file mode 100644 index 0000000000..1ae55f6c06 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v1-unbounded-domain.fzn @@ -0,0 +1,4 @@ +% CLI fixture v1: missing integer bounds are outside this finite-domain compiler. +% A frontend rejection must never be reported as a mathematical UNSAT proof. +var int: x :: output_var; +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v1-unknown-predicate.fzn b/test/optimize/flatzinc-fixtures/cli-v1-unknown-predicate.fzn new file mode 100644 index 0000000000..75abd5cd18 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v1-unknown-predicate.fzn @@ -0,0 +1,4 @@ +% CLI fixture v1: an intentionally unknown predicate must be rejected completely. +var 0..2: x :: output_var; +constraint cli_v1_unknown_predicate(x); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-circuit-empty.fzn b/test/optimize/flatzinc-fixtures/cli-v2-circuit-empty.fzn new file mode 100644 index 0000000000..3305c92cf1 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-circuit-empty.fzn @@ -0,0 +1,3 @@ +% This low-level predicate requires a nonempty successor array. +constraint gecode_circuit(0,[]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-circuit-offset.fzn b/test/optimize/flatzinc-fixtures/cli-v2-circuit-offset.fzn new file mode 100644 index 0000000000..d0e1d119e0 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-circuit-offset.fzn @@ -0,0 +1,6 @@ +% Exactly one cycle on labels 3,4,5. Minimizing the first successor is unique. +var 3..5: x :: output_var; +var 3..5: y :: output_var; +var 3..5: z :: output_var; +constraint gecode_circuit(3,[x,y,z]); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-circuit-singleton.fzn b/test/optimize/flatzinc-fixtures/cli-v2-circuit-singleton.fzn new file mode 100644 index 0000000000..52d4194c02 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-circuit-singleton.fzn @@ -0,0 +1,3 @@ +% A singleton full circuit returns to its sole explicit label. +constraint gecode_circuit(5,[5]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-circuit-subtours.fzn b/test/optimize/flatzinc-fixtures/cli-v2-circuit-subtours.fzn new file mode 100644 index 0000000000..2911855406 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-circuit-subtours.fzn @@ -0,0 +1,3 @@ +% Two disjoint two-cycles are not a full circuit. +constraint gecode_circuit(0,[1,0,3,2]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-fixed-alias.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-fixed-alias.fzn new file mode 100644 index 0000000000..50efb27d3d --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-fixed-alias.fzn @@ -0,0 +1,12 @@ +% Original alias-domain intersections fix duration=2 and capacity=2; h is assigned. +% Task [-1,1) uses one unit, so the two-unit task has earliest start 1. +var {0,2}: d :: output_var; +var int: duration_alias :: output_var = d; +var 0..3: h :: output_var = 1; +var {1,2}: capacity :: output_var; +var int: capacity_alias :: output_var = capacity; +var -1..3: s :: output_var; +constraint int_in(duration_alias,1..3); +constraint int_in(capacity_alias,{2}); +constraint cumulatives([-1,s],[duration_alias,1],[h,2],capacity_alias); +solve minimize s; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-half-open.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-half-open.fzn new file mode 100644 index 0000000000..27d9b1fa20 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-half-open.fzn @@ -0,0 +1,5 @@ +% a occupies [-1,0); b may start exactly at 0, which is its unique optimum. +var -1..-1: a :: output_var; +var -1..2: b :: output_var; +constraint gecode_cumulatives([a,b],[1,2],[2,2],2); +solve minimize b; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-malformed-four.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-malformed-four.fzn new file mode 100644 index 0000000000..480b1470ac --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-malformed-four.fzn @@ -0,0 +1,4 @@ +% Four arguments with mismatched task-array lengths are invalid input. +var 0..1: s; +constraint gecode_cumulatives([s],[1,1],[1],1); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-overlap-unsat.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-overlap-unsat.fzn new file mode 100644 index 0000000000..317341f27f --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-overlap-unsat.fzn @@ -0,0 +1,4 @@ +% The legacy four-argument spelling denotes the same single resource. +% Two tasks overlap on [-1,0), where demand 3 exceeds capacity 2. +constraint cumulatives([-1,-1],[2,1],[2,1],2); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-positive-duration-unsat.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-positive-duration-unsat.fzn new file mode 100644 index 0000000000..0c45f81d7a --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-positive-duration-unsat.fzn @@ -0,0 +1,4 @@ +% Positive duration makes the same excess demand impossible at every start. +var -2..2: s :: output_var; +constraint gecode_cumulatives([s],[1],[2],1); +solve minimize s; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unfixed-parameter.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unfixed-parameter.fzn new file mode 100644 index 0000000000..929e25eb11 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unfixed-parameter.fzn @@ -0,0 +1,7 @@ +% A normal equality does not establish an original singleton declaration/domain. +% The compiler must not substitute the lower bound or run propagation to fix d. +var 0..1: s; +var 1..2: d; +constraint int_eq(d,1); +constraint gecode_cumulatives([s],[d],[1],1); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-seven.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-seven.fzn new file mode 100644 index 0000000000..313f553379 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-seven.fzn @@ -0,0 +1,4 @@ +% The seven-argument MiniZinc wrapper is distinct from the four-argument poster. +var 0..1: s; +constraint fzn_cumulatives([s],[1],[1],[0],[1],true,0); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-six.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-six.fzn new file mode 100644 index 0000000000..66bb334431 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-unsupported-six.fzn @@ -0,0 +1,4 @@ +% Machine assignments, per-machine bounds and polarity must never be truncated. +var 0..1: s; +constraint gecode_cumulatives([s],[1],[1],[0],[1],true); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-wrong-arity.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-wrong-arity.fzn new file mode 100644 index 0000000000..9a92675fcb --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-wrong-arity.fzn @@ -0,0 +1,4 @@ +% The admitted legacy spelling still requires exactly four arguments. +var 0..1: s; +constraint cumulatives([s],[1],[1]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-cumulative-zero-duration.fzn b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-zero-duration.fzn new file mode 100644 index 0000000000..426b6786b6 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-cumulative-zero-duration.fzn @@ -0,0 +1,5 @@ +% Half-open semantics: a zero-duration task consumes no capacity. +% The legacy p_cumulatives singleton shortcut incorrectly rejects height 2 > 1. +var -2..2: s :: output_var; +constraint gecode_cumulatives([s],[0],[2],1); +solve minimize s; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-domain-contiguous.fzn b/test/optimize/flatzinc-fixtures/cli-v2-domain-contiguous.fzn new file mode 100644 index 0000000000..a47d94290a --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-domain-contiguous.fzn @@ -0,0 +1,4 @@ +% Intersecting finite sets proves the exact interval [0,1], with no global left. +var {0,1,3}: x :: output_var; +constraint int_in(x,{0,1,2}); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-holey-alias.fzn b/test/optimize/flatzinc-fixtures/cli-v2-holey-alias.fzn new file mode 100644 index 0000000000..6fd789a1aa --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-holey-alias.fzn @@ -0,0 +1,7 @@ +% Alias membership intersection leaves {-1,1}; the row excludes -1. +% Replacing this domain with its hull would incorrectly admit the optimum 0. +var {-3,-1,1,4}: x :: output_var; +var int: y :: output_var = x; +constraint int_in(y,{-1,1,3}); +constraint int_le(0,y); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-table-alias-unsat.fzn b/test/optimize/flatzinc-fixtures/cli-v2-table-alias-unsat.fzn new file mode 100644 index 0000000000..f65b487cf9 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-table-alias-unsat.fzn @@ -0,0 +1,4 @@ +% Repeated positions are the same decision, so the only tuple cannot match. +var 0..1: x :: output_var; +constraint gecode_table_int([x,x],[0,1]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-table-empty.fzn b/test/optimize/flatzinc-fixtures/cli-v2-table-empty.fzn new file mode 100644 index 0000000000..dd3879c8ef --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-table-empty.fzn @@ -0,0 +1,4 @@ +% A positive-arity relation with no tuples is false. +var 0..1: x :: output_var; +constraint gecode_table_int([x],[]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-table-holes.fzn b/test/optimize/flatzinc-fixtures/cli-v2-table-holes.fzn new file mode 100644 index 0000000000..66f42f85d3 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-table-holes.fzn @@ -0,0 +1,5 @@ +% Row-major relation and a declared finite set both preserve original values. +var {-3,1,3}: x :: output_var; +var -2..2: y :: output_var; +constraint gecode_table_int([x,y],[-3,2,1,-2,3,1]); +solve minimize y; diff --git a/test/optimize/flatzinc-fixtures/cli-v2-table-zero-arity.fzn b/test/optimize/flatzinc-fixtures/cli-v2-table-zero-arity.fzn new file mode 100644 index 0000000000..06d5c024db --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v2-table-zero-arity.fzn @@ -0,0 +1,3 @@ +% Flattening lost whether this meant zero tuples or one empty tuple. +constraint gecode_table_int([],[]); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-alias-repeat.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-alias-repeat.fzn new file mode 100644 index 0000000000..1061c47cdc --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-alias-repeat.fzn @@ -0,0 +1,5 @@ +% Three source positions share one variable; repeated 2 is accepted. +var 1..2: x :: output_var; +var 1..2: y :: output_var = x; +constraint gecode_regular([x,y,x],2,2,[1,2,2,1],1,{2}); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-count.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-count.fzn new file mode 100644 index 0000000000..dd4886b15a --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-count.fzn @@ -0,0 +1,3 @@ +% No initial state can belong to a zero-state automaton. +constraint gecode_regular([],0,1,[],1,{}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-initial.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-initial.fzn new file mode 100644 index 0000000000..0810aff04c --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-initial.fzn @@ -0,0 +1,3 @@ +% Initial state is outside 1..Q; empty words do not bypass admission. +constraint gecode_regular([],2,2,[1,2,2,1],3,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-target.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-target.fzn new file mode 100644 index 0000000000..eaae4e56b2 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-bad-target.fzn @@ -0,0 +1,3 @@ +% Every target must be in 0..Q, including unreachable transitions. +constraint gecode_regular([],2,2,[1,2,3,1],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-dead-transition.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-dead-transition.fzn new file mode 100644 index 0000000000..47ff7e4c1b --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-dead-transition.fzn @@ -0,0 +1,3 @@ +% Source target 0 is always failing, not the typed API's ordinary state 0. +constraint gecode_regular([1],1,1,[0],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-accept.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-accept.fzn new file mode 100644 index 0000000000..eb36700451 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-accept.fzn @@ -0,0 +1,4 @@ +% No transitions are needed when the empty word starts in a final state. +array [1..0] of var 1..2: word :: output_array([1..0]) = []; +constraint gecode_regular(word,2,2,[0,0,0,0],2,{2}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-finals.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-finals.fzn new file mode 100644 index 0000000000..eda129d2c5 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-finals.fzn @@ -0,0 +1,3 @@ +% An empty final set rejects even an empty word. +constraint gecode_regular([],1,1,[1],1,{}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-reject.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-reject.fzn new file mode 100644 index 0000000000..dc701c50a9 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-empty-reject.fzn @@ -0,0 +1,3 @@ +% Empty word does not visit another final state. +constraint gecode_regular([],2,2,[0,0,0,0],2,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-final-interval.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-final-interval.fzn new file mode 100644 index 0000000000..9f569ccb6a --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-final-interval.fzn @@ -0,0 +1,4 @@ +% Both destinations are final after expanding the parameter interval. +var 0..3: x :: output_var; +constraint gecode_regular([x],3,2,[2,3,0,0,0,0],1,2..3); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-malformed-matrix.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-malformed-matrix.fzn new file mode 100644 index 0000000000..7030793da7 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-malformed-matrix.fzn @@ -0,0 +1,3 @@ +% Q*S is 4, but only 3 cells are present. +constraint gecode_regular([1],2,2,[1,2,1],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-nonliteral-parameter.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-nonliteral-parameter.fzn new file mode 100644 index 0000000000..53fb3a47bc --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-nonliteral-parameter.fzn @@ -0,0 +1,5 @@ +% Q is a var reference even though its original domain is singleton. +% The explicit literal-parameter schema rejects it without propagation. +var 1..1: q; +constraint gecode_regular([1],q,1,[1],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-nonunit-finals.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-nonunit-finals.fzn new file mode 100644 index 0000000000..5acbc9a069 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-nonunit-finals.fzn @@ -0,0 +1,4 @@ +% The literal final set is noncontiguous and contains a harmless duplicate. +var 0..3: x :: output_var; +constraint gecode_regular([x],3,2,[2,3,0,0,0,0],1,{3,1,3}); +solve maximize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-rejected-word.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-rejected-word.fzn new file mode 100644 index 0000000000..d77967c2ff --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-rejected-word.fzn @@ -0,0 +1,3 @@ +% Word [1,1] ends in a nonfinal state, without a missing transition. +constraint gecode_regular([1,1],2,2,[1,2,2,1],1,{2}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-unsupported-set.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-unsupported-set.fzn new file mode 100644 index 0000000000..3d6768cdc3 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-unsupported-set.fzn @@ -0,0 +1,3 @@ +% Seven-argument set-alphabet spelling is a separate unsupported interface. +constraint gecode_regular_set([1],1,1,1,[1],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-word.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-word.fzn new file mode 100644 index 0000000000..6876d0fe37 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-word.fzn @@ -0,0 +1,5 @@ +% Exactly the words [1,2] and [2,1] are accepted; min x is unique. +var 0..3: x :: output_var; +var 0..3: y :: output_var; +constraint gecode_regular([x,y],3,2,[2,3,0,3,3,0],1,{3}); +solve minimize x; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-wrong-arity.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-wrong-arity.fzn new file mode 100644 index 0000000000..4bca50814b --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-wrong-arity.fzn @@ -0,0 +1,3 @@ +% Six arguments are required; a missing final set is malformed. +constraint gecode_regular([1],1,1,[1],1); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/cli-v3-regular-zero-symbol.fzn b/test/optimize/flatzinc-fixtures/cli-v3-regular-zero-symbol.fzn new file mode 100644 index 0000000000..2d4395f815 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/cli-v3-regular-zero-symbol.fzn @@ -0,0 +1,3 @@ +% Source alphabet is 1..S; input zero must never become a valid symbol. +constraint gecode_regular([0],1,1,[1],1,{1}); +solve satisfy; diff --git a/test/optimize/flatzinc-fixtures/linear-alias.fzn b/test/optimize/flatzinc-fixtures/linear-alias.fzn new file mode 100644 index 0000000000..81990d17f4 --- /dev/null +++ b/test/optimize/flatzinc-fixtures/linear-alias.fzn @@ -0,0 +1,4 @@ +var 0..3: x; +var 1..2: y :: output_var = x; +array [1..4] of var 0..3: a :: output_array([-1..0,2..3]) = [x,x,2,3]; +solve minimize y; diff --git a/test/optimize/flatzinc-fixtures/unsupported.fzn b/test/optimize/flatzinc-fixtures/unsupported.fzn new file mode 100644 index 0000000000..f1cdf18add --- /dev/null +++ b/test/optimize/flatzinc-fixtures/unsupported.fzn @@ -0,0 +1,3 @@ +var 0..2: x :: output_var; +constraint int_times(x,x,x); +solve minimize x; diff --git a/test/optimize/flatzinc.cpp b/test/optimize/flatzinc.cpp new file mode 100644 index 0000000000..f3f0761ce1 --- /dev/null +++ b/test/optimize/flatzinc.cpp @@ -0,0 +1,718 @@ +/* Independent source-language truth tables; no native parser/backend required. */ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace F=Gecode::FlatZinc::Capture; +using I=std::int64_t; +using Point=std::vector; +static std::size_t configurations=0,assignments=0; +F::Value integer(I x){F::Value v;v.integer=x;return v;} +F::Value boolean(bool x){F::Value v;v.kind=F::ValueKind::Boolean;v.boolean=x;return v;} +F::Value ref(std::size_t index,F::Type type=F::Type::Integer){F::Value v;v.kind=F::ValueKind::Reference;v.reference={type,index};return v;} +F::Value array(std::vector x){F::Value v;v.kind=F::ValueKind::Array;v.elements=std::move(x);return v;} +F::Value domain(I lo,I hi){F::Value v;v.kind=F::ValueKind::Set;v.set.interval=true;v.set.lower=lo;v.set.upper=hi;return v;} +F::Value members(std::vector values){auto v=domain(0,0);v.set.interval=false;v.set.values=std::move(values);return v;} +F::Value atom(const std::string& x){F::Value v;v.kind=F::ValueKind::Atom;v.text=x;return v;} +F::Value call(const std::string& x,std::vector args){auto v=atom(x);v.kind=F::ValueKind::Call;v.elements=std::move(args);return v;} +F::Variable variable(std::size_t index,I lo,I hi,F::Type type=F::Type::Integer){F::Variable v;v.reference={type,index};v.name="v"+std::to_string(index);v.domain.present=true;v.domain.integers=domain(lo,hi).set;return v;} +F::Constraint row(const std::string& name,std::vector args){F::Constraint c;c.id=name;c.arguments=std::move(args);c.location={"fixture.fzn",3,1};return c;} +O::CompiledFlatZinc compiled(const F::Records& source){auto result=O::compile_flatzinc(source);if(!result.compiled)std::cerr<<"compile failed: "<> mapped(const O::CompiledFlatZinc& c,const Point& point){ + std::vector values(c.model().variables.size());std::vector assigned(values.size());assert(point.size()==c.variables().size()); + for(std::size_t i=0;ibool { + if(slot==values.size())return O::validate(c.model(),values,0,0).valid; + if(assigned[slot])return self(self,slot+1); + const auto& v=c.model().variables[slot];assert(v.active&&v.upper-v.lower<=2); + for(I x=static_cast(v.lower);x<=static_cast(v.upper);++x){values[slot]=static_cast(x);if(self(self,slot+1))return true;} + return false; + }; + if(complete(complete,0))return values;return {}; +} +O::SolveResult witness(const O::CompiledFlatZinc& c,const Point& point,double objective=0){ + O::SolveResult result;result.model_id=c.model().model_id;result.revision=c.model().revision; + result.values=*mapped(c,point);result.active_variables.assign(result.values.size(),true);result.objective=objective; + result.solution_validated=true;result.termination=O::Termination::Optimal;result.guarantee=O::Guarantee::Exact;return result; +} +void oracle(const F::Records& source,const std::vector>& ranges,const std::function& predicate){ + const auto c=compiled(source);Point point(ranges.size()); + const auto visit=[&](const auto& self,std::size_t j)->void{ + if(j(status)<<" actual "<(r.status)<<"\n";assert(r.status==status&&!r.compiled);++configurations;} +void comparisons(){ + for(const auto& id:{"int_eq","int_le","int_lt","int_ge","int_gt"})for(bool left_literal:{false,true})for(bool right_literal:{false,true}){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2)}; + r.raw_constraints={row(id,{left_literal?integer(-1):ref(0),right_literal?integer(1):ref(1)})}; + oracle(r,{{-2,2},{-2,2}},[&](const Point& p){auto a=left_literal?-1:p[0],b=right_literal?1:p[1];std::string s=id;return s=="int_eq"?a==b:s=="int_le"?a<=b:s=="int_lt"?a=b:a>b;}); + } + for(const auto& id:{"int_plus","int_minus"}){F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2),variable(2,-2,2)}; + r.raw_constraints={row(id,{ref(0),ref(1),ref(2)})};oracle(r,{{-2,2},{-2,2},{-2,2}},[&](const Point& p){return (std::string(id)=="int_plus"?p[0]+p[1]:p[0]-p[1])==p[2];});} + for(int a=-3;a<=3;++a)for(int b=-3;b<=3;++b)for(bool equality:{false,true}){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2)}; + r.raw_constraints={row(equality?"int_lin_eq":"int_lin_le",{array({integer(a),integer(b),integer(-1)}),array({ref(0),ref(1),ref(0)}),integer(1)})}; + oracle(r,{{-2,2},{-2,2}},[&](const Point& p){auto sum=(a-1)*p[0]+b*p[1];return equality?sum==1:sum<=1;}); + } +} +void booleans(){ + const auto B=F::Type::Boolean; + for(const auto& id:{"bool_eq","bool_le","bool_not","bool_and","bool_or"}){ + F::Records r;r.raw_variables={variable(0,0,1,B),variable(1,0,1,B),variable(2,0,1,B)}; + std::vector args{ref(0,B),ref(1,B)};if(std::string(id)=="bool_and"||std::string(id)=="bool_or")args.push_back(ref(2,B)); + r.raw_constraints={row(id,args)};oracle(r,{{0,1},{0,1},{0,1}},[&](const Point& p){std::string s=id;return s=="bool_eq"?p[0]==p[1]:s=="bool_le"?p[0]<=p[1]:s=="bool_not"?p[0]!=p[1]:s=="bool_and"?((p[0]&&p[1])==p[2]):((p[0]||p[1])==p[2]);}); + } + for(bool conjunction:{false,true})for(int size=0;size<=4;++size)for(bool literal_result:{false,true}){ + F::Records r;r.raw_variables={variable(0,0,1,B),variable(1,0,1,B)};std::vector args; + for(int i=0;i a(n,ref(0,B)),b(k,ref(1,B));r.raw_constraints={row("bool_clause",{array(a),array(b)})};oracle(r,{{0,1},{0,1}},[&](const Point& p){return(n&&p[0])||(k&&!p[1]);});} + F::Records channel;channel.raw_variables={variable(0,0,1,B),variable(0,-1,2)};channel.raw_constraints={row("bool2int",{ref(0,B),ref(0)})}; + oracle(channel,{{0,1},{-1,2}},[](const Point& p){return p[0]==p[1];}); + channel.raw_constraints={row("bool_lin_eq",{array({integer(2),integer(-1)}),array({ref(0,B),boolean(true)}),ref(0)})}; + oracle(channel,{{0,1},{-1,2}},[](const Point& p){return 2*p[0]-1==p[1];}); +} +void aliases_domains(){ + F::Records r;r.raw_variables={variable(0,-2,3),variable(1,-9,9),variable(2,-9,9)}; + r.raw_variables[1].alias=true;r.raw_variables[1].target={F::Type::Integer,0};r.raw_variables[2].alias=true;r.raw_variables[2].target={F::Type::Integer,1}; + r.raw_domains={row("int_in",{ref(1),domain(0,2)})}; + // Normalized audit data must never replace a raw relation. + r.constraints={row("unsupported_audit_only",{})}; + r.raw_constraints={row("int_le",{ref(2),integer(1)})}; + oracle(r,{{-2,3},{-2,3},{-2,3}},[](const Point& p){return p[0]==p[1]&&p[1]==p[2]&&p[0]>=0&&p[0]<=1;}); + r.raw_domains.push_back(row("int_in",{ref(2),domain(3,4)}));oracle(r,{{-2,3},{-2,3},{-2,3}},[](const Point&){return false;}); + F::Records empty;empty.raw_variables={variable(0,1,0)};oracle(empty,{{-1,1}},[](const Point&){return false;}); + empty.raw_variables[0].domain.integers=domain(0,1).set;empty.raw_variables[0].assigned=true;empty.raw_variables[0].value=integer(1); + oracle(empty,{{-1,2}},[](const Point& p){return p[0]==1;}); + empty.raw_variables[0].assigned=false;empty.raw_variables[0].domain.present=false;empty.raw_domains={row("int_in",{ref(0),domain(-1,1)})}; + oracle(empty,{{-2,2}},[](const Point& p){return p[0]>=-1&&p[0]<=1;}); + auto set=domain(0,0);set.set.interval=false;set.set.values={2,0,1,1};empty.raw_domains={row("int_in",{ref(0),set})}; + oracle(empty,{{-1,3}},[](const Point& p){return p[0]>=0&&p[0]<=2;}); + set.set.values={0,2};empty.raw_domains={row("int_in",{ref(0),set})};oracle(empty,{{-1,3}},[](const Point& p){return p[0]==0||p[0]==2;}); +} +void failures(){ + F::Records r;r.raw_variables={variable(0,0,2)}; + for(const auto& id:{"unknown_plugin","int_eq_reif","int_lin_eq_reif","int_times","regular","gecode_int_le","array_bool_element"}){r.raw_constraints={row(id,{})};rejected(r);} + r.raw_constraints={row("cumulatives",{})};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_constraints={row("int_eq",{})};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_constraints={row("int_eq",{ref(3),integer(0)})};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_constraints={row("int_eq",{boolean(false),integer(0)})};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_constraints.clear();r.raw_variables[0].alias=true;r.raw_variables[0].target={F::Type::Integer,0};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_variables={variable(0,0,1),variable(0,0,1)};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_variables={variable(0,0,1,F::Type::Float)};rejected(r); + r.raw_variables={variable(0,0,1)};r.solve.annotations={call("int_search",{})};rejected(r); + r.solve.annotations.clear();r.raw_constraints={row("int_le",{ref(0),integer(0)})};r.raw_constraints[0].annotations={atom("unknown_annotation")};rejected(r); + for(const auto& name:{"ctx_pos","ctx_neg","ctx_mix"}) { + r.raw_constraints[0].annotations={atom(name)}; + oracle(r,{{0,1}},[](const Point& p){return p[0]<=0;}); + for(const auto& args:{std::vector{},std::vector{integer(0)}}) { + r.raw_constraints[0].annotations={call(name,args)};rejected(r,O::FlatZincCompileStatus::InvalidInput); + } + auto malformed=atom(name);malformed.elements={integer(0)}; + r.raw_constraints[0].annotations={malformed};rejected(r,O::FlatZincCompileStatus::InvalidInput); + } + r.raw_constraints[0].annotations={atom("bounds")};assert(O::compile_flatzinc(r).compiled); + r.raw_constraints[0].annotations={call("defines_var",{ref(99)})};rejected(r,O::FlatZincCompileStatus::InvalidInput); + r.raw_constraints[0].annotations={atom("bounds")}; + r.declaration_annotations={{"missing",{atom("output_var")},{}}};rejected(r,O::FlatZincCompileStatus::InvalidInput);r.declaration_annotations.clear(); + for(int mode=0;mode<5;++mode){O::FlatZincCompileOptions opts; + if(mode==0)opts.max_work=0;if(mode==1)opts.max_variables=0;if(mode==2)opts.max_constraints=0;if(mode==3)opts.max_nonzeros=0;if(mode==4)opts.max_value_depth=0; + if(mode==4)r.raw_constraints[0].arguments[0]=array({ref(0)}); + auto result=O::compile_flatzinc(r,opts);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled); + } + r.raw_constraints.clear();O::FlatZincCompileOptions opts;opts.time_limit_seconds=0;assert(O::compile_flatzinc(r,opts).status==O::FlatZincCompileStatus::TimeLimit); + opts.time_limit_seconds=10;opts.cancellation=std::make_shared();opts.cancellation->cancel();assert(O::compile_flatzinc(r,opts).status==O::FlatZincCompileStatus::Cancelled); +} +void history_output(){ + F::Records r;r.raw_variables={variable(0,-2,3),variable(0,0,1,F::Type::Boolean)}; + r.output={{"x",ref(0)},{"b",ref(0,F::Type::Boolean)},{"a",array({ref(0),ref(0),integer(7),integer(-3)})}}; + r.declaration_annotations={{"a",{call("output_array",{array({domain(-1,0),domain(2,3)})})},{}}}; + for(auto method:{F::Method::Minimize,F::Method::Maximize})for(bool constant:{false,true}) { + r.solve.method=method;r.solve.has_objective=true;r.solve.objective=constant?integer(7):ref(0); + auto c=compiled(r);auto result=witness(c,{2,1},constant?7:2);auto checked=O::validate_flatzinc(c,result);assert(checked.valid&&checked.original_objective==(constant?7:2)); + assert(O::format_flatzinc_solution(c,result)=="x = 2;\nb = true;\na = array2d(-1..0, 2..3, [2, 2, 7, -3]);\n----------\n"); + result.revision++;assert(!O::validate_flatzinc(c,result).valid);result.revision--; + result.objective=99;assert(!O::validate_flatzinc(c,result).valid);result.objective=constant?7:2; + result.values[0]=2.0000001;assert(O::validate_flatzinc(c,result).valid);result.values[0]=2.1;assert(!O::validate_flatzinc(c,result).valid); + result.values[0]=2;result.active_variables[0]=false;assert(!O::validate_flatzinc(c,result).valid); + bool threw=false;try{O::format_flatzinc_solution(c,result);}catch(const O::ModelError&){threw=true;}assert(threw); + } + auto c=compiled(r);r.raw_variables.clear();r.output.clear();assert(c.source().raw_variables.size()==2&&c.source().output.size()==3); + F::Records empty;auto e=compiled(empty);assert(O::format_flatzinc_solution(e,witness(e,{}))=="----------\n"); +} +void actual_backends(){ + F::Records r;r.raw_variables={variable(0,-2,4),variable(1,-2,4)};r.raw_constraints={row("int_lin_le",{array({integer(-2),integer(-1)}),array({ref(0),ref(1)}),integer(-5)})}; + r.solve.method=F::Method::Minimize;r.solve.has_objective=true;r.solve.objective=ref(0);auto c=compiled(r); + for(auto backend:{O::Backend::Highs,O::Backend::Native})if(O::capabilities(backend).available){O::SolveOptions opts;opts.backend=backend;opts.relative_gap=0;opts.absolute_gap=0;opts.guarantee=backend==O::Backend::Native?O::Guarantee::Exact:O::Guarantee::Numerical;auto solved=O::solve(c.model(),opts);assert(solved.termination==O::Termination::Optimal&&solved.objective==1&&O::validate_flatzinc(c,solved).valid);} +} +void guarded(){ + const auto B=F::Type::Boolean; + for(const auto& id:{"int_le_reif","int_le_imp","int_eq_imp"})for(int guard=0;guard<4;++guard)for(int operands=0;operands<4;++operands){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2),variable(0,0,1,B)}; + if(guard==3){r.raw_variables[2].assigned=true;r.raw_variables[2].value=boolean(false);} + r.raw_constraints={row(id,{operands&1?integer(-1):ref(0),operands&2?integer(1):ref(1),guard==1?boolean(false):guard==2?boolean(true):ref(0,B)})}; + oracle(r,{{-2,2},{-2,2},{0,1}},[&](const Point& p){const auto a=operands&1?-1:p[0],b=operands&2?1:p[1];const bool g=guard==1?false:guard==2?true:p[2]; + const bool condition=std::string(id)=="int_eq_imp"?a==b:a<=b; + return(guard!=3||p[2]==0)&&(std::string(id)=="int_le_reif"?condition==g:!g||condition);}); + } + for(bool equivalence:{false,true})for(int a=-3;a<=3;++a)for(int b=-3;b<=3;++b)for(int guard=0;guard<3;++guard){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2),variable(0,0,1,B)}; + r.raw_constraints={row(equivalence?"int_lin_le_reif":"int_lin_le_imp",{array({integer(a),integer(b),integer(-1)}),array({ref(0),ref(1),ref(0)}),integer(1),guard==1?boolean(false):guard==2?boolean(true):ref(0,B)})}; + oracle(r,{{-2,2},{-2,2},{0,1}},[&](const Point& p){const bool g=guard==1?false:guard==2?true:p[2],condition=(a-1)*p[0]+b*p[1]<=1;return equivalence?condition==g:!g||condition;}); + } + for(I rhs=-1;rhs<=1;++rhs){F::Records r;r.raw_variables={variable(0,0,1,B)};r.raw_constraints={row("int_lin_le_reif",{array({}),array({}),integer(rhs),ref(0,B)})};oracle(r,{{0,1}},[&](const Point& p){return(0<=rhs)==bool(p[0]);});} + F::Records literals;literals.raw_variables={variable(0,-2,2),variable(0,0,1,B)}; + literals.raw_constraints={row("int_lin_le_reif",{array({integer(-2),integer(3)}),array({ref(0),integer(-1)}),integer(-2),ref(0,B)})}; + oracle(literals,{{-2,2},{0,1}},[](const Point& p){return(-2*p[0]-3<=-2)==bool(p[1]);}); + O::FlatZincCompileOptions no_helpers;no_helpers.max_variables=2; + assert(O::compile_flatzinc(literals,no_helpers).status==O::FlatZincCompileStatus::ResourceLimit); + F::Records alias;alias.raw_variables={variable(0,-1,1),variable(1,-1,1),variable(0,0,1,B),variable(1,0,1,B)}; + alias.raw_variables[1].alias=true;alias.raw_variables[1].target={F::Type::Integer,0};alias.raw_variables[3].alias=true;alias.raw_variables[3].target={B,0}; + alias.raw_constraints={row("int_le_reif",{ref(0),ref(1),ref(1,B)})}; + oracle(alias,{{-1,1},{-1,1},{0,1},{0,1}},[](const Point& p){return p[0]==p[1]&&p[2]==1&&p[3]==1;}); + auto c=compiled(alias);auto proof=witness(c,{0,0,1,1}); + std::set visible;for(const auto& m:c.variables())visible.insert(m.variable.id); + for(std::size_t i=0;i values=variant==0?std::vector{}:variant==1?std::vector{ref(0)}:variant==2?std::vector{ref(0),ref(0)}:variant==3?std::vector{ref(0),ref(1),integer(1)}:std::vector{integer(1),integer(1)}; + r.raw_constraints={row("all_different_int",{array(values)})}; + oracle(r,{{-1,2},{-1,2}},[&](const Point& p){return variant<2?true:variant==2||variant==4?false:p[0]!=p[1]&&p[0]!=1&&p[1]!=1;}); + } + for(const auto& id:{"array_int_element","array_var_int_element"})for(int variant=0;variant<5;++variant){ + if(std::string(id)=="array_int_element"&&variant>=2)continue; + F::Records r;r.raw_variables={variable(0,0,3),variable(1,-1,2),variable(2,-1,2),variable(3,-1,2)}; + const std::vector elements=variant==0?std::vector{}:variant==1?std::vector{integer(-1),integer(2)}:variant==2?std::vector{ref(2),ref(2)}:std::vector{ref(2),integer(1),ref(3)}; + r.raw_constraints={row(id,{variant==4?integer(2):ref(0),array(elements),variant==3?ref(0):ref(1)})}; + oracle(r,{{0,3},{-1,2},{-1,2},{-1,2}},[&](const Point& p){const I index=variant==4?2:p[0],result=variant==3?p[0]:p[1]; + if(index<1||static_cast(index)>elements.size())return false; + const I selected=variant==1?(index==1?-1:2):variant==2?p[2]:index==1?p[2]:index==2?1:p[3];return selected==result;}); + } + F::Records aliases;aliases.raw_variables={variable(0,-1,2),variable(1,-1,2)};aliases.raw_variables[1].alias=true;aliases.raw_variables[1].target={F::Type::Integer,0}; + aliases.raw_constraints={row("all_different_int",{array({ref(0),ref(1)})})};oracle(aliases,{{-1,2},{-1,2}},[](const Point&){return false;}); + aliases.raw_constraints={row("array_int_element",{integer(1),array({ref(0)}),ref(1)})};rejected(aliases,O::FlatZincCompileStatus::InvalidInput); + F::Records limits;limits.raw_variables={variable(0,0,2)};limits.raw_constraints={row("all_different_int",{array({ref(0),integer(1)})})}; + O::FlatZincCompileOptions cap;cap.max_variables=1;assert(O::compile_flatzinc(limits,cap).status==O::FlatZincCompileStatus::ResourceLimit); + cap={};cap.max_nonzeros=1;assert(O::compile_flatzinc(limits,cap).status==O::FlatZincCompileStatus::ResourceLimit); + auto c=compiled(limits); + if(O::capabilities(O::Backend::Highs).available){O::SolveOptions opt;opt.backend=O::Backend::Highs;auto r=O::solve(c.model(),opt);assert(r.termination==O::Termination::Unsupported&&!r.has_solution());} + if(O::capabilities(O::Backend::Native).available){O::SolveOptions opt;opt.backend=O::Backend::Native;opt.guarantee=O::Guarantee::Exact;auto r=O::solve(c.model(),opt);assert(r.termination==O::Termination::Optimal&&O::validate_flatzinc(c,r,0).valid);} + F::Records combined;combined.raw_variables={variable(0,1,3),variable(1,1,3),variable(0,0,1,F::Type::Boolean)}; + combined.raw_constraints={row("all_different_int",{array({ref(0),ref(1)})}),row("array_var_int_element",{integer(1),array({ref(0),integer(3)}),ref(1)}),row("int_le_reif",{ref(0),ref(1),ref(0,F::Type::Boolean)})}; + oracle(combined,{{1,3},{1,3},{0,1}},[](const Point&){return false;}); + if(O::capabilities(O::Backend::Native).available){ + O::SolveOptions opt;opt.backend=O::Backend::Native;opt.guarantee=O::Guarantee::Exact; + auto impossible=compiled(combined);assert(O::solve(impossible.model(),opt).termination==O::Termination::Infeasible); + combined.raw_constraints[1]=row("array_var_int_element",{integer(2),array({ref(0),ref(1)}),ref(1)}); + auto possible=compiled(combined);auto r=O::solve(possible.model(),opt); + assert(r.termination==O::Termination::Optimal&&O::validate_flatzinc(possible,r,0).valid); + } +} + +void holey_domains(){ + // Every pair of subsets of a signed five-point universe: intersection is + // checked through bit membership, independently of normalization/lowering. + for(unsigned first=0;first<32;++first)for(unsigned second=0;second<32;++second){ + F::Records r;r.raw_variables={variable(7,-2,2)};std::vector a,b; + for(int bit=4;bit>=0;--bit){if(first&(1u<{2,1}:std::vector{-2,0})})}; + oracle(r,{},[&](const Point&){return allowed;}); + } + F::Records empty;empty.raw_variables={variable(0,0,1)};empty.raw_variables[0].domain.present=false; + empty.raw_domains={row("int_in",{ref(0),members({})})};oracle(empty,{{-1,1}},[](const Point&){return false;}); + empty.raw_variables[0].domain.integers=members({0,2,3,4,6}).set;empty.raw_variables[0].domain.present=true; + empty.raw_domains={row("int_in",{ref(0),domain(2,4)})}; + auto contiguous=compiled(empty);assert(contiguous.model().globals.empty()); + oracle(empty,{{0,6}},[](const Point& p){return p[0]>=2&&p[0]<=4;}); + empty.raw_domains={row("int_in",{ref(0),members({3})})};assert(compiled(empty).model().globals.empty()); + // Sparse gaps stay symbolic even at the limits of exact model representation. + const I large=9007199254740992LL; + F::Records sparse;sparse.raw_variables={variable(8,-large,large)}; + sparse.raw_variables[0].domain.integers=members({large,-large,large}).set; + auto c=compiled(sparse);assert(c.model().variables.size()==1&&c.model().globals.size()==1); + assert(c.model().variables[0].lower==-large&&c.model().variables[0].upper==large); + assert(mapped(c,{-large})&&mapped(c,{large})&&!mapped(c,{0})); + auto historical=witness(c,{large});assert(O::validate_flatzinc(c,historical,0).valid); + sparse.raw_variables.clear();assert(O::validate_flatzinc(c,historical,0).valid); + historical.values[0]=0;assert(!O::validate_flatzinc(c,historical,0).valid); + historical.values[0]=large;historical.active_variables[0]=false;assert(!O::validate_flatzinc(c,historical,0).valid); + empty.raw_domains={row("int_in",{ref(0),members({large+1})})};rejected(empty); + // A contradictory earlier domain must not hide an inadmissible later value. + empty.raw_variables[0].domain.integers=members({}).set;rejected(empty); + F::Records boolean_domain;boolean_domain.raw_variables={variable(0,0,1,F::Type::Boolean)}; + boolean_domain.raw_domains={row("int_in",{ref(0,F::Type::Boolean),members({3,1,-1})})}; + oracle(boolean_domain,{{0,1}},[](const Point& p){return p[0]==1;}); +} +void tables(){ + // All relations of arities one through three on {0,1}; order and duplicate + // rows are deliberately perturbed. The oracle interprets a relation bitset. + for(unsigned arity=1;arity<=3;++arity)for(unsigned relation=0;relation<(1u<<(1u< arguments,flat; + for(unsigned j=0;j=0;--tuple)if(relation&(1u<>j)&1u)); + r.raw_constraints={row("gecode_table_int",{array(arguments),array(flat)})}; + oracle(r,std::vector>(arity,{0,1}),[&](const Point& p){unsigned index=0;for(unsigned j=0;j{integer(-2),integer(allowed?-2:1)}:std::vector{})})}; + oracle(fixed,{},[&](const Point&){return nonempty&&allowed;}); + } + F::Records malformed;malformed.raw_variables={variable(0,0,1)}; + const auto reject=[&](std::vector args,O::FlatZincCompileStatus status=O::FlatZincCompileStatus::InvalidInput){malformed.raw_constraints={row("gecode_table_int",std::move(args))};rejected(malformed,status);}; + reject({});reject({array({ref(0)})});reject({ref(0),array({})}); + reject({array({ref(0),ref(0)}),array({integer(0)})}); + reject({array({ref(0)}),array({ref(0)})});reject({array({ref(0)}),array({boolean(true)})}); + reject({array({boolean(true)}),array({integer(1)})});reject({array({ref(9)}),array({integer(0)})}); + reject({array({}),array({})},O::FlatZincCompileStatus::Unsupported);reject({array({}),array({integer(0)})}); + reject({array({ref(0)}),array({integer(9007199254740993LL)})},O::FlatZincCompileStatus::Unsupported); + for(const auto& id:{"table_int","fzn_table_int","gecode_gecode_table_int","gecode_table_bool"}){malformed.raw_constraints={row(id,{array({ref(0)}),array({integer(0)})})};rejected(malformed);} +} +void table_domain_limits(){ + F::Records r;r.raw_variables={variable(0,-2,2)};r.raw_variables[0].domain.integers=members({2,-2,0,2}).set; + r.raw_constraints={row("gecode_table_int",{array({ref(0),integer(0)}),array({integer(-2),integer(0),integer(2),integer(0)})})}; + auto full=O::compile_flatzinc(r);assert(full.compiled&&full.work>0); + for(const auto cap:{std::size_t(0),std::size_t(1),full.work/2,full.work-1}){ + O::FlatZincCompileOptions options;options.max_work=cap;auto result=O::compile_flatzinc(r,options); + assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled&&result.work<=cap); + } + O::FlatZincCompileOptions options;options.max_work=full.work;assert(O::compile_flatzinc(r,options).compiled); + for(int mode=0;mode<3;++mode){options={};if(mode==0)options.max_variables=1;if(mode==1)options.max_constraints=1;if(mode==2)options.max_nonzeros=9; + auto result=O::compile_flatzinc(r,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled); + } + // Unary domain: one operand plus three distinct values; binary table: two + // operands plus four cells. Both footprint limits are reserved before posting. + options={};options.max_variables=2;options.max_constraints=2;options.max_nonzeros=10;assert(O::compile_flatzinc(r,options).compiled); + F::Records duplicates;duplicates.raw_variables={variable(0,0,1)};duplicates.raw_variables[0].domain.integers=members({0,0,0,0}).set; + options={};options.max_nonzeros=3;auto result=O::compile_flatzinc(duplicates,options); + assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled); + options={};options.time_limit_seconds=0;assert(O::compile_flatzinc(r,options).status==O::FlatZincCompileStatus::TimeLimit); + options={};options.cancellation=std::make_shared();options.cancellation->cancel();assert(O::compile_flatzinc(r,options).status==O::FlatZincCompileStatus::Cancelled); +} +void table_domain_backends(){ + F::Records r;r.raw_variables={variable(0,-3,3),variable(1,-3,3),variable(0,0,1,F::Type::Boolean)}; + r.raw_variables[0].domain.integers=members({3,-3,1}).set; + r.raw_constraints={row("gecode_table_int",{array({ref(0),ref(1)}),array({integer(-3),integer(2),integer(1),integer(-2),integer(3),integer(1)})}), + row("all_different_int",{array({ref(0),ref(1)})}), + row("array_var_int_element",{integer(1),array({ref(0),ref(1)}),ref(0)}), + row("int_le_reif",{ref(0),ref(1),ref(0,F::Type::Boolean)})}; + oracle(r,{{-3,3},{-3,3},{0,1}},[](const Point& p){return ((p[0]==-3&&p[1]==2)||(p[0]==1&&p[1]==-2)||(p[0]==3&&p[1]==1))&&bool(p[2])==(p[0]<=p[1]);}); + for(auto method:{F::Method::Minimize,F::Method::Maximize}){ + r.solve.method=method;r.solve.has_objective=true;r.solve.objective=ref(0);auto c=compiled(r); + O::SolveOptions options;options.backend=O::Backend::Highs; + auto unsupported=O::solve(c.model(),options);assert(unsupported.termination==O::Termination::Unsupported&&!unsupported.has_solution()); + for(auto backend:{O::Backend::Native,O::Backend::Auto}){options.backend=backend;options.guarantee=O::Guarantee::Exact; + auto solved=O::solve(c.model(),options); + if(O::capabilities(O::Backend::Native).available)assert(solved.termination==O::Termination::Optimal&&solved.objective==(method==F::Method::Minimize?-3:3)&&O::validate_flatzinc(c,solved,0).valid); + else assert(solved.termination==O::Termination::Unsupported&&!solved.has_solution()); + } + } + // Eliminating all holes restores the linear backend path without weakening + // the original list: only the exact interval intersection remains feasible. + F::Records contiguous;contiguous.raw_variables={variable(0,0,6)}; + contiguous.raw_variables[0].domain.integers=members({0,2,3,4,6}).set; + contiguous.raw_domains={row("int_in",{ref(0),domain(2,4)})}; + contiguous.solve.method=F::Method::Minimize;contiguous.solve.has_objective=true;contiguous.solve.objective=ref(0); + auto linear=compiled(contiguous);assert(linear.model().globals.empty()); + O::SolveOptions linear_options;linear_options.backend=O::Backend::Highs; + auto linear_result=O::solve(linear.model(),linear_options); + if(O::capabilities(O::Backend::Highs).available)assert(linear_result.termination==O::Termination::Optimal&&linear_result.objective==2&&O::validate_flatzinc(linear,linear_result,0).valid); + else assert(linear_result.termination==O::Termination::Unsupported&&!linear_result.has_solution()); + F::Records large;large.raw_variables={variable(0,-9007199254740992LL,9007199254740992LL)}; + large.raw_variables[0].domain.integers=members({-9007199254740992LL,9007199254740992LL}).set; + auto wide=compiled(large);O::SolveOptions native;native.backend=O::Backend::Native;native.guarantee=O::Guarantee::Exact; + auto native_result=O::solve(wide.model(),native);assert(native_result.termination==O::Termination::Unsupported&&!native_result.has_solution()); + F::Records empty;empty.raw_variables={variable(0,0,1)};empty.raw_constraints={row("gecode_table_int",{array({ref(0)}),array({})})}; + auto c=compiled(empty);O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + const auto result=O::solve(c.model(),options);assert(result.termination==(O::capabilities(O::Backend::Native).available?O::Termination::Infeasible:O::Termination::Unsupported)); +} + +// Independent circuit oracle: generate Hamiltonian cycles from permutations of +// nodes 1..n-1, rather than reusing either checker's successor-walk algorithm. +std::set circuit_points(std::size_t size,I offset){ + assert(size>0);std::vector order; + for(std::size_t i=1;i points; + do{Point successor(size);std::size_t previous=0; + for(auto next:order){successor[previous]=offset+static_cast(next);previous=next;} + successor[previous]=offset;points.insert(std::move(successor)); + }while(std::next_permutation(order.begin(),order.end())); + return points; +} +void circuits(){ + for(I offset:{I(0),I(1),I(3)})for(std::size_t size=1;size<=5;++size){ + F::Records r;std::vector arguments; + for(std::size_t i=0;i(size)));arguments.push_back(ref(i));} + r.raw_constraints={row("gecode_circuit",{integer(offset),array(arguments)})}; + const auto allowed=circuit_points(size,offset); + oracle(r,std::vector>(size,{offset-1,offset+static_cast(size)}),[&](const Point& p){return allowed.count(p)!=0;}); + const auto artifact=compiled(r);const auto& data=std::get(artifact.model().globals.at(0).payload); + assert(data.index_base==offset&&data.successors.size()==size); + for(std::size_t i=0;i arguments{ref(0),variant==1?ref(0):ref(1),variant==0?ref(2):integer(3)}; + r.raw_constraints={row("gecode_circuit",{integer(3),array(arguments)})};const auto allowed=circuit_points(3,3); + oracle(r,{{2,5},{2,5},{2,5}},[&](const Point& p){ + return(variant!=2||p[0]==p[1])&&allowed.count({p[0],variant==1?p[0]:p[1],variant==0?p[2]:3}); + }); + } + for(const auto& tuple:std::vector{{3},{2},{4,3},{4,5,3},{4,3,5},{3,4,5}}){ + F::Records r;std::vector args;for(auto value:tuple)args.push_back(integer(value)); + r.raw_constraints={row("gecode_circuit",{integer(3),array(args)})};const auto allowed=circuit_points(tuple.size(),3); + oracle(r,{},[&](const Point&){return allowed.count(tuple)!=0;}); + } + // Owning source, hidden constant slots and output positions remain intact. + F::Records r;r.raw_variables={variable(0,3,5),variable(1,3,5)}; + r.raw_constraints={row("gecode_circuit",{integer(3),array({ref(0),ref(1),integer(3)})})};r.output={{"first",ref(0)}}; + auto saved=compiled(r);auto proof=witness(saved,{4,5});assert(proof.values.size()==3&&saved.variables().size()==2); + r.raw_variables.clear();r.raw_constraints.clear();r.output.clear(); + assert(O::validate_flatzinc(saved,proof,0).valid&&O::format_flatzinc_solution(saved,proof,0)=="first = 4;\n----------\n"); + proof.values[0]=3;assert(!O::validate_flatzinc(saved,proof,0).valid); + proof=witness(saved,{4,5});proof.values.back()=4;assert(!O::validate_flatzinc(saved,proof,0).valid); +} +void circuit_boundaries(){ + F::Records r;r.raw_variables={variable(0,0,1),variable(0,0,1,F::Type::Boolean)}; + const auto reject=[&](std::vector args,O::FlatZincCompileStatus status=O::FlatZincCompileStatus::InvalidInput){r.raw_constraints={row("gecode_circuit",std::move(args))};rejected(r,status);}; + reject({});reject({integer(0)});reject({integer(0),array({ref(0)}),integer(0)}); + reject({array({ref(0)}),integer(0)});reject({ref(0),array({ref(0)})}); + reject({boolean(false),array({ref(0)})});reject({integer(0),ref(0)});reject({integer(0),array({})}); + reject({integer(0),array({boolean(true)})});reject({integer(0),array({ref(0,F::Type::Boolean)})}); + reject({integer(0),array({ref(7)})});reject({integer(0),array({array({integer(0)})})}); + reject({integer(-1),array({integer(-1)})},O::FlatZincCompileStatus::Unsupported); + constexpr I large=9007199254740992LL; + reject({integer(large+1),array({integer(0)})},O::FlatZincCompileStatus::Unsupported); + reject({integer(large),array({integer(0),integer(0)})},O::FlatZincCompileStatus::Unsupported); + reject({integer(0),array({integer(large+1)})},O::FlatZincCompileStatus::Unsupported); + for(const auto& id:{"circuit","fzn_circuit","fzn_gecode_circuit","gecode_gecode_circuit","gecode_subcircuit","gecode_circuit_cost","gecode_circuit_reif"}){ + r.raw_constraints={row(id,{integer(0),array({ref(0)})})};rejected(r); + } + // Exact frontend range and native implementation range are separate gates. + for(const auto& tuple:std::vector>{{large,{large}},{large-1,{large,large-1}}}){ + F::Records wide;std::vector args;for(auto v:tuple.second)args.push_back(integer(v)); + wide.raw_constraints={row("gecode_circuit",{integer(tuple.first),array(args)})}; + oracle(wide,{},[](const Point&){return true;});auto c=compiled(wide); + O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + assert(O::solve(c.model(),options).termination==O::Termination::Unsupported); + } + F::Records bounded;bounded.raw_variables={variable(0,0,1)}; + bounded.raw_constraints={row("gecode_circuit",{integer(0),array({ref(0),integer(0)})})}; + const auto full=O::compile_flatzinc(bounded);assert(full.compiled&&full.work>0); + for(std::size_t cap:{std::size_t(0),full.work/2,full.work-1}){ + O::FlatZincCompileOptions options;options.max_work=cap;auto result=O::compile_flatzinc(bounded,options); + assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled&&result.work<=cap); + } + O::FlatZincCompileOptions options;options.max_work=full.work;assert(O::compile_flatzinc(bounded,options).compiled); + for(int mode=0;mode<3;++mode){options={};if(mode==0)options.max_variables=1;if(mode==1)options.max_constraints=0;if(mode==2)options.max_nonzeros=1; + auto result=O::compile_flatzinc(bounded,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled); + } + options={};options.max_variables=2;options.max_constraints=1;options.max_nonzeros=2;assert(O::compile_flatzinc(bounded,options).compiled); + options={};options.time_limit_seconds=0;auto stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::TimeLimit&&!stopped.compiled); + options={};options.cancellation=std::make_shared();options.cancellation->cancel();stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::Cancelled&&!stopped.compiled); + // An earlier contradiction does not excuse an unsupported later signature. + bounded.raw_variables[0].domain.integers=domain(1,0).set;bounded.raw_constraints[0].arguments[0]=integer(-1);rejected(bounded); +} +void circuit_combined(){ + F::Records r;r.raw_variables={variable(0,3,5),variable(1,3,5),variable(2,3,5),variable(0,0,1,F::Type::Boolean),variable(9,-4,-2)}; + r.raw_variables[1].domain.integers=members({5,3,5}).set; + r.raw_constraints={row("gecode_circuit",{integer(3),array({ref(0),ref(1),ref(2)})}), + row("gecode_table_int",{array({ref(0),ref(1),ref(2)}),array({integer(4),integer(5),integer(3),integer(5),integer(3),integer(4)})}), + row("all_different_int",{array({ref(0),ref(1),ref(2)})}), + row("array_var_int_element",{integer(1),array({ref(0),ref(1)}),ref(0)}), + row("int_le_reif",{ref(0),ref(1),ref(0,F::Type::Boolean)}), + row("int_plus",{ref(9),integer(7),ref(0)})}; + const auto allowed=circuit_points(3,3); + oracle(r,{{3,5},{3,5},{3,5},{0,1},{-4,-2}},[&](const Point& p){return allowed.count({p[0],p[1],p[2]})&&bool(p[3])==(p[0]<=p[1])&&p[4]+7==p[0];}); + for(auto method:{F::Method::Minimize,F::Method::Maximize}){ + r.solve.method=method;r.solve.has_objective=true;r.solve.objective=ref(9);auto c=compiled(r); + for(auto backend:{O::Backend::Native,O::Backend::Auto,O::Backend::Highs}){ + O::SolveOptions options;options.backend=backend;options.guarantee=backend==O::Backend::Highs?O::Guarantee::Numerical:O::Guarantee::Exact; + auto result=O::solve(c.model(),options); + if(backend!=O::Backend::Highs&&O::capabilities(O::Backend::Native).available) + assert(result.termination==O::Termination::Optimal&&result.objective==(method==F::Method::Minimize?-3:-2)&&O::validate_flatzinc(c,result,0).valid); + else assert(result.termination==O::Termination::Unsupported&&!result.has_solution()); + } + } +} + +// The tiny cumulative oracle samples every integer time in a bounded horizon. +// Integer endpoints make this exhaustive for half-open continuous-time usage, +// independently of both production event-sweep implementations. +bool cumulative_point(const Point& starts,const Point& durations,const Point& heights,I bound){ + assert(starts.size()==durations.size()&&starts.size()==heights.size()&&bound>=0); + I first=0,last=0; + for(std::size_t i=0;i=0&&heights[i]>=0);first=std::min(first,starts[i]);last=std::max(last,starts[i]+durations[i]);} + assert(last-first<100); + for(I time=first;timebound)return false; + } + return true; +} +void cumulatives(){ + for(const auto& id:{"gecode_cumulatives","cumulatives"})for(std::size_t size=0;size<=4;++size){ + std::size_t patterns=size==0?1:size==1?9:size==2?81:18; + for(std::size_t pattern=0;pattern starts,duration_values,height_values;Point durations,heights;auto code=pattern; + for(std::size_t i=0;i>(size,{-2,2}),[&](const Point& p){return cumulative_point(p,durations,heights,bound);}); + } + } + // Repeated/aliased starts remain separate demands; literals get fixed slots. + for(int variant=0;variant<4;++variant){F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2)}; + if(variant==1){r.raw_variables[1].alias=true;r.raw_variables[1].target={F::Type::Integer,0};} + r.raw_constraints={row("gecode_cumulatives",{array({ref(0),variant==0?ref(0):variant==2?integer(0):ref(1)}),array({integer(2),integer(1)}),array({integer(2),integer(1)}),integer(2)})}; + oracle(r,{{-2,2},{-2,2}},[&](const Point& p){return(variant!=1||p[0]==p[1])&&cumulative_point({p[0],variant==0?p[0]:variant==2?0:p[1]},{2,1},{2,1},2);}); + } + // Legacy p_cumulatives has a singleton height<=bound shortcut which rejects + // this zero-duration task. The independent half-open oracle and typed/native + // route must accept it; a positive duration must remain infeasible. + for(I duration:{I(0),I(1)})for(const auto& id:{"gecode_cumulatives","cumulatives"}){ + F::Records r;r.raw_variables={variable(0,-2,2)}; + r.raw_constraints={row(id,{array({ref(0)}),array({integer(duration)}),array({integer(2)}),integer(1)})}; + oracle(r,{{-2,2}},[&](const Point& p){return cumulative_point(p,{duration},{2},1);}); + auto c=compiled(r);O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact;auto result=O::solve(c.model(),options); + if(O::capabilities(O::Backend::Native).available){ + assert(result.termination==(duration?O::Termination::Infeasible:O::Termination::Optimal)); + if(!duration)assert(O::validate_flatzinc(c,result,0).valid); + }else assert(result.termination==O::Termination::Unsupported); + } +} +void cumulative_parameters(){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2),variable(10,0,3),variable(11,0,3),variable(12,0,3),variable(13,0,3)}; + r.raw_variables[2].domain.integers=members({2,0,2}).set; + r.raw_variables[3].assigned=true;r.raw_variables[3].value=integer(1); + r.raw_variables[5].alias=true;r.raw_variables[5].target={F::Type::Integer,12}; + r.raw_domains={row("int_in",{ref(10),domain(1,3)}),row("int_in",{ref(13),members({2,2})})}; + r.raw_constraints={row("gecode_cumulatives",{array({ref(0),ref(1)}),array({ref(10),integer(1)}),array({ref(11),ref(11)}),ref(13)})}; + oracle(r,{{-2,2},{-2,2},{0,3},{0,3},{0,3},{0,3}},[](const Point& p){return p[2]==2&&p[3]==1&&p[4]==2&&p[5]==2&&cumulative_point({p[0],p[1]},{2,1},{1,1},2);}); + auto c=compiled(r);const auto& payload=std::get(c.model().globals.back().payload); + assert(payload.durations==Point({2,1})&&payload.heights==Point({1,1})&&payload.capacity==2); + assert(c.variables().size()==6&&c.model().variables.size()==5); // alias only, no hidden parameter slots + r.output={{"duration",ref(10)},{"height",ref(11)},{"capacity",ref(13)}};auto output=compiled(r);auto historical=witness(output,{-1,0,2,1,2,2}); + r.raw_variables.clear();r.raw_constraints.clear();r.raw_domains.clear();r.output.clear(); + assert(O::validate_flatzinc(output,historical,0).valid&&O::format_flatzinc_solution(output,historical,0)=="duration = 2;\nheight = 1;\ncapacity = 2;\n----------\n"); + historical.values[output.variables()[2].variable.id]=0;assert(!O::validate_flatzinc(output,historical,0).valid); + // No inference from an ordinary equality row, a lower bound, or an empty + // original domain which happened to produce the compiler's dummy zero slot. + for(int parameter=0;parameter<3;++parameter){F::Records source;source.raw_variables={variable(0,-1,1),variable(1,0,2)}; + source.raw_constraints={row("gecode_cumulatives",{array({ref(0)}),array({parameter==0?ref(1):integer(1)}),array({parameter==1?ref(1):integer(1)}),parameter==2?ref(1):integer(1)}),row("int_eq",{ref(1),integer(1)})}; + rejected(source);source.raw_variables[1].domain.integers=members({}).set;rejected(source); + } +} +void cumulative_boundaries(){ + F::Records r;r.raw_variables={variable(0,-1,1),variable(1,0,1,F::Type::Boolean)}; + const auto valid=std::vector{array({ref(0)}),array({integer(1)}),array({integer(1)}),integer(1)}; + const auto reject=[&](std::vector args,O::FlatZincCompileStatus status=O::FlatZincCompileStatus::InvalidInput){r.raw_constraints={row("gecode_cumulatives",std::move(args))};rejected(r,status);}; + reject({});reject({array({}),array({}),array({})}); + auto changed=valid;changed.push_back(boolean(true));reject(changed); + changed.push_back(integer(0));reject(changed,O::FlatZincCompileStatus::Unsupported); + changed.push_back(integer(0));reject(changed,O::FlatZincCompileStatus::Unsupported); + changed.push_back(integer(0));reject(changed); + for(int index=0;index<4;++index){changed=valid;changed[index]=index==3?boolean(true):integer(0);reject(changed);} + for(int index=0;index<3;++index){changed=valid;changed[index]=array({});reject(changed);} + for(int index=0;index<3;++index){changed=valid;changed[index]=array({boolean(true)});reject(changed); + changed[index]=array({ref(1,F::Type::Boolean)});reject(changed);changed[index]=array({ref(9)});reject(changed);} + for(int index:{1,2}){changed=valid;changed[index]=array({integer(-1)});reject(changed);} + changed=valid;changed[3]=integer(-1);reject(changed,O::FlatZincCompileStatus::Unsupported); + constexpr I large=9007199254740992LL; + for(int index=0;index<4;++index){changed=valid;changed[index]=index==3?integer(large+1):array({integer(large+1)});reject(changed,O::FlatZincCompileStatus::Unsupported);} + for(const auto& id:{"fzn_cumulative","fzn_cumulatives","gecode_cumulative","gecode_gecode_cumulatives","gecode_schedule_cumulative_optional"}){r.raw_constraints={row(id,valid)};rejected(r);} + // Both selected names reject multi-machine six-/seven-argument forms rather + // than truncating machine/bound/polarity data to a single resource. + for(const auto& id:{"gecode_cumulatives","cumulatives"})for(int size:{6,7}){r.raw_constraints={row(id,std::vector(size,integer(0)))};rejected(r);} + F::Records wide;wide.raw_constraints={row("gecode_cumulatives",{array({integer(large)}),array({integer(large)}),array({integer(1)}),integer(1)})}; + auto c=compiled(wide);assert(O::validate_flatzinc(c,witness(c,{}),0).valid); + O::SolveOptions native;native.backend=O::Backend::Native;native.guarantee=O::Guarantee::Exact; + assert(O::solve(c.model(),native).termination==O::Termination::Unsupported); + // The existing native energy/activity envelope remains a separate gate. + F::Records energy;energy.raw_variables={variable(0,0,1073741823),variable(1,0,1073741823)}; + energy.raw_constraints={row("gecode_cumulatives",{array({ref(0),ref(1)}),array({integer(1),integer(1)}),array({integer(1073741823),integer(1073741823)}),integer(1073741823)})}; + auto guarded=compiled(energy);assert(O::validate_flatzinc(guarded,witness(guarded,{0,1}),0).valid); + assert(O::solve(guarded.model(),native).termination==O::Termination::Unsupported); + F::Records bounded;bounded.raw_variables={variable(0,-1,1)}; + bounded.raw_constraints={row("gecode_cumulatives",{array({ref(0),integer(0)}),array({integer(1),integer(2)}),array({integer(1),integer(1)}),integer(2)})}; + auto full=O::compile_flatzinc(bounded);assert(full.compiled&&full.work>0); + for(std::size_t cap:{std::size_t(0),full.work/2,full.work-1}){O::FlatZincCompileOptions options;options.max_work=cap;auto result=O::compile_flatzinc(bounded,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled&&result.work<=cap);} + O::FlatZincCompileOptions options;options.max_work=full.work;assert(O::compile_flatzinc(bounded,options).compiled); + for(int mode=0;mode<3;++mode){options={};if(mode==0)options.max_variables=1;if(mode==1)options.max_constraints=0;if(mode==2)options.max_nonzeros=6;auto result=O::compile_flatzinc(bounded,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled);} + options={};options.max_variables=2;options.max_constraints=1;options.max_nonzeros=7;assert(O::compile_flatzinc(bounded,options).compiled); + options={};options.time_limit_seconds=0;auto stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::TimeLimit&&!stopped.compiled); + options={};options.cancellation=std::make_shared();options.cancellation->cancel();stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::Cancelled&&!stopped.compiled); + F::Records empty;empty.raw_constraints={row("cumulatives",{array({}),array({}),array({}),integer(0)})};options={};options.max_nonzeros=0; + assert(O::compile_flatzinc(empty,options).status==O::FlatZincCompileStatus::ResourceLimit);options.max_nonzeros=1;assert(O::compile_flatzinc(empty,options).compiled); +} +void cumulative_combined(){ + F::Records r;r.raw_variables={variable(0,-2,2),variable(1,-2,2),variable(0,0,1,F::Type::Boolean)}; + r.raw_variables[0].domain.integers=members({-2,0,2}).set; + r.raw_constraints={row("gecode_cumulatives",{array({ref(0),ref(1)}),array({integer(2),integer(1)}),array({integer(2),integer(1)}),integer(2)}), + row("all_different_int",{array({ref(0),ref(1)})}),row("array_var_int_element",{integer(2),array({ref(0),ref(1)}),ref(1)}), + row("gecode_table_int",{array({ref(1)}),array({integer(-2),integer(0),integer(2)})}),row("int_le_reif",{ref(0),ref(1),ref(0,F::Type::Boolean)})}; + oracle(r,{{-2,2},{-2,2},{0,1}},[](const Point& p){return p[0]%2==0&&p[1]%2==0&&p[0]!=p[1]&&bool(p[2])==(p[0]<=p[1])&&cumulative_point({p[0],p[1]},{2,1},{2,1},2);}); + for(auto method:{F::Method::Minimize,F::Method::Maximize}){r.solve.method=method;r.solve.has_objective=true;r.solve.objective=ref(0);auto c=compiled(r); + for(auto backend:{O::Backend::Native,O::Backend::Auto,O::Backend::Highs}){O::SolveOptions options;options.backend=backend;options.guarantee=backend==O::Backend::Highs?O::Guarantee::Numerical:O::Guarantee::Exact;auto result=O::solve(c.model(),options); + if(backend!=O::Backend::Highs&&O::capabilities(O::Backend::Native).available)assert(result.termination==O::Termination::Optimal&&result.objective==(method==F::Method::Minimize?-2:2)&&O::validate_flatzinc(c,result,0).valid); + else assert(result.termination==O::Termination::Unsupported&&!result.has_solution()); + } + } +} + +// Generate accepted words by enumerating source-labeled paths, independently +// of the compiler's sparse zero-based graph and the source checker's indexing. +std::set regular_words(I states,I symbols,const Point& transitions,I initial, + const std::set& finals,std::size_t length){ + assert(transitions.size()==static_cast(states*symbols));std::set accepted;Point word; + const auto paths=[&](const auto& self,I state)->void { + if(word.size()==length){if(finals.count(state))accepted.insert(word);return;} + for(I symbol=1;symbol<=symbols;++symbol){I next=0;std::size_t cell=0; + for(I from=1;from<=states;++from)for(I label=1;label<=symbols;++label,++cell) + if(from==state&&label==symbol)next=transitions[cell]; + if(next){word.push_back(symbol);self(self,next);word.pop_back();} + } + };paths(paths,initial);return accepted; +} +void regulars(){ + for(unsigned pattern=0;pattern<81;++pattern)for(I initial=1;initial<=2;++initial)for(unsigned final=0;final<4;++final)for(std::size_t size=0;size<=3;++size){ + F::Records r;std::vector word,flat;Point edges,final_values;std::set finals;auto code=pattern; + for(unsigned i=0;i<4;++i){edges.push_back(code%3);flat.push_back(integer(code%3));code/=3;} + for(I state=1;state<=2;++state)if(final&(1u<<(state-1))){finals.insert(state);final_values.push_back(state);} + for(std::size_t i=0;i>(size,{0,3}),[&](const Point& p){return accepted.count(p)!=0;}); + if(pattern%19==0&&initial==2&&final==2){auto c=compiled(r);O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact;auto result=O::solve(c.model(),options); + if(O::capabilities(O::Backend::Native).available){assert(result.termination==(accepted.empty()?O::Termination::Infeasible:O::Termination::Optimal));if(!accepted.empty())assert(O::validate_flatzinc(c,result,0).valid);} + else assert(result.termination==O::Termination::Unsupported); + } + } + // Every source position survives aliasing and fixed-literal lowering. + for(int mode=0;mode<4;++mode){F::Records r;r.raw_variables={variable(0,0,3),variable(1,0,3)}; + if(mode==1){r.raw_variables[1].alias=true;r.raw_variables[1].target={F::Type::Integer,0};} + r.raw_constraints={row("gecode_regular",{array({ref(0),mode==0?ref(0):mode==2?integer(2):ref(1)}),integer(2),integer(2),array({integer(1),integer(2),integer(2),integer(0)}),integer(1),members({2,2})})}; + const auto accepted=regular_words(2,2,{1,2,2,0},1,{2},2); + oracle(r,{{0,3},{0,3}},[&](const Point& p){return(mode!=1||p[0]==p[1])&&accepted.count({p[0],mode==0?p[0]:mode==2?2:p[1]});}); + } + for(const auto& finals:{members({}),members({2,1,2}),domain(1,2),domain(3,2)})for(std::size_t size:{0u,1u}){ + F::Records r;std::vector word;if(size){r.raw_variables={variable(0,0,3)};word={ref(0)};} + r.raw_constraints={row("gecode_regular",{array(word),integer(2),integer(2),array({integer(0),integer(0),integer(0),integer(0)}),integer(1),finals})}; + const bool initial_final=finals.set.interval?(finals.set.lower<=1&&1<=finals.set.upper):std::find(finals.set.values.begin(),finals.set.values.end(),1)!=finals.set.values.end(); + oracle(r,std::vector>(size,{0,3}),[&](const Point&){return!size&&initial_final;}); + } +} +void regular_boundaries(){ + F::Records r;r.raw_variables={variable(0,1,2),variable(1,1,1),variable(0,0,1,F::Type::Boolean)}; + const std::vector valid={array({ref(0)}),integer(2),integer(2),array({integer(1),integer(2),integer(2),integer(1)}),integer(1),members({2})}; + const auto reject=[&](std::vector args,O::FlatZincCompileStatus status=O::FlatZincCompileStatus::InvalidInput){r.raw_constraints={row("gecode_regular",std::move(args))};rejected(r,status);}; + for(std::size_t n=0;n<=8;++n)if(n!=6)reject(std::vector(n,integer(0))); + for(std::size_t i=0;i<6;++i){auto changed=valid;changed[i]=boolean(true);reject(changed);} + for(std::size_t i:{1u,2u,4u}){auto changed=valid;changed[i]=ref(1);reject(changed);} + for(std::size_t i:{1u,2u})for(I value:{I(-1),I(0)}){auto changed=valid;changed[i]=integer(value);reject(changed);} + for(I initial:{I(0),I(3)}){auto changed=valid;changed[4]=integer(initial);reject(changed);} + for(std::size_t n:{0u,3u,5u}){auto changed=valid;changed[3]=array(std::vector(n,integer(0)));reject(changed);} + for(const auto& cell:{integer(-1),integer(3),boolean(true),ref(1),ref(0,F::Type::Boolean)}){auto changed=valid;changed[3].elements[0]=cell;reject(changed);} + for(const auto& final:{members({0}),members({3}),domain(0,1),domain(1,3),ref(1)}){auto changed=valid;changed[5]=final;reject(changed);} + for(const auto& term:{boolean(true),ref(0,F::Type::Boolean),ref(9),array({integer(1)})}){auto changed=valid;changed[0]=array({term});reject(changed);} + constexpr I huge=9007199254740992LL; + for(std::size_t i:{1u,2u,4u}){auto changed=valid;changed[i]=integer(huge+1);reject(changed,O::FlatZincCompileStatus::Unsupported);} + auto changed=valid;changed[1]=integer(huge);changed[2]=integer(huge);reject(changed,O::FlatZincCompileStatus::Unsupported); + changed=valid;changed[3].elements[0]=integer(huge+1);reject(changed,O::FlatZincCompileStatus::Unsupported); + changed=valid;changed[5]=members({huge+1});reject(changed,O::FlatZincCompileStatus::Unsupported); + for(const auto& id:{"regular","fzn_regular","gecode_regular_set","gecode_regular_reif","gecode_gecode_regular","gecode_regular_nfa"}){r.raw_constraints={row(id,valid)};rejected(r);} + // Even an empty word or an earlier contradiction cannot bypass admission. + changed=valid;changed[0]=array({});changed[3].elements[0]=integer(-1);reject(changed); + r.raw_variables[0].domain.integers=domain(1,0).set;reject(changed);r.raw_variables[0].domain.integers=domain(1,2).set; + // Exact payload accounting: three scalar parameters, word positions, input + // matrix cells, three cells per nonzero transition and expanded final IDs. + F::Records bounded;bounded.raw_variables={variable(0,1,2)}; + bounded.raw_constraints={row("gecode_regular",{array({ref(0),integer(1)}),integer(2),integer(2),array({integer(1),integer(2),integer(0),integer(0)}),integer(1),domain(1,2)})}; + auto full=O::compile_flatzinc(bounded);assert(full.compiled&&full.work>0); + for(auto cap:{std::size_t(0),full.work/2,full.work-1}){O::FlatZincCompileOptions options;options.max_work=cap;auto result=O::compile_flatzinc(bounded,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled&&result.work<=cap);} + O::FlatZincCompileOptions options;options.max_work=full.work;assert(O::compile_flatzinc(bounded,options).compiled); + for(int mode=0;mode<3;++mode){options={};if(mode==0)options.max_variables=1;if(mode==1)options.max_constraints=0;if(mode==2)options.max_nonzeros=16;auto result=O::compile_flatzinc(bounded,options);assert(result.status==O::FlatZincCompileStatus::ResourceLimit&&!result.compiled);} + options={};options.max_variables=2;options.max_constraints=1;options.max_nonzeros=17;assert(O::compile_flatzinc(bounded,options).compiled); + options={};options.time_limit_seconds=0;auto stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::TimeLimit&&!stopped.compiled); + options={};options.cancellation=std::make_shared();options.cancellation->cancel();stopped=O::compile_flatzinc(bounded,options);assert(stopped.status==O::FlatZincCompileStatus::Cancelled&&!stopped.compiled); + bounded.raw_constraints[0].arguments[5]=domain(1,2);options={};options.max_nonzeros=1;assert(O::compile_flatzinc(bounded,options).status==O::FlatZincCompileStatus::ResourceLimit); +} +void regular_combined(){ + F::Records r;r.raw_variables={variable(0,0,3),variable(1,0,3),variable(0,0,1,F::Type::Boolean),variable(9,-3,-2)}; + r.raw_variables[0].domain.integers=members({2,1,2}).set; + r.raw_constraints={row("gecode_regular",{array({ref(0),ref(1)}),integer(3),integer(2),array({integer(2),integer(3),integer(0),integer(3),integer(3),integer(0)}),integer(1),members({3})}), + row("gecode_table_int",{array({ref(1)}),array({integer(1),integer(2)})}),row("all_different_int",{array({ref(0),ref(1)})}), + row("int_le_reif",{ref(0),ref(1),ref(0,F::Type::Boolean)}),row("int_plus",{ref(9),integer(4),ref(0)})}; + oracle(r,{{0,3},{0,3},{0,1},{-3,-2}},[](const Point& p){return((p[0]==1&&p[1]==2)||(p[0]==2&&p[1]==1))&&bool(p[2])==(p[0]<=p[1])&&p[3]+4==p[0];}); + for(auto method:{F::Method::Minimize,F::Method::Maximize}){ + r.solve.method=method;r.solve.has_objective=true;r.solve.objective=ref(9);r.output={{"first",ref(0)},{"objective",ref(9)}};auto c=compiled(r); + for(auto backend:{O::Backend::Native,O::Backend::Auto,O::Backend::Highs}){O::SolveOptions options;options.backend=backend;options.guarantee=backend==O::Backend::Highs?O::Guarantee::Numerical:O::Guarantee::Exact;auto result=O::solve(c.model(),options); + if(backend!=O::Backend::Highs&&O::capabilities(O::Backend::Native).available){assert(result.termination==O::Termination::Optimal&&result.objective==(method==F::Method::Minimize?-3:-2)&&O::validate_flatzinc(c,result,0).valid);assert(!O::format_flatzinc_solution(c,result,0).empty());} + else assert(result.termination==O::Termination::Unsupported&&!result.has_solution()); + } + } + r.solve={};auto c=compiled(r);auto historical=witness(c,{1,2,1,-3});r.raw_variables.clear();r.raw_constraints.clear();assert(O::validate_flatzinc(c,historical,0).valid); + historical.values[c.variables()[1].variable.id]=0;assert(!O::validate_flatzinc(c,historical,0).valid); +} + +int main(){regulars();regular_boundaries();regular_combined();cumulatives();cumulative_parameters();cumulative_boundaries();cumulative_combined();circuits();circuit_boundaries();circuit_combined();holey_domains();tables();table_domain_limits();table_domain_backends();comparisons();booleans();aliases_domains();guarded();globals();failures();history_output();actual_backends();assert(configurations>500&&assignments>20000);std::cout<<"FlatZinc source compiler: "< +#include + +namespace FznOptimizeDriver { +int fake=0,calls=0; +O::SolveResult test_solve(const O::ModelSnapshot& m,const O::SolveOptions& options) { + ++calls;if(!fake)return O::solve(m,options); + O::SolveResult r;r.model_id=m.model_id;r.revision=m.revision;r.guarantee=options.guarantee; + r.termination=O::Termination::Optimal;r.values.resize(m.variables.size(),0); + r.active_variables.resize(m.variables.size(),true);r.solution_validated=true;r.objective=0; + r.best_bound=0;r.absolute_gap=0;r.relative_gap=0; + const auto clear=[&] {r.values.clear();r.active_variables.clear();r.objective.reset();r.best_bound.reset();r.absolute_gap.reset();r.relative_gap.reset();r.solution_validated=false;}; + switch(fake) { + case 2:r.termination=O::Termination::NodeLimit;break; + case 3:r.termination=O::Termination::NodeLimit;clear();break; + case 4:r.values[0]=3;break; + case 5:++r.model_id;break; + case 6:r.active_variables[0]=false;break; + case 7:clear();break; + case 8:r.termination=O::Termination::Infeasible;break; + case 9:r.termination=O::Termination::Infeasible;clear();break; + case 10:r.guarantee=O::Guarantee::Certified;break; + case 11:r.termination=O::Termination::BackendError;break; + case 12:r.termination=O::Termination::Unsupported;break; + case 13:r.objective=std::numeric_limits::quiet_NaN();break; + case 14:r.termination=O::Termination::Unbounded;clear();break; + case 15:r.termination=O::Termination::Infeasible;r.solution_validated=false;r.objective.reset();r.best_bound.reset();r.absolute_gap.reset();r.relative_gap.reset();break; + case 16:r.best_bound=1;break; + case 17:r.best_bound=std::numeric_limits::quiet_NaN();break; + case 18:r.best_bound.reset();r.absolute_gap.reset();r.relative_gap.reset();break; + case 19:r.best_bound=-1;r.absolute_gap=1;r.relative_gap=1;break; + case 20:r.absolute_gap=std::numeric_limits::quiet_NaN();break; + case 21:r.relative_gap=1;break; + case 22:r.termination=O::Termination::Infeasible;clear();r.objective=std::numeric_limits::quiet_NaN();break; + default:break; + } + return r; +} +} +using namespace FznOptimizeDriver; +namespace { +int checks=0; +const std::string basic="var 0..2: x :: output_var; solve minimize x;"; +std::pair run(const std::string& source,Options options={}) { + std::istringstream input(source);std::ostringstream out,err; + const int code=execute(options,input,out,err);++checks; + if(code==2) {assert(out.str().empty());assert(!err.str().empty());} + return {code,out.str()}; +} +void rejected_arguments() { + for(const auto& args:std::vector>{ + {},{"-a"},{"m","-a","1"},{"m","--backend","auto"},{"m","--backend"}, + {"m","--node-limit","-1"},{"m","--node-limit","1.5"}, + {"m","--node-limit","18446744073709551616"},{"m","--time-limit","nan"}, + {"m","--time-limit","-1"},{"m","--time-limit"," 2"}, + {"m","--time-limit","2x"},{"m","--max-input-bytes","2147483648"}, + {"m","--backend","native","--backend","highs"}}) { + bool threw=false;try{arguments(args);}catch(const std::invalid_argument&){threw=true;}assert(threw);++checks; + } + auto valid=arguments({"-","--backend","highs","--time-limit","1e2","--node-limit","18446744073709551615"}); + assert(valid.solve.time_limit_seconds==100&&valid.solve.node_limit==std::numeric_limits::max());++checks; +} +void fake_contract() { + for(fake=1;fake<=22;++fake) { + auto result=run(basic); + if(fake==1)assert(result.first==0&&result.second.find("x = 0;\n----------\n==========\n")!=std::string::npos); + else if(fake==2)assert(result.first==1&&result.second.find("x = 0;")!=std::string::npos&&result.second.find("==========")==std::string::npos); + else if(fake==3)assert(result.first==1&&result.second.find("=====UNKNOWN=====")!=std::string::npos); + else if(fake==9)assert(result.first==0&&result.second.find("=====UNSATISFIABLE=====")!=std::string::npos); + else assert(result.first==2); + } + fake=1;auto sat=run("var 0..2: x :: output_var; solve satisfy;"); + assert(sat.first==0&&sat.second.find("x = 0;")!=std::string::npos&&sat.second.find("==========")==std::string::npos); + calls=0;Options timed;timed.solve.time_limit_seconds=0; + assert(run("not parsed",timed).first==1&&calls==0); + Options small;small.capture.max_input_bytes=1; + assert(run(basic,small).first==2&&calls==0); + for(const auto& source:{ + "var 0..2: x; constraint mystery(x); solve satisfy;", + "var 0..2: x; constraint int_times(x,x,x); solve satisfy;", + "var int: x; solve minimize x;", + "var 0.0..1.0: x; solve minimize x;", + "var 0..2: x; solve :: int_search([x],input_order,indomain_min,complete) satisfy;", + "var 0..2: x; constraint int_eq(x); solve satisfy;", + "var 0..2: x; solve minimize missing;"})assert(run(source).first==2&&calls==0); + // Finite holes are admitted now. A legal candidate reaches formatting, but + // a forged value inside the hull and outside the set remains invalid. + calls=0; + auto holes=run("var {0,2}: x :: output_var; solve minimize x;"); + assert(holes.first==0&&calls==1&&holes.second.find("x = 0;")!=std::string::npos); + calls=0; + assert(run("var {-1,1}: x :: output_var; solve minimize x;").first==2&&calls==1); + fake=0; +} +void actual_pipeline() { + int available=0; + for(auto backend:{O::Backend::Native,O::Backend::Highs}) { + Options o;o.solve.backend=backend;o.solve.guarantee=backend==O::Backend::Native?O::Guarantee::Exact:O::Guarantee::Numerical; + if(!O::capabilities(backend).available) {assert(run(basic,o).first==2);continue;} + ++available; + auto simple=run(basic,o);assert(simple.first==0&&simple.second.find("x = 0;")!=std::string::npos); + auto maximum=run("var -2..3: x :: output_var; solve maximize x;",o); + assert(maximum.first==0&&maximum.second.find("x = 3;")!=std::string::npos); + auto aliases=run("var 0..3: x; var 1..2: y :: output_var = x; array [1..4] of var 0..3: a :: output_array([-1..0,2..3]) = [x,x,2,3]; solve minimize y;",o); + assert(aliases.first==0&&aliases.second.find("a = array2d(-1..0, 2..3, [1, 1, 2, 3]);")!=std::string::npos&&aliases.second.find("y = 1;")!=std::string::npos); + auto channel=run("var 0..1: x :: output_var; var bool: b :: output_var; constraint bool2int(b,x); constraint bool_eq(b,true); solve minimize x;",o); + assert(channel.first==0&&channel.second.find("b = true;")!=std::string::npos&&channel.second.find("x = 1;")!=std::string::npos); + auto unsat=run("var 0..1: x; constraint int_ge(x,2); solve satisfy;",o); + assert(unsat.first==0&&unsat.second.find("=====UNSATISFIABLE=====")!=std::string::npos); + auto hidden=run("var 0..2: hidden; var 0..2: x :: output_var; constraint int_plus(hidden,x,3); constraint int_eq(hidden,2); solve minimize x;",o); + assert(hidden.first==0&&hidden.second.find("x = 1;")!=std::string::npos); + for(const auto& source:{"int: p = 7; solve minimize p;","solve maximize -3;"}) { + auto captured=F::parse_string(source);assert(captured.records); + auto compiled=O::compile_flatzinc(*captured.records);assert(compiled.compiled); + auto result=O::solve(compiled.compiled->model(),o.solve); + assert(result.termination==O::Termination::Optimal&&result.objective==(std::string(source).find('7')!=std::string::npos?7:-3)); + assert(run(source,o).first==0); + } + } +#ifdef GECODE_FLATZINC_DRIVER_EXPECT_BACKEND + assert(available>=1); +#else + assert(available==0); +#endif +} +} +int main() {rejected_arguments();fake_contract();actual_pipeline();assert(checks>=50);std::cout<<"FlatZinc complete frontend: "< None: + if not condition: + raise Failure(message) + + +def scalar(text: str) -> int | str: + text = text.strip() + if text in ("true", "false"): + return text # Keep Boolean true distinct from integer 1. + require(re.fullmatch(r"-?\d+", text) is not None, f"Noninteger source output: {text!r}") + return int(text) + + +def parse_output(text: str) -> Output: + assignments: dict[str, int | str | Array] = {} + markers: list[str] = [] + comments: list[str] = [] + for line in text.splitlines(): + if not line: + continue + if line.startswith("%"): + comments.append(line) + continue + if line in ("----------", "==========", "=====UNKNOWN=====", "=====UNSATISFIABLE====="): + markers.append(line) + continue + require(not markers, f"Assignment after a status/solution marker: {line!r}") + match = re.fullmatch(r"([A-Za-z_][A-Za-z0-9_]*) = (.*);", line) + require(match is not None, f"Unexpected stdout content: {line!r}") + name, raw = match.groups() + require(name not in assignments, f"Duplicate source output: {name}") + array = re.fullmatch(r"array(\d+)d\((.*), \[(.*)\]\)", raw) + if array: + arity, dimensions, contents = array.groups() + dims = [] + for dimension in dimensions.split(","): + bounds = re.fullmatch(r"\s*(-?\d+)\.\.(-?\d+)\s*", dimension) + require(bounds is not None, f"Unexpected array dimension: {dimension!r}") + dims.append(tuple(map(int, bounds.groups()))) + require(len(dims) == int(arity), "arrayNd dimension count mismatch") + values = tuple(scalar(item) for item in contents.split(",")) if contents else () + require(math.prod(max(0, hi - lo + 1) for lo, hi in dims) == len(values), + "Array output cardinality mismatch") + assignments[name] = Array(tuple(dims), values) + else: + assignments[name] = scalar(raw) + return Output(assignments, markers, comments) + + +class Suite: + def __init__(self, binary: Path, fixtures: Path, timeout: float) -> None: + self.binary, self.fixtures = binary, fixtures + self.deadline = time.monotonic() + timeout + self.results: list[dict[str, object]] = [] + self.sources: dict[str, str] = {} + + def fixture(self, name: str) -> Path: + path = self.fixtures / name + require(path.is_file(), f"Required fixture is missing: {path}") + self.sources[name] = hashlib.sha256(path.read_bytes()).hexdigest() + return path + + def invoke(self, name: str, args: list[str], data: bytes | None = None) -> tuple[int, str, str]: + remaining = self.deadline - time.monotonic() + require(remaining > 0, f"Aggregate CLI test deadline before required case {name}") + started = time.monotonic() + command = [str(self.binary), *args] + process = subprocess.Popen(command, stdin=subprocess.PIPE if data is not None else subprocess.DEVNULL, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + start_new_session=os.name == "posix") + try: + stdout, stderr = process.communicate(input=data, timeout=min(8.0, remaining)) + except subprocess.TimeoutExpired as error: + if os.name == "posix": + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + else: + process.kill() # The trusted driver creates solver threads, not child programs. + try: + process.communicate(timeout=1.0) + except subprocess.TimeoutExpired: + process.kill() + raise Failure(f"CLI child deadline: {name}, command={command!r}") from error + elapsed = time.monotonic() - started + require(len(stdout) <= 262144 and len(stderr) <= 262144, f"Excessive CLI output: {name}") + out, err = stdout.decode("utf-8", "strict"), stderr.decode("utf-8", "strict") + self.results.append({"case": name, "returncode": process.returncode, "elapsed_seconds": elapsed}) + require(time.monotonic() <= self.deadline, f"Aggregate CLI test deadline after {name}") + return process.returncode, out, err + + def solve(self, name: str, fixture: str, expected: dict[str, int | str | Array], + *, backend: str = "native", mode: str = "optimal", stdin: bool = False) -> None: + path = self.fixture(fixture) + args = ["-" if stdin else str(path), "--backend", backend] + code, stdout, stderr = self.invoke(name, args, path.read_bytes() if stdin else None) + require(code == 0 and not stderr, f"{name}: expected success, got {code}; stderr={stderr!r}; stdout={stdout!r}") + parsed = parse_output(stdout) + require(parsed.assignments == expected, f"{name}: wrong source assignment: {parsed.assignments!r}") + markers = {"optimal": ["----------", "=========="], "satisfy": ["----------"], + "unsat": ["=====UNSATISFIABLE====="]}[mode] + require(parsed.markers == markers, f"{name}: wrong completion markers: {parsed.markers!r}") + comment = "% guarantee: exact integer search" if backend == "native" else "% guarantee: numerical; requested MIP gaps: 0" + require(parsed.comments == [comment], f"{name}: missing/wrong guarantee attribution: {parsed.comments!r}") + + def error(self, name: str, args: list[str], text: str | None = None, contains: str = "") -> None: + code, stdout, stderr = self.invoke(name, args, None if text is None else text.encode()) + require(code == 2 and stdout == "" and bool(stderr), + f"{name}: rejection must emit only stderr, got code={code}, stdout={stdout!r}, stderr={stderr!r}") + require(contains.casefold() in stderr.casefold(), f"{name}: unexpected error: {stderr!r}") + + def cases(self, highs: str) -> None: + # Analytic source oracles, independent of any solver result. + alias = {"a": Array(((-1, 0), (2, 3)), (1, 1, 2, 3)), "y": 1} + channel = {"b": "true", "x": 1} + candidates = [(2*x+y, x, y) for x, y in itertools.product(range(-2, 5), range(-1, 4)) if x-y <= 2] + objective, x, y = max(candidates) + require(sum(candidate[0] == objective for candidate in candidates) == 1, "Oracle maximum is not unique") + maximum = {"x": x, "y": y, "z": objective} + for backend in ("native", "highs"): + if backend == "highs" and highs == "unavailable": + self.error("highs-unavailable", [str(self.fixture("linear-alias.fzn")), "--backend", backend], contains="unsupported") + continue + self.solve(f"{backend}-alias-file", "linear-alias.fzn", alias, backend=backend) + self.solve(f"{backend}-contiguous-domain", "cli-v2-domain-contiguous.fzn", {"x": 0}, backend=backend) + self.solve(f"{backend}-channel-stdin", "boolean-channel.fzn", channel, backend=backend, stdin=True) + self.solve(f"{backend}-maximum", "cli-v1-max-linear.fzn", maximum, backend=backend) + self.solve(f"{backend}-satisfaction", "cli-v1-satisfy-hidden.fzn", {"x": 1}, backend=backend, mode="satisfy") + self.solve(f"{backend}-infeasible-alias", "cli-v1-infeasible-alias.fzn", {}, backend=backend, mode="unsat") + self.solve(f"{backend}-constant-goal", "cli-v1-constant-objective.fzn", {"w": 5}, backend=backend) + self.solve(f"{backend}-empty-array", "cli-v1-empty-output.fzn", {"a": Array(((1, 0),), ())}, backend=backend, mode="satisfy") + self.solve(f"{backend}-reified-complement", "cli-v1-reified-complement.fzn", {"b": "false", "x": 2}, backend=backend) + feasible = [(yv, xv) for xv, yv in itertools.product(range(-1, 3), range(-2, 3)) if not (-2*xv+yv-xv <= -1)] + min_y, min_x = min(feasible) + require(sum(yv == min_y for yv, xv in feasible) == 1, "Reification oracle is not unique") + self.solve(f"{backend}-reified-signed-alias", "cli-v1-reified-signed-alias.fzn", {"b": "false", "x": min_x, "y": min_y}, backend=backend) + # Global source semantics remain present even when another backend lacks them. + table_candidates = [(yv, xv) for xv in (-3, 1, 3) for yv in range(-2, 3) + if (xv, yv) in ((-3, 2), (1, -2), (3, 1))] + table_y, table_x = min(table_candidates) + hole_candidates = sorted(set((-3, -1, 1, 4)) & set((-1, 1, 3))) + hole_min = min(v for v in hole_candidates if v >= 0) + # Enumerate original successor functions, then walk their labeled graph. + circuits = [] + for successors in itertools.product(range(3, 6), repeat=3): + seen, node = set(), 3 + for _ in range(3): + if node in seen: + break + seen.add(node) + node = successors[node-3] + if len(seen) == 3 and node == 3: + circuits.append(successors) + circuit = min(circuits) + require(sum(c[0] == circuit[0] for c in circuits) == 1, "Circuit optimum is not unique") + # Independent integer-time scheduling oracle. Integer endpoints make + # these checks exhaustive for half-open continuous-time task usage. + def cumulative(starts: tuple[int, ...], durations: tuple[int, ...], + heights: tuple[int, ...], capacity: int) -> bool: + require(len(starts) == len(durations) == len(heights), "Malformed scheduling oracle") + require(capacity >= 0 and all(v >= 0 for v in (*durations, *heights)), "Negative oracle task data") + first = min(starts, default=0) + last = max((s+d for s, d in zip(starts, durations)), default=first) + return all(sum(h for s, d, h in zip(starts, durations, heights) if s <= t < s+d) <= capacity + for t in range(first, last)) + zero_starts = [s for s in range(-2, 3) if cumulative((s,), (0,), (2,), 1)] + require(zero_starts == list(range(-2, 3)), "Zero-duration task incorrectly consumes capacity") + require(not any(cumulative((s,), (1,), (2,), 1) for s in range(-2, 3)), "Positive-duration excess demand is feasible") + touching_starts = [s for s in range(-1, 3) if cumulative((-1, s), (1, 2), (2, 2), 2)] + require(touching_starts == [0, 1, 2], "Shared start/end time has the wrong half-open usage") + require(not cumulative((-1, -1), (2, 1), (2, 1), 2), "Overlapping demand oracle is feasible") + fixed_durations = set((0, 2)) & set(range(1, 4)) + fixed_capacities = set((1, 2)) & {2} + require(fixed_durations == {2} and fixed_capacities == {2}, "Original alias parameter domains are not singleton") + duration, capacity, height = next(iter(fixed_durations)), next(iter(fixed_capacities)), 1 + fixed_starts = [s for s in range(-1, 4) if cumulative((-1, s), (duration, 1), (height, 2), capacity)] + require(fixed_starts == [1, 2, 3], "Fixed-alias scheduling oracle changed") + # Walk raw one-based FlatZinc transition tables. The oracle never uses + # compiled sparse IR, native DFA objects, or solver output as its input. + def regular(word: tuple[int, ...], states: int, symbols: int, + table: tuple[int, ...], initial: int, finals: tuple[int, ...]) -> bool: + require(states > 0 and symbols > 0 and len(table) == states*symbols, + "Malformed regular oracle dimensions") + require(1 <= initial <= states and all(0 <= target <= states for target in table) + and all(1 <= final <= states for final in finals), "Malformed regular oracle states") + current = initial + for symbol in word: + if not 1 <= symbol <= symbols: + return False + current = table[(current-1)*symbols+symbol-1] + if current == 0: + return False + return current in finals + regular_candidates = [word for word in itertools.product(range(4), repeat=2) + if regular(word, 3, 2, (2,3,0,3,3,0), 1, (3,))] + require(regular_candidates == [(1,2), (2,1)], "Regular accepted-word oracle changed") + regular_word = min(regular_candidates) + repeated_values = [v for v in (1,2) if regular((v,v,v), 2, 2, (1,2,2,1), 1, (2,))] + require(repeated_values == [2], "Regular repeated-alias oracle changed") + require(not regular((1,1), 2, 2, (1,2,2,1), 1, (2,)), "Nonfinal regular word was accepted") + require(regular((), 2, 2, (0,0,0,0), 2, (2,)) and + not regular((), 2, 2, (0,0,0,0), 2, (1,)), "Regular empty-word semantics changed") + require(not regular((1,), 1, 1, (0,), 1, (1,)) and + not regular((0,), 1, 1, (1,), 1, (1,)) and + not regular((), 1, 1, (1,), 1, ()), "Regular failure-state/alphabet/final-set semantics changed") + nonunit_words = [v for v in range(4) if regular((v,), 3, 2, (2,3,0,0,0,0), 1, (3,1,3))] + interval_words = [v for v in range(4) if regular((v,), 3, 2, (2,3,0,0,0,0), 1, tuple(range(2,4)))] + require(nonunit_words == [2] and interval_words == [1,2], "Regular literal final-set oracle changed") + globals_cases = ( + ("cli-v3-regular-word.fzn", dict(zip(("x", "y"), regular_word)), "optimal"), + ("cli-v3-regular-rejected-word.fzn", {}, "unsat"), + ("cli-v3-regular-alias-repeat.fzn", {"x": repeated_values[0], "y": repeated_values[0]}, "optimal"), + ("cli-v3-regular-empty-accept.fzn", {"word": Array(((1,0),), ())}, "satisfy"), + ("cli-v3-regular-empty-reject.fzn", {}, "unsat"), + ("cli-v3-regular-dead-transition.fzn", {}, "unsat"), + ("cli-v3-regular-nonunit-finals.fzn", {"x": max(nonunit_words)}, "optimal"), + ("cli-v3-regular-final-interval.fzn", {"x": min(interval_words)}, "optimal"), + ("cli-v3-regular-empty-finals.fzn", {}, "unsat"), + ("cli-v3-regular-zero-symbol.fzn", {}, "unsat"), + ("cli-v2-cumulative-zero-duration.fzn", {"s": min(zero_starts)}, "optimal"), + ("cli-v2-cumulative-positive-duration-unsat.fzn", {}, "unsat"), + ("cli-v2-cumulative-half-open.fzn", {"a": -1, "b": min(touching_starts)}, "optimal"), + ("cli-v2-cumulative-overlap-unsat.fzn", {}, "unsat"), + ("cli-v2-cumulative-fixed-alias.fzn", {"d": duration, "duration_alias": duration, "h": height, + "capacity": capacity, "capacity_alias": capacity, + "s": min(fixed_starts)}, "optimal"), + ("cli-v2-circuit-offset.fzn", dict(zip(("x", "y", "z"), circuit)), "optimal"), + ("cli-v2-circuit-subtours.fzn", {}, "unsat"), + ("cli-v2-circuit-singleton.fzn", {}, "satisfy"), + ("cli-v2-table-holes.fzn", {"x": table_x, "y": table_y}, "optimal"), + ("cli-v2-table-alias-unsat.fzn", {}, "unsat"), + ("cli-v2-table-empty.fzn", {}, "unsat"), + ("cli-v2-holey-alias.fzn", {"x": hole_min, "y": hole_min}, "optimal"), + ("cli-v1-global-element.fzn", {"i": 2, "v": -4}, "optimal"), + ("cli-v1-global-distinct.fzn", {"a": Array(((1, 3),), (1, 2, 3))}, "optimal"), + ("cli-v1-global-repeated-alias.fzn", {}, "unsat"), + ) + for fixture, expected, mode in globals_cases: + self.solve(f"native-{fixture}", fixture, expected, mode=mode) + self.error(f"highs-rejects-{fixture}", [str(self.fixture(fixture)), "--backend", "highs"], contains="unsupported") + # Default selection must be native/exact, without a fallback flag. + default = self.fixture("boolean-channel.fzn") + code, stdout, stderr = self.invoke("default-native", [str(default)]) + parsed = parse_output(stdout) + require(code == 0 and not stderr and parsed.assignments == channel and + parsed.comments == ["% guarantee: exact integer search"] and + parsed.markers == ["----------", "=========="], "Default backend/guarantee/output changed") + for fixture, fragment in (("cli-v3-regular-malformed-matrix.fzn", "Q*S"), + ("cli-v3-regular-bad-target.fzn", "0..Q"), + ("cli-v3-regular-bad-initial.fzn", "1..Q"), + ("cli-v3-regular-nonliteral-parameter.fzn", "expected an integer literal"), + ("cli-v3-regular-unsupported-set.fzn", "gecode_regular_set"), + ("cli-v3-regular-wrong-arity.fzn", "arity"), + ("cli-v3-regular-bad-count.fzn", "positive"), + ("cli-v2-circuit-empty.fzn", "nonempty"), + ("cli-v2-cumulative-malformed-four.fzn", "equal lengths"), + ("cli-v2-cumulative-wrong-arity.fzn", "arity"), + ("cli-v2-cumulative-unsupported-six.fzn", "multi-machine"), + ("cli-v2-cumulative-unsupported-seven.fzn", "fzn_cumulatives"), + ("cli-v2-cumulative-unfixed-parameter.fzn", "singleton"), + ("cli-v2-table-zero-arity.fzn", "zero-arity"), + ("cli-v1-malformed-arity.fzn", "argument"), + ("cli-v1-unknown-predicate.fzn", "cli_v1_unknown_predicate"), + ("cli-v1-unbounded-domain.fzn", "finite explicit domain"), + ("unsupported.fzn", "int_times")): + self.error(f"reject-{fixture}", [str(self.fixture(fixture))], contains=fragment) + self.error("malformed-stdin", ["-"], "var int: x; solve minimize missing;", "missing") + self.error("unsupported-string-escape", ["-"], "solve :: invalid(\"\\123\") satisfy;", "escape") + code, stdout, stderr = self.invoke("invalid-utf8-stdin", ["-"], b'solve :: text("\xff") satisfy;') + require(code == 2 and not stdout and "UTF-8" in stderr, "Invalid UTF-8 input was not rejected") + self.error("missing-file", [str(self.fixtures / "cli-v1-does-not-exist.fzn")], contains="Cannot open") + self.error("unknown-flag", [str(default), "--not-a-solver-flag", "1"], contains="Unsupported option") + self.error("unknown-backend", [str(default), "--backend", "auto"], contains="Backend") + self.error("missing-option-value", [str(default), "--node-limit"], contains="Missing") + self.error("duplicate-option", [str(default), "--node-limit", "1", "--node-limit", "2"], contains="repeated") + self.error("nonfinite-time", [str(default), "--time-limit", "nan"], contains="finite") + self.error("negative-node-count", [str(default), "--node-limit", "-1"], contains="unsigned") + self.error("input-byte-limit", [str(default), "--max-input-bytes", "1"], contains="byte limit") + self.error("no-arguments", [], contains="Usage") + # Exit status 1 and UNKNOWN are never UNSAT or an exhaustive marker. + source = self.fixture("cli-v1-max-linear.fzn") + for key, value in (("--time-limit", "0"), ("--node-limit", "0")): + code, stdout, stderr = self.invoke(f"zero-{key[2:]}", [str(source), key, value]) + parsed = parse_output(stdout) + require(code == 1 and not parsed.assignments and parsed.markers == ["=====UNKNOWN====="], + f"Zero budget incorrectly completed: {code}, {stdout!r}, {stderr!r}") + code, stdout, stderr = self.invoke("native-one-node", [str(source), "--node-limit", "1"]) + limited = parse_output(stdout) + require(code == 1 and "node_limit" in stderr, f"One-node fixture did not actually interrupt: {code}, {stdout!r}, {stderr!r}") + require(limited.comments == ["% guarantee: exact integer search"], "Limited native result lost attribution") + if limited.assignments: + require(limited.markers == ["----------"] and set(limited.assignments) == {"x", "y", "z"}, "Limited witness claimed completion") + xv, yv, zv = (limited.assignments[key] for key in ("x", "y", "z")) + require(all(type(v) is int for v in (xv, yv, zv)) and -2 <= xv <= 4 and -1 <= yv <= 3 and + xv-yv <= 2 and zv == 2*xv+yv and zv <= objective, "Limited source witness is invalid") + else: + require(limited.markers == ["=====UNKNOWN====="], "Limit without witness must be UNKNOWN") + code, stdout, stderr = self.invoke("help", ["--help"]) + require(code == 0 and not stderr and "Usage:" in stdout, "Help invocation failed") + # Quoting and file-path handling must not depend on the source checkout name. + with tempfile.TemporaryDirectory(prefix="fzn driver path ") as directory: + spaced = Path(directory) / "source model.fzn" + spaced.write_bytes(default.read_bytes()) + code, stdout, stderr = self.invoke("filename-with-spaces", [str(spaced)]) + require(code == 0 and not stderr and parse_output(stdout).assignments == channel, "Spaced filename failed") + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--binary", required=True, type=Path) + parser.add_argument("--fixtures", type=Path, default=Path(__file__).parent / "flatzinc-fixtures") + parser.add_argument("--highs", choices=("available", "unavailable"), default="available") + parser.add_argument("--timeout", type=float, default=60.0) + args = parser.parse_args() + try: + require(args.binary.is_file(), f"Required prebuilt driver is missing: {args.binary}") + require(math.isfinite(args.timeout) and args.timeout > 0, "Test timeout must be finite and positive") + digest = hashlib.sha256(args.binary.read_bytes()).hexdigest() + suite = Suite(args.binary.resolve(), args.fixtures.resolve(), args.timeout) + suite.cases(args.highs) + require(len(suite.results) == (106 if args.highs == "available" else 97), "Required CLI cases were skipped") + print(json.dumps({"status": "passed", "binary_sha256": digest, "cases": len(suite.results), + "fixture_sha256": suite.sources, "checks": suite.results}, sort_keys=True)) + return 0 + except (Failure, OSError, UnicodeError) as error: + print(f"FlatZinc driver CLI conformance failed: {error}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/test/optimize/globals.cpp b/test/optimize/globals.cpp new file mode 100644 index 0000000000..79b384dc94 --- /dev/null +++ b/test/optimize/globals.cpp @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +constexpr double inf=std::numeric_limits::infinity(); +using Assignment=std::vector; + +// Enumerate the complete finite product using predicates independent of the +// library's global validator and native compiler. Check both acceptance and +// optimal objective, then compare the native search result with that oracle. +static void oracle(O::Model& model,const std::vector>& domains, + const std::function& predicate) { + auto snapshot=model.snapshot();assert(domains.size()==snapshot.variables.size()); + double best=snapshot.objective.sense==O::ObjectiveSense::Minimize?inf:-inf; + std::size_t feasible=0; + Assignment assignment(domains.size()); + const auto visit=[&](auto&& self,std::size_t index)->void { + if(index values(assignment.begin(),assignment.end()); + const auto checked=O::validate(snapshot,values,0,0); + assert(checked.model_valid && checked.valid==expected); + if(!expected) return; + ++feasible; + double objective=snapshot.objective.offset; + for(const auto& term:snapshot.objective.terms) objective+=term.coefficient*values[term.variable.id]; + if(snapshot.objective.sense==O::ObjectiveSense::Minimize) best=std::min(best,objective); + else best=std::max(best,objective); + }; + visit(visit,0); + O::SolveOptions options;options.backend=O::Backend::Native;options.guarantee=O::Guarantee::Exact; + const auto result=O::solve(snapshot,options); + if(!O::capabilities(O::Backend::Native).available) { + assert(result.termination==O::Termination::Unsupported);return; + } + if(feasible) { + if(result.termination!=O::Termination::Optimal) std::cerr< static void invalid(F operation) {bool caught=false;try{operation();}catch(const O::ModelError&){caught=true;}assert(caught);} + +int main() { + O::Model different;std::vector v; + for(int i=0;i<4;++i) v.push_back(different.add_integer(-1,2)); + auto all=O::add_all_different(different,v,"permutation"); + different.minimize({{v[0],1},{v[1],2},{v[2],3},{v[3],4}},-7); + oracle(different,{{-1,2},{-1,2},{-1,2},{-1,2}},[](const auto& a){auto b=a;std::sort(b.begin(),b.end());return std::adjacent_find(b.begin(),b.end())==b.end();}); + O::Model aliases;auto x=aliases.add_integer(0,2); + O::add_all_different(aliases,{x,x});oracle(aliases,{{0,2}},[](const auto&){return false;}); + + O::Model element;auto index=element.add_integer(-2,2),a=element.add_integer(0,2),b=element.add_integer(-1,1); + O::add_element(element,index,{a,a,b},index,-1); + element.maximize({{index,3},{a,-2},{b,1}},4); + oracle(element,{{-2,2},{0,2},{-1,1}},[](const auto& q){return q[0]>=-1 && q[0]<=1 && q[0]==(q[0]<1?q[1]:q[2]);}); + O::Model empty_element;auto e=empty_element.add_integer(0,1); + O::add_element(empty_element,e,{},e);oracle(empty_element,{{0,1}},[](const auto&){return false;}); + + O::Model table;auto tx=table.add_integer(0,2),ty=table.add_integer(0,2); + O::add_table(table,{tx,ty,tx},{{0,0,1},{1,2,1},{2,0,2},{1,2,1}}); + table.minimize({{tx,3},{ty,-1}},-9); + oracle(table,{{0,2},{0,2}},[](const auto& q){return (q[0]==1 && q[1]==2)||(q[0]==2 && q[1]==0);}); + O::Model false_table;O::add_table(false_table,{},{});oracle(false_table,{},[](const auto&){return false;}); + O::Model true_table;O::add_table(true_table,{},{{}});oracle(true_table,{},[](const auto&){return true;}); + + O::Model schedule;auto s0=schedule.add_integer(0,4),s1=schedule.add_integer(0,4),s2=schedule.add_integer(0,4); + O::add_cumulative(schedule,{s0,s1,s2},{2,2,0},{1,1,100},1); + schedule.minimize({{s0,2},{s1,1},{s2,10}}); + oracle(schedule,{{0,4},{0,4},{0,4}},[](const auto& q){ + for(int time=0;time<7;++time) if((q[0]<=time && time1) return false; + return true; + }); + for(int capacity=1;capacity<=2;++capacity) { + O::Model same_start;auto s=same_start.add_integer(-2,2); + O::add_cumulative(same_start,{s,s},{2,2},{1,1},capacity); + oracle(same_start,{{-2,2}},[capacity](const auto&){return capacity==2;}); + } + O::Model no_resource;auto start=no_resource.add_integer(-2,2); + O::add_cumulative(no_resource,{start,start},{0,2},{99,0},0); + oracle(no_resource,{{-2,2}},[](const auto&){return true;}); + + O::Model circuit;std::vector successors; + for(int i=0;i<4;++i) successors.push_back(circuit.add_integer(-2,1)); + O::add_circuit(circuit,successors,-2); + circuit.maximize({{successors[0],1},{successors[1],2},{successors[2],3},{successors[3],4}},8); + oracle(circuit,{{-2,1},{-2,1},{-2,1},{-2,1}},[](const auto& q){ + bool seen[4]={};int node=0; + for(int step=0;step<4;++step){if(seen[node])return false;seen[node]=true;node=q[node]+2;} + return node==0; + }); + O::Model singleton;auto successor=singleton.add_integer(5,9); + O::add_circuit(singleton,{successor},7);oracle(singleton,{{5,9}},[](const auto& q){return q[0]==7;}); + O::Model same_successor;auto s=same_successor.add_integer(0,1); + O::add_circuit(same_successor,{s,s});oracle(same_successor,{{0,1}},[](const auto&){return false;}); + + // Old numerical workflows must reject globals rather than solve a relaxation + // as if it represented the original model. + const auto automatic=O::solve(different); + if(O::capabilities(O::Backend::Native).available) { + assert(automatic.has_solution() && automatic.backend=="Gecode native"); + const O::ObjectiveData total{{{v[0],1},{v[1],1},{v[2],1},{v[3],1}},0,O::ObjectiveSense::Minimize}; + const O::ObjectiveData prefer{{{v[0],1}},0,O::ObjectiveSense::Maximize}; + const auto ordered=O::solve_lexicographic(different,{{total,0,0,"total"},{prefer,0,0,"first"}}); + assert(ordered.completed_numerically() && ordered.objective_values==std::vector({2,2})); + assert(O::validate(different.snapshot(),ordered.final_solution.values,0,0).valid); + } else assert(automatic.termination==O::Termination::Unsupported); + O::SolveOptions highs;highs.backend=O::Backend::Highs; + assert(O::solve(different,highs).termination==O::Termination::Unsupported); + O::SolveSession session;assert(session.solve(different).termination==O::Termination::Unsupported); + assert(O::analyze_conflict(different).status==O::ConflictStatus::Unsupported); + invalid([&]{O::write_model(different,"unsupported-global.lp");}); + + const auto revision=different.revision();const auto snapshot=different.snapshot(); + invalid([&]{O::add_table(different,{v[0]},{{1,2}});}); + invalid([&]{O::add_cumulative(different,{v[0]},{-1},{1},1);}); + invalid([&]{O::add_circuit(different,{});}); + invalid([&]{O::add_all_different(different,{x});}); + assert(different.revision()==revision && different.snapshot().globals.size()==snapshot.globals.size()); + invalid([&]{different.remove(v[0]);}); + auto malformed=snapshot;malformed.globals[0].global.model_id=0; + assert(!O::validate(malformed,{-1,0,1,2}).model_valid); + malformed=snapshot;std::get(malformed.globals[0].payload).variables[0]=x; + assert(!O::validate(malformed,{-1,0,1,2}).model_valid); + different.set_name(all,"renamed");assert(different.global(all).name=="renamed"); + different.remove(all);invalid([&]{different.remove(all);}); + different.minimize({});different.remove(v[0]); + O::validate_structure(different.snapshot()); // Inactive global can refer to tombstones. + O::Model moved(std::move(different));O::validate_structure(moved.snapshot()); + invalid([&]{different.add_global(O::AllDifferentData{});}); + + O::Model huge;auto h0=huge.add_integer(0,0),h1=huge.add_integer(0,0); + O::add_cumulative(huge,{h0,h1},{1,1},{INT64_C(9007199254740992),INT64_C(9007199254740992)},INT64_C(9007199254740992)); + const auto failed=O::validate(huge.snapshot(),{0,0},0,0); + assert(failed.model_valid && !failed.valid && failed.violated_globals==1); + O::SolveOptions exact;exact.backend=O::Backend::Native;exact.guarantee=O::Guarantee::Exact; + assert(O::solve(huge,exact).termination==O::Termination::Unsupported); + + // The previous int64 energy/width guards admitted these six tasks, but + // C*est+sum(energy) overflows Omega/Lambda envelopes. Reject before posting. + O::Model envelope;std::vector tasks; + for(int i=0;i<6;++i) tasks.push_back(envelope.add_integer(715827880,715827880)); + O::add_cumulative(envelope,tasks,std::vector(6,1431655760), + std::vector(6,1073741823),2147483646); + const auto unsafe_envelope=O::solve(envelope,exact); + assert(unsafe_envelope.termination==O::Termination::Unsupported && !unsafe_envelope.has_solution()); + + // Exactly at the conservative edge-finding int-cast guard and just outside. + // C=2, h_min=1, E=2 gives 4*B+2 <= native_max=2147483646. + for(int sign:{-1,1}) for(int outside:{0,1}) { + const int magnitude=536870911+outside; + const int begin=sign>0?magnitude-1:-magnitude; + O::Model boundary;auto p=boundary.add_integer(begin,begin),q=boundary.add_integer(begin,begin); + O::add_cumulative(boundary,{p,q},{1,1},{1,1},2); + if(outside) assert(O::solve(boundary,exact).termination==O::Termination::Unsupported); + else oracle(boundary,{{begin,begin},{begin,begin}},[](const auto&){return true;}); + } + // Singleton and zero-resource constraints need no envelope arithmetic. + O::Model lone;auto late=lone.add_integer(2147483645,2147483645); + O::add_cumulative(lone,{late},{1},{1},10); + oracle(lone,{{2147483645,2147483645}},[](const auto&){return true;}); + O::Model no_energy;auto late_zero=no_energy.add_integer(2147483646,2147483646); + O::add_cumulative(no_energy,{late_zero,late_zero},{2147483646,0},{0,2147483646},0); + oracle(no_energy,{{2147483646,2147483646}},[](const auto&){return true;}); + O::Model overloaded;auto overload_start=overloaded.add_integer(-2,2); + O::add_cumulative(overloaded,{overload_start},{2},{2},1); + oracle(overloaded,{{-2,2}},[](const auto&){return false;}); + + // Native int addition of the two minimum heights overflowed here. The wide + // disjunctive test must preserve exact non-overlap semantics instead. + O::Model resource_units;auto r0=resource_units.add_integer(0,2),r1=resource_units.add_integer(0,2); + O::add_cumulative(resource_units,{r0,r1},{1,1},{1073741823,2147483646},2147483646); + resource_units.minimize({{r0,1},{r1,1}}); + oracle(resource_units,{{0,2},{0,2}},[](const auto& q){return q[0]!=q[1];}); + + // The advanced propagator indexes count*distinct_heights using int. + O::Model array_product;auto repeated=array_product.add_integer(0,0); + std::vector distinct_heights(46341); + for(std::size_t i=0;i(i+1); + O::add_cumulative(array_product,std::vector(46341,repeated), + std::vector(46341,1),distinct_heights,46341); + assert(O::solve(array_product,exact).termination==O::Termination::Unsupported); + std::cout<<"native globals and independent finite-product oracles passed\n"; +} diff --git a/test/optimize/io.cpp b/test/optimize/io.cpp new file mode 100644 index 0000000000..b4f6116a59 --- /dev/null +++ b/test/optimize/io.cpp @@ -0,0 +1,269 @@ +#include +#include +#include +#ifdef GECODE_OPTIMIZE_IO_TEST_HIGHS +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace fs=std::filesystem; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +void require(bool value,const std::string& message){if(!value)throw std::runtime_error(message);} +void rejected(const std::function& action,const std::string& message){ + bool caught=false;try{action();}catch(const O::ModelError&){caught=true;}require(caught,message); +} +void put(const fs::path& path,const std::string& text){std::ofstream f(path);f<(f),std::istreambuf_iterator()};} +struct Directory { + fs::path path=fs::temp_directory_path()/("gecode-io-tests-"+std::to_string(std::random_device{}())); + Directory(){require(fs::create_directory(path),"temporary directory unavailable");} + ~Directory(){std::error_code ec;fs::remove_all(path,ec);} +}; +void equal(const O::ModelSnapshot& a,const O::ModelSnapshot& b){ + require(a.variables.size()==b.variables.size()&&a.rows.size()==b.rows.size(),"roundtrip dimensions"); + for(std::size_t i=0;i= 5\nBounds\n 0 <= x <= 10\nGeneral\n x\nEnd\n"); + auto m=O::read_model(path.string()).snapshot();require(m.objective.terms[0].coefficient==5&&m.objective.offset==7,"duplicate LP objective overwritten"); + require(m.rows[0].lower==3,"LP LHS constant ignored"); + put(path,"Maximize\n obj: 1e16 + 1 - 1e16\nSubject To\nEnd\n"); + require(O::read_model(path.string()).snapshot().objective.offset==1,"LP objective cancellation lost"); + for(const auto& relation:{">=","<=","="}){ + put(path,std::string("Minimize\n obj: x\nSubject To\n c: x + 1 - 1e16 ")+relation+" -1e16\nBounds\n x free\nEnd\n"); + const auto row=O::read_model(path.string()).snapshot().rows[0]; + require((std::string(relation)=="<="||row.lower==-1)&&(std::string(relation)==">="||row.upper==-1),"LP RHS cancellation lost residual"); + } + put(path,"Minimize\n obj: + 0 x + 0 y\nSubject To\n c: 2 x\n + 3 y >= 7\nBounds\n x free\n 2 <= y <= 8\nGeneral\n y\nSemi\n y\nEnd\n"); + m=O::read_model(path.string()).snapshot();require(m.variables[0].lower==-inf&&m.variables[1].type==O::VariableType::SemiInteger,"LP free/semi-integer import"); + require(m.rows[0].terms.size()==2,"LP wrapped row"); + put(path,"Minimize\n obj: y\nBounds\n 2 <= y <= 8\nSemi\n y\nGeneral\n y\nEnd\n"); + require(O::read_model(path.string()).snapshot().variables[0].type==O::VariableType::SemiInteger,"LP Semi then General lost integrality"); +} +void mps_semantics(const fs::path& dir){ + const auto path=dir/"external.mps"; + put(path,"NAME sample\nOBJSENSE MAX\nROWS\n N obj\n L upper\n G lower\n E eqpos\n E eqneg\nCOLUMNS\n x obj 2 upper 1\n x obj 3 lower 1\n x eqpos 1 eqneg 1\nRHS\n rhs obj -7 upper 10\n rhs lower 5 eqpos 8\n rhs eqneg 9\nRANGES\n range upper 4 lower 2\n range eqpos 3 eqneg -2\nBOUNDS\n FR bounds x\nENDATA\n"); + const auto m=O::read_model(path.string()).snapshot();require(m.objective.sense==O::ObjectiveSense::Maximize&&m.objective.offset==7&&m.objective.terms[0].coefficient==5,"MPS objective duplicates/sense/offset"); + require(m.rows[0].lower==6&&m.rows[0].upper==10&&m.rows[1].lower==5&&m.rows[1].upper==7&&m.rows[2].lower==8&&m.rows[2].upper==11&&m.rows[3].lower==7&&m.rows[3].upper==9,"MPS RANGES signs"); +} +void type_declarations(const fs::path& dir){ + const auto path=dir/"types.mps"; + const std::string base="NAME t\nROWS\n N obj\nCOLUMNS\n"; + const std::string column=" x obj 1\n"; + const std::string marked=" mark0 'MARKER' 'INTORG'\n"+column+" mark1 'MARKER' 'INTEND'\n"; + const std::vector declarations={" BV b x\n"," SC b x 2\n"," SI b x 2\n"," LI b x 1\n"," UI b x 2\n"}; + for(std::size_t i=0;i{" SI b x 2\n"," LI b x 1\n SI b x 2\n"}){ + put(path,base+marked+"BOUNDS\n"+declarations+"ENDATA\n"); + const auto v=O::read_model(path.string()).snapshot().variables[0]; + require(v.type==O::VariableType::SemiInteger&&v.lower==1&&v.upper==2,"valid SI discarded integer type"); + } + for(const auto& declarations:std::vector{" LI b x 1\n UI b x 2\n"," UI b x 2\n LI b x 1\n"}){ + put(path,base+column+"BOUNDS\n"+declarations+"ENDATA\n"); + const auto v=O::read_model(path.string()).snapshot().variables[0]; + require(v.type==O::VariableType::Integer&&v.lower==1&&v.upper==2,"valid integer bound order rejected"); + } + for(const auto& order:std::vector{"Binary\n x\nSemi\n x\n","Semi\n x\nBinary\n x\n","Binary\n x\nGeneral\n x\n","General\n x\nBinary\n x\n"}){ + const auto lp=dir/"types.lp";put(lp,"Minimize\n obj: x\n"+order+"End\n"); + rejected([&]{O::read_model(lp.string());},"conflicting LP declaration order accepted"); + } +} +void failures(const fs::path& dir){ + const auto target=dir/"protected.lp";put(target,"original bytes");auto m=comprehensive(); + auto bad=m.snapshot();bad.objective.offset=inf; + rejected([&]{O::write_model(bad,target.string());},"invalid export succeeded");require(get(target)=="original bytes","failed export destroyed destination"); + O::Model logical;auto active=logical.add_binary("active");auto quantity=logical.add_continuous(0,10,"quantity"); + const auto indicator=O::add_indicator(logical,active,true,{{quantity,1}},3,inf,"logical"); + rejected([&]{O::write_model(logical,target.string());},"original indicator semantics dropped on export"); + require(get(target)=="original bytes","indicator rejection changed destination"); + O::remove_indicator(logical,indicator.indicator); + O::write_model(logical,(dir/"removed-indicator.lp").string()); + rejected([&]{O::write_model(m,(dir/"missing"/"out.lp").string());},"missing directory accepted"); + rejected([&]{O::read_model((dir/"missing.lp").string());},"missing input accepted"); + rejected([&]{O::write_model(m,(dir/"out.txt").string());},"unknown output format accepted"); + auto protected_dir=dir/"destination.lp";fs::create_directory(protected_dir);put(protected_dir/"marker","keep"); + const auto count=[&]{return static_cast(std::distance(fs::directory_iterator(dir),fs::directory_iterator()));}; + const auto before=count();rejected([&]{O::write_model(m,protected_dir.string());},"directory replaced"); + require(get(protected_dir/"marker")=="keep"&&count()==before,"failed atomic replacement leaked or damaged files"); + O::Model nonrepresentable;auto x=nonrepresentable.add_continuous();nonrepresentable.add_row({{x,1}},std::numeric_limits::denorm_min(),std::numeric_limits::max()); + const auto mps=dir/"protected.mps";put(mps,"original MPS bytes");const auto files=count(); + rejected([&]{O::write_model(nonrepresentable,mps.string());},"unrepresentable MPS range changed semantics"); + require(get(mps)=="original MPS bytes"&&count()==files,"roundtrip rejection changed destination or leaked temp"); + for(const auto& bounds:std::vector>{{0.25,0.75},{0,0},{1,1}}){ + O::Model tighter;auto binary=tighter.add_binary();tighter.set_bounds(binary,bounds.first,bounds.second); + rejected([&]{O::write_model(tighter,mps.string());},"nondefault MPS binary bounds exported nonportably"); + require(get(mps)=="original MPS bytes"&&count()==files,"binary export rejection changed destination or leaked temp"); + const auto lp=dir/"tighter.lp";O::write_model(tighter,lp.string());equal(tighter.snapshot(),O::read_model(lp.string()).snapshot()); + fs::remove(lp); + } + const std::vector invalid_lp={ + "Minimize\n obj: [ x ^ 2 ] / 2\nEnd\n", + "Minimize\n obj: x\nSOS\n s: S1 :: x : 1\nEnd\n", + "Minimize\n obj: x\nSubject To\n c: z = 1 -> x <= 2\nEnd\n", + "Minimize\n obj: nan x\nEnd\n", + "Minimize\n obj: 1e-9999 x\nEnd\n", + "Minimize\n obj: 1e+2e+3\nEnd\n", + "Minimize\n obj: x\nBounds\n x <= 3\n x <= 2\nEnd\n", + "Minimize\n obj: x\nBounds\n x <= 3\n x free\nEnd\n", + "Minimize\n obj: x\nEnd\nSome ignored content\n", + "Minimize\n obj: x\n", + "Minimize\n obj: x\nSubject To\n c: x < 2\nEnd\n", + "\\ GECODE_NAME V absent 41\nMinimize\n obj: x\nEnd\n"}; + for(const auto& input:invalid_lp){put(target,input);rejected([&]{O::read_model(target.string());},"malformed/unsupported LP accepted: "+input);} + const std::string base="NAME t\nROWS\n N obj\n L row\nCOLUMNS\n x obj 1 row 1\n"; + for(const auto& tail:std::vector{ + "SOS\n S1 set\nENDATA\n","QUADOBJ\n x x 1\nENDATA\n","INDICATORS\n IF row x 1\nENDATA\n", + "RHS\n a row 1\n b row 2\nENDATA\n","RHS\n a unknown 1\nENDATA\n", + "BOUNDS\n UP b unknown 2\nENDATA\n","BOUNDS\n XX b x\nENDATA\n", + "BOUNDS\n LO b x 1\n LI b x 2\nENDATA\n","ENDATA\ntrailing\n",""}){ + put(mps,base+tail);rejected([&]{O::read_model(mps.string());},"malformed/unsupported MPS accepted: "+tail);} +} +#ifdef GECODE_OPTIMIZE_IO_TEST_HIGHS +// An independent parser checks exported mathematics, including every unused +// column. It intentionally ignores private display-name/type distinctions +// absent from HiGHS (Binary is represented as an integer with bounds [0,1]). +void highs_export(const O::ModelSnapshot& model,const fs::path& path){ + O::write_model(model,path.string()); + Highs highs;highs.setOptionValue("output_flag",false); + require(highs.readModel(path.string())==HighsStatus::kOk,"HiGHS export import warned/failed: "+path.string()); + const auto& lp=highs.getLp(); + require(static_cast(lp.num_col_)==model.variables.size(),"HiGHS lost unused column"); + require(lp.sense_==(model.objective.sense==O::ObjectiveSense::Minimize?ObjSense::kMinimize:ObjSense::kMaximize)&&lp.offset_==model.objective.offset,"HiGHS changed sense/offset"); + std::map columns; + for(std::size_t i=0;i costs(model.variables.size(),0);for(const auto& t:model.objective.terms)costs[t.variable.id]=t.coefficient; + for(const auto& v:model.variables){const auto name="x"+std::to_string(v.variable.id); + require(columns.count(name)!=0,"HiGHS lost column "+name+" in "+path.string());const auto col=columns.at(name); + const auto type=lp.integrality_.empty()?HighsVarType::kContinuous:lp.integrality_[col]; + const auto expected=v.type==O::VariableType::Continuous?HighsVarType::kContinuous:v.type==O::VariableType::SemiContinuous?HighsVarType::kSemiContinuous:v.type==O::VariableType::SemiInteger?HighsVarType::kSemiInteger:HighsVarType::kInteger; + require(type==expected&&lp.col_lower_[col]==v.lower&&lp.col_upper_[col]==v.upper&&lp.col_cost_[col]==costs[v.variable.id],"HiGHS changed exported variable domain/cost: "+std::to_string(v.variable.id)); + } + auto matrix=lp.a_matrix_;matrix.ensureColwise(); + std::vector> rows(static_cast(lp.num_row_)); + for(HighsInt col=0;col indices;for(std::size_t i=0;i terms;for(const auto& t:r.terms)terms.emplace("x"+std::to_string(t.variable.id),t.coefficient); + // HiGHS' free-MPS parser discards later N rows; these unconstrained + // expressions have no effect on the feasible set or objective. + if(path.extension()==".mps"&&r.lower==-inf&&r.upper==inf&&indices.count("r"+std::to_string(r.constraint.id))==0)continue; + const bool split=path.extension()==".lp"&&std::isfinite(r.lower)&&std::isfinite(r.upper)&&r.lower!=r.upper; + const auto check=[&](const std::string& name,double lb,double ub){ + require(indices.count(name)!=0,"HiGHS lost row "+name+" in "+path.string());const auto row=indices.at(name);++expected_rows; + require(lp.row_lower_[row]==lb&&lp.row_upper_[row]==ub&&rows[row]==terms,"HiGHS changed exported row: "+name);}; + check("r"+std::to_string(r.constraint.id),r.lower,split?inf:r.upper); + if(split)check("u"+std::to_string(r.constraint.id),-inf,r.upper); + } + require(expected_rows==static_cast(lp.num_row_),"HiGHS changed exported row count"); +} +void highs_portability(const fs::path& dir){ + auto all=comprehensive();for(const auto& ext:{".lp",".mps"})highs_export(all.snapshot(),dir/(std::string("highs-all")+ext)); + for(const auto& bounds:std::vector>{{0.25,0.75},{0,0},{1,1}}){ + O::Model m;auto x=m.add_binary();m.set_bounds(x,bounds.first,bounds.second);m.minimize({{x,1}}); + highs_export(m.snapshot(),dir/"highs-tighter.lp"); + } + O::Model m;auto x=m.add_integer(0,10);m.add_row({{x,100000000000000.125}},100000000000000.25,inf);m.minimize({{x,1}},0.125); + for(const auto& ext:{".lp",".mps"})highs_export(m.snapshot(),dir/(std::string("highs-precision")+ext)); +} +#endif +void public_mps(const fs::path& directory,const fs::path& output){ + struct Entry{const char* name;std::size_t variables,rows;}; + for(const auto& e:std::vector{{"p0033",33,16},{"lseu",89,28},{"p0201",201,133},{"p0282",282,241},{"p0548",548,176}}){ + const auto path=directory/(std::string(e.name)+".mps");auto m=O::read_model(path.string()).snapshot(); + require(m.variables.size()==e.variables&&m.rows.size()==e.rows,std::string("public MPS dimensions: ")+e.name); + for(const auto& v:m.variables)require((v.type==O::VariableType::Binary||v.type==O::VariableType::Integer)&&v.lower==0&&v.upper==1,"public binary bounds/types"); + O::validate_structure(m); + for(const auto& extension:{".lp",".mps"}){const auto saved=output/(std::string(e.name)+extension); + O::write_model(m,saved.string());equal(m,O::read_model(saved.string()).snapshot());} +#ifdef GECODE_OPTIMIZE_IO_TEST_HIGHS + for(const auto& extension:{".lp",".mps"})highs_export(m,output/(std::string("highs-")+e.name+extension)); +#endif + } +} +} +int main(int argc,char** argv){ + try{Directory temp;roundtrips(temp.path);precision(temp.path);lp_semantics(temp.path);mps_semantics(temp.path);type_declarations(temp.path);failures(temp.path); +#ifdef GECODE_OPTIMIZE_IO_TEST_HIGHS + highs_portability(temp.path); +#endif + if(argc>1)public_mps(argv[1],temp.path); + std::cout<<"PASS lossless numerical LP/MPS I/O"<<(argc>1?" and five public MPS imports":"") +#ifdef GECODE_OPTIMIZE_IO_TEST_HIGHS + <<" with independent HiGHS export checks" +#endif + <<'\n';return 0; + }catch(const std::exception& e){std::cerr<<"FAIL: "< +#include +#include +#include +#include +#include +#include +#include +namespace O=Gecode::Optimize; +using B=O::LpBasisStatus; +using S=O::LpBasisSubmissionState; +constexpr double inf=std::numeric_limits::infinity(); +static void near(double a,double b){assert(std::isfinite(a)&&std::abs(a-b)<1e-7);} +templatestatic void invalid(F fn){bool caught=false;try{fn();}catch(const O::ModelError&){caught=true;}assert(caught);} +static void optimal(const O::LpBasisSolveResult& out,double objective){ + if(out.observed.result.termination!=O::Termination::Optimal) + std::cerr<checks().accepted); +} +int main(){ + O::Model model;auto x=model.add_continuous(),y=model.add_continuous(); + auto row=model.add_row({{x,1},{y,1}},4,inf);model.minimize({{x,2},{y,3}},7); + O::LpBasisData data;data.source=model.snapshot();data.columns={B::Basic,B::Lower};data.rows={B::Lower}; + auto basis=O::make_lp_basis(data);assert(basis->origin()==O::LpBasisOrigin::Caller); + assert(basis->id()==model.id()&&basis->revision()==model.revision()); + data.source.objective.offset=100;data.columns[0]=B::Upper; + assert(basis->source().objective.offset==7&&*basis->columns()[0]==B::Basic); + for(int mode=0;mode<9;++mode){ + O::LpBasisData bad;bad.source=basis->source();bad.rows=basis->rows();bad.columns=basis->columns(); + if(mode==0)bad.rows.clear(); + if(mode==1)bad.columns.push_back(B::Lower); + if(mode==2)bad.columns[0].reset(); + if(mode==3)bad.columns[0]=B::Lower; + if(mode==4)bad.columns[1]=B::Basic; + if(mode==5)bad.columns[1]=static_cast(99); + if(mode==6)bad.columns[1]=B::Upper; + if(mode==7)bad.columns[1]=B::Zero; + if(mode==8)bad.source.rows[0].terms[0].variable.model_id=0; + invalid([&]{O::make_lp_basis(bad);}); + } + O::Model constant;constant.add_row({},-1,1);O::LpBasisData cd;cd.source=constant.snapshot();cd.rows={B::Basic}; + invalid([&]{O::make_lp_basis(cd);}); + O::Model integer;integer.add_integer(0,1);O::LpBasisData id;id.source=integer.snapshot();id.columns={B::Lower}; + invalid([&]{O::make_lp_basis(id);}); + O::LpBasisSolveOptions options;options.basis=basis; + O::SolveSession session; + auto missing=session.solve_lp_with_basis(model,{});assert(missing.observed.result.termination==O::Termination::InvalidModel); + assert(missing.submission.state==S::NotAttempted&&!missing.submission.backend_attempted); + auto starts=options;starts.observations.solve.primal_start={{x,4},{y,0}}; + assert(session.solve_lp_with_basis(model,starts).observed.result.termination==O::Termination::InvalidModel); + assert(session.statistics().solve_calls==0); + // Every compatible-content gate is checked even if an untrusted snapshot reuses revision. + for(int mode=0;mode<9;++mode){ + auto changed=model.snapshot(); + if(mode==0)++changed.revision; + if(mode==1)changed.variables[0].upper=10; + if(mode==2)changed.variables[0].name="new label"; + if(mode==3)changed.rows[0].lower=3; + if(mode==4)changed.rows[0].name="new row label"; + if(mode==5)changed.rows[0].terms[0].coefficient=2; + if(mode==6)changed.objective.offset=8; + if(mode==7)changed.objective.sense=O::ObjectiveSense::Maximize; + if(mode==8)changed.objective.terms[0].coefficient=1; + auto out=session.solve_lp_with_basis(changed,options); + assert(out.observed.result.termination==O::Termination::InvalidModel&&!out.submission.backend_attempted); + assert(out.requested_basis==basis&&session.statistics().solve_calls==0); + } + O::Model foreign;auto fx=foreign.add_continuous(),fy=foreign.add_continuous(); + foreign.add_row({{fx,1},{fy,1}},4,inf);foreign.minimize({{fx,2},{fy,3}},7); + assert(session.solve_lp_with_basis(foreign,options).observed.result.termination==O::Termination::InvalidModel); + for(auto backend:{O::Backend::Native}){ + auto unsupported=options;unsupported.observations.solve.backend=backend; + auto out=session.solve_lp_with_basis(model,unsupported);assert(out.observed.result.termination==O::Termination::Unsupported&&!out.submission.backend_attempted); + } + auto exact=options;exact.observations.solve.guarantee=O::Guarantee::Exact; + assert(session.solve_lp_with_basis(model,exact).observed.result.termination==O::Termination::Unsupported); + if(!O::lp_observation_capabilities().available){ + auto out=session.solve_lp_with_basis(model,options);assert(out.observed.result.termination==O::Termination::Unsupported); + assert(out.submission.state==S::NotAttempted&&!out.submission.backend_attempted&&out.requested_basis==basis); + std::cout<<"LP basis factory, source admission and missing-backend checks passed\n";return 0; + } + auto first=session.solve_lp_with_basis(model,options);optimal(first,15);assert(first.submission.state==S::Accepted); + assert(session.statistics().model_loads==1&&session.statistics().basis_warm_starts==0); + auto exported=O::make_lp_basis(*first.observed.observations);assert(exported->origin()==O::LpBasisOrigin::Observations); + options.basis=exported;optimal(session.solve_lp_with_basis(model,options),15); + optimal(O::solve_lp_with_basis(model,options),15); + // Round-trip original row statuses for max sense and ranged/free entities. + for(int scenario=0;scenario<3;++scenario){ + O::Model ranged;auto a=ranged.add_continuous(-inf,inf),fixed=ranged.add_continuous(2,2); + ranged.add_row({{a,1}},1,4); + if(scenario==0)ranged.maximize({{a,2},{fixed,1}},7); + else ranged.minimize({{a,scenario==1?1.0:-1.0},{fixed,1}},7); + const double objective[]={17,10,5}; + auto observed=O::solve_lp_observed(ranged); + assert(observed.observations->basis().state==O::LpObservationState::Available); + O::LpBasisSolveOptions ro;ro.basis=O::make_lp_basis(*observed.observations); + optimal(O::solve_lp_with_basis(ranged,ro),objective[scenario]); + } + // A legitimate nonoptimal all-logical basis is accepted before later pivots. + data.source=model.snapshot();data.columns={B::Lower,B::Lower};data.rows={B::Basic}; + options.basis=O::make_lp_basis(data);auto logical=session.solve_lp_with_basis(model,options);optimal(logical,15); + assert(logical.submission.state==S::Accepted&&!*logical.submission.statuses_changed); + assert(logical.observed.observations->columns()[0].basis==B::Basic); + // Count-correct singular structural basis: HiGHS repairs before optimization. + { + O::Model singular;auto a=singular.add_continuous(),b=singular.add_continuous(); + singular.add_row({{a,1},{b,1}},1,1);singular.add_row({{a,2},{b,2}},2,2); + singular.minimize({{a,1},{b,2}}); + O::LpBasisData sd;sd.source=singular.snapshot();sd.columns={B::Basic,B::Basic};sd.rows={B::Lower,B::Lower}; + O::LpBasisSolveOptions so;so.basis=O::make_lp_basis(sd); + auto repaired=session.solve_lp_with_basis(singular,so);optimal(repaired,1); + assert(repaired.submission.state==S::Repaired&&*repaired.submission.statuses_changed); + near(*session.solve(singular).objective,1); + optimal(session.solve_lp_with_basis(singular,so),1); + } + // Zero-row submitted statuses must never enter the pinned unsafe alien branch. + { + O::Model zero;auto a=zero.add_continuous(0,5),b=zero.add_continuous(-inf,inf),c=zero.add_continuous(-2,3); + zero.minimize({{a,1},{c,-1}},5); + O::LpBasisData zd;zd.source=zero.snapshot();zd.columns={B::Lower,B::Zero,B::Upper}; + O::LpBasisSolveOptions zo;zo.basis=O::make_lp_basis(zd); + auto out=O::solve_lp_with_basis(zero,zo);optimal(out,2);assert(out.submission.state==S::Accepted); + near(out.observed.result.value(b),0); + } + // Tombstones retain their slot but never carry a submitted status. + { + O::Model holes;auto removed=holes.add_continuous();holes.remove(removed);auto a=holes.add_continuous(); + auto deleted=holes.add_row({},-1,1);holes.remove(deleted);holes.add_row({{a,1}},2,inf);holes.minimize({{a,1}}); + O::LpBasisData hd;hd.source=holes.snapshot();hd.columns={std::nullopt,B::Basic};hd.rows={std::nullopt,B::Lower}; + O::LpBasisSolveOptions ho;ho.basis=O::make_lp_basis(hd);optimal(O::solve_lp_with_basis(holes,ho),2); + hd.columns[0]=B::Lower;invalid([&]{O::make_lp_basis(hd);}); + hd.columns[0].reset();hd.rows[0]=B::Basic;invalid([&]{O::make_lp_basis(hd);}); + } + options.basis=exported;auto zero=options;zero.observations.solve.time_limit_seconds=0; + auto limited=session.solve_lp_with_basis(model,zero);assert(limited.observed.result.termination==O::Termination::TimeLimit&&!limited.submission.backend_attempted); + auto cancel=options;cancel.observations.solve.cancellation=std::make_shared();cancel.observations.solve.cancellation->cancel(); + assert(session.solve_lp_with_basis(model,cancel).observed.result.termination==O::Termination::Cancelled); + optimal(session.solve_lp_with_basis(model,options),15); + auto p=options;p.observations.duals=p.observations.basis=false;auto primal=session.solve_lp_with_basis(model,p); + assert(primal.observed.result.has_solution()&&primal.observed.observations->basis().state==O::LpObservationState::NotRequested); + invalid([&]{O::make_lp_basis(*primal.observed.observations);}); + model.set_bounds(row,5,inf); + assert(session.solve_lp_with_basis(model,options).observed.result.termination==O::Termination::InvalidModel); + near(*session.solve(model).objective,17); + session.reset();assert(first.requested_basis->source().objective.offset==7); + assert(first.observed.observations->row(row).dual==2); + O::SolveSession moved(std::move(session)); + assert(session.solve_lp_with_basis(model,options).observed.result.termination==O::Termination::InvalidModel); + O::Model empty;empty.minimize({},7);O::LpBasisData ed;ed.source=empty.snapshot(); + O::LpBasisSolveOptions eo;eo.basis=O::make_lp_basis(ed); + auto empty_result=O::solve_lp_with_basis(empty,eo); + assert(empty_result.observed.result.termination==O::Termination::Optimal); + near(*empty_result.observed.result.objective,7); + assert(empty_result.requested_basis&&empty_result.submission.state==S::NotAttempted&&!empty_result.submission.backend_attempted); + std::shared_ptr detached; + { + O::Model temporary;auto a=temporary.add_continuous();temporary.add_row({{a,1}},2,inf); + temporary.minimize({{a,1}},1);O::LpBasisData td;td.source=temporary.snapshot(); + td.columns={B::Basic};td.rows={B::Lower};detached=O::make_lp_basis(td); + } + O::LpBasisSolveOptions detached_options;detached_options.basis=detached;detached.reset(); + auto retained=O::solve_lp_with_basis(detached_options.basis->source(),detached_options);optimal(retained,3); + detached_options.basis.reset();assert(retained.requested_basis->source().objective.offset==1); + std::cout<<"LP basis accepted/repaired, singular/zero-row, source and session conformance passed\n"; +} diff --git a/test/optimize/lp_basis_c_api.c b/test/optimize/lp_basis_c_api.c new file mode 100644 index 0000000000..ade44235e1 --- /dev/null +++ b/test/optimize/lp_basis_c_api.c @@ -0,0 +1,83 @@ +/* Compile this consumer as C99, then link the versioned shared C ABI. */ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#define OK(call) do { int32_t code=(call); if(code)fprintf(stderr,"%s: %s\n",#call,gecode_opt_v1_last_error()); assert(code==GECODE_OPT_OK); } while(0) +int main(void) { + gecode_opt_handle model=0,basis=0,session=0,solved=0,observed=0,ordinary=0,copy=0,exported=0; + gecode_opt_id x,y,dead,row,deleted,foreign; + gecode_opt_term terms[2];int32_t columns[3]={1,0,-1},rows[2]={-1,0},status=-9; + gecode_opt_basis_info_v1 info;gecode_opt_basis_result_info_v1 result; + gecode_opt_lp_capabilities_v1 caps;gecode_opt_lp_options_v1 options; + uint64_t needed=0;int32_t small[2]={91,92}; + OK(gecode_opt_v1_lp_capabilities(&caps,sizeof(caps))); + OK(gecode_opt_v1_model_create(&model)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,INFINITY,"x",&x)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,INFINITY,"y",&y)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,1,"deleted",&dead)); + OK(gecode_opt_v1_model_remove_variable(model,dead)); + OK(gecode_opt_v1_model_add_row(model,NULL,0,-1,1,"deleted",&deleted)); + OK(gecode_opt_v1_model_remove_row(model,deleted)); + terms[0].variable=x;terms[0].coefficient=1;terms[1].variable=y;terms[1].coefficient=1; + OK(gecode_opt_v1_model_add_row(model,terms,2,4,INFINITY,"demand",&row)); + terms[0].coefficient=2;terms[1].coefficient=3; + OK(gecode_opt_v1_model_set_objective(model,terms,2,0,7)); + assert(gecode_opt_v1_basis_from_model(model,columns,3,rows,2,NULL)==GECODE_OPT_INVALID_ARGUMENT); + basis=99;assert(gecode_opt_v1_basis_from_model(model,NULL,3,rows,2,&basis)==GECODE_OPT_INVALID_ARGUMENT&&basis==0); + assert(gecode_opt_v1_basis_from_model(model,columns,UINT64_MAX,rows,2,&basis)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_basis_from_model(model,columns,2,rows,2,&basis)==GECODE_OPT_MODEL_ERROR); + columns[0]=-2;assert(gecode_opt_v1_basis_from_model(model,columns,3,rows,2,&basis)==GECODE_OPT_INVALID_ARGUMENT); + columns[0]=1;columns[2]=0;assert(gecode_opt_v1_basis_from_model(model,columns,3,rows,2,&basis)==GECODE_OPT_MODEL_ERROR); + columns[2]=-1;OK(gecode_opt_v1_basis_from_model(model,columns,3,rows,2,&basis)); + OK(gecode_opt_v1_basis_info(basis,&info,sizeof(info))); + assert(info.struct_size==sizeof(info)&&info.reserved==0&&info.reserved_flags==0&&info.origin==GECODE_OPT_BASIS_CALLER); + assert(info.column_slots==3&&info.row_slots==2&&info.model_id==x.model_id); + assert(gecode_opt_v1_basis_info(basis,&info,sizeof(info)-1)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_basis_info(model,&info,sizeof(info))==GECODE_OPT_INVALID_HANDLE); + assert(gecode_opt_v1_basis_statuses(basis,99,NULL,0,&needed)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_basis_statuses(basis,GECODE_OPT_VARIABLE_ID,NULL,0,&needed));assert(needed==3); + assert(gecode_opt_v1_basis_statuses(basis,GECODE_OPT_VARIABLE_ID,small,2,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + assert(small[0]==91&&small[1]==92&&needed==3); + OK(gecode_opt_v1_basis_column(basis,x,&status));assert(status==GECODE_OPT_LP_BASIS_BASIC); + OK(gecode_opt_v1_basis_row(basis,row,&status));assert(status==GECODE_OPT_LP_BASIS_LOWER); + assert(gecode_opt_v1_basis_column(basis,dead,&status)==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_basis_row(basis,deleted,&status)==GECODE_OPT_MODEL_ERROR); + foreign=x;foreign.model_id++;assert(gecode_opt_v1_basis_column(basis,foreign,&status)==GECODE_OPT_MODEL_ERROR); + foreign=x;foreign.reserved=1;assert(gecode_opt_v1_basis_column(basis,foreign,&status)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_basis_row(basis,x,&status)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_session_create(&session));OK(gecode_opt_v1_lp_options_default(&options,sizeof(options))); + options.reserved=1;assert(gecode_opt_v1_solve_lp_with_basis(model,basis,&options,&solved)==GECODE_OPT_INVALID_ARGUMENT&&solved==0);options.reserved=0; + options.solve.reserved=1;assert(gecode_opt_v1_solve_lp_with_basis(model,basis,&options,&solved)==GECODE_OPT_INVALID_ARGUMENT);options.solve.reserved=0; + assert(gecode_opt_v1_solve_lp_with_basis(model,model,&options,&solved)==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_session_solve_lp_with_basis(session,model,basis,&options,&solved)); + OK(gecode_opt_v1_basis_result_info(solved,&result,sizeof(result))); + assert(result.struct_size==sizeof(result)&&result.reserved==0&&result.reserved_flags==0&&result.result.reserved==0); + assert(result.has_requested_basis&&result.requested_model_id==x.model_id); + assert(result.result.termination==(caps.available?GECODE_OPT_OPTIMAL:GECODE_OPT_UNSUPPORTED)); + assert(result.state==(caps.available?GECODE_OPT_BASIS_ACCEPTED:GECODE_OPT_BASIS_NOT_ATTEMPTED)); + assert(result.backend_attempted==caps.available&&result.has_statuses_changed==caps.available&&!result.statuses_changed); + assert(gecode_opt_v1_basis_result_info(basis,&result,sizeof(result))==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_basis_result_message(solved,NULL,0,&needed));assert(needed>0); + {char text[4096];assert(needed<=sizeof(text));OK(gecode_opt_v1_basis_result_message(solved,text,sizeof(text),&needed));assert(text[needed-1]=='\0');} + OK(gecode_opt_v1_basis_result_copy_observed(solved,&observed)); + OK(gecode_opt_v1_basis_result_copy_basis(solved,©)); + OK(gecode_opt_v1_lp_observed_result_copy_result(observed,&ordinary)); + if(caps.available) {OK(gecode_opt_v1_basis_from_observed(observed,&exported));OK(gecode_opt_v1_basis_info(exported,&info,sizeof(info)));assert(info.origin==GECODE_OPT_BASIS_OBSERVATIONS);} + else assert(gecode_opt_v1_basis_from_observed(observed,&exported)==GECODE_OPT_MODEL_ERROR&&exported==0); + OK(gecode_opt_v1_basis_result_destroy(solved));OK(gecode_opt_v1_basis_destroy(basis)); + assert(gecode_opt_v1_basis_info(basis,&info,sizeof(info))==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_lp_observed_result_destroy(observed)); + OK(gecode_opt_v1_model_set_row_bounds(model,row,5,INFINITY)); + OK(gecode_opt_v1_session_solve_lp_with_basis(session,model,copy,NULL,&solved)); + OK(gecode_opt_v1_basis_result_info(solved,&result,sizeof(result)));assert(result.result.termination==GECODE_OPT_INVALID_MODEL&&!result.backend_attempted); + OK(gecode_opt_v1_model_destroy(model));OK(gecode_opt_v1_session_destroy(session)); + OK(gecode_opt_v1_basis_column(copy,x,&status));assert(status==1); + if(caps.available) {int32_t present=0;double value=0;OK(gecode_opt_v1_result_number(ordinary,GECODE_OPT_OBJECTIVE,&present,&value));assert(present&&fabs(value-15)<1e-7);OK(gecode_opt_v1_result_value(ordinary,x,&value));assert(value==4);OK(gecode_opt_v1_basis_destroy(exported));} + OK(gecode_opt_v1_result_destroy(ordinary));OK(gecode_opt_v1_basis_result_destroy(solved));OK(gecode_opt_v1_basis_destroy(copy)); + puts("C99 owning basis, submission, buffers, source identity and lifetime conformance passed");return 0; +} diff --git a/test/optimize/lp_basis_failure.cpp b/test/optimize/lp_basis_failure.cpp new file mode 100644 index 0000000000..09c4f49c82 --- /dev/null +++ b/test/optimize/lp_basis_failure.cpp @@ -0,0 +1,62 @@ +// Link against a separately compiled solve.cpp with +// GECODE_OPTIMIZE_TEST_LP_BASIS_FAILURE=1, and real HiGHS. The seam injects +// rejection/cancellation only AFTER real setBasis has modified backend state. +#include +#include +#include +#include +#include +#include +namespace O=Gecode::Optimize; +using B=O::LpBasisStatus; +using S=O::LpBasisSubmissionState; +static bool inject_cancellation=false; +namespace Gecode { namespace Optimize { namespace Detail { +bool lp_basis_test_cancel() noexcept { return inject_cancellation; } +}}} +static void value(const O::SolveResult& result,double objective){ + assert(result.termination==O::Termination::Optimal&&result.has_solution()); + assert(std::abs(*result.objective-objective)<1e-7); +} +int main(){ + assert(O::lp_observation_capabilities().available); // Required real numerical backend. + const double inf=std::numeric_limits::infinity(); + O::Model model;auto x=model.add_continuous(),y=model.add_continuous(); + model.add_row({{x,1},{y,1}},4,inf);model.minimize({{x,2},{y,3}},7); + O::LpBasisData data;data.source=model.snapshot();data.columns={B::Basic,B::Lower};data.rows={B::Lower}; + O::LpBasisSolveOptions options;options.basis=O::make_lp_basis(data); + O::SolveSession session; + auto historical=session.solve_lp_observed(model);value(historical.result,15); + const auto initial_loads=session.statistics().model_loads; + auto rejected=session.solve_lp_with_basis(model,options); + assert(rejected.submission.backend_attempted&&rejected.submission.state==S::Rejected); + assert(!rejected.submission.statuses_changed&&!rejected.observed.result.has_solution()); + assert(rejected.observed.result.termination==O::Termination::BackendError); + assert(rejected.observed.observations->basis().state!=O::LpObservationState::Available); + // No fallback solve occurred. The next call must load a clean backend. + assert(session.statistics().model_loads==initial_loads); + value(session.solve(model),15);assert(session.statistics().model_loads==initial_loads+1); + assert(historical.observations->checks().accepted&&historical.observations->rows()[0].dual==2); + // Cancellation after actual factor/repair has completed also clears callbacks + // and disposes the backend before the caller can reuse the session. + options.observations.solve.cancellation=std::make_shared(); + inject_cancellation=true; + const auto before=session.statistics().model_loads; + auto cancelled=session.solve_lp_with_basis(model,options); + assert(cancelled.submission.backend_attempted&&cancelled.submission.state==S::Interrupted); + assert(!cancelled.submission.statuses_changed); + assert(cancelled.observed.result.termination==O::Termination::Cancelled); + assert(cancelled.observed.observations->dual_point().reason==O::LpObservationReason::Interrupted); + value(session.solve(model),15);assert(session.statistics().model_loads==before+1); + // The zero-row safe submission path has the same cleanup contract. + O::Model zero;auto z=zero.add_continuous(0,5);zero.minimize({{z,-1}},2); + O::LpBasisData zd;zd.source=zero.snapshot();zd.columns={B::Upper}; + options={};options.basis=O::make_lp_basis(zd); + inject_cancellation=false; + auto zero_failure=session.solve_lp_with_basis(zero,options); + assert(zero_failure.submission.backend_attempted&&zero_failure.submission.state==S::Rejected); + assert(zero_failure.observed.result.termination==O::Termination::BackendError); + const auto zero_loads=session.statistics().model_loads; + value(session.solve(zero),-3);assert(session.statistics().model_loads==zero_loads+1); + std::cout<<"LP basis post-real-submission rejection/cancellation cleanup passed\n"; +} diff --git a/test/optimize/lp_evidence.cpp b/test/optimize/lp_evidence.cpp new file mode 100644 index 0000000000..1b554b5d6e --- /dev/null +++ b/test/optimize/lp_evidence.cpp @@ -0,0 +1,115 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +namespace O=Gecode::Optimize; +using State=O::LpEvidenceState;using Request=O::LpEvidenceRequest; +constexpr double inf=std::numeric_limits::infinity(); +static void near(double a,double b){assert(std::isfinite(a)&&std::abs(a-b)<1e-7);} +templatestatic void invalid(F fn){bool caught=false;try{fn();}catch(const O::ModelError&){caught=true;}assert(caught);} +static const O::LpEvidence& good(const O::LpEvidenceResult& r){ + if(r.completion!=O::LpEvidenceCompletion::Complete)std::cerr<stages()){ + assert(stage.auxiliary_model&&stage.columns.size()==stage.auxiliary_model->variables.size()); + if(stage.phase!=O::LpEvidencePhase::FeasibleBase){ + std::vector zero(stage.columns.size(),0); + assert(O::validate(*stage.auxiliary_model,zero,0,0).valid); + } + if(stage.attempted){assert(stage.auxiliary_result); + assert(stage.auxiliary_model->model_id!=r.model_id&&stage.auxiliary_result->model_id==stage.auxiliary_model->model_id); + assert(stage.auxiliary_result->revision==stage.auxiliary_model->revision&&stage.auxiliary_result->guarantee==O::Guarantee::Numerical);} + } + return *r.evidence; +} +int main(){ + O::Model basic;auto x=basic.add_continuous();basic.minimize({{x,-1}},7); + for(auto request:{Request::Automatic,Request::PrimalRay,Request::Farkas,Request::Both}){ + O::LpEvidenceOptions options;options.request=request;auto out=O::analyze_lp_evidence(basic,options); + if(!O::capabilities(O::Backend::Highs).available){assert(out.stop_reason==O::Termination::Unsupported&&out.attempted_calls==0&&out.evidence);continue;} + const auto& e=good(out);assert(out.attempted_calls==(request==Request::Farkas?1:request==Request::Both?3:2)); + if(request!=Request::Farkas){assert(e.primal_ray().state==State::Available);near(e.base_value(x),0);near(e.direction_value(x),1);near(*e.primal_data().normalized_objective_slope,-1);} + if(request!=Request::PrimalRay)assert(e.farkas().state==State::Unavailable); + } + O::LpEvidenceOptions options; + for(int mode=0;mode<7;++mode){auto wrong=options; + if(mode==0)wrong.request=static_cast(99); + if(mode==1)wrong.checks.recession=-1; + if(mode==2)wrong.checks.stationarity=inf; + if(mode==3)wrong.checks.minimum_contradiction=std::numeric_limits::quiet_NaN(); + if(mode==4)wrong.solve.backend=O::Backend::Native; + if(mode==5)wrong.solve.guarantee=O::Guarantee::Exact; + if(mode==6)wrong.solve.primal_start={{x,0}}; + auto out=O::analyze_lp_evidence(basic,wrong);assert(out.attempted_calls==0&&out.completion==O::LpEvidenceCompletion::Rejected); + } + auto invalid_source=basic.snapshot();invalid_source.variables[0].variable.model_id=0; + assert(O::analyze_lp_evidence(invalid_source).stop_reason==O::Termination::InvalidModel); + {O::Model discrete;discrete.add_integer(0,0);assert(O::analyze_lp_evidence(discrete).stop_reason==O::Termination::Unsupported);} + {O::Model global;O::add_all_different(global,{});assert(O::analyze_lp_evidence(global).stop_reason==O::Termination::Unsupported);} + for(int stop=0;stop<6;++stop){auto limited=options; + if(stop==0)limited.solve.time_limit_seconds=0; + if(stop==1){limited.solve.cancellation=std::make_shared();limited.solve.cancellation->cancel();} + if(stop==2)limited.limits.max_work=0; + if(stop==3)limited.limits.max_auxiliary_variables=0; + if(stop==4)limited.limits.max_retained_slots=0; + if(stop==5)limited.solve.node_limit=0; + auto out=O::analyze_lp_evidence(basic,limited);assert(out.attempted_calls==0&&out.stop_reason); + } + if(!O::capabilities(O::Backend::Highs).available){std::cout<<"LP evidence core admission and missing backend passed\n";return 0;} + for(bool maximize:{false,true})for(bool upper:{false,true}){ + O::Model m;auto v=m.add_continuous(upper?-inf:0,upper?0:inf); + const double coefficient=(upper?1:-1)*(maximize?-1:1); + m.set_objective({{v,coefficient}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,1e16); + auto out=O::analyze_lp_evidence(m);const auto& e=good(out);assert(e.primal_ray().state==State::Available); + near(e.direction_value(v),upper?-1:1);near(*e.primal_data().normalized_objective_slope,-1); + } + { + O::Model m;auto a=m.add_continuous(-inf,inf),b=m.add_continuous(-inf,inf),fixed=m.add_continuous(2,2); + auto equality=m.add_row({{a,1},{b,-1}},0,0);auto ranged=m.add_row({{fixed,1}},1,3);m.minimize({{a,-1}},100); + auto out=O::analyze_lp_evidence(m);const auto& e=good(out);near(e.direction_value(a),1);near(e.direction_value(b),1);near(e.direction_value(fixed),0); + near(e.primal_data().row_direction[equality.id],0);near(e.primal_data().row_direction[ranged.id],0); + } + for(bool upper:{false,true})for(bool maximize:{false,true}){ + O::Model m;auto v=m.add_continuous(upper?0:-inf,upper?inf:0); + auto r=m.add_row({{v,1}},upper?-inf:1,upper?-1:inf);m.set_objective({{v,1}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,7); + auto out=O::analyze_lp_evidence(m);const auto& e=good(out);assert(e.farkas().state==State::Available&&e.primal_ray().state==State::Unavailable); + near(e.row_multiplier(r).multiplier,upper?-1:1);near(e.column_multiplier(v).multiplier,upper?1:-1);near(*e.farkas_data().contradiction_margin,1); + assert(e.row_multiplier(r).side==(upper?O::LpEvidenceSide::Upper:O::LpEvidenceSide::Lower)); + assert(out.attempted_calls==2&&!e.stages()[1].attempted); + } + { + O::Model m;auto v=m.add_continuous(-inf,inf);auto lower=m.add_row({{v,1}},1,inf);auto upper=m.add_row({{v,1}},-inf,0); + O::LpEvidenceOptions o;o.request=Request::Farkas;auto out=O::analyze_lp_evidence(m,o);const auto& e=good(out); + near(e.row_multiplier(lower).multiplier,1);near(e.row_multiplier(upper).multiplier,-1);near(e.column_multiplier(v).multiplier,0); + assert(!e.column_multiplier(v).side);near(*e.farkas_data().contradiction_margin,1); + } + { + O::Model m;auto r=m.add_row({},-inf,-2);auto out=O::analyze_lp_evidence(m);const auto& e=good(out); + assert(e.farkas().state==State::Available&&e.farkas_data().columns.empty());near(e.row_multiplier(r).multiplier,-1);near(*e.farkas_data().contradiction_margin,2); + } + { + O::Model m;auto v=m.add_continuous(0,0);m.add_row({{v,1}},1,1);auto out=O::analyze_lp_evidence(m);const auto& e=good(out); + assert(e.farkas().state==State::Available);near(e.column_multiplier(v).multiplier,-1); + } + for(bool empty:{false,true}){ + O::Model m;if(!empty){auto v=m.add_continuous(0,1);m.minimize({{v,1}});}O::LpEvidenceOptions o;o.request=Request::Both; + auto out=O::analyze_lp_evidence(m,o);const auto& e=good(out);assert(e.primal_ray().state==State::Unavailable&&e.farkas().state==State::Unavailable&&out.attempted_calls==3); + } + { + O::Model m;auto v=m.add_continuous(0,0);auto u=m.add_continuous(0,inf);m.add_row({{v,1}},1,inf);m.minimize({{u,-1}}); + auto out=O::analyze_lp_evidence(m);const auto& e=good(out);assert(e.primal_ray().state==State::Unavailable&&e.primal_data().direction.empty()&&e.farkas().state==State::Available); + } + O::LpEvidenceResult historical;O::Variable live,dead;O::Constraint removed; + {O::Model m;dead=m.add_continuous();m.remove(dead);live=m.add_continuous();removed=m.add_row({},-1,1);m.remove(removed);m.minimize({{live,-1}}); + historical=O::analyze_lp_evidence(m);m.maximize({{live,1}},9);} + const auto& h=good(historical);near(h.direction_value(live),1);assert(std::isnan(h.primal_data().direction[dead.id])); + invalid([&]{h.direction_value(dead);});invalid([&]{h.direction_value({live.model_id+1,live.id});});invalid([&]{h.row_multiplier(removed);}); + options.limits.max_auxiliary_solves=1;auto capped=O::analyze_lp_evidence(basic,options);assert(capped.stop_reason==O::Termination::IterationLimit&&capped.attempted_calls==1&&capped.evidence->primal_ray().state!=State::Available); + std::cout<<"LP evidence original signs, bounds, rays, Farkas, zero rows, identities and limits passed\n"; +} diff --git a/test/optimize/lp_evidence_binding_cleanup.cpp b/test/optimize/lp_evidence_binding_cleanup.cpp new file mode 100644 index 0000000000..b4653c9cd5 --- /dev/null +++ b/test/optimize/lp_evidence_binding_cleanup.cpp @@ -0,0 +1,52 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +static gecode_opt_handle cancellation=0; +extern "C" void gecode_opt_test_evidence_binding_checkpoint(void){ + if(cancellation)assert(gecode_opt_v1_cancellation_cancel(cancellation)==GECODE_OPT_OK); +} +static void ok(int32_t code){if(code)std::cerr<::infinity(); + for(bool farkas:{false,true}){ + gecode_opt_handle model=0,analysis=0,child=0;gecode_opt_id x{},row{}; + ok(gecode_opt_v1_model_create(&model));ok(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,farkas?-inf:0,farkas?0:inf,"x",&x)); + gecode_opt_term t{x,farkas?1.0:-1.0}; + if(farkas)ok(gecode_opt_v1_model_add_row(model,&t,1,1,inf,"contradiction",&row)); + else ok(gecode_opt_v1_model_set_objective(model,&t,1,GECODE_OPT_MINIMIZE,7)); + gecode_opt_evidence_options_v1 options{};ok(gecode_opt_v1_evidence_options_default(&options,sizeof(options))); + options.request=farkas?GECODE_OPT_EVIDENCE_FARKAS:GECODE_OPT_EVIDENCE_PRIMAL_RAY; + ok(gecode_opt_v1_analyze_lp_evidence(model,&options,&analysis)); + gecode_opt_evidence_group_v1 group{}; + ok(gecode_opt_v1_lp_evidence_group(analysis,farkas?1:0,&group,sizeof(group)));assert(group.state==GECODE_OPT_EVIDENCE_AVAILABLE); + ok(gecode_opt_v1_lp_evidence_destroy(analysis)); + ok(gecode_opt_v1_cancellation_create(&cancellation));options.solve.cancellation=cancellation; + ok(gecode_opt_v1_analyze_lp_evidence(model,&options,&analysis)); + gecode_opt_evidence_info_v1 info{};ok(gecode_opt_v1_lp_evidence_info(analysis,&info,sizeof(info))); + assert(info.has_evidence&&info.completion==GECODE_OPT_EVIDENCE_INTERRUPTED&&info.has_stop_reason&&info.stop_reason==GECODE_OPT_CANCELLED); + ok(gecode_opt_v1_lp_evidence_group(analysis,farkas?1:0,&group,sizeof(group))); + assert(group.state==GECODE_OPT_EVIDENCE_UNAVAILABLE&&group.reason==GECODE_OPT_EVIDENCE_REASON_STOPPED); + ok(gecode_opt_v1_lp_evidence_group(analysis,farkas?0:1,&group,sizeof(group)));assert(group.state==GECODE_OPT_EVIDENCE_NOT_REQUESTED); + double value=0;gecode_opt_evidence_slot_v1 slot{}; + assert(gecode_opt_v1_lp_evidence_value(analysis,x,GECODE_OPT_EVIDENCE_BASE_VALUE,&value)==GECODE_OPT_NO_EVIDENCE); + assert(gecode_opt_v1_lp_evidence_value(analysis,x,GECODE_OPT_EVIDENCE_DIRECTION_VALUE,&value)==GECODE_OPT_NO_EVIDENCE); + assert(gecode_opt_v1_lp_evidence_multiplier(analysis,farkas?row:x,&slot,sizeof(slot))==GECODE_OPT_NO_EVIDENCE); + ok(gecode_opt_v1_lp_evidence_slot(analysis,farkas?row:x,&slot,sizeof(slot))); + assert(farkas?slot.multiplier.present:slot.direction.present); + ok(gecode_opt_v1_lp_evidence_copy_stage(analysis,farkas?0:1,&child)); + ok(gecode_opt_v1_lp_evidence_destroy(analysis));ok(gecode_opt_v1_model_destroy(model));ok(gecode_opt_v1_cancellation_destroy(cancellation));cancellation=0; + gecode_opt_evidence_stage_v1 stage{};ok(gecode_opt_v1_lp_evidence_stage_info(child,&stage,sizeof(stage))); + assert(stage.attempted&&stage.candidate_examined&&stage.check.valid&&stage.has_raw_result); + assert(stage.raw_result.reported_solution_validated&&stage.raw_result.termination_code==GECODE_OPT_OPTIMAL); + gecode_opt_result_info_v1 ordinary{};assert(gecode_opt_v1_result_info(child,&ordinary,sizeof(ordinary))==GECODE_OPT_INVALID_HANDLE); + ok(gecode_opt_v1_lp_evidence_stage_destroy(child)); + } + std::cout<<"LP evidence binding final cancellation revokes accepted getters; raw child history survives\n"; +} diff --git a/test/optimize/lp_evidence_c.c b/test/optimize/lp_evidence_c.c new file mode 100644 index 0000000000..a6b227639e --- /dev/null +++ b/test/optimize/lp_evidence_c.c @@ -0,0 +1,123 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#define OK(call) do { int32_t code_=(call); if(code_){fprintf(stderr,"%s: %d %s\n",#call,(int)code_,gecode_opt_v1_last_error());assert(code_==0);} } while(0) +static int32_t available; +static void near(double x,double y){assert(isfinite(x)&&fabs(x-y)<1e-7);} +static gecode_opt_handle analyze(gecode_opt_handle m,const gecode_opt_evidence_options_v1* options){ + gecode_opt_handle h=0;OK(gecode_opt_v1_analyze_lp_evidence(m,options,&h));assert(h);return h; +} +static void ray(void){ + gecode_opt_handle m=0,out=0,child=0;gecode_opt_id dead,x,y,row,gone,bad; + gecode_opt_term terms[2];gecode_opt_evidence_options_v1 options;gecode_opt_evidence_info_v1 info; + gecode_opt_evidence_group_v1 group;gecode_opt_evidence_primal_v1 primal;gecode_opt_evidence_slot_v1 slot; + gecode_opt_evidence_stage_v1 stage;gecode_opt_evidence_column_v1 map[2];gecode_opt_evidence_raw_value_v1 raw[2]; + gecode_opt_result_info_v1 ordinary;uint64_t owner,revision,needed;double value; + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,INFINITY,"dead",&dead)); + OK(gecode_opt_v1_model_remove_variable(m,dead));OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,INFINITY,"x",&x)); + OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,-INFINITY,INFINITY,"y",&y)); + OK(gecode_opt_v1_model_add_row(m,NULL,0,-INFINITY,INFINITY,"gone",&gone));OK(gecode_opt_v1_model_remove_row(m,gone)); + terms[0].variable=x;terms[0].coefficient=1;terms[1].variable=y;terms[1].coefficient=-1; + OK(gecode_opt_v1_model_add_row(m,terms,2,0,0,"same",&row));terms[0].coefficient=-1; + OK(gecode_opt_v1_model_set_objective(m,terms,1,GECODE_OPT_MINIMIZE,7));OK(gecode_opt_v1_model_identity(m,&owner,&revision)); + OK(gecode_opt_v1_evidence_options_default(&options,sizeof(options)));options.request=GECODE_OPT_EVIDENCE_BOTH; + assert(!options.reserved&&!options.reserved_flags&&options.max_auxiliary_solves==3); + out=analyze(m,&options);memset(&info,0xa5,sizeof(info));OK(gecode_opt_v1_lp_evidence_info(out,&info,sizeof(info))); + assert(!info.reserved&&info.model_id==owner&&info.revision==revision&&info.has_evidence&&info.stage_count==3); + assert(info.row_slots==2&&info.column_slots==3);OK(gecode_opt_v1_lp_evidence_group(out,GECODE_OPT_EVIDENCE_PRIMAL_GROUP,&group,sizeof(group))); + assert(group.state==(available?GECODE_OPT_EVIDENCE_AVAILABLE:GECODE_OPT_EVIDENCE_REJECTED)); + if(available){assert(info.completion==GECODE_OPT_EVIDENCE_COMPLETE&&!info.has_stop_reason&&info.attempted_calls==3); + OK(gecode_opt_v1_lp_evidence_value(out,x,GECODE_OPT_EVIDENCE_DIRECTION_VALUE,&value));near(value,1); + OK(gecode_opt_v1_lp_evidence_value(out,y,GECODE_OPT_EVIDENCE_DIRECTION_VALUE,&value));near(value,1); + OK(gecode_opt_v1_lp_evidence_value(out,x,GECODE_OPT_EVIDENCE_BASE_VALUE,&value));near(value,0); + }else{assert(info.stop_reason==GECODE_OPT_UNSUPPORTED&&!info.attempted_calls); + assert(gecode_opt_v1_lp_evidence_value(out,x,GECODE_OPT_EVIDENCE_DIRECTION_VALUE,&value)==GECODE_OPT_NO_EVIDENCE);} + OK(gecode_opt_v1_lp_evidence_primal(out,&primal,sizeof(primal)));assert(!primal.reserved&&!primal.reserved_flags); + assert(primal.has_base_check==available&&primal.normalized_objective_slope.present==available); + if(available){assert(primal.base_check.valid);near(primal.normalized_objective_slope.value,-1);} + bad=x;bad.model_id++;assert(gecode_opt_v1_lp_evidence_slot(out,bad,&slot,sizeof(slot))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_lp_evidence_slot(out,dead,&slot,sizeof(slot))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_lp_evidence_slot(out,gone,&slot,sizeof(slot))==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_lp_evidence_slot(out,row,&slot,sizeof(slot)));assert(slot.active&&slot.source.kind==GECODE_OPT_ROW_ID&&!slot.base_value.present); + if(available){assert(slot.direction.present);near(slot.direction.value,0);} + {gecode_opt_evidence_slot_v1 slots[3];OK(gecode_opt_v1_lp_evidence_slots(out,GECODE_OPT_VARIABLE_ID,slots,sizeof(slots[0]),3,&needed)); + assert(needed==3&&!slots[0].active&&!slots[0].direction.present&&!slots[0].base_value.present&&slots[0].direction.value==0); + assert(!slots[1].reserved&&!slots[1].reserved_flags);} + memset(&slot,0xa5,sizeof(slot));assert(gecode_opt_v1_lp_evidence_slots(out,GECODE_OPT_VARIABLE_ID,&slot,sizeof(slot),1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + assert(needed==3&&slot.struct_size==UINT64_C(0xa5a5a5a5a5a5a5a5)); + assert(gecode_opt_v1_lp_evidence_slots(out,GECODE_OPT_VARIABLE_ID,NULL,sizeof(slot)-1,0,&needed)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_lp_evidence_slots(out,99,NULL,sizeof(slot),0,&needed)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_lp_evidence_info(out,&info,sizeof(info)-1)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_result_info(out,&ordinary,sizeof(ordinary))==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_lp_evidence_copy_stage(out,1,&child));OK(gecode_opt_v1_lp_evidence_stage_info(child,&stage,sizeof(stage))); + assert(stage.phase==GECODE_OPT_EVIDENCE_RECESSION&&stage.private_model_id!=owner&&stage.column_count==2); + assert(stage.attempted==available&&stage.has_raw_result==available&&stage.candidate_examined==available); + if(available){assert(stage.check.valid&&stage.raw_result.reported_solution_validated);near(stage.raw_result.objective.value,-1); + assert(stage.raw_result.model_id==stage.private_model_id&&stage.raw_result.revision==stage.private_revision);} + assert(gecode_opt_v1_result_info(child,&ordinary,sizeof(ordinary))==GECODE_OPT_INVALID_HANDLE); + assert(gecode_opt_v1_lp_evidence_stage_info(out,&stage,sizeof(stage))==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_lp_evidence_stage_columns(child,map,sizeof(map[0]),2,&needed));assert(needed==2); + assert(map[0].source.model_id==owner&&map[0].source.slot==x.slot&&map[0].private_variable.model_id!=owner&&!map[0].has_side); + OK(gecode_opt_v1_model_set_objective_offset(m,123));OK(gecode_opt_v1_model_destroy(m));OK(gecode_opt_v1_lp_evidence_destroy(out)); + OK(gecode_opt_v1_lp_evidence_stage_info(child,&stage,sizeof(stage)));assert(stage.attempted==available); + OK(gecode_opt_v1_lp_evidence_stage_raw_values(child,raw,sizeof(raw[0]),2,&needed));assert(needed==(available?2:0)); + if(available){near(raw[0].reported_value.value,1);assert(raw[0].reported_value.present&&raw[0].has_reported_mask&&raw[0].reported_mask==1);} + OK(gecode_opt_v1_lp_evidence_stage_destroy(child));assert(gecode_opt_v1_lp_evidence_stage_destroy(child)==GECODE_OPT_INVALID_HANDLE); +} +static void farkas(void){ + gecode_opt_handle m=0,out=0,child=0;gecode_opt_id x,row;gecode_opt_term t;gecode_opt_evidence_options_v1 options; + gecode_opt_evidence_group_v1 group;gecode_opt_evidence_farkas_v1 summary;gecode_opt_evidence_slot_v1 slot; + gecode_opt_evidence_column_v1 maps[2];uint64_t needed; + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,-INFINITY,0,"x",&x)); + t.variable=x;t.coefficient=1;OK(gecode_opt_v1_model_add_row(m,&t,1,1,INFINITY,"impossible",&row)); + OK(gecode_opt_v1_evidence_options_default(&options,sizeof(options)));options.request=GECODE_OPT_EVIDENCE_FARKAS; + out=analyze(m,&options);OK(gecode_opt_v1_lp_evidence_group(out,GECODE_OPT_EVIDENCE_PRIMAL_GROUP,&group,sizeof(group))); + assert(group.state==GECODE_OPT_EVIDENCE_NOT_REQUESTED&&group.reason==GECODE_OPT_EVIDENCE_REASON_NOT_REQUESTED); + OK(gecode_opt_v1_lp_evidence_farkas(out,&summary,sizeof(summary)));assert(summary.contradiction_margin.present==available); + if(available){near(summary.contradiction_margin.value,1);OK(gecode_opt_v1_lp_evidence_multiplier(out,row,&slot,sizeof(slot))); + assert(slot.has_side&&slot.side==GECODE_OPT_EVIDENCE_LOWER&&slot.selected_bound.present);near(slot.multiplier.value,1);near(slot.selected_bound.value,1); + OK(gecode_opt_v1_lp_evidence_multiplier(out,x,&slot,sizeof(slot)));assert(slot.side==GECODE_OPT_EVIDENCE_UPPER); + near(slot.multiplier.value,-1);assert(slot.contribution.present);near(slot.contribution.value,0);near(slot.selected_bound.value,0); + }else assert(gecode_opt_v1_lp_evidence_multiplier(out,row,&slot,sizeof(slot))==GECODE_OPT_NO_EVIDENCE); + OK(gecode_opt_v1_lp_evidence_copy_stage(out,0,&child));OK(gecode_opt_v1_lp_evidence_stage_columns(child,maps,sizeof(maps[0]),2,&needed)); + assert(needed==2&&maps[0].kind==GECODE_OPT_EVIDENCE_ROW_SIDE&&maps[0].source.slot==row.slot&&maps[0].has_side); + assert(maps[1].kind==GECODE_OPT_EVIDENCE_VARIABLE_SIDE&&maps[1].source.slot==x.slot&&maps[1].side==GECODE_OPT_EVIDENCE_UPPER); + OK(gecode_opt_v1_model_destroy(m));OK(gecode_opt_v1_lp_evidence_destroy(out));OK(gecode_opt_v1_lp_evidence_stage_destroy(child)); +} +static void options_and_stops(void){ + gecode_opt_handle m=0,out=0,cancel=0;gecode_opt_id x;gecode_opt_evidence_options_v1 options,bad; + gecode_opt_evidence_info_v1 info;gecode_opt_evidence_group_v1 group;int i; + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,INFINITY,"x",&x)); + OK(gecode_opt_v1_evidence_options_default(&options,sizeof(options))); + for(i=0;i<7;i++){ + bad=options;switch(i){case 0:bad.struct_size--;break;case 1:bad.reserved=1;break;case 2:bad.reserved_flags=1;break; + case 3:bad.solve.struct_size--;break;case 4:bad.solve.has_node_limit=2;break;case 5:bad.request=99;break;default:bad.solve.reserved=1;break;} + out=99;assert(gecode_opt_v1_analyze_lp_evidence(m,&bad,&out)==GECODE_OPT_INVALID_ARGUMENT&&out==0); + } + bad=options;bad.minimum_contradiction=NAN;out=99;assert(gecode_opt_v1_analyze_lp_evidence(m,&bad,&out)==GECODE_OPT_MODEL_ERROR&&out==0); + for(i=0;i<8;i++){ + int expected;bad=options;switch(i){case 0:bad.solve.backend=GECODE_OPT_NATIVE;expected=GECODE_OPT_UNSUPPORTED;break; + case 1:bad.solve.guarantee=GECODE_OPT_EXACT;expected=GECODE_OPT_UNSUPPORTED;break; + case 2:bad.solve.time_limit_seconds=0;expected=GECODE_OPT_TIME_LIMIT;break; + case 3:bad.solve.has_node_limit=1;bad.solve.node_limit=0;expected=GECODE_OPT_NODE_LIMIT;break; + case 4:bad.max_work=0;expected=GECODE_OPT_ITERATION_LIMIT;break; + case 5:bad.max_auxiliary_variables=0;expected=GECODE_OPT_MEMORY_LIMIT;break; + case 6:bad.max_retained_slots=0;expected=GECODE_OPT_MEMORY_LIMIT;break; + default:bad.max_auxiliary_solves=0;expected=available?GECODE_OPT_ITERATION_LIMIT:GECODE_OPT_UNSUPPORTED;break;} + out=analyze(m,&bad);OK(gecode_opt_v1_lp_evidence_info(out,&info,sizeof(info))); + assert(info.has_stop_reason&&info.stop_reason==expected&&!info.attempted_calls); + if(!info.has_evidence)assert(gecode_opt_v1_lp_evidence_group(out,0,&group,sizeof(group))==GECODE_OPT_NO_EVIDENCE); + OK(gecode_opt_v1_lp_evidence_destroy(out)); + } + OK(gecode_opt_v1_cancellation_create(&cancel));OK(gecode_opt_v1_cancellation_cancel(cancel));bad=options;bad.solve.cancellation=cancel; + out=analyze(m,&bad);OK(gecode_opt_v1_lp_evidence_info(out,&info,sizeof(info)));assert(info.stop_reason==GECODE_OPT_CANCELLED); + OK(gecode_opt_v1_cancellation_destroy(cancel));OK(gecode_opt_v1_lp_evidence_destroy(out));OK(gecode_opt_v1_model_destroy(m)); +} +int main(void){int32_t lp,mip;OK(gecode_opt_v1_capabilities(GECODE_OPT_HIGHS,&available,&lp,&mip)); + ray();farkas();options_and_stops();puts("C99 LP evidence ownership, raw stages, groups and boundary tests passed");return 0;} diff --git a/test/optimize/lp_evidence_coordinator.cpp b/test/optimize/lp_evidence_coordinator.cpp new file mode 100644 index 0000000000..a2a804238d --- /dev/null +++ b/test/optimize/lp_evidence_coordinator.cpp @@ -0,0 +1,122 @@ +// Compile lp_evidence.cpp separately with GECODE_OPTIMIZE_TEST_LP_EVIDENCE=1. +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +namespace O=Gecode::Optimize; +using Phase=O::LpEvidencePhase;using State=O::LpEvidenceState;using Request=O::LpEvidenceRequest; +namespace { +enum class Fault {None,Owner,Revision,Mask,Dimension,NaNValue,Objective,NaNBound,WrongBound,Gap,Status,Guarantee, + FalseInfeasible,Unbounded,NoWitness,NormalizedInfeasible,FiniteLimit,OriginalDirection,InfiniteSide,CancellationSum}; +Fault fault=Fault::None;Phase target=Phase::Recession;std::size_t calls=0; +std::string cancel_point,allocation_point;std::size_t cancel_index=0; +std::shared_ptr cancellation; +double previous=std::numeric_limits::infinity(); +O::SolveResult oracle(const O::ModelSnapshot& m,const O::SolveOptions& options){ + O::SolveResult out;out.model_id=m.model_id;out.revision=m.revision;out.guarantee=O::Guarantee::Numerical; + out.backend="deterministic finite-grid oracle";for(const auto& v:m.variables)out.active_variables.push_back(v.active); + std::vector values(m.variables.size(),0);const double grid[]={-1,0,.25,.5,1}; + std::function visit=[&](std::size_t i){ + if(i=m.variables[i].lower&&x<=m.variables[i].upper){values[i]=x;visit(i+1);}return;} + for(const auto& row:m.rows){long double sum=0;for(const auto& t:row.terms)sum+=t.coefficient*values[t.variable.id]; + if(sumrow.upper+options.feasibility_tolerance)return;} + long double objective=m.objective.offset;for(const auto& t:m.objective.terms)objective+=t.coefficient*values[t.variable.id]; + if(!out.objective||(m.objective.sense==O::ObjectiveSense::Minimize?objective<*out.objective:objective>*out.objective)){out.objective=static_cast(objective);out.values=values;} + };visit(0);out.solution_validated=bool(out.objective);out.best_bound=out.objective; + out.termination=out.objective?O::Termination::Optimal:O::Termination::Infeasible;return out; +} +void reset(){fault=Fault::None;target=Phase::Recession;calls=0;cancel_point.clear();allocation_point.clear();cancel_index=0; + cancellation=std::make_shared();previous=std::numeric_limits::infinity();} +} +namespace Gecode { namespace Optimize { namespace Detail { +SolveResult lp_evidence_test_solve(LpEvidencePhase phase,const ModelSnapshot& m,const SolveOptions& options){ + assert(options.backend==Backend::Highs&&options.guarantee==Guarantee::Numerical&&options.time_limit_seconds<=previous); + previous=options.time_limit_seconds;++calls;auto out=oracle(m,options);if(phase!=target)return out; + const auto discard=[&]{out.values.clear();out.objective.reset();out.best_bound.reset();out.solution_validated=false;}; + switch(fault){ + case Fault::None:break; + case Fault::Owner:++out.model_id;break;case Fault::Revision:++out.revision;break; + case Fault::Mask:out.active_variables[0]=false;break; + case Fault::Dimension:out.values.push_back(0);break; + case Fault::NaNValue:out.values[0]=std::numeric_limits::quiet_NaN();break; + case Fault::Objective:*out.objective+=1;break; + case Fault::NaNBound:out.best_bound=std::numeric_limits::quiet_NaN();break; + case Fault::WrongBound:out.best_bound=std::numeric_limits::infinity();break; + case Fault::Gap:out.relative_gap=std::numeric_limits::quiet_NaN();break; + case Fault::Status:out.termination=static_cast(99);break; + case Fault::Guarantee:out.guarantee=Guarantee::Exact;break; + case Fault::FalseInfeasible:out.termination=Termination::Infeasible;out.solution_validated=false;break; + case Fault::Unbounded:discard();out.termination=Termination::Unbounded;break; + case Fault::NoWitness:discard();break; + case Fault::NormalizedInfeasible:discard();out.termination=Termination::Infeasible;break; + case Fault::FiniteLimit:out.termination=Termination::IterationLimit;out.best_bound=-std::numeric_limits::infinity();break; + case Fault::OriginalDirection:out.values={1e-8};out.objective=-1e-8;out.best_bound=out.objective;break; + case Fault::InfiniteSide:out.values={1e-8};out.objective=1e-8;out.best_bound=out.objective;break; + case Fault::CancellationSum:out.values={.25,.25,.25};out.objective=.25;out.best_bound=out.objective;out.solution_validated=true;out.termination=Termination::Optimal;break; + } + return out; +} +void lp_evidence_test_checkpoint(const char* point,std::size_t index){ + if(cancel_point==point&&cancel_index==index)cancellation->cancel(); + if(allocation_point==point)throw std::bad_alloc(); +} +}}} +int main(){ + O::Model source;auto x=source.add_continuous();source.minimize({{x,-1}},7); + O::LpEvidenceOptions options;options.solve.time_limit_seconds=30;options.request=Request::Both; + reset();auto good=O::analyze_lp_evidence(source,options);assert(good.completion==O::LpEvidenceCompletion::Complete&&calls==3&&previous<30); + assert(good.evidence->primal_ray().state==State::Available&&good.evidence->direction_value(x)==1); + for(auto f:{Fault::Owner,Fault::Revision,Fault::Mask,Fault::Dimension,Fault::NaNValue,Fault::Objective, + Fault::NaNBound,Fault::WrongBound,Fault::Gap,Fault::Status,Fault::Guarantee,Fault::FalseInfeasible,Fault::Unbounded,Fault::NoWitness,Fault::NormalizedInfeasible}){ + reset();fault=f;auto out=O::analyze_lp_evidence(source,options); + assert(out.stop_reason==((f==Fault::Unbounded||f==Fault::NormalizedInfeasible)?O::Termination::BackendError:O::Termination::NumericalFailure)&&out.completion==O::LpEvidenceCompletion::Rejected&&calls==2); + assert(out.evidence->primal_ray().state==State::Rejected&&out.evidence->farkas().state==State::Rejected); + } + reset();target=Phase::FeasibleBase;fault=Fault::FalseInfeasible; + auto false_infeasible=O::analyze_lp_evidence(source,options);assert(false_infeasible.stop_reason==O::Termination::NumericalFailure&&calls==1); + reset();fault=Fault::FiniteLimit;auto limited=O::analyze_lp_evidence(source,options); + assert(limited.completion==O::LpEvidenceCompletion::Interrupted&&limited.stop_reason==O::Termination::IterationLimit&&calls==2); + assert(limited.evidence->primal_ray().state==State::Available&&!limited.evidence->stages()[2].attempted); + // An auxiliary direction within its primal tolerance can fail after normalization. + O::Model bounded;auto fixed=bounded.add_continuous(0,0);bounded.minimize({{fixed,-1}}); + reset();fault=Fault::OriginalDirection;auto normalized=O::analyze_lp_evidence(bounded,options); + assert(normalized.stop_reason==O::Termination::NumericalFailure&&normalized.evidence->primal_ray().reason==O::LpEvidenceReason::FailedOriginalChecks); + // Tiny auxiliary stationarity residual does not authorize an infinite bound side. + O::Model free;auto f=free.add_continuous(-std::numeric_limits::infinity(),std::numeric_limits::infinity());free.add_row({{f,1}},1,std::numeric_limits::infinity()); + reset();target=Phase::Farkas;fault=Fault::InfiniteSide;options.request=Request::Farkas; + auto side=O::analyze_lp_evidence(free,options);assert(side.stop_reason==O::Termination::NumericalFailure&&side.evidence->farkas().reason==O::LpEvidenceReason::FailedOriginalChecks); + // Original cancellation must retain the small residual across large terms. + O::Model cancellation_model;auto a=cancellation_model.add_continuous(-std::numeric_limits::infinity(),std::numeric_limits::infinity()); + auto b=cancellation_model.add_continuous(-std::numeric_limits::infinity(),std::numeric_limits::infinity()); + cancellation_model.add_row({{a,1}},1,std::numeric_limits::infinity());cancellation_model.add_row({{b,1}},1e16,std::numeric_limits::infinity()); + cancellation_model.add_row({{a,1},{b,1}},-std::numeric_limits::infinity(),1e16); + reset();target=Phase::Farkas;fault=Fault::CancellationSum; + auto sum=O::analyze_lp_evidence(cancellation_model,options);assert(sum.completion==O::LpEvidenceCompletion::Complete&&sum.evidence->farkas().state==State::Available); + assert(sum.evidence->farkas_data().contradiction_margin==1&&sum.evidence->farkas_data().max_stationarity==0); + // Different valid declared tolerances overlap: reject incompatible conclusions. + O::Model overlap;auto z=overlap.add_continuous(0,0);overlap.add_row({{z,1}},1e-8,std::numeric_limits::infinity()); + reset();options.request=Request::Both;options.checks.minimum_contradiction=1e-10; + auto inconsistent=O::analyze_lp_evidence(overlap,options); + assert(inconsistent.stop_reason==O::Termination::NumericalFailure&&inconsistent.evidence->farkas().reason==O::LpEvidenceReason::InconsistentEvidence); + assert(inconsistent.evidence->primal_ray().state==State::Rejected&&inconsistent.evidence->farkas().state==State::Rejected); + assert(inconsistent.evidence->primal_data().base_check.valid&&inconsistent.evidence->farkas_data().contradiction_margin==1e-8); + for(const auto& item:std::vector>{{"source_copy",0},{"admission",0},{"before_solve",1},{"after_solve",1}, + {"after_check",1},{"stage_cleanup",1},{"evidence_check",1},{"publication",3},{"source_cleanup",3}}){ + reset();cancel_point=item.first;cancel_index=item.second;options.solve.cancellation=cancellation; + auto stopped=O::analyze_lp_evidence(source,options);assert(stopped.stop_reason==O::Termination::Cancelled); + if(stopped.evidence){assert(stopped.evidence->primal_ray().state!=State::Available&&stopped.evidence->farkas().state!=State::Available);} + assert(stopped.attempted_calls==calls); + } + reset();allocation_point="publication";options.solve.cancellation=cancellation; + auto memory=O::analyze_lp_evidence(source,options);assert(memory.stop_reason==O::Termination::MemoryLimit&&memory.evidence->primal_ray().state!=State::Available); + reset();options.solve.cancellation=cancellation;options.limits.max_work=good.work-1; + auto work=O::analyze_lp_evidence(source,options);assert(work.work<=options.limits.max_work&&work.stop_reason==O::Termination::IterationLimit); + assert(!work.evidence||work.evidence->primal_ray().state!=State::Available); + std::cout<<"LP evidence adversarial status, original checks, consistency and lifecycle gates passed\n"; +} diff --git a/test/optimize/lp_observations.cpp b/test/optimize/lp_observations.cpp new file mode 100644 index 0000000000..56268d197a --- /dev/null +++ b/test/optimize/lp_observations.cpp @@ -0,0 +1,159 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +using State=O::LpObservationState; +using Reason=O::LpObservationReason; +constexpr double inf=std::numeric_limits::infinity(); +static void near(double a,double b){assert(std::isfinite(a)&&std::abs(a-b)<1e-6);} +static void optimal(const O::LpObservedResult& out,double objective) { + if(out.result.termination!=O::Termination::Optimal) + std::cerr<<"unexpected solve status: "<dual_point().state!=State::Available) + std::cerr<<"unexpected dual status: "<dual_point().message<<'\n'; + assert(out.observations->primal_rows().state==State::Available); + assert(out.observations->dual_point().state==State::Available&&out.observations->checks().accepted); + near(*out.observations->checks().dual_objective_estimate,objective); + near(*out.observations->checks().normalized_gap,0); +} +static void no_duals(const O::LpObservedResult& out) { + assert(out.observations); + assert(out.observations->dual_point().state!=State::Available); + assert(out.observations->basis().state!=State::Available); + for(const auto& c:out.observations->columns())assert(!c.reduced_cost&&!c.basis); + for(const auto& r:out.observations->rows())assert(!r.dual&&!r.basis); +} +templatestatic void model_error(F&& fn){bool threw=false;try{fn();}catch(const O::ModelError&){threw=true;}assert(threw);} +int main(){ + O::Model model;auto x=model.add_continuous(),y=model.add_continuous(); + auto demand=model.add_row({{x,1},{y,1}},4,inf);model.minimize({{x,2},{y,3}},7); + const auto cap=O::lp_observation_capabilities(); + assert(cap.available==O::capabilities(O::Backend::Highs).available); + for(double bad:{-1.0,inf,std::numeric_limits::quiet_NaN()}) { + O::LpObservationOptions options;options.checks.complementarity=bad; + auto out=O::solve_lp_observed(model,options);assert(out.result.termination==O::Termination::InvalidModel&&!out.observations); + } + O::LpObservationOptions bad;bad.solve.backend=static_cast(99); + assert(O::solve_lp_observed(model,bad).result.termination==O::Termination::InvalidModel); + O::SolveSession session; + for(auto guarantee:{O::Guarantee::Exact,O::Guarantee::Certified}){ + O::LpObservationOptions options;options.solve.guarantee=guarantee; + auto out=session.solve_lp_observed(model,options);assert(out.result.termination==O::Termination::Unsupported); + assert(out.result.guarantee==guarantee);no_duals(out);assert(session.statistics().solve_calls==0); + } + O::LpObservationOptions native;native.solve.backend=O::Backend::Native; + auto unsupported=session.solve_lp_observed(model,native); + assert(unsupported.result.termination==O::Termination::Unsupported);no_duals(unsupported); + for(auto type:{O::VariableType::Integer,O::VariableType::Binary,O::VariableType::SemiContinuous,O::VariableType::SemiInteger}){ + O::Model typed;auto v=typed.add_variable(type,type==O::VariableType::Binary?0:1,1);typed.minimize({{v,1}}); + auto out=session.solve_lp_observed(typed);assert(out.result.termination==O::Termination::Unsupported);no_duals(out); + assert(out.observations->source().variables[0].type==type); + } + // An active empty native constraint must be rejected even without integer columns. + O::Model global;global.add_global(O::AllDifferentData{}); + auto global_out=session.solve_lp_observed(global); + assert(global_out.result.termination==O::Termination::Unsupported);no_duals(global_out); + assert(session.statistics().solve_calls==0); + if(!cap.available){ + auto out=session.solve_lp_observed(model);assert(out.result.termination==O::Termination::Unsupported); + no_duals(out);assert(out.observations->source().model_id==model.id()); + assert(out.observations->rows().size()==1&&out.observations->columns().size()==2); + std::cout<<"LP observations explicit missing-backend/admission contract passed\n";return 0; + } + assert(cap.duals&&cap.basis_export&&!cap.backend_version.empty()); + auto first=session.solve_lp_observed(model);optimal(first,15); + assert(first.observations->basis().state==State::Available); + near(first.result.value(x),4);near(first.result.value(y),0); + near(*first.observations->row(demand).dual,2); + near(*first.observations->column(x).reduced_cost,0);near(*first.observations->column(y).reduced_cost,1); + near(*first.observations->row(demand).activity,4);near(*first.observations->row(demand).lower_slack,0); + assert(!first.observations->row(demand).upper_slack); + assert(first.observations->metadata().backend_primal_tolerance&&first.observations->metadata().backend_dual_tolerance); + const auto original_revision=model.revision(); + model.minimize({{x,2},{y,1}},7); + auto second=session.solve_lp_observed(model);optimal(second,11);near(*second.observations->row(demand).dual,1); + near(*second.observations->column(x).reduced_cost,1); + assert(first.observations->revision()==original_revision&&first.observations->source().objective.terms[1].coefficient==3); + near(*first.observations->row(demand).dual,2); + // Same revision is not sufficient for cache compatibility or historical content identity. + auto snapshot=model.snapshot();snapshot.objective.terms[1].coefficient=5; + auto same_revision=session.solve_lp_observed(snapshot);optimal(same_revision,15); + assert(same_revision.observations->revision()==second.observations->revision()); + assert(same_revision.observations->source().objective.terms[1].coefficient==5); + snapshot.objective.terms[1].coefficient=100; + assert(same_revision.observations->source().objective.terms[1].coefficient==5); + O::LpObservationOptions zero;zero.solve.time_limit_seconds=0; + auto stopped=session.solve_lp_observed(model,zero);assert(stopped.result.termination==O::Termination::TimeLimit);no_duals(stopped); + assert(stopped.observations->primal_rows().reason==Reason::Interrupted); + auto ordinary=session.solve(model);assert(ordinary.termination==O::Termination::Optimal);near(*ordinary.objective,11); + optimal(session.solve_lp_observed(model),11); + O::LpObservationOptions cancelled;cancelled.solve.cancellation=std::make_shared(); + cancelled.solve.cancellation->cancel();auto stop=session.solve_lp_observed(model,cancelled); + assert(stop.result.termination==O::Termination::Cancelled);no_duals(stop); + model.set_bounds(demand,8,inf);model.set_bounds(y,0,3); + optimal(session.solve_lp_observed(model),20); + model.maximize({{x,-2},{y,-1}},-7);auto edited=session.solve_lp_observed(model);optimal(edited,-20); + auto cold=O::solve_lp_observed(model);optimal(cold,-20); + near(*edited.observations->row(demand).dual,*cold.observations->row(demand).dual); + session.reset();near(*first.observations->row(demand).dual,2); + O::SolveSession moved(std::move(session));auto invalid=session.solve_lp_observed(model); + assert(invalid.result.termination==O::Termination::InvalidModel);no_duals(invalid); + optimal(moved.solve_lp_observed(model),-20); + // Original min/max dual conventions, free columns and range sides. + for(int scenario=0;scenario<4;++scenario){ + O::Model m;auto v=m.add_continuous(-inf,inf); + auto r=m.add_row({{v,1}},scenario<2?-inf:1,scenario<2?4:3); + if(scenario==0)m.maximize({{v,2}},7); + else if(scenario==1)m.minimize({{v,-2}},7); + else m.minimize({{v,scenario==2?1.0:-1.0}}); + const double objective[]={15,-1,1,-3},dual[]={2,-2,1,-1}; + auto out=O::solve_lp_observed(m);optimal(out,objective[scenario]);near(*out.observations->row(r).dual,dual[scenario]); + assert(out.observations->basis().state==State::Available); + } + // Constant rows are independently evaluated; backend rows have their own map. + std::shared_ptr retained; + O::Variable historical;O::Constraint historical_row; + { + O::Model m;auto tomb=m.add_continuous();m.remove(tomb); + auto a=m.add_continuous(0,inf,"duplicate"),b=m.add_continuous(0,inf,"duplicate");historical=a; + auto gone=m.add_row({},-1,1);m.remove(gone); + auto r=m.add_row({{a,1}},2,inf);historical_row=r; + auto constant=m.add_row({},-1,1);auto s=m.add_row({{b,1}},3,inf); + m.minimize({{a,2},{b,3}},1);auto out=O::solve_lp_observed(m);optimal(out,14); + retained=out.observations; + assert(!retained->columns()[tomb.id].active&&!retained->rows()[gone.id].active); + near(*retained->row(r).dual,2);near(*retained->row(s).dual,3); + near(*retained->row(constant).activity,0);near(*retained->row(constant).lower_slack,1); + near(*retained->row(constant).upper_slack,1);near(*retained->row(constant).dual,0); + assert(retained->row(constant).dual_source==O::LpDualSource::DerivedConstantRow); + assert(retained->basis().reason==Reason::ElidedConstantRows); + model_error([&]{retained->column(tomb);});model_error([&]{retained->row(gone);}); + model_error([&]{retained->column(x);});model_error([&]{retained->row(demand);}); + model_error([&]{retained->column({m.id(),999});}); + } + near(*retained->column(historical).reduced_cost,0);near(*retained->row(historical_row).dual,2); + O::Model empty;empty.minimize({},7);auto empty_result=O::solve_lp_observed(empty); + assert(empty_result.result.termination==O::Termination::Optimal);near(*empty_result.result.objective,7); + assert(empty_result.observations->primal_rows().state==State::Available&&empty_result.observations->rows().empty()); + assert(empty_result.observations->dual_point().reason==Reason::NoBackendSolve); + O::LpObservationOptions primal_only;primal_only.duals=primal_only.basis=false; + auto p=O::solve_lp_observed(model,primal_only); + assert(p.result.has_solution()&&p.observations->primal_rows().state==State::Available); + assert(p.observations->dual_point().state==State::NotRequested&&p.observations->basis().state==State::NotRequested); + O::Model infeasible;auto iv=infeasible.add_continuous(0,1);infeasible.add_row({{iv,1}},2,inf); + auto infeas=O::solve_lp_observed(infeasible);assert(infeas.result.termination==O::Termination::Infeasible);no_duals(infeas); + O::Model unbounded;auto uv=unbounded.add_continuous();unbounded.minimize({{uv,-1}}); + auto unbound=O::solve_lp_observed(unbounded);assert(unbound.result.termination==O::Termination::Unbounded);no_duals(unbound); + auto malformed=model.snapshot();malformed.rows[0].terms[0].variable.model_id=0; + auto malformed_result=O::solve_lp_observed(malformed);assert(malformed_result.result.termination==O::Termination::InvalidModel&&!malformed_result.observations); + std::cout<<"LP observations real-backend analytic, mapping, ownership and session checks passed\n"; +} diff --git a/test/optimize/lp_observations_c.c b/test/optimize/lp_observations_c.c new file mode 100644 index 0000000000..ba8b055717 --- /dev/null +++ b/test/optimize/lp_observations_c.c @@ -0,0 +1,119 @@ +/* C99 owning LP-observation ABI conformance and independent analytic duals. */ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#define OK(call) do { int code=(call); if(code)fprintf(stderr,"%s: %s\n",#call,gecode_opt_v1_last_error());assert(code==GECODE_OPT_OK); } while(0) +#define LPINFO(h,i) OK(gecode_opt_v1_lp_observed_result_info(h,&i,sizeof(i))) +static void absent(gecode_opt_optional_number_v1 n){assert(!n.present&&n.value==0&&!n.reserved);} +static void present(gecode_opt_optional_number_v1 n,double x){assert(n.present&&!n.reserved&&fabs(n.value-x)<1e-6);} +static int available; +static void analytic(int maximize,double offset){ + gecode_opt_handle model=0,observed=0,copy=0,session=0; + gecode_opt_id x,y,removed,dead,row;gecode_opt_lp_options_v1 options; + gecode_opt_lp_info_v1 info;gecode_opt_lp_row_v1 r,rows[2];gecode_opt_lp_column_v1 c; + gecode_opt_lp_checks_v1 checks;gecode_opt_lp_group_v1 group;gecode_opt_lp_metadata_v1 metadata; + uint64_t needed=0;double value=0;gecode_opt_result_info_v1 ordinary; + OK(gecode_opt_v1_model_create(&model)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,10,"x",&x)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,10,"y",&y)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,10,"removed",&removed)); + OK(gecode_opt_v1_model_remove_variable(model,removed)); + OK(gecode_opt_v1_model_add_row(model,NULL,0,-INFINITY,INFINITY,"dead",&dead)); + OK(gecode_opt_v1_model_remove_row(model,dead)); + {gecode_opt_term terms[2]={{x,1},{y,1}}; + OK(gecode_opt_v1_model_add_row(model,terms,2,maximize?-INFINITY:3,maximize?3:INFINITY,"demand",&row)); + terms[0].coefficient=maximize?4:1;terms[1].coefficient=maximize?1:2; + OK(gecode_opt_v1_model_set_objective(model,terms,2,maximize?GECODE_OPT_MAXIMIZE:GECODE_OPT_MINIMIZE,offset));} + OK(gecode_opt_v1_lp_options_default(&options,sizeof(options))); + assert(options.struct_size==sizeof(options)&&!options.reserved&&options.duals&&options.basis); + options.solve.backend=GECODE_OPT_HIGHS; + OK(gecode_opt_v1_session_create(&session)); + OK(gecode_opt_v1_session_solve_lp_observed(session,model,&options,&observed)); + LPINFO(observed,info);assert(info.struct_size==sizeof(info)&&!info.reserved&&!info.reserved_flags&&info.has_observations); + assert(info.row_slots==2&&info.column_slots==3&&info.model_id==x.model_id); + assert(gecode_opt_v1_result_info(observed,&ordinary,sizeof(ordinary))==GECODE_OPT_INVALID_HANDLE); + assert(gecode_opt_v1_lp_observed_result_copy_result(model,©)==GECODE_OPT_INVALID_HANDLE&©==0); + assert(gecode_opt_v1_lp_observed_result_info(observed,&info,sizeof(info)-1)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_lp_observed_result_group(observed,GECODE_OPT_LP_PRIMAL_ROWS,&group,sizeof(group))); + assert(gecode_opt_v1_lp_observed_result_group(observed,99,&group,sizeof(group))==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_lp_observed_result_row(observed,row,&r,sizeof(r))); + assert(gecode_opt_v1_lp_observed_result_row(observed,dead,&r,sizeof(r))==GECODE_OPT_MODEL_ERROR); + {gecode_opt_id foreign=row;foreign.model_id++;assert(gecode_opt_v1_lp_observed_result_row(observed,foreign,&r,sizeof(r))==GECODE_OPT_MODEL_ERROR);} + assert(gecode_opt_v1_lp_observed_result_row(observed,x,&r,sizeof(r))==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_lp_observed_result_column(observed,removed,&c,sizeof(c))==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_lp_observed_result_rows(observed,NULL,sizeof(r),0,&needed));assert(needed==2); + memset(rows,0xa5,sizeof(rows)); + assert(gecode_opt_v1_lp_observed_result_rows(observed,rows,sizeof(r),1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + {unsigned char expected[sizeof(rows)];memset(expected,0xa5,sizeof(expected));assert(!memcmp(rows,expected,sizeof(rows)));} + assert(gecode_opt_v1_lp_observed_result_rows(observed,rows,sizeof(r)-1,2,&needed)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_lp_observed_result_rows(observed,rows,sizeof(r),UINT64_MAX,&needed)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_lp_observed_result_rows(observed,rows,sizeof(r),2,&needed));assert(!rows[0].active&&rows[1].active);absent(rows[0].activity); + OK(gecode_opt_v1_lp_observed_result_checks(observed,&checks,sizeof(checks))); + OK(gecode_opt_v1_lp_observed_result_metadata(observed,&metadata,sizeof(metadata))); + assert(!checks.reserved&&!metadata.reserved&&metadata.objective_gap==options.objective_gap); + OK(gecode_opt_v1_lp_observed_result_copy_result(observed,©)); + if(available){ + assert(info.result.termination==GECODE_OPT_OPTIMAL&&info.result.has_solution&&checks.accepted); + present(rows[1].activity,3);present(rows[1].dual,maximize?4:1); + if(maximize){absent(rows[1].lower_slack);present(rows[1].upper_slack,0);}else{present(rows[1].lower_slack,0);absent(rows[1].upper_slack);} + assert(rows[1].dual_source==GECODE_OPT_LP_DUAL_BACKEND&&rows[1].has_basis); + OK(gecode_opt_v1_lp_observed_result_column(observed,y,&c,sizeof(c)));present(c.reduced_cost,maximize?-3:1);assert(c.has_basis&&c.basis==GECODE_OPT_LP_BASIS_LOWER); + present(checks.normalized_gap,0);assert(metadata.backend_primal_tolerance.present&&metadata.backend_dual_tolerance.present); + OK(gecode_opt_v1_result_value(copy,x,&value));assert(value==3); + }else{assert(info.result.termination==GECODE_OPT_UNSUPPORTED&&!info.result.has_solution&&!checks.accepted);absent(rows[1].dual);absent(checks.normalized_gap);absent(metadata.backend_dual_tolerance);} + /* Editing and a stopped call must never expose the preceding basis/duals. */ + OK(gecode_opt_v1_model_set_row_bounds(model,row,maximize?-INFINITY:4,maximize?4:INFINITY)); + {gecode_opt_handle stopped=0;gecode_opt_lp_options_v1 zero=options;zero.solve.time_limit_seconds=0; + OK(gecode_opt_v1_session_solve_lp_observed(session,model,&zero,&stopped));LPINFO(stopped,info); + assert(info.result.termination==(available?GECODE_OPT_TIME_LIMIT:GECODE_OPT_UNSUPPORTED)); + OK(gecode_opt_v1_lp_observed_result_row(stopped,row,&r,sizeof(r)));absent(r.activity);absent(r.dual);assert(!r.has_basis); + OK(gecode_opt_v1_lp_observed_result_destroy(stopped));} + OK(gecode_opt_v1_model_destroy(model));OK(gecode_opt_v1_session_destroy(session)); + OK(gecode_opt_v1_lp_observed_result_row(observed,row,&r,sizeof(r)));if(available)present(r.activity,3); + OK(gecode_opt_v1_lp_observed_result_destroy(observed)); + if(available){OK(gecode_opt_v1_result_value(copy,x,&value));assert(value==3);} + OK(gecode_opt_v1_result_destroy(copy)); + assert(gecode_opt_v1_lp_observed_result_destroy(observed)==GECODE_OPT_INVALID_HANDLE); +} +static void states(void){ + gecode_opt_handle model=0,result=0;gecode_opt_id x,row,constant,global; + gecode_opt_lp_options_v1 options;gecode_opt_lp_group_v1 group;gecode_opt_lp_row_v1 observation; + gecode_opt_lp_info_v1 info; + OK(gecode_opt_v1_model_create(&model));OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_CONTINUOUS,0,10,"x",&x)); + {gecode_opt_term term={x,1};OK(gecode_opt_v1_model_add_row(model,&term,1,2,INFINITY,"r",&row));OK(gecode_opt_v1_model_set_objective(model,&term,1,GECODE_OPT_MINIMIZE,7));} + OK(gecode_opt_v1_model_add_row(model,NULL,0,-1,1,"constant",&constant)); + OK(gecode_opt_v1_solve_lp_observed(model,NULL,&result)); + OK(gecode_opt_v1_lp_observed_result_group(result,GECODE_OPT_LP_BASIS,&group,sizeof(group))); + if(available){assert(group.state==GECODE_OPT_LP_UNAVAILABLE&&group.reason==GECODE_OPT_LP_REASON_ELIDED_CONSTANT_ROWS); + OK(gecode_opt_v1_lp_observed_result_row(result,constant,&observation,sizeof(observation)));present(observation.dual,0);assert(observation.dual_source==GECODE_OPT_LP_DUAL_DERIVED_CONSTANT_ROW&&!observation.has_basis);} + OK(gecode_opt_v1_lp_observed_result_destroy(result)); + for(int mode=0;mode<7;++mode){ + OK(gecode_opt_v1_lp_options_default(&options,sizeof(options))); + if(mode==0)options.duals=options.basis=0; + if(mode==1)options.solve.backend=GECODE_OPT_NATIVE; + if(mode==2)options.solve.guarantee=GECODE_OPT_EXACT; + if(mode==3){OK(gecode_opt_v1_model_add_all_different(model,NULL,0,"empty",&global));} + if(mode==4){OK(gecode_opt_v1_model_remove_global(model,global));OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,0,"fixed integer",&global));} + if(mode==5){options.reserved=1;result=123;assert(gecode_opt_v1_solve_lp_observed(model,&options,&result)==GECODE_OPT_INVALID_ARGUMENT&&result==0);continue;} + if(mode==6){options.solve.struct_size--;result=123;assert(gecode_opt_v1_solve_lp_observed(model,&options,&result)==GECODE_OPT_INVALID_ARGUMENT&&result==0);continue;} + OK(gecode_opt_v1_solve_lp_observed(model,&options,&result));LPINFO(result,info); + if(mode==0){OK(gecode_opt_v1_lp_observed_result_group(result,GECODE_OPT_LP_DUAL_POINT,&group,sizeof(group)));assert(group.state==GECODE_OPT_LP_NOT_REQUESTED);} + else assert(info.result.termination==GECODE_OPT_UNSUPPORTED&&!info.result.has_solution); + OK(gecode_opt_v1_lp_observed_result_destroy(result)); + } + OK(gecode_opt_v1_model_destroy(model)); +} +int main(void){ + gecode_opt_lp_capabilities_v1 caps;char buffer[128];uint64_t n=0; + OK(gecode_opt_v1_lp_capabilities(&caps,sizeof(caps)));available=caps.available; + assert(caps.struct_size==sizeof(caps)&&!caps.reserved&&!caps.reserved_flags&&caps.limitation_count>0); + OK(gecode_opt_v1_lp_capability_text(GECODE_OPT_LP_CAP_BACKEND,0,buffer,sizeof(buffer),&n));assert(n>1); + assert(gecode_opt_v1_lp_capability_text(GECODE_OPT_LP_CAP_BACKEND,1,buffer,sizeof(buffer),&n)==GECODE_OPT_INVALID_ARGUMENT); + for(int sense=0;sense<2;++sense){analytic(sense,7);analytic(sense,1e16);}states(); + puts("LP observation C99 conformance passed");return 0; +} diff --git a/test/optimize/lp_observations_checks.cpp b/test/optimize/lp_observations_checks.cpp new file mode 100644 index 0000000000..bec77ccacb --- /dev/null +++ b/test/optimize/lp_observations_checks.cpp @@ -0,0 +1,190 @@ +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace D=Gecode::Optimize::Detail; +using State=O::LpObservationState; +using Reason=O::LpObservationReason; +using Basis=O::LpBasisStatus; +constexpr double inf=std::numeric_limits::infinity(); +static void near(double a,double b) { assert(std::isfinite(a)&&std::abs(a-b)<1e-8); } +struct Fixture { + O::ModelSnapshot model; + O::SolveResult result; + D::LpBackendObservations raw; + O::LpObservationOptions options; +}; +static Fixture fixture() { + O::Model model; + auto x=model.add_continuous(0,10),y=model.add_continuous(0,10); + model.add_row({{x,1},{y,1}},4,inf); + model.minimize({{x,2},{y,3}},7); + Fixture f;f.model=model.snapshot(); + f.result.model_id=model.id();f.result.revision=model.revision(); + f.result.backend="test-only owned data";f.result.backend_version="1"; + f.result.termination=O::Termination::Optimal;f.result.values={4,0}; + f.result.active_variables={true,true};f.result.objective=15;f.result.solution_validated=true; + f.raw.attempted=f.raw.timely=f.raw.complete=true; + f.raw.info_valid=f.raw.value_valid=f.raw.primal_feasible=true; + f.raw.dual_valid=f.raw.dual_feasible=f.raw.basis_valid=f.raw.info_basis_valid=true; + f.raw.model_id=model.id();f.raw.revision=model.revision(); + f.raw.column_slots={0,1};f.raw.row_slots={0}; + f.raw.column_duals={0,1};f.raw.row_duals={2}; + f.raw.column_basis={Basis::Basic,Basis::Lower};f.raw.row_basis={Basis::Lower}; + f.raw.primal_tolerance=1e-7;f.raw.dual_tolerance=1e-7; + return f; +} +static std::shared_ptr inspect(const Fixture& f) { + auto out=D::LpObservationAccess::create(f.model,f.options); + O::SolveBudget budget(f.options.solve); + D::LpObservationAccess::finish(*out,f.result,f.raw,budget); + return out; +} +static void rejected_dual(const Fixture& f,Reason reason=Reason::InvalidBackendData) { + auto out=inspect(f); + assert(out->primal_rows().state==State::Available); + assert(out->dual_point().state==State::Rejected&&out->dual_point().reason==reason); + for(const auto& c:out->columns()) assert(!c.reduced_cost); + for(const auto& r:out->rows()) assert(!r.dual&&r.dual_source==O::LpDualSource::None); +} +int main() { + auto f=fixture();auto good=inspect(f); + assert(good->primal_rows().state==State::Available); + assert(good->dual_point().state==State::Available&&good->basis().state==State::Available); + assert(good->checks().accepted);near(*good->checks().normalized_gap,0); + near(*good->checks().dual_objective_estimate,15); + near(*good->rows()[0].activity,4);near(*good->rows()[0].lower_slack,0); + near(*good->columns()[1].reduced_cost,1); + // Each validity flag is independently necessary; unavailable is not a zero dual. + for(int flag=0;flag<7;++flag) { + f=fixture(); + bool* flags[]={&f.raw.info_valid,&f.raw.value_valid,&f.raw.primal_feasible, + &f.raw.dual_valid,&f.raw.dual_feasible,&f.raw.basis_valid,&f.raw.info_basis_valid}; + *flags[flag]=false;auto out=inspect(f); + if(flag<3) {assert(out->dual_point().reason==Reason::NoPrimalPoint);assert(out->basis().reason==Reason::NoPrimalPoint);} + else if(flag<5) {assert(out->dual_point().reason==Reason::NoDualPoint);assert(out->basis().state==State::Available);} + else {assert(out->dual_point().state==State::Available);assert(out->basis().reason==Reason::NoBasis);} + } + for(double bad:{inf,-inf,std::numeric_limits::quiet_NaN()}) { + f=fixture();f.raw.row_duals[0]=bad;rejected_dual(f); + f=fixture();f.raw.column_duals[1]=bad;rejected_dual(f); + } + for(int mode=0;mode<4;++mode) { + f=fixture(); + if(mode==0)f.raw.row_duals.clear(); + if(mode==1)f.raw.row_duals.push_back(0); + if(mode==2)f.raw.column_duals.pop_back(); + if(mode==3)f.raw.column_duals.push_back(0); + rejected_dual(f);assert(inspect(f)->basis().state==State::Available); + } + for(int mode=0;mode<8;++mode) { + f=fixture(); + if(mode==0)std::swap(f.raw.column_slots[0],f.raw.column_slots[1]); + if(mode==1)f.raw.row_slots.clear(); + if(mode==2)f.raw.column_slots.push_back(2); + if(mode==3)++f.raw.model_id; + if(mode==4)++f.raw.revision; + if(mode==5)f.raw.complete=false; + if(mode==6)f.raw.primal_tolerance=-1; + if(mode==7)f.raw.dual_tolerance=std::numeric_limits::quiet_NaN(); + rejected_dual(f);assert(inspect(f)->basis().state==State::Rejected); + } + for(int mode=0;mode<7;++mode) { + f=fixture(); + if(mode==0)++f.result.model_id; + if(mode==1)++f.result.revision; + if(mode==2)f.result.active_variables.pop_back(); + if(mode==3)f.result.active_variables[1]=false; + if(mode==4)f.result.objective=14; + if(mode==5)f.result.values[0]=3; + if(mode==6)f.result.values[0]=11; + auto out=inspect(f);assert(out->primal_rows().state==State::Rejected); + assert(!out->rows()[0].activity&&out->dual_point().state==State::Rejected); + } + for(int mode=0;mode<5;++mode) { + f=fixture(); + if(mode==0)f.raw.column_basis[0]=Basis::Lower; + if(mode==1)f.raw.column_basis[0]=static_cast(99); + if(mode==2)f.raw.row_basis[0]=Basis::Basic; + if(mode==3)f.raw.column_basis[1]=Basis::Zero; + if(mode==4)f.raw.row_basis.clear(); + auto out=inspect(f);assert(out->basis().state==State::Rejected); + assert(out->dual_point().state==State::Available); + assert(!out->columns()[0].basis&&!out->rows()[0].basis); + } + f=fixture();f.raw.column_duals[1]=0;rejected_dual(f,Reason::FailedChecks); + auto out=inspect(f);assert(!out->checks().stationarity_valid);near(*out->checks().normalized_gap,0); + f=fixture();f.raw.row_duals[0]=1;f.raw.column_duals={1,2}; + out=inspect(f);assert(out->checks().stationarity_valid&&!out->checks().dual_signs_valid); + assert(!out->checks().complementarity_valid&&!out->checks().gap_valid); + f=fixture();f.raw.row_duals[0]=3;f.raw.column_duals={0,0}; + out=inspect(f);near(*out->checks().normalized_gap,-4);assert(!out->checks().accepted); + // A tiny multiplier still requires a finite endpoint; never replace inf*epsilon by zero. + f=fixture();f.model.variables[0].upper=inf;f.raw.column_duals[0]=-1e-12; + out=inspect(f);assert(!out->checks().dual_objective_estimate&&!out->checks().normalized_gap); + assert(out->dual_point().state==State::Rejected); + // Large common offsets cannot hide a nonzero normalized primal/dual gap. + f=fixture();f.model.objective.offset=1e16;f.result.objective=1e16+8; + f.raw.row_duals[0]=2.0001;f.raw.column_duals={-0.0001,0.9999}; + out=inspect(f);assert(out->checks().stationarity_valid&&!out->checks().gap_valid); + assert(*out->checks().normalized_gap>0.0005); + assert(*out->checks().dual_objective_estimate==*f.result.objective); + // A^T*pi = 1e16 + 1 - 1e16 must retain the unit residual. + { + O::Model model;auto x=model.add_continuous(1,1); + model.add_row({{x,1e16}},1e16,1e16);model.add_row({{x,1}},1,1); + model.add_row({{x,-1e16}},-1e16,-1e16);model.minimize({{x,1}}); + f=fixture();f.model=model.snapshot();f.result.model_id=model.id();f.result.revision=model.revision(); + f.result.values={1};f.result.active_variables={true};f.result.objective=1; + f.raw.model_id=model.id();f.raw.revision=model.revision();f.raw.column_slots={0};f.raw.row_slots={0,1,2}; + f.raw.column_duals={0};f.raw.row_duals={1,1,1};f.raw.basis_valid=false; + out=inspect(f);assert(out->checks().accepted);near(*out->checks().max_stationarity,0); + } + // Retain a row's residual for slack, normal-cone, and basis checks before narrowing. + { + O::Model model;auto x=model.add_continuous(1,1),y=model.add_continuous(1,1); + model.add_row({{x,1e16},{y,1}},1e16,inf);model.minimize({}); + f=fixture();f.model=model.snapshot();f.result.model_id=model.id();f.result.revision=model.revision(); + f.result.values={1,1};f.result.objective=0; + f.raw.model_id=model.id();f.raw.revision=model.revision();f.raw.row_duals={0};f.raw.column_duals={0,0}; + f.raw.column_basis={Basis::Lower,Basis::Lower};f.raw.row_basis={Basis::Basic}; + out=inspect(f);assert(out->checks().accepted&&out->basis().state==State::Available); + near(*out->rows()[0].lower_slack,1); + f.raw.row_basis={Basis::Lower};f.raw.column_basis[0]=Basis::Basic; + assert(inspect(f)->basis().state==State::Rejected); + f.raw.row_duals={1};f.raw.column_duals={-1e16,-1}; + out=inspect(f);assert(!out->checks().dual_signs_valid);near(*out->checks().max_complementarity,1); + } + f=fixture();f.result.termination=O::Termination::TimeLimit; + out=inspect(f);assert(out->primal_rows().state==State::Available&&out->dual_point().reason==Reason::NotOptimal); + f=fixture();f.raw.timely=false;out=inspect(f);assert(out->dual_point().reason==Reason::Interrupted); + f=fixture();f.raw.attempted=false;out=inspect(f);assert(out->dual_point().reason==Reason::NoBackendSolve); + f=fixture();f.raw.failure=D::LpCaptureFailure::Allocation; + rejected_dual(f,Reason::AllocationFailure); + f=fixture();f.options.duals=f.options.basis=false;out=inspect(f); + assert(out->primal_rows().state==State::Available&&out->dual_point().state==State::NotRequested&&out->basis().state==State::NotRequested); + for(double bad:{-1.0,inf,std::numeric_limits::quiet_NaN()}) { + f=fixture();f.options.checks.stationarity=bad;bool threw=false; + try{inspect(f);}catch(const O::ModelError&){threw=true;}assert(threw); + } + // A deterministic post-collection cancellation models cleanup crossing the final gate. + // Production uses this same gate after raw vectors have been destroyed; no sleeps/hooks. + f=fixture();f.options.solve.cancellation=std::make_shared(); + O::SolveBudget budget(f.options.solve);auto mutable_observation=D::LpObservationAccess::create(f.model,f.options); + {auto raw=f.raw;D::LpObservationAccess::finish(*mutable_observation,f.result,raw,budget);} + assert(mutable_observation->dual_point().state==State::Available); + O::LpObservedResult observed{f.result,mutable_observation}; + f.options.solve.cancellation->cancel(); + D::LpObservationAccess::final_budget(observed,mutable_observation,budget); + assert(observed.result.termination==O::Termination::Cancelled&&observed.result.has_solution()); + assert(observed.observations->primal_rows().reason==Reason::Interrupted); + assert(observed.observations->dual_point().reason==Reason::Interrupted); + assert(!observed.observations->checks().accepted&&!observed.observations->rows()[0].activity); + f=fixture();f.options.solve.time_limit_seconds=0;out=inspect(f); + assert(out->primal_rows().reason==Reason::Interrupted&&!out->rows()[0].activity); + std::cout<<"LP observation independent analytic/corruption checks passed\n"; +} diff --git a/test/optimize/lp_sensitivity.cpp b/test/optimize/lp_sensitivity.cpp new file mode 100644 index 0000000000..67000ccb10 --- /dev/null +++ b/test/optimize/lp_sensitivity.cpp @@ -0,0 +1,210 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include "lp_sensitivity_oracle.hpp" +#include "lp_sensitivity_fixture.hpp" + +namespace O=Gecode::Optimize; +constexpr double inf=std::numeric_limits::infinity(); +static void near(double a,double b){assert(std::isfinite(a)&&std::abs(a-b)<1e-7*std::max(1.0,std::abs(b)));} +static void endpoint(const O::LpRangeEnd& a,double b){ + if(std::isinf(b)){assert(!a.value);assert(a.kind==(b>0?O::LpRangeEndKind::PositiveInfinity:O::LpRangeEndKind::NegativeInfinity));} + else {assert(a.kind==O::LpRangeEndKind::Finite&&a.value);near(*a.value,b);} +} +static void bounds(const O::LpSensitivityEntry* e,double lo,double hi,double slope){ + assert(e);if(e->group.state!=O::LpSensitivityState::Available)std::cerr<<"range unavailable: "<group.message<<'\n'; + assert(e->group.state==O::LpSensitivityState::Available&&e->interval&&e->interval->checks.accepted); + endpoint(e->interval->lower,lo);endpoint(e->interval->upper,hi);assert(e->interval->objective_slope);near(*e->interval->objective_slope,slope); +} +static void complete(const O::LpSensitivityResult& r){ + if(r.completion!=O::LpSensitivityCompletion::Complete)std::cerr<<"sensitivity failure: "<checks().kkt.accepted); +} +static O::LpObservedResult selected(O::Model& m,std::vector columns, + std::vector rows){ + O::LpBasisData data;data.source=m.snapshot();for(auto s:columns)data.columns.push_back(s);for(auto s:rows)data.rows.push_back(s); + O::LpBasisSolveOptions options;options.basis=O::make_lp_basis(data); + auto out=O::solve_lp_with_basis(m,options); + assert(out.submission.state==O::LpBasisSubmissionState::Accepted); + assert(out.observed.result.termination==O::Termination::Optimal);return out.observed; +} +template static void invalid(F f){bool threw=false;try{f();}catch(const O::ModelError&){threw=true;}assert(threw);} +static void historical_panel(){ + O::LpSensitivityResult history;O::LpObservedResult original;O::Variable x,y,deleted;O::Constraint row,removed,unrequested; + { + O::Model model;deleted=model.add_continuous();model.remove(deleted); + x=model.add_continuous();y=model.add_continuous();removed=model.add_row({{x,1}},0,9);model.remove(removed); + row=model.add_row({{x,1},{y,1}},3,3);unrequested=model.add_row({{x,1}},-inf,4); + model.minimize({{x,2},{y,1}},7);O::SolveSession session;original=session.solve_lp_observed(model); + O::LpSensitivityOptions options;options.parameters={O::LpObjectiveParameter{x},O::LpEqualityRhsParameter{row}}; + history=O::analyze_lp_sensitivity(original,options);complete(history); + assert(!history.sensitivity->objective(y)&&!history.sensitivity->equality_rhs(unrequested)); + invalid([&]{history.sensitivity->objective(deleted);});invalid([&]{history.sensitivity->equality_rhs(removed);}); + invalid([&]{history.sensitivity->objective(O::Variable{model.id()+1,x.id});}); + invalid([&]{history.sensitivity->equality_rhs(O::Constraint{model.id()+1,row.id});}); + for(auto request:{O::LpSensitivityParameter{O::LpObjectiveParameter{deleted}},O::LpSensitivityParameter{O::LpEqualityRhsParameter{removed}}}){ + options.parameters={request};auto rejected=O::analyze_lp_sensitivity(original,options); + assert(rejected.reason==O::LpSensitivityReason::InvalidSource&&!rejected.work.factor_setup_attempted); + } + model.set_objective_coefficient(x,-3);auto changed=session.solve_lp_observed(model);assert(changed.result.termination==O::Termination::Optimal); + session.reset();assert(history.sensitivity->revision()!=model.revision()); + } + bounds(history.sensitivity->objective(x),1,inf,0);bounds(history.sensitivity->equality_rhs(row),0,inf,1); + assert(history.sensitivity->original().observations==original.observations); + assert(history.sensitivity->active_columns()==std::vector({false,true,true})); + assert(history.sensitivity->active_rows()==std::vector({false,true,true})); + for(const auto& entity:history.sensitivity->factor_order())std::visit([&](const auto& e){assert(e.model_id==history.model_id&&e.id!=0);},entity); + original={};assert(history.sensitivity->original().result.objective==10); +} +static void scaled_panel(){ + using B=O::LpBasisStatus; + for(double scale:{1e-6,1e6})for(bool maximize:{false,true}){ + O::Model model;auto x=model.add_continuous(-2,5),y=model.add_continuous(0,4); + auto row=model.add_row({{x,2*scale},{y,-4*scale}},-12*scale,-12*scale); + model.set_objective({{x,maximize?-2.0:2.0},{y,maximize?-3.0:3.0}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,17); + auto source=selected(model,{B::Lower,B::Basic},{B::Lower});O::LpSensitivityOptions o; + o.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{y},O::LpEqualityRhsParameter{row}}; + auto result=O::analyze_lp_sensitivity(source,o);complete(result); + bounds(result.sensitivity->objective(x),maximize?-inf:-1.5,maximize?1.5:inf,-2); + bounds(result.sensitivity->objective(y),maximize?-inf:-4,maximize?4:inf,2); + bounds(result.sensitivity->equality_rhs(row),-20*scale,-4*scale,(maximize?3.0:-3.0)/(4*scale)); + } +} +static void cancellation_panel(){ + // Exact original witness: w=1, x=0, y=1-10^14; dual=(1,100), + // reduced cost of w = 10^16 - 1 - 10^16 = -1. Computing the + // dot product first rounds away the 1 and changes x's lower endpoint. + O::Model model;auto x=model.add_continuous(-inf,inf),y=model.add_continuous(-inf,inf),w=model.add_continuous(0,1); + model.add_row({{x,1},{w,1}},1,1);model.add_row({{y,1},{w,1e14}},1,1); + model.minimize({{x,1},{y,100},{w,1e16}});auto source=model.snapshot(); + O::LpObservedResult original;original.result.model_id=source.model_id;original.result.revision=source.revision; + original.result.termination=O::Termination::Optimal;original.result.guarantee=O::Guarantee::Numerical; + original.result.values={0,1-1e14,1};original.result.active_variables={true,true,true};original.result.solution_validated=true; + original.result.objective=original.result.best_bound=100;original.result.absolute_gap=original.result.relative_gap=0; + O::LpObservationOptions options;auto data=O::Detail::LpObservationAccess::create(source,options);original.observations=data; + O::Detail::LpBackendObservations raw;raw.attempted=raw.timely=raw.complete=true; + raw.info_valid=raw.value_valid=raw.primal_feasible=raw.dual_valid=raw.dual_feasible=raw.basis_valid=raw.info_basis_valid=true; + raw.model_id=source.model_id;raw.revision=source.revision;raw.column_slots={0,1,2};raw.row_slots={0,1}; + raw.column_duals={0,0,-1};raw.row_duals={1,100}; + raw.column_basis={O::LpBasisStatus::Basic,O::LpBasisStatus::Basic,O::LpBasisStatus::Upper}; + raw.row_basis={O::LpBasisStatus::Lower,O::LpBasisStatus::Lower};O::SolveBudget budget(options.solve); + O::Detail::LpObservationAccess::finish(*data,original.result,raw,budget);assert(data->checks().accepted); + O::LpSensitivityOptions requested;requested.parameters={O::LpObjectiveParameter{x}}; + auto result=O::analyze_lp_sensitivity(original,requested);complete(result);bounds(result.sensitivity->objective(x),0,inf,0); + assert(result.sensitivity->checks().kkt.normalized_gap==0); +} +static void partial_panel(){ + // The coefficient-y endpoint 100-2e-14 cannot be represented closely enough + // to retain its original-unit limiting equality; the w endpoint is exact. + O::Model model;auto y=model.add_continuous(-inf,inf),w=model.add_continuous(0,1); + model.add_row({{y,1},{w,1e14}},1,1);model.minimize({{y,100},{w,1e16-2}}); + auto original=O::solve_lp_observed(model);assert(original.result.termination==O::Termination::Optimal&&original.observations->checks().accepted); + assert(original.result.objective==98);O::LpSensitivityOptions options; + options.parameters={O::LpObjectiveParameter{y},O::LpObjectiveParameter{w}}; + auto result=O::analyze_lp_sensitivity(original,options);assert(result.completion==O::LpSensitivityCompletion::Partial&&result.sensitivity); + auto rejected=result.sensitivity->objective(y);assert(rejected->group.state==O::LpSensitivityState::Rejected&&rejected->group.reason==O::LpSensitivityReason::FailedIntervalChecks&&!rejected->interval); + bounds(result.sensitivity->objective(w),-inf,1e16,1); +} +static void oracle_panel(){ + using namespace SensitivityOracle;using B=O::LpBasisStatus; + for(bool maximize:{false,true})for(bool at_lower:{false,true})for(int a:{-3,2})for(int b:{-4,2}){ + BoxLine q;q.a=Q(a);q.b=Q(b);q.lx=Q(-2);q.ux=Q(5);q.ly=Q(0);q.uy=Q(4);q.cy=Q(3); + q.reference={at_lower?q.lx:q.ux,Q(2)};q.rhs=q.a*q.reference[0]+q.b*q.reference[1];q.maximize=maximize; + q.cx=q.a*q.cy/q.b+Q((maximize?-1:1)*(at_lower?1:-1)); + O::Model m;auto x=m.add_continuous(q.lx.value(),q.ux.value()),y=m.add_continuous(q.ly.value(),q.uy.value()); + auto row=m.add_row({{x,q.a.value()},{y,q.b.value()}},q.rhs.value(),q.rhs.value()); + m.set_objective({{x,q.cx.value()},{y,q.cy.value()}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,1e16); + auto original=selected(m,{at_lower?B::Lower:B::Upper,B::Basic},{B::Lower}); + O::LpSensitivityOptions options;options.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{y},O::LpEqualityRhsParameter{row}}; + auto result=O::analyze_lp_sensitivity(original,options);complete(result); + auto expected=[&](Range r,const O::LpSensitivityEntry* e,double slope){bounds(e,r.lower?r.lower->value():-inf,r.upper?r.upper->value():inf,slope);}; + expected(q.objective(0),result.sensitivity->objective(x),q.reference[0].value()); + expected(q.objective(1),result.sensitivity->objective(y),q.reference[1].value()); + expected(q.equality_with_x_fixed(),result.sensitivity->equality_rhs(row),(q.cy/q.b).value()); + for(std::size_t j=0;j<2;++j){const auto range=q.objective(j);const auto anchor=j?q.cy:q.cx; + assert(q.optimal_at(anchor,j)); + if(range.lower){assert(q.optimal_at(*range.lower,j));assert(q.optimal_at((*range.lower+anchor)/Q(2),j));assert(!q.optimal_at(*range.lower-Q(1,4),j));} + if(range.upper){assert(q.optimal_at(*range.upper,j));assert(q.optimal_at((*range.upper+anchor)/Q(2),j));assert(!q.optimal_at(*range.upper+Q(1,4),j));} + if(!range.lower)assert(q.optimal_at(anchor-Q(100),j)); + if(!range.upper)assert(q.optimal_at(anchor+Q(100),j)); + } + } + // Free basic column, fixed nonbasic column, unreferenced zero-cost variable. + O::Model free;auto x=free.add_continuous(-inf,inf),fixed=free.add_continuous(2,2),zero=free.add_continuous(-5,5); + auto row=free.add_row({{x,1},{fixed,1}},3,3);free.minimize({{x,1}},9); + auto original=selected(free,{B::Basic,B::Lower,B::Lower},{B::Lower}); + O::LpSensitivityOptions options;options.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{fixed},O::LpObjectiveParameter{zero},O::LpEqualityRhsParameter{row}}; + auto r=O::analyze_lp_sensitivity(original,options);complete(r); + bounds(r.sensitivity->objective(x),-inf,inf,1);bounds(r.sensitivity->objective(fixed),-inf,inf,2); + bounds(r.sensitivity->objective(zero),0,inf,-5);bounds(r.sensitivity->equality_rhs(row),-inf,inf,1); + // A redundant equality has a basic fixed logical; its RHS range is singleton. + O::Model redundant;auto v=redundant.add_continuous(0,10);auto a=redundant.add_row({{v,1}},2,2);auto b=redundant.add_row({{v,2}},4,4);redundant.minimize({{v,1}}); + original=selected(redundant,{B::Basic},{B::Lower,B::Basic});options.parameters={O::LpEqualityRhsParameter{a},O::LpEqualityRhsParameter{b},O::LpObjectiveParameter{v}}; + r=O::analyze_lp_sensitivity(original,options);complete(r);bounds(r.sensitivity->equality_rhs(a),2,2,1);bounds(r.sensitivity->equality_rhs(b),4,4,0);bounds(r.sensitivity->objective(v),-inf,inf,2); + // A ranged source row limits equality changes; varying its side is unsupported. + O::Model ranged;v=ranged.add_continuous(-inf,inf);a=ranged.add_row({{v,1}},2,2);b=ranged.add_row({{v,1}},1,3);ranged.minimize({{v,1}}); + original=selected(ranged,{B::Basic},{B::Lower,B::Basic});options.parameters={O::LpEqualityRhsParameter{a}}; + r=O::analyze_lp_sensitivity(original,options);complete(r);bounds(r.sensitivity->equality_rhs(a),1,3,1); + options.parameters={O::LpEqualityRhsParameter{b}};r=O::analyze_lp_sensitivity(original,options);assert(r.reason==O::LpSensitivityReason::Unsupported&&!r.work.factor_setup_attempted); + // A free nonbasic column requires both reduced-cost signs: coefficient zero. + O::Model free_zero;v=free_zero.add_continuous();auto z=free_zero.add_continuous(-inf,inf); + a=free_zero.add_row({{v,1}},2,2);free_zero.minimize({{v,1}}); + original=selected(free_zero,{B::Basic,B::Zero},{B::Lower});options.parameters={O::LpObjectiveParameter{z},O::LpEqualityRhsParameter{a}}; + r=O::analyze_lp_sensitivity(original,options);complete(r);bounds(r.sensitivity->objective(z),0,0,0);bounds(r.sensitivity->equality_rhs(a),0,inf,1); + // The same degenerate optimum has different ranges for different bases. + O::Model degenerate;auto dx=degenerate.add_continuous(),dy=degenerate.add_continuous(); + degenerate.add_row({{dx,1},{dy,1}},0,0);degenerate.minimize({}); + options.parameters={O::LpObjectiveParameter{dx}}; + auto x_basic=O::analyze_lp_sensitivity(selected(degenerate,{B::Basic,B::Lower},{B::Lower}),options); + auto y_basic=O::analyze_lp_sensitivity(selected(degenerate,{B::Lower,B::Basic},{B::Lower}),options); + complete(x_basic);complete(y_basic);bounds(x_basic.sensitivity->objective(dx),-inf,0,0);bounds(y_basic.sensitivity->objective(dx),0,inf,0); +} +int main(){ + O::Model m;auto x=m.add_continuous(),y=m.add_continuous();auto row=m.add_row({{x,1},{y,1}},3,3);m.minimize({{x,2},{y,1}},7); + O::LpSensitivityOptions options;options.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{y},O::LpEqualityRhsParameter{row}}; + auto original=O::solve_lp_observed(m); + if(!O::capabilities().available){ + auto missing=O::analyze_lp_sensitivity(original,options);assert(missing.completion==O::LpSensitivityCompletion::Rejected); + auto explicit_source=SensitivityFixture::two_column_observed(m); + auto unavailable=O::analyze_lp_sensitivity(explicit_source,options); + assert(unavailable.completion==O::LpSensitivityCompletion::Rejected&&unavailable.reason==O::LpSensitivityReason::Unsupported); + assert(unavailable.sensitivity&&unavailable.work.factor_setup_attempted&&unavailable.work.basis_solves==0); + for(const auto& e:unavailable.sensitivity->entries())assert(e.group.state!=O::LpSensitivityState::Available&&!e.interval); + std::cout<<"sensitivity missing-observation and missing-backend admission passed\n";return 0; + } + auto r=O::analyze_lp_sensitivity(original,options);complete(r); + bounds(r.sensitivity->objective(x),1,inf,0);bounds(r.sensitivity->objective(y),-inf,2,3);bounds(r.sensitivity->equality_rhs(row),0,inf,1); + assert(r.work.factor_setup_attempted&&r.work.basis_solves==4); + m.maximize({{x,-2},{y,-1}},11);auto maximal=O::solve_lp_observed(m);auto max=O::analyze_lp_sensitivity(maximal,options);complete(max); + bounds(max.sensitivity->objective(x),-inf,-1,0);bounds(max.sensitivity->objective(y),-2,inf,3);bounds(max.sensitivity->equality_rhs(row),0,inf,-1); + // Historical source/result is copied unchanged even after edits. + assert(r.sensitivity->original().result.objective==original.result.objective); + assert(r.sensitivity->original().observations==original.observations); + assert(r.sensitivity->revision()!=m.revision()); + auto again=O::analyze_lp_sensitivity(original,options);complete(again); + oracle_panel(); + historical_panel();scaled_panel();cancellation_panel();partial_panel(); + for(int fault=0;fault<8;++fault){auto bad=original; + if(fault==0)bad.result.termination=static_cast(99); + if(fault==1)bad.result.revision++; + if(fault==2)bad.result.active_variables[0]=false; + if(fault==3)bad.result.values[1]=4; + if(fault==4)bad.result.objective=inf; + if(fault==5)bad.result.best_bound=-10; + if(fault==6)bad.result.solution_validated=false; + if(fault==7)bad.result.absolute_gap=-1; + auto rejected=O::analyze_lp_sensitivity(bad,options);assert(rejected.completion==O::LpSensitivityCompletion::Rejected&&!rejected.work.factor_setup_attempted);} + auto limited=options;limited.time_limit_seconds=0; + assert(O::analyze_lp_sensitivity(original,limited).stop_reason==O::Termination::TimeLimit); + limited=options;limited.limits.max_basis_solves=2;auto stopped=O::analyze_lp_sensitivity(original,limited); + assert(stopped.completion==O::LpSensitivityCompletion::Interrupted&&stopped.sensitivity); + for(const auto& e:stopped.sensitivity->entries())assert(e.group.state!=O::LpSensitivityState::Available&&!e.interval); + limited=options;limited.backend=O::Backend::Native;assert(O::analyze_lp_sensitivity(original,limited).reason==O::LpSensitivityReason::Unsupported); + limited=options;limited.parameters.push_back(O::LpObjectiveParameter{x});assert(O::analyze_lp_sensitivity(original,limited).reason==O::LpSensitivityReason::InvalidSource); + std::cout<<"LP sensitivity analytic min/max, provenance and admission checks passed\n"; +} diff --git a/test/optimize/lp_sensitivity_binding_cleanup.cpp b/test/optimize/lp_sensitivity_binding_cleanup.cpp new file mode 100644 index 0000000000..3514b8acc5 --- /dev/null +++ b/test/optimize/lp_sensitivity_binding_cleanup.cpp @@ -0,0 +1,55 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +static gecode_opt_handle cancellation=0; +extern "C" void gecode_opt_test_sensitivity_binding_checkpoint(void){ + if(cancellation)assert(gecode_opt_v1_cancellation_cancel(cancellation)==GECODE_OPT_OK); +} +static void ok(int32_t c){if(c)std::cerr<::infinity();gecode_opt_handle m=0,source=0,h=0,copied=0,basis=0; + gecode_opt_id x{},y{},unrequested{},row{};ok(gecode_opt_v1_model_create(&m)); + ok(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,inf,"x",&x)); + ok(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,inf,"y",&y)); + ok(gecode_opt_v1_model_add_variable(m,GECODE_OPT_CONTINUOUS,0,1,"unrequested",&unrequested)); + gecode_opt_term terms[2]={{x,1},{y,1}};ok(gecode_opt_v1_model_add_row(m,terms,2,3,3,"balance",&row));terms[0].coefficient=2; + ok(gecode_opt_v1_model_set_objective(m,terms,2,GECODE_OPT_MINIMIZE,7));ok(gecode_opt_v1_solve_lp_observed(m,nullptr,&source)); + gecode_opt_sensitivity_request_v1 requests[2]={{sizeof(requests[0]),0,GECODE_OPT_SENSITIVITY_OBJECTIVE,0,x}, + {sizeof(requests[0]),0,GECODE_OPT_SENSITIVITY_EQUALITY_RHS,0,row}}; + gecode_opt_sensitivity_options_v1 options{};ok(gecode_opt_v1_sensitivity_options_default(&options,sizeof(options)));options.requests=requests;options.request_count=2; + ok(gecode_opt_v1_analyze_lp_sensitivity(source,&options,&h));gecode_opt_sensitivity_info_v1 info{};ok(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info))); + assert(info.completion==GECODE_OPT_SENSITIVITY_COMPLETE);ok(gecode_opt_v1_sensitivity_destroy(h)); + ok(gecode_opt_v1_cancellation_create(&cancellation));options.cancellation=cancellation; + ok(gecode_opt_v1_analyze_lp_sensitivity(source,&options,&h));ok(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info))); + assert(info.completion==GECODE_OPT_SENSITIVITY_INTERRUPTED&&info.reason==GECODE_OPT_SENSITIVITY_REASON_STOPPED); + assert(info.has_sensitivity&&info.has_basis&&info.has_stop_reason&&info.stop_reason==GECODE_OPT_CANCELLED); + gecode_opt_sensitivity_entry_v1 entries[2]{},entry{};uint64_t needed; + ok(gecode_opt_v1_sensitivity_entries(h,entries,sizeof(entries[0]),2,&needed));assert(needed==2); + for(const auto& e:entries){assert(e.requested&&!e.has_interval&&e.group.state==GECODE_OPT_SENSITIVITY_UNAVAILABLE&&e.group.reason==GECODE_OPT_SENSITIVITY_REASON_STOPPED); + assert(!e.objective_slope.present&&!e.checks.accepted&&!e.lower.value.present&&!e.has_lower_limiter);} + ok(gecode_opt_v1_sensitivity_entry(h,0,&entry,sizeof(entry)));assert(!entry.has_interval); + ok(gecode_opt_v1_sensitivity_objective(h,x,&entry,sizeof(entry)));assert(!entry.has_interval); + ok(gecode_opt_v1_sensitivity_equality_rhs(h,row,&entry,sizeof(entry)));assert(!entry.has_interval); + ok(gecode_opt_v1_sensitivity_objective(h,unrequested,&entry,sizeof(entry)));assert(!entry.requested&&entry.group.state==GECODE_OPT_SENSITIVITY_NOT_REQUESTED); + char message[160];for(int field:{GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE,GECODE_OPT_SENSITIVITY_INTERVAL_MESSAGE}){ + ok(gecode_opt_v1_sensitivity_text(h,field,0,message,sizeof(message),&needed));assert(std::strstr(message,"stopped"));} + gecode_opt_sensitivity_reference_checks_v1 checks{};ok(gecode_opt_v1_sensitivity_reference_checks(h,&checks,sizeof(checks))); + assert(checks.primal.valid&&checks.kkt.accepted&&checks.basis_point_matches); // retained diagnostics, not intervals + ok(gecode_opt_v1_sensitivity_copy_source_observed(h,&copied));ok(gecode_opt_v1_sensitivity_copy_basis(h,&basis)); + // Invalid options retain their original admission reason even at this hook. + options.time_limit_seconds=-1;gecode_opt_handle invalid=0;ok(gecode_opt_v1_analyze_lp_sensitivity(source,&options,&invalid)); + ok(gecode_opt_v1_sensitivity_info(invalid,&info,sizeof(info)));assert(info.reason==GECODE_OPT_SENSITIVITY_REASON_INVALID_SOURCE&&!info.has_stop_reason); + ok(gecode_opt_v1_sensitivity_destroy(invalid));ok(gecode_opt_v1_sensitivity_destroy(h));ok(gecode_opt_v1_lp_observed_result_destroy(source)); + ok(gecode_opt_v1_model_destroy(m));ok(gecode_opt_v1_cancellation_destroy(cancellation));cancellation=0; + gecode_opt_lp_info_v1 original{};ok(gecode_opt_v1_lp_observed_result_info(copied,&original,sizeof(original)));assert(original.result.termination==GECODE_OPT_OPTIMAL); + int32_t status;ok(gecode_opt_v1_basis_column(basis,y,&status));assert(status==GECODE_OPT_LP_BASIS_BASIC); + ok(gecode_opt_v1_lp_observed_result_destroy(copied));ok(gecode_opt_v1_basis_destroy(basis)); + std::cout<<"Sensitivity binding cleanup revokes every range view and retains owning source/basis diagnostics\n"; +} diff --git a/test/optimize/lp_sensitivity_c.c b/test/optimize/lp_sensitivity_c.c new file mode 100644 index 0000000000..5ffeabf973 --- /dev/null +++ b/test/optimize/lp_sensitivity_c.c @@ -0,0 +1,121 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#define OK(call) do {int32_t c_=(call);if(c_){fprintf(stderr,"%s: %s\n",#call,gecode_opt_v1_last_error());assert(!c_);}}while(0) +static int32_t available; +static void near(double a,double b){assert(isfinite(a)&&fabs(a-b)<1e-7);} +static gecode_opt_sensitivity_request_v1 request(int32_t kind,gecode_opt_id id){ + gecode_opt_sensitivity_request_v1 r;memset(&r,0,sizeof(r));r.struct_size=sizeof(r);r.kind=kind;r.entity=id;return r; +} +static gecode_opt_handle analyze(gecode_opt_handle source,const gecode_opt_sensitivity_options_v1* o){ + gecode_opt_handle h=0;OK(gecode_opt_v1_analyze_lp_sensitivity(source,o,&h));assert(h);return h; +} +static void model(gecode_opt_handle* m,gecode_opt_handle* observed,gecode_opt_id ids[6]){ + gecode_opt_term t[2];OK(gecode_opt_v1_model_create(m)); + OK(gecode_opt_v1_model_add_variable(*m,GECODE_OPT_CONTINUOUS,0,1,"dead",&ids[0]));OK(gecode_opt_v1_model_remove_variable(*m,ids[0])); + OK(gecode_opt_v1_model_add_variable(*m,GECODE_OPT_CONTINUOUS,0,INFINITY,"x",&ids[1])); + OK(gecode_opt_v1_model_add_variable(*m,GECODE_OPT_CONTINUOUS,0,INFINITY,"y",&ids[2])); + OK(gecode_opt_v1_model_add_variable(*m,GECODE_OPT_CONTINUOUS,0,1,"unrequested",&ids[3])); + OK(gecode_opt_v1_model_add_row(*m,NULL,0,-INFINITY,INFINITY,"gone",&ids[4]));OK(gecode_opt_v1_model_remove_row(*m,ids[4])); + t[0].variable=ids[1];t[0].coefficient=1;t[1].variable=ids[2];t[1].coefficient=1; + OK(gecode_opt_v1_model_add_row(*m,t,2,3,3,"balance",&ids[5]));t[0].coefficient=2; + OK(gecode_opt_v1_model_set_objective(*m,t,2,GECODE_OPT_MINIMIZE,7));OK(gecode_opt_v1_solve_lp_observed(*m,NULL,observed)); +} +static void analytic_history(void){ + gecode_opt_handle m=0,observed=0,h=0,copy=0,basis=0,ordinary=0;gecode_opt_id ids[6],bad,order[1]; + gecode_opt_sensitivity_options_v1 o;gecode_opt_sensitivity_request_v1 requests[3]; + gecode_opt_sensitivity_info_v1 info;gecode_opt_sensitivity_work_v1 work,before; + gecode_opt_sensitivity_entry_v1 entries[3],single;gecode_opt_sensitivity_reference_checks_v1 checks; + gecode_opt_lp_info_v1 original;gecode_opt_result_info_v1 result;uint64_t n,owner,revision;uint8_t mask[4];int32_t status; + model(&m,&observed,ids);OK(gecode_opt_v1_model_identity(m,&owner,&revision)); + requests[0]=request(0,ids[1]);requests[1]=request(0,ids[2]);requests[2]=request(1,ids[5]); + OK(gecode_opt_v1_sensitivity_options_default(&o,sizeof(o)));o.requests=requests;o.request_count=3; + assert(!o.reserved&&!o.reserved_flags&&!o.checks.reserved&&!o.limits.reserved);h=analyze(observed,&o); + memset(&info,0xa5,sizeof(info));OK(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info))); + assert(info.model_id==owner&&info.revision==revision&&info.guarantee==GECODE_OPT_NUMERICAL&&!info.reserved&&!info.reserved_flags); + OK(gecode_opt_v1_sensitivity_work(h,&before,sizeof(before)));assert(before.preparation_visits==3); + assert(gecode_opt_v1_result_info(h,&result,sizeof(result))==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_sensitivity_copy_source_observed(h,©));OK(gecode_opt_v1_lp_observed_result_info(copy,&original,sizeof(original))); + assert(original.result.model_id==owner&&original.result.revision==revision); + if(available){ + assert(info.completion==GECODE_OPT_SENSITIVITY_COMPLETE&&info.has_sensitivity&&info.has_basis&&!info.has_stop_reason); + assert(info.entry_count==3&&info.factor_order_count==1&&info.column_slots==4&&info.row_slots==2); + assert(before.factor_setup_attempted&&before.basis_solves>0&&before.coordinator_visits>0); + OK(gecode_opt_v1_sensitivity_entries(h,NULL,sizeof(entries[0]),0,&n));assert(n==3); + memset(entries,0xa5,sizeof(entries));assert(gecode_opt_v1_sensitivity_entries(h,entries,sizeof(entries[0]),2,&n)==GECODE_OPT_BUFFER_TOO_SMALL); + assert(entries[0].struct_size==UINT64_C(0xa5a5a5a5a5a5a5a5)); + OK(gecode_opt_v1_sensitivity_entries(h,entries,sizeof(entries[0]),3,&n)); + assert(n==3&&entries[0].has_interval&&entries[0].requested&&entries[0].index==0&&entries[2].index==2); + assert(entries[0].group.state==GECODE_OPT_SENSITIVITY_AVAILABLE&&entries[0].checks.accepted); + assert(!entries[0].reserved&&!entries[0].lower.reserved&&!entries[0].checks.reserved_flags); + near(entries[0].anchor,2);near(entries[0].lower.value.value,1);assert(entries[0].lower.value.present); + assert(entries[0].upper.kind==GECODE_OPT_RANGE_POSITIVE_INFINITY&&!entries[0].upper.value.present&&entries[0].upper.value.value==0); + assert(entries[1].lower.kind==GECODE_OPT_RANGE_NEGATIVE_INFINITY&&!entries[1].lower.value.present);near(entries[1].upper.value.value,2); + near(entries[2].lower.value.value,0);assert(entries[2].upper.kind==GECODE_OPT_RANGE_POSITIVE_INFINITY);near(entries[2].objective_slope.value,1); + OK(gecode_opt_v1_sensitivity_objective(h,ids[3],&single,sizeof(single)));assert(!single.requested&&!single.has_interval&&single.group.state==GECODE_OPT_SENSITIVITY_NOT_REQUESTED); + OK(gecode_opt_v1_sensitivity_equality_rhs(h,ids[5],&single,sizeof(single)));assert(single.index==2);near(single.anchor,3); + bad=ids[1];bad.model_id++;assert(gecode_opt_v1_sensitivity_objective(h,bad,&single,sizeof(single))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_sensitivity_objective(h,ids[0],&single,sizeof(single))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_sensitivity_equality_rhs(h,ids[4],&single,sizeof(single))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_sensitivity_objective(h,ids[5],&single,sizeof(single))==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_sensitivity_factor_order(h,order,1,&n));assert(n==1&&order[0].model_id==owner&&order[0].slot==ids[2].slot&&order[0].kind==GECODE_OPT_VARIABLE_ID); + OK(gecode_opt_v1_sensitivity_active_slots(h,GECODE_OPT_VARIABLE_ID,mask,4,&n));assert(n==4&&!mask[0]&&mask[1]&&mask[2]&&mask[3]); + OK(gecode_opt_v1_sensitivity_reference_checks(h,&checks,sizeof(checks)));assert(checks.primal.valid&&checks.primal.model_valid&&checks.kkt.accepted&&checks.basis_point_matches); + assert(checks.max_system_residual.present&&!checks.reserved&&!checks.kkt.reserved); + OK(gecode_opt_v1_sensitivity_copy_basis(h,&basis)); + {char text[1];assert(gecode_opt_v1_sensitivity_text(h,GECODE_OPT_SENSITIVITY_ENTRY_MESSAGE,0,text,1,&n)==GECODE_OPT_BUFFER_TOO_SMALL);assert(n>1);} + assert(gecode_opt_v1_sensitivity_text(h,GECODE_OPT_SENSITIVITY_MESSAGE,1,NULL,0,&n)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_sensitivity_entries(h,NULL,sizeof(single)-1,0,&n)==GECODE_OPT_INVALID_ARGUMENT); + }else{ + assert(info.completion==GECODE_OPT_SENSITIVITY_ANALYSIS_REJECTED&&!info.has_sensitivity&&!before.factor_setup_attempted&&!before.basis_solves); + assert(gecode_opt_v1_sensitivity_entry(h,0,&single,sizeof(single))==GECODE_OPT_NO_SENSITIVITY); + assert(gecode_opt_v1_sensitivity_copy_basis(h,&basis)==GECODE_OPT_NO_BASIS&&!basis); + } + OK(gecode_opt_v1_sensitivity_work(h,&work,sizeof(work)));assert(!memcmp(&work,&before,sizeof(work))); + OK(gecode_opt_v1_model_set_objective_offset(m,999));OK(gecode_opt_v1_model_destroy(m));OK(gecode_opt_v1_lp_observed_result_destroy(observed)); + OK(gecode_opt_v1_sensitivity_destroy(h));OK(gecode_opt_v1_lp_observed_result_copy_result(copy,&ordinary)); + OK(gecode_opt_v1_result_info(ordinary,&result,sizeof(result)));assert(result.model_id==owner&&result.revision==revision); + if(available){double value;int32_t present;OK(gecode_opt_v1_result_number(ordinary,GECODE_OPT_OBJECTIVE,&present,&value));assert(present);near(value,10); + OK(gecode_opt_v1_basis_column(basis,ids[2],&status));assert(status==GECODE_OPT_LP_BASIS_BASIC);OK(gecode_opt_v1_basis_destroy(basis));} + OK(gecode_opt_v1_lp_observed_result_destroy(copy));OK(gecode_opt_v1_result_destroy(ordinary)); +} +static void admission(void){ + gecode_opt_handle m=0,observed=0,h=0,token=0;gecode_opt_id ids[6];gecode_opt_sensitivity_request_v1 r,saved; + gecode_opt_sensitivity_options_v1 o,bad;gecode_opt_sensitivity_info_v1 info;gecode_opt_sensitivity_work_v1 work;int i;int32_t cancelled; + model(&m,&observed,ids);r=request(0,ids[1]);saved=r;OK(gecode_opt_v1_sensitivity_options_default(&o,sizeof(o)));o.requests=&r;o.request_count=1; + for(i=0;i<13;i++){ + bad=o;r=saved;switch(i){case 0:bad.struct_size--;break;case 1:bad.reserved=1;break;case 2:bad.reserved_flags=1;break; + case 3:bad.checks.struct_size--;break;case 4:bad.checks.reserved=1;break;case 5:bad.limits.struct_size--;break; + case 6:bad.limits.reserved=1;break;case 7:bad.backend=99;break;case 8:bad.requests=NULL;break; + case 9:r.struct_size--;break;case 10:r.reserved=1;break;case 11:r.kind=99;break;default:r.entity.kind=GECODE_OPT_ROW_ID;break;} + h=99;assert(gecode_opt_v1_analyze_lp_sensitivity(observed,&bad,&h)==GECODE_OPT_INVALID_ARGUMENT&&!h); + } + r=saved;h=99;assert(gecode_opt_v1_analyze_lp_sensitivity(m,&o,&h)==GECODE_OPT_INVALID_HANDLE&&!h); + for(i=0;i<6;i++){ + bad=o;switch(i){case 0:bad.request_count=0;break;case 1:bad.checks.stationarity=NAN;break;case 2:bad.time_limit_seconds=-1;break; + case 3:bad.time_limit_seconds=0;break;case 4:bad.limits.max_work=0;break;default:bad.limits.max_requests=0;break;} + h=analyze(observed,&bad);OK(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info)));OK(gecode_opt_v1_sensitivity_work(h,&work,sizeof(work))); + assert(!work.factor_setup_attempted&&!work.basis_solves&&!work.preparation_visits); + if(i<3){assert(info.completion==GECODE_OPT_SENSITIVITY_ANALYSIS_REJECTED&&info.reason==GECODE_OPT_SENSITIVITY_REASON_INVALID_SOURCE&&!info.has_stop_reason);} + else{assert(info.completion==GECODE_OPT_SENSITIVITY_INTERRUPTED&&info.has_stop_reason); + assert(info.stop_reason==(i==3?GECODE_OPT_TIME_LIMIT:i==4?GECODE_OPT_ITERATION_LIMIT:GECODE_OPT_MEMORY_LIMIT));} + OK(gecode_opt_v1_sensitivity_destroy(h)); + } + OK(gecode_opt_v1_cancellation_create(&token));OK(gecode_opt_v1_cancellation_is_cancelled(token,&cancelled));assert(!cancelled); + assert(gecode_opt_v1_cancellation_is_cancelled(token,NULL)==GECODE_OPT_INVALID_ARGUMENT); + assert(gecode_opt_v1_cancellation_is_cancelled(m,&cancelled)==GECODE_OPT_INVALID_HANDLE); + OK(gecode_opt_v1_cancellation_cancel(token));OK(gecode_opt_v1_cancellation_is_cancelled(token,&cancelled));assert(cancelled); + bad=o;bad.cancellation=token;h=analyze(observed,&bad);OK(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info)));assert(info.stop_reason==GECODE_OPT_CANCELLED);OK(gecode_opt_v1_sensitivity_destroy(h)); + bad.time_limit_seconds=-1;h=analyze(observed,&bad);OK(gecode_opt_v1_sensitivity_info(h,&info,sizeof(info)));assert(info.reason==GECODE_OPT_SENSITIVITY_REASON_INVALID_SOURCE&&!info.has_stop_reason);OK(gecode_opt_v1_sensitivity_destroy(h)); + {gecode_opt_handle copied=0;OK(gecode_opt_v1_cancellation_copy(token,&copied));OK(gecode_opt_v1_cancellation_destroy(token)); + OK(gecode_opt_v1_cancellation_is_cancelled(copied,&cancelled));assert(cancelled);OK(gecode_opt_v1_cancellation_destroy(copied)); + copied=99;assert(gecode_opt_v1_cancellation_copy(m,&copied)==GECODE_OPT_INVALID_HANDLE&&!copied);} + OK(gecode_opt_v1_lp_observed_result_destroy(observed));OK(gecode_opt_v1_model_destroy(m)); +} +int main(void){int32_t lp,mip;OK(gecode_opt_v1_capabilities(GECODE_OPT_HIGHS,&available,&lp,&mip));analytic_history();admission();puts("C99 sensitivity endpoints, source/basis history, counted buffers and admission passed");return 0;} diff --git a/test/optimize/lp_sensitivity_coordinator.cpp b/test/optimize/lp_sensitivity_coordinator.cpp new file mode 100644 index 0000000000..b5ff6557b2 --- /dev/null +++ b/test/optimize/lp_sensitivity_coordinator.cpp @@ -0,0 +1,120 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#include "lp_sensitivity_fixture.hpp" + +namespace O=Gecode::Optimize; +namespace { +int fault=0;std::size_t calls=0;std::string stop_event; +std::shared_ptr token; +struct Factor : O::Detail::LpSensitivityFactor { + ~Factor() override {if(fault==10&&token)token->cancel();} + std::vector solve(const std::vector& rhs,bool) override { + ++calls;assert(rhs.size()==1); + if(fault==5)return {}; + if(fault==6)return {std::numeric_limits::quiet_NaN()}; + if(fault==7&&calls==1)return {rhs[0]+1}; + if(fault==8&&calls==2)return {rhs[0]+1}; + if(fault==9&&calls==3)return {rhs[0]+1}; + if(fault==12&&calls==3)return {std::numeric_limits::denorm_min()}; + if(fault==13&&calls==3)return {1e-200}; + return rhs; // Selected B=[1]. This is not an optimization backend. + } +}; +void clear(const O::LpSensitivityResult& out) { + if(out.sensitivity)for(const auto& entry:out.sensitivity->entries()) + assert(entry.group.state!=O::LpSensitivityState::Available&&!entry.interval); +} +} +namespace Gecode {namespace Optimize {namespace Detail { +std::unique_ptr lp_sensitivity_test_factor( + const ModelSnapshot& source,const LpBasis&,double,const SolveBudget&) { + calls=0;if(fault==1)return {}; + auto out=std::make_unique();out->version="test factor"; + out->columns={0,1};out->rows={0};out->order={source.variables[1].variable}; + if(fault==2)out->columns={0}; + if(fault==3)out->order={Variable{source.model_id+1,1}}; + if(fault==4)out->order={source.variables[0].variable}; + return out; +} +void lp_sensitivity_test_checkpoint(const char* point,std::size_t index) { + if(stop_event==point&&token)token->cancel(); + if(fault==11&&std::string(point)=="after_interval"&&index==0)throw std::bad_alloc(); + if(fault==14&&std::string(point)=="after_interval"&&index==2)throw std::runtime_error("test backend boundary exception"); +} +}}} +int main() { + O::Model model;auto x=model.add_continuous(),y=model.add_continuous();auto row=model.add_row({{x,1},{y,1}},3,3);model.minimize({{x,2},{y,1}},7); + const auto source=SensitivityFixture::two_column_observed(model);O::LpSensitivityOptions options; + options.parameters={O::LpObjectiveParameter{x},O::LpObjectiveParameter{y},O::LpEqualityRhsParameter{row}}; + auto normal=O::analyze_lp_sensitivity(source,options);assert(normal.completion==O::LpSensitivityCompletion::Complete); + for(fault=1;fault<=8;++fault){auto out=O::analyze_lp_sensitivity(source,options);assert(out.completion==O::LpSensitivityCompletion::Rejected);clear(out);} + fault=9;auto partial=O::analyze_lp_sensitivity(source,options); + assert(partial.completion==O::LpSensitivityCompletion::Partial); + assert(partial.sensitivity->entries()[0].group.state==O::LpSensitivityState::Available); + assert(partial.sensitivity->entries()[1].group.state==O::LpSensitivityState::Rejected&&!partial.sensitivity->entries()[1].interval); + assert(partial.sensitivity->entries()[2].group.state==O::LpSensitivityState::Available); + token=std::make_shared();options.cancellation=token;stop_event="after_cleanup"; + auto stopped_partial=O::analyze_lp_sensitivity(source,options); + assert(stopped_partial.completion==O::LpSensitivityCompletion::Interrupted&&stopped_partial.stop_reason==O::Termination::Cancelled);clear(stopped_partial); + stop_event.clear();token.reset();options.cancellation.reset(); + // Deliberately loosen the linear-system tolerance to admit a corrupt tiny + // derivative. Finite endpoint overflow must still never become infinity. + auto loose=options;loose.checks.system_absolute=2;fault=12; + auto overflow=O::analyze_lp_sensitivity(source,loose); + assert(overflow.completion==O::LpSensitivityCompletion::Partial); + assert(overflow.sensitivity->entries()[1].group.reason==O::LpSensitivityReason::FailedIntervalChecks); + assert(!overflow.sensitivity->entries()[1].interval); + fault=13;auto tiny=O::analyze_lp_sensitivity(source,loose); + assert(tiny.completion==O::LpSensitivityCompletion::Complete); + const auto& finite=tiny.sensitivity->entries()[1].interval->upper; + assert(finite.kind==O::LpRangeEndKind::Finite&&finite.value&&*finite.value>1e199); + fault=0; + for(const char* phase:{"before_copy","after_copy","before_factor","after_factor","before_system","after_system","after_reference","before_interval","after_interval","after_cleanup"}) { + token=std::make_shared();options.cancellation=token;stop_event=phase; + auto stopped=O::analyze_lp_sensitivity(source,options);assert(stopped.completion==O::LpSensitivityCompletion::Interrupted&&stopped.stop_reason==O::Termination::Cancelled);clear(stopped); + } + stop_event.clear();token=std::make_shared();options.cancellation=token;fault=10; + auto cleanup=O::analyze_lp_sensitivity(source,options);assert(cleanup.stop_reason==O::Termination::Cancelled);clear(cleanup); + options.cancellation.reset();token.reset();fault=11; + auto allocation=O::analyze_lp_sensitivity(source,options);assert(allocation.reason==O::LpSensitivityReason::AllocationFailure&&allocation.stop_reason==O::Termination::MemoryLimit);clear(allocation); + fault=14;auto exception=O::analyze_lp_sensitivity(source,options); + assert(exception.reason==O::LpSensitivityReason::BackendFailure&&exception.completion==O::LpSensitivityCompletion::Rejected);clear(exception); + fault=0; + for(int limit=0;limit<7;++limit){auto o=options; + if(limit==0)o.limits.max_rows=0; + if(limit==1)o.limits.max_columns=1; + if(limit==2)o.limits.max_nonzeros=1; + if(limit==3)o.limits.max_factor_entries=0; + if(limit==4)o.limits.max_requests=2; + if(limit==5)o.limits.max_retained_slots=1; + if(limit==6)o.limits.max_work=0; + auto rejected=O::analyze_lp_sensitivity(source,o);assert(rejected.reason==O::LpSensitivityReason::ResourceLimit&&!rejected.work.factor_setup_attempted);clear(rejected);} + for(int option=0;option<7;++option){auto o=options; + if(option==0)o.checks.system_absolute=-1; + if(option==1)o.checks.system_relative=std::numeric_limits::quiet_NaN(); + if(option==2)o.parameters.clear(); + if(option==3)o.backend=static_cast(99); + if(option==4)o.time_limit_seconds=-1; + if(option==5)o.time_limit_seconds=std::numeric_limits::quiet_NaN(); + if(option==6){o.time_limit_seconds=-1;o.cancellation=std::make_shared();o.cancellation->cancel();} + auto rejected=O::analyze_lp_sensitivity(source,o);assert(rejected.completion==O::LpSensitivityCompletion::Rejected&&!rejected.work.factor_setup_attempted);clear(rejected);} + // Inactive semantic payloads are still owning copied history. Empty table + // tuple containers therefore consume retained slots even with no entries. + auto historical=model.snapshot();O::GlobalData inactive; + inactive.global={model.id(),0};inactive.active=false; + O::TableData table;table.tuples.resize(1000);inactive.payload=std::move(table);historical.globals.push_back(std::move(inactive)); + auto history=SensitivityFixture::two_column_observed(std::move(historical));auto retention=options; + retention.limits.max_retained_slots=normal.work.retained_slots+1000; + auto retained=O::analyze_lp_sensitivity(history,retention); + assert(retained.reason==O::LpSensitivityReason::ResourceLimit&&!retained.work.factor_setup_attempted);clear(retained); + assert(O::analyze_lp_sensitivity(source,options).completion==O::LpSensitivityCompletion::Complete); + std::cout<<"LP sensitivity malformed-factor, partial, caps, allocation and cleanup coordinator passed\n"; +} diff --git a/test/optimize/lp_sensitivity_factor.cpp b/test/optimize/lp_sensitivity_factor.cpp new file mode 100644 index 0000000000..aaaa7204c3 --- /dev/null +++ b/test/optimize/lp_sensitivity_factor.cpp @@ -0,0 +1,69 @@ +/* Pinned backend experiment: factor a supplied basis without optimization. */ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include "Highs.h" +#include +#include +#include +#include +#include + +static void near(double actual,double expected) { + assert(std::isfinite(actual)); + assert(std::abs(actual-expected)<=1e-9*std::max(1.0,std::abs(expected))); +} +static HighsLp model(double first,double second,bool singular=false) { + HighsLp lp; + lp.num_col_=2;lp.num_row_=2; + lp.col_cost_={1,2};lp.col_lower_={0,0};lp.col_upper_={10,10}; + lp.row_lower_={-100,-100};lp.row_upper_={100,100}; + lp.a_matrix_.format_=MatrixFormat::kColwise; + lp.a_matrix_.start_={0,2,4};lp.a_matrix_.index_={0,1,0,1}; + lp.a_matrix_.value_={2*first,8*second,4*first,(singular?16:32)*second}; + return lp; +} +static void mixed(double first,double second) { + Highs h;assert(h.setOptionValue("output_flag",false)==HighsStatus::kOk); + assert(h.setOptionValue("threads",1)==HighsStatus::kOk); + assert(h.passModel(model(first,second))==HighsStatus::kOk); + HighsBasis b;b.alien=false;b.valid=true;b.useful=true; + b.col_status={HighsBasisStatus::kBasic,HighsBasisStatus::kLower}; + b.row_status={HighsBasisStatus::kUpper,HighsBasisStatus::kBasic}; + assert(h.setBasis(b,"sensitivity factor-only experiment")==HighsStatus::kOk); + assert(!h.hasInvert()); + std::vector order(2); + assert(h.getBasicVariables(order.data())==HighsStatus::kOk); + assert(h.hasInvert());assert(order[0]==0&&order[1]==-2); + assert(h.getBasis().col_status==b.col_status&&h.getBasis().row_status==b.row_status); + // B = [ A_column_0, +e_1 ]. Logical coordinate z is -row activity. + double rhs[]={6*first,40*second},answer[2]={}; + assert(h.getBasisSolve(rhs,answer)==HighsStatus::kOk); + near(answer[0],3);near(answer[1],16*second); + near(2*first*answer[0],rhs[0]);near(8*second*answer[0]+answer[1],rhs[1]); + const double dual[]={4/first,3/second}; + const double trhs[]={32,3/second}; + assert(h.getBasisTransposeSolve(trhs,answer)==HighsStatus::kOk); + near(answer[0],dual[0]);near(answer[1],dual[1]); + near(2*first*answer[0]+8*second*answer[1],trhs[0]);near(answer[1],trhs[1]); + // Original first-row RHS movement uses +e_0: z_0'=-1, x'=B^-1 e_0. + const double direction_rhs[]={1,0}; + assert(h.getBasisSolve(direction_rhs,answer)==HighsStatus::kOk); + near(2*first*answer[0],1);near(8*second*answer[0]+answer[1],0); + assert(h.getModelStatus()==HighsModelStatus::kNotset); + assert(!h.getInfo().valid); +} +int main() { + mixed(1,1);mixed(1e-6,1e6); + Highs h;assert(h.setOptionValue("output_flag",false)==HighsStatus::kOk); + assert(h.passModel(model(1,1,true))==HighsStatus::kOk); + HighsBasis b;b.alien=false;b.valid=true;b.useful=true; + b.col_status={HighsBasisStatus::kBasic,HighsBasisStatus::kBasic}; + b.row_status={HighsBasisStatus::kLower,HighsBasisStatus::kUpper}; + assert(h.setBasis(b,"singular factor-only experiment")==HighsStatus::kOk); + std::vector order(2); + assert(h.getBasicVariables(order.data())==HighsStatus::kError); + assert(h.getBasis().col_status==b.col_status&&h.getBasis().row_status==b.row_status); + assert(h.getModelStatus()==HighsModelStatus::kNotset); + std::cout<<"factor-only normal/scaled signs and singular rejection passed\n"; +} diff --git a/test/optimize/lp_sensitivity_fixture.hpp b/test/optimize/lp_sensitivity_fixture.hpp new file mode 100644 index 0000000000..ed3f8bc58b --- /dev/null +++ b/test/optimize/lp_sensitivity_fixture.hpp @@ -0,0 +1,24 @@ +/* Explicit immutable O1 data for testing without an optimization backend. */ +#ifndef TEST_OPTIMIZE_LP_SENSITIVITY_FIXTURE_HPP +#define TEST_OPTIMIZE_LP_SENSITIVITY_FIXTURE_HPP +#include +#include +namespace SensitivityFixture { +namespace O=Gecode::Optimize; +inline O::LpObservedResult two_column_observed(O::ModelSnapshot source) { + O::LpObservationOptions options; + O::LpObservedResult out;out.result.model_id=source.model_id;out.result.revision=source.revision; + out.result.termination=O::Termination::Optimal;out.result.guarantee=O::Guarantee::Numerical; + out.result.backend="Test explicit original O1 data";out.result.objective=10;out.result.best_bound=10; + out.result.absolute_gap=0;out.result.relative_gap=0;out.result.values={0,3};out.result.active_variables={true,true};out.result.solution_validated=true; + auto data=O::Detail::LpObservationAccess::create(source,options);out.observations=data; + O::Detail::LpBackendObservations raw;raw.attempted=true;raw.timely=true;raw.complete=true; + raw.info_valid=raw.value_valid=raw.primal_feasible=raw.dual_valid=raw.dual_feasible=raw.basis_valid=raw.info_basis_valid=true; + raw.model_id=source.model_id;raw.revision=source.revision;raw.column_slots={0,1};raw.row_slots={0}; + raw.column_duals={1,0};raw.row_duals={1};raw.column_basis={O::LpBasisStatus::Lower,O::LpBasisStatus::Basic};raw.row_basis={O::LpBasisStatus::Lower}; + O::SolveBudget budget(options.solve);O::Detail::LpObservationAccess::finish(*data,out.result,raw,budget); + assert(data->basis().state==O::LpObservationState::Available&&data->checks().accepted);return out; +} +inline O::LpObservedResult two_column_observed(const O::Model& model) {return two_column_observed(model.snapshot());} +} +#endif diff --git a/test/optimize/lp_sensitivity_oracle.hpp b/test/optimize/lp_sensitivity_oracle.hpp new file mode 100644 index 0000000000..f5ec46d5d4 --- /dev/null +++ b/test/optimize/lp_sensitivity_oracle.hpp @@ -0,0 +1,63 @@ +/* Independent exact vertex oracle for small boxed two-variable equality LPs. + * It compares objectives at enumerated vertices, never uses a simplex tableau. + * Fixtures keep operands small enough for checked int64 arithmetic. */ +#ifndef TEST_OPTIMIZE_LP_SENSITIVITY_ORACLE_HPP +#define TEST_OPTIMIZE_LP_SENSITIVITY_ORACLE_HPP +#include +#include +#include +#include +#include +#include +#include +namespace SensitivityOracle { +struct Q { + std::int64_t n=0,d=1; + Q(std::int64_t a=0,std::int64_t b=1):n(a),d(b){assert(b);if(d<0){n=-n;d=-d;}auto g=std::gcd(n,d);n/=g;d/=g;} + double value() const{return static_cast(n)/d;} +}; +inline std::int64_t product(std::int64_t a,std::int64_t b){assert(std::abs(a)<=100000000&&std::abs(b)<=100000000);return a*b;} +inline Q operator+(Q a,Q b){return {product(a.n,b.d)+product(b.n,a.d),product(a.d,b.d)};} +inline Q operator-(Q a,Q b){return {product(a.n,b.d)-product(b.n,a.d),product(a.d,b.d)};} +inline Q operator*(Q a,Q b){return {product(a.n,b.n),product(a.d,b.d)};} +inline Q operator/(Q a,Q b){assert(b.n);return {product(a.n,b.d),product(a.d,b.n)};} +inline bool operator<(Q a,Q b){return product(a.n,b.d) lower,upper;}; +struct BoxLine { + Q a,b,rhs,lx,ux,ly,uy,cx,cy; + std::array reference; + bool maximize=false; + std::vector> vertices() const { + std::vector> out; + auto add=[&](Q x,Q y){if(x=2; solve minimize y; output [show([x,y]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-all-different.mzn b/test/optimize/minizinc-fixtures/mzn-all-different.mzn new file mode 100644 index 0000000000..b8952921b5 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-all-different.mzn @@ -0,0 +1 @@ +include "all_different.mzn"; array[1..2] of var 1..2:x; constraint all_different(x); solve minimize x[1]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-circuit-negative.mzn b/test/optimize/minizinc-fixtures/mzn-circuit-negative.mzn new file mode 100644 index 0000000000..d32c5d49f4 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-circuit-negative.mzn @@ -0,0 +1 @@ +include "circuit.mzn"; array[-2..0] of var -2..0:x; constraint circuit(x); solve minimize x[-2]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-circuit-offset.mzn b/test/optimize/minizinc-fixtures/mzn-circuit-offset.mzn new file mode 100644 index 0000000000..4ee5d8d840 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-circuit-offset.mzn @@ -0,0 +1 @@ +include "circuit.mzn"; array[2..4] of var 2..4:x; constraint circuit(x); solve minimize x[2]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-cumulative-fixed-alias.mzn b/test/optimize/minizinc-fixtures/mzn-cumulative-fixed-alias.mzn new file mode 100644 index 0000000000..e8c278191b --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-cumulative-fixed-alias.mzn @@ -0,0 +1 @@ +include "cumulative.mzn"; var 1..1:d; var 1..1:r=d; var 0..2:x; constraint cumulative([x,1,1],[d,1,1],[r,1,1],2); solve minimize x; output [show([x,d,r]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-cumulative-half-open.mzn b/test/optimize/minizinc-fixtures/mzn-cumulative-half-open.mzn new file mode 100644 index 0000000000..3fc8ce8411 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-cumulative-half-open.mzn @@ -0,0 +1 @@ +include "cumulative.mzn"; var 0..2:x; constraint cumulative([x,1,1],[1,1,1],[1,1,1],2); solve minimize x; output [show([x,1]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-cumulative-unsat.mzn b/test/optimize/minizinc-fixtures/mzn-cumulative-unsat.mzn new file mode 100644 index 0000000000..91cdc5807e --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-cumulative-unsat.mzn @@ -0,0 +1 @@ +include "cumulative.mzn"; var 0..2:x; constraint cumulative([x,x,x],[1,1,1],[1,1,1],2); solve satisfy; output [show([x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-cumulative-zero.mzn b/test/optimize/minizinc-fixtures/mzn-cumulative-zero.mzn new file mode 100644 index 0000000000..a484917f26 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-cumulative-zero.mzn @@ -0,0 +1 @@ +include "cumulative.mzn"; var 0..2:x; constraint cumulative([x,1,1],[0,1,1],[2,1,1],2); solve minimize x; output [show([x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-element-offset.mzn b/test/optimize/minizinc-fixtures/mzn-element-offset.mzn new file mode 100644 index 0000000000..b71dab5f3e --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-element-offset.mzn @@ -0,0 +1 @@ +array[-1..0] of int:a=array1d(-1..0,[3,2]); var -1..0:i; var 2..3:x; constraint x=a[i]; solve minimize x; output [show([i,x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-linear-max.mzn b/test/optimize/minizinc-fixtures/mzn-linear-max.mzn new file mode 100644 index 0000000000..28ef6d2038 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-linear-max.mzn @@ -0,0 +1 @@ +var -2..2:x; var -2..2:y; constraint x+y<=1; solve maximize 3*x-y+2; output [show([x,y,3*x-y+2]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-linear-min.mzn b/test/optimize/minizinc-fixtures/mzn-linear-min.mzn new file mode 100644 index 0000000000..26fee3002e --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-linear-min.mzn @@ -0,0 +1 @@ +var 0..3:x; var 0..3:y; constraint x+y>=3; solve minimize 2*x+y-4; output [show([x,y,2*x+y-4]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular-alias.mzn b/test/optimize/minizinc-fixtures/mzn-regular-alias.mzn new file mode 100644 index 0000000000..483a869a82 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular-alias.mzn @@ -0,0 +1 @@ +include "regular.mzn"; var 1..2:x; constraint regular([x,x,x],2,2,[|2,1|1,2|],1,{1}); solve minimize x; output [show([x,x,x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular-complement.mzn b/test/optimize/minizinc-fixtures/mzn-regular-complement.mzn new file mode 100644 index 0000000000..83de412ab9 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular-complement.mzn @@ -0,0 +1 @@ +include "regular.mzn"; array[1..2] of var 1..2:x; var bool:b; constraint b <-> regular(x,1,2,[|1,0|],1,{1}); constraint not b; solve minimize 2*x[1]+x[2]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular-dead.mzn b/test/optimize/minizinc-fixtures/mzn-regular-dead.mzn new file mode 100644 index 0000000000..1ed1013ced --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular-dead.mzn @@ -0,0 +1 @@ +include "regular.mzn"; var 1..1:x; constraint regular([x],1,1,[|0|],1,{1}); solve satisfy; output [show([x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular-decomposed-reif.mzn b/test/optimize/minizinc-fixtures/mzn-regular-decomposed-reif.mzn new file mode 100644 index 0000000000..0a7694fbfe --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular-decomposed-reif.mzn @@ -0,0 +1 @@ +include "regular.mzn"; array[1..2] of var 1..2:x; var bool:b; constraint b <-> regular(x,1,2,[|1,0|],1,{1}); solve maximize bool2int(b); output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular-empty.mzn b/test/optimize/minizinc-fixtures/mzn-regular-empty.mzn new file mode 100644 index 0000000000..b8b5eb3921 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular-empty.mzn @@ -0,0 +1 @@ +include "regular.mzn"; constraint regular([],1,1,[|1|],1,{1}); solve satisfy; output ["[]\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-regular.mzn b/test/optimize/minizinc-fixtures/mzn-regular.mzn new file mode 100644 index 0000000000..68b49b2d1d --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-regular.mzn @@ -0,0 +1 @@ +include "regular.mzn"; array[1..2] of var 1..2:x; constraint regular(x,3,2,[|2,3|0,3|2,0|],1,{3}); solve minimize x[1]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reified-le.mzn b/test/optimize/minizinc-fixtures/mzn-reified-le.mzn new file mode 100644 index 0000000000..82453a0246 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reified-le.mzn @@ -0,0 +1 @@ +var 0..2:x; var bool:b; constraint b <-> (x<=1); constraint b; solve maximize x; output [show([x,bool2int(b)]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-float.mzn b/test/optimize/minizinc-fixtures/mzn-reject-float.mzn new file mode 100644 index 0000000000..a4f0d55ea7 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-float.mzn @@ -0,0 +1 @@ +var 0.0..2.0:x; constraint x>=0.5; solve minimize x; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-reif-eq.mzn b/test/optimize/minizinc-fixtures/mzn-reject-reif-eq.mzn new file mode 100644 index 0000000000..84aa2eee9e --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-reif-eq.mzn @@ -0,0 +1 @@ +var 0..2:x; var 0..2:y; var bool:b; constraint b <-> (x=y); solve maximize bool2int(b); output [show([x,y]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-search.mzn b/test/optimize/minizinc-fixtures/mzn-reject-search.mzn new file mode 100644 index 0000000000..d0b16e363e --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-search.mzn @@ -0,0 +1 @@ +var 0..2:x; solve :: int_search([x],input_order,indomain_min,complete) satisfy; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-set.mzn b/test/optimize/minizinc-fixtures/mzn-reject-set.mzn new file mode 100644 index 0000000000..2768d6a769 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-set.mzn @@ -0,0 +1 @@ +var set of 1..3:s; constraint card(s)=2; solve satisfy; output [show(s),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-times.mzn b/test/optimize/minizinc-fixtures/mzn-reject-times.mzn new file mode 100644 index 0000000000..19017fcd92 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-times.mzn @@ -0,0 +1 @@ +var 1..3:x; var 1..3:y; var 1..9:z; constraint z=x*y; solve minimize z; output [show([x,y,z]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-reject-variable-cumulative.mzn b/test/optimize/minizinc-fixtures/mzn-reject-variable-cumulative.mzn new file mode 100644 index 0000000000..e140f3b963 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-reject-variable-cumulative.mzn @@ -0,0 +1 @@ +include "cumulative.mzn"; var 1..2:d; var 0..2:x; constraint cumulative([x,1,2],[d,1,1],[1,1,1],2); solve satisfy; output [show([x,d]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-satisfy.mzn b/test/optimize/minizinc-fixtures/mzn-satisfy.mzn new file mode 100644 index 0000000000..7396cc7181 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-satisfy.mzn @@ -0,0 +1 @@ +var 1..2:x; solve satisfy; output [show([x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-table-alias.mzn b/test/optimize/minizinc-fixtures/mzn-table-alias.mzn new file mode 100644 index 0000000000..b5a3085d24 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-table-alias.mzn @@ -0,0 +1 @@ +include "table.mzn"; var 1..2:x; constraint table([x,x],[|1,1|2,2|]); solve minimize x; output [show([x,x]),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-table.mzn b/test/optimize/minizinc-fixtures/mzn-table.mzn new file mode 100644 index 0000000000..b24ee1ccd3 --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-table.mzn @@ -0,0 +1 @@ +include "table.mzn"; array[1..2] of var 1..2:x; constraint table(x,[|1,2|2,1|]); solve minimize x[1]; output [show(x),"\n"]; diff --git a/test/optimize/minizinc-fixtures/mzn-unsat.mzn b/test/optimize/minizinc-fixtures/mzn-unsat.mzn new file mode 100644 index 0000000000..e807fe4bfc --- /dev/null +++ b/test/optimize/minizinc-fixtures/mzn-unsat.mzn @@ -0,0 +1 @@ +include "all_different.mzn"; array[1..3] of var 1..2:x; constraint all_different(x); solve satisfy; output [show(x),"\n"]; diff --git a/test/optimize/minizinc_configure.py b/test/optimize/minizinc_configure.py new file mode 100644 index 0000000000..059a26af46 --- /dev/null +++ b/test/optimize/minizinc_configure.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""Pure CMake -P JSON encoder tests; no compiler, solver, or downloads.""" +import argparse +import json +from pathlib import Path +import subprocess +import tempfile + +ROOT = Path(__file__).resolve().parents[2] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--cmake", required=True) + args = parser.parse_args() + script = ROOT / "tools/flatzinc/configure-optimize-msc.cmake" + template = ROOT / "tools/flatzinc/gecode-optimize.msc.in" + with tempfile.TemporaryDirectory(prefix="gecode-msc-escape-") as tmp: + output = Path(tmp)/"directory with spaces"/"solver.msc" + cases = [ + ("6.4.0", "../../../bin/fzn-gecode-optimize", "../gecode-optimize-experimental"), + ('version"quote', 'C:\\solver path\\a"b;ç/driver.exe', '../library space/雪;z'), + ("v"+"".join(map(chr,range(1,32))), 'drive\\name\nline\rreturn\ttab', 'lib\bback\fform'), + ('@GECODE_OPTIMIZE_MSC_EXECUTABLE@', '@GECODE_VERSION@/binary', '@GECODE_OPTIMIZE_MSC_MZNLIB@'), + ] + for version,driver,library in cases: + command = [args.cmake, "-DTEMPLATE="+str(template), "-DVERSION="+version, + "-DDRIVER="+driver, "-DMZNLIB="+library, "-DOUTPUT="+str(output), "-P", str(script)] + subprocess.run(command,check=True,capture_output=True,timeout=10) + encoded = output.read_bytes() + value = json.loads(encoded) + assert value["version"] == version + assert value["executable"] == [driver,"--minizinc"] + assert value["mznlib"] == library + assert not list(output.parent.glob(output.name+".*.tmp")) + prior = output.read_bytes() + for omitted in ("VERSION","DRIVER","MZNLIB","OUTPUT","TEMPLATE"): + inputs = {"VERSION":"1","DRIVER":"driver","MZNLIB":"lib","OUTPUT":str(output),"TEMPLATE":str(template)} + del inputs[omitted] + run = subprocess.run([args.cmake,*[f"-D{k}={v}" for k,v in inputs.items()],"-P",str(script)], + capture_output=True,timeout=10) + assert run.returncode != 0 and output.read_bytes() == prior + run = subprocess.run([args.cmake,"-DTEMPLATE="+str(Path(tmp)/"absent.in"),"-DVERSION=1", + "-DDRIVER=driver","-DMZNLIB=lib","-DOUTPUT="+str(output),"-P",str(script)], + capture_output=True,timeout=10) + assert run.returncode != 0 and output.read_bytes() == prior + print("MiniZinc JSON encoder: 10 cases passed") + + +if __name__ == "__main__": + main() diff --git a/test/optimize/minizinc_registration.py b/test/optimize/minizinc_registration.py new file mode 100644 index 0000000000..806a1ea35c --- /dev/null +++ b/test/optimize/minizinc_registration.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +"""Pinned MiniZinc-to-driver compatibility gate; no download, build, or benchmarks. + +Requires an actual MiniZinc 2.10.1 compiler with its matching standard library and +an actual native-enabled driver. Each required child and the suite have deadlines. +""" +from __future__ import annotations +import argparse +import hashlib +import itertools +import json +import math +import os +from pathlib import Path +import re +import signal +import subprocess +import sys +import tempfile +import time + +ROOT = Path(__file__).resolve().parents[2] +IDENTITY = "org.gecode.optimize.experimental" +# Exact complete-predicate admission, deliberately independent of registry aliases. +PRIMITIVES = set("int_eq int_le int_lt int_ge int_gt int_plus int_minus int_lin_eq int_lin_le bool_eq bool_le bool_not bool_and bool_or array_bool_and array_bool_or bool_clause bool_lin_eq bool_lin_le bool2int int_in int_le_reif int_le_imp int_eq_imp int_lin_le_reif int_lin_le_imp array_int_element array_var_int_element all_different_int gecode_table_int gecode_regular gecode_circuit gecode_cumulatives cumulatives".split()) + + +def require(condition, message): + if not condition: + raise AssertionError(message) + + +def digest(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +class Suite: + def __init__(self, args, directory): + self.args, self.directory = args, directory + self.deadline = time.monotonic() + args.timeout + self.checks, self.sources = [], {} + self.msc = args.registration or directory / "gecode-optimize.msc" + if args.registration is None: + config = json.loads((ROOT / "tools/flatzinc/gecode-optimize.msc.in").read_text()) + config["version"] = "6.4.0-experimental-test" + config["mznlib"] = str((ROOT / "tools/flatzinc/mznlib-optimize").resolve()) + config["executable"] = [str(args.binary), "--minizinc"] + self.msc.write_text(json.dumps(config, indent=2) + "\n") + # Read the actual artifact in place, preserving all relative paths. + self.configuration_bytes = self.msc.read_bytes() + config = json.loads(self.configuration_bytes) + require(config.get("id") == IDENTITY, "Wrong experimental solver identity") + executable = config.get("executable") + require(isinstance(executable,list) and len(executable) == 2 and + isinstance(executable[0],str) and executable[1] == "--minizinc", + "Registration must invoke exactly the driver and --minizinc") + def relative_path(value): + require(isinstance(value,str) and value, "Registration path must be a nonempty string") + path = Path(value) + return (path if path.is_absolute() else self.msc.parent/path).resolve() + executable_path = relative_path(executable[0]) + require(executable_path.is_file() and executable_path.samefile(args.binary), + "Registration executable does not resolve to --binary") + require(isinstance(config.get("mznlib"),str) and not config["mznlib"].startswith("-G"), + "Registration must name its dedicated library directory, not a -G alias") + self.library = relative_path(config["mznlib"]) + require(self.library.is_dir(), "Registration library directory does not exist") + self.library_hashes = self.hash_library() + require(self.library_hashes, "Registration library contains no .mzn files") + # Only this process's environment changes; no system/user solver prefs. + self.old_solver_path = os.environ.get("MZN_SOLVER_PATH") + os.environ["MZN_SOLVER_PATH"] = str(self.msc.parent) + + def hash_library(self): + return {str(path.relative_to(self.library)).replace(os.sep,"/"):digest(path) + for path in sorted(self.library.rglob("*.mzn"))} + + def close(self): + if self.old_solver_path is None: + os.environ.pop("MZN_SOLVER_PATH", None) + else: + os.environ["MZN_SOLVER_PATH"] = self.old_solver_path + + def run(self, label, command, *, cwd=None): + remaining = self.deadline - time.monotonic() + require(remaining > 1, f"Aggregate deadline before {label}") + start = time.monotonic() + with tempfile.TemporaryFile() as out, tempfile.TemporaryFile() as err: + process = None + try: + if os.name == "nt": + sys.path.insert(0, str(ROOT / "experiments/optimize")) + from process_containment import WindowsJobProcess + process = WindowsJobProcess() + process.start([str(x) for x in command], out, err, str(cwd or self.directory)) + else: + process = subprocess.Popen([str(x) for x in command], cwd=cwd or self.directory, + stdin=subprocess.DEVNULL, stdout=out, stderr=err, + start_new_session=True) + code = process.wait(timeout=min(10, remaining - 1)) + finally: + if process is not None: + if os.name == "nt": + process.cleanup(timeout=1) + else: + # MiniZinc starts the driver; terminate the whole group, + # even if MiniZinc exited while leaving a child behind. + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + process.wait(timeout=1) + require(out.tell() <= 1048576 and err.tell() <= 1048576, f"Excessive output: {label}") + out.seek(0); err.seek(0) + stdout, stderr = out.read().decode(), err.read().decode() + require(time.monotonic() < self.deadline, f"Aggregate deadline after {label}") + self.checks.append({"case": label, "returncode": code, "elapsed_seconds": time.monotonic()-start}) + return code, stdout, stderr + + def mzn(self, label, *options): + return self.run(label, [self.args.minizinc, "--solver", self.msc, *options]) + + def fixture(self, name): + path = ROOT / "test/optimize/minizinc-fixtures" / ("mzn-"+name+".mzn") + require(path.is_file(), f"Missing fixture: {path}") + self.sources[path.name] = digest(path) + return path + + def positive(self, name, allowed, *, mode="optimal", required=None): + source = self.fixture(name) + fzn = self.directory / (name+".fzn") + code, stdout, stderr = self.mzn("compile-"+name, "--compile", "--output-fzn-to-file", fzn, + "--output-ozn-to-file", self.directory/(name+".ozn"), source) + require(code == 0 and not stderr, f"Compile {name}: {code} {stdout!r} {stderr!r}") + text = fzn.read_text() + emitted = set(re.findall(r"\bconstraint\s+(\w+)\s*\(", text)) + require(emitted <= PRIMITIVES, f"Unadmitted predicate lowering in {name}: {emitted-PRIMITIVES}") + if required: + require(required in emitted, f"Missing native lowering {required} in {name}") + code, stdout, stderr = self.mzn("solve-"+name, source) + require(code == 0 and not stderr, f"Solve {name}: {code} {stdout!r} {stderr!r}") + lines = [line for line in stdout.splitlines() if line and not line.startswith("%")] + if mode == "unsat": + require(lines == ["=====UNSATISFIABLE====="], f"False completion in {name}: {lines}") + else: + markers = ["----------", "=========="] if mode == "optimal" else ["----------"] + require(lines[1:] == markers, f"Wrong markers in {name}: {lines}") + require(tuple(json.loads(lines[0])) in allowed, f"Original-model oracle failed in {name}: {lines[0]}") + require("% guarantee: exact integer search" in stdout, f"Wrong backend provenance: {name}") + + def rejected(self, name, contains): + code, stdout, stderr = self.mzn("reject-"+name, self.fixture(name)) + require(code != 0 and contains in stderr, f"Missing rejection {name}: {code} {stdout!r} {stderr!r}") + require("----------" not in stdout and "=====UNSATISFIABLE=====" not in stdout, + f"Rejected model published a witness/proof: {name}") + + +def regular(word, states, alphabet, transitions, initial, finals): + for symbol in word: + if not 1 <= symbol <= alphabet or not 1 <= initial <= states: + return False + initial = transitions[(initial-1)*alphabet+symbol-1] + if initial == 0: + return False + return initial in finals + + +def circuit(values, offset): + visited, node = set(), offset + for _ in values: + if node in visited or not offset <= node < offset+len(values): + return False + visited.add(node) + node = values[node-offset] + return node == offset and len(visited) == len(values) + + +def cumulative(starts, durations, heights, capacity): + # Independent half-open integer-time oracle for these tiny source models. + return all(sum(h for s,d,h in zip(starts,durations,heights) if s <= t < s+d) <= capacity + for t in range(-2, 6)) + + +def tests(s): + code, stdout, stderr = s.run("compiler-version", [s.args.minizinc, "--version"]) + require(code == 0 and "version 2.10.1," in stdout and not stderr, "Required pinned MiniZinc 2.10.1 unavailable") + code, stdout, stderr = s.run("solver-discovery", [s.args.minizinc, "--solvers-json"]) + require(code == 0 and not stderr, "Solver discovery failed") + configs = [x for x in json.loads(stdout) if x["id"] == IDENTITY] + require(len(configs) == 1, "Experimental solver identity absent or duplicated") + require(configs[0]["stdFlags"] == ["-t"] and configs[0]["tags"] == ["cp","int","experimental"], + "Registration overstates supported flags/types") + require("default" not in configs[0]["tags"], "Experimental registration changed the default") + a = [(x,y,2*x+y-4) for x,y in itertools.product(range(4),repeat=2) if x+y >= 3] + s.positive("linear-min", {min(a,key=lambda p:p[2])}) + a = [(x,y,3*x-y+2) for x,y in itertools.product(range(-2,3),repeat=2) if x+y <= 1] + s.positive("linear-max", {max(a,key=lambda p:p[2])}) + s.positive("satisfy", {(1,),(2,)}, mode="satisfy") + s.positive("unsat", set(), mode="unsat", required="all_different_int") + s.positive("alias-holes", {(3,3)}) + s.positive("all-different", {(1,2)}, required="all_different_int") + s.positive("table", {(1,2)}, required="gecode_table_int") + s.positive("table-alias", {(1,1)}, required="gecode_table_int") + words = [x for x in itertools.product((1,2),repeat=2) if regular(x,3,2,[2,3,0,3,2,0],1,{3})] + s.positive("regular", {min(words,key=lambda x:x[0])}, required="gecode_regular") + words = [(x,x,x) for x in (1,2) if regular((x,x,x),2,2,[2,1,1,2],1,{1})] + s.positive("regular-alias", set(words), required="gecode_regular") + s.positive("regular-empty", {()}, mode="satisfy") + s.positive("regular-dead", set(), mode="unsat", required="gecode_regular") + for name,offset in (("negative",-2),("offset",2)): + values = [x for x in itertools.product(range(offset,offset+3),repeat=3) if circuit(x,offset)] + s.positive("circuit-"+name, {min(values,key=lambda x:x[0])}, required="gecode_circuit") + s.positive("element-offset", {(0,2)}, required="array_int_element") + starts = [(x,1) for x in range(3) if cumulative([x,1,1],[1,1,1],[1,1,1],2)] + s.positive("cumulative-half-open", {min(starts)}, required="gecode_cumulatives") + s.positive("cumulative-zero", {(0,)}, required="gecode_cumulatives") + s.positive("cumulative-unsat", set(), mode="unsat", required="gecode_cumulatives") + s.positive("cumulative-fixed-alias", {(0,1,1)}, required="gecode_cumulatives") + s.positive("reified-le", {(1,1)}) + accepted = {x for x in itertools.product((1,2),repeat=2) if regular(x,1,2,[1,0],1,{1})} + s.positive("regular-decomposed-reif", accepted, required="gecode_regular") + rejected = [x for x in itertools.product((1,2),repeat=2) if not regular(x,1,2,[1,0],1,{1})] + s.positive("regular-complement", {min(rejected,key=lambda x:2*x[0]+x[1])}, required="gecode_regular") + for name,text in (("times","multiplication is unsupported"),("reif-eq","equality is unsupported"), + ("float","float and set variables"),("set","float and set variables"),("search","search annotations"), + ("variable-cumulative","original singleton")): + s.rejected("reject-"+name,text) + # Test flags through the actual MiniZinc parser, not only the .msc JSON. + for flag in ("--all-solutions","--intermediate-solutions"): + args = [flag] + code, stdout, stderr = s.mzn("unadvertised-"+flag, *args, s.fixture("satisfy")) + require(code != 0 and "Unrecognized option" in stderr, f"Unsupported standard flag accepted: {flag}") + # MiniZinc owns compiler/output statistics and may consume --parallel even + # when neither solver flag is advertised. Force forwarding to test the + # driver's strict boundary without misrepresenting the outer compiler. + for flag in ("-s", "-p"): + code, stdout, stderr = s.mzn("forwarded-"+flag,"--fzn-flag",flag,s.fixture("satisfy")) + require(code != 0 and "Unsupported MiniZinc protocol option" in stderr, + f"Unsupported forwarded solver flag accepted: {flag}") + for milliseconds in ("0","1000"): + code, stdout, stderr = s.mzn("time-"+milliseconds,"--solver-time-limit",milliseconds,s.fixture("satisfy")) + require(code == 0 and "----------" in stdout and not stderr, "MiniZinc time convention mismatch") + # Filename ordering and zero semantics are isolated from direct CLI behavior. + fzn = s.directory/"protocol.fzn" + fzn.write_text("var 0..2: x :: output_var; solve minimize x;\n") + for args in (("-t","0",str(fzn)),(str(fzn),"-t","0"),("--",str(fzn))): + code, stdout, stderr = s.run("protocol-order",[s.args.binary,"--minizinc",*args]) + require(code == 0 and "x = 0;" in stdout and "==========" in stdout and not stderr, "Protocol option order/zero failed") + for args in (("-t",),("-t","-1",str(fzn)),("-t","1.5",str(fzn)),("-t","18446744073709551616",str(fzn)), + ("-t","0","-t","1",str(fzn)),(str(fzn),str(fzn)),("--backend","highs",str(fzn)),("-a",str(fzn))): + code, stdout, stderr = s.run("protocol-rejection",[s.args.binary,"--minizinc",*args]) + require(code == 2 and not stdout and stderr, f"Malformed protocol accepted: {args}") + code, stdout, stderr = s.run("direct-zero",[s.args.binary,fzn,"--time-limit","0"]) + require(code == 1 and "=====UNKNOWN=====" in stdout, "Direct zero deadline changed") + # A finite parser workload (no CP benchmark) makes a 1ms budget expire in + # capture on supported CI machines, verifying UNKNOWN is normal exit0. + large = s.directory/"capture-deadline.fzn" + large.write_text("".join(f"var 0..1: x{i};\n" for i in range(20000))+"solve satisfy;\n") + for prefix in ([s.args.binary,"--minizinc","-t","1"], + [s.args.minizinc,"--solver",s.msc,"--solver-time-limit","1"]): + code, stdout, stderr = s.run("actual-timeout",[*prefix,large]) + require(code == 0 and "=====UNKNOWN=====" in stdout and "=====ERROR=====" not in stdout, + f"Timeout became solver error: {code} {stdout!r} {stderr!r}") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--minizinc", type=Path, required=True) + parser.add_argument("--binary", type=Path, required=True) + parser.add_argument("--registration", type=Path, help="Test this configured .msc in place without rewriting it") + parser.add_argument("--timeout", type=float, default=120) + args = parser.parse_args() + require(math.isfinite(args.timeout) and args.timeout > 0, "Finite positive suite timeout required") + args.minizinc, args.binary = args.minizinc.resolve(), args.binary.resolve() + args.registration = args.registration.resolve() if args.registration is not None else None + require(args.minizinc.is_file() and args.binary.is_file(), "Required executable is missing") + with tempfile.TemporaryDirectory(prefix="gecode-minizinc-") as tmp: + suite = Suite(args,Path(tmp)) + try: + tests(suite) + require(suite.msc.read_bytes() == suite.configuration_bytes, "Registration artifact changed during the test") + require(suite.hash_library() == suite.library_hashes, "Registration library changed during the test") + report = {"status":"passed","compiler_version":"2.10.1","compiler_sha256":digest(args.minizinc), + "driver_sha256":digest(args.binary),"cases":len(suite.checks),"checks":suite.checks, + "configuration_sha256":hashlib.sha256(suite.configuration_bytes).hexdigest(), + "configuration_provided":args.registration is not None, + "library_files_sha256":suite.library_hashes, + "library_sha256":hashlib.sha256(json.dumps(suite.library_hashes,sort_keys=True,separators=(",",":")).encode()).hexdigest(), + "source_sha256":suite.sources} + print(json.dumps(report,sort_keys=True)) + finally: + suite.close() + + +if __name__ == "__main__": + main() diff --git a/test/optimize/model.cpp b/test/optimize/model.cpp new file mode 100644 index 0000000000..c30ec1dc07 --- /dev/null +++ b/test/optimize/model.cpp @@ -0,0 +1,250 @@ +/* Standalone tests: compile with model.cpp; no native Gecode dependencies. */ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; + +namespace { +constexpr double infinity = std::numeric_limits::infinity(); + +template +void rejects(Action action) { + bool caught = false; + try { + action(); + } catch (const ModelError&) { + caught = true; + } + assert(caught); +} + +void defaults_and_ownership() { + static_assert(!std::is_copy_constructible::value, "No implicit model copy"); + static_assert(!std::is_copy_assignable::value, "No implicit model assignment"); + static_assert(std::is_nothrow_move_constructible::value, "Move preserves handles"); + Model a, b; + assert(a.id() != 0 && b.id() != 0 && a.id() != b.id()); + auto initial = a.snapshot(); + assert(initial.revision == 0 && initial.variables.empty() && initial.rows.empty()); + assert(initial.objective.terms.empty() && initial.objective.offset == 0.0); + assert(initial.objective.sense == ObjectiveSense::Minimize); + Variable x = a.add_binary("x"); + Variable y = b.add_binary("y"); + Constraint row = a.add_row({{x, 1.0}}, 0.0, 1.0, "row"); + Constraint foreign = b.add_row({{y, 1.0}}, 0.0, 1.0); + const auto revision = a.revision(); + rejects([&] { a.add_row({{y, 1.0}}, 0.0, 1.0); }); + rejects([&] { a.minimize({{y, 0.0}}); }); + rejects([&] { a.set_bounds(y, 0.0, 1.0); }); + rejects([&] { a.set_bounds(foreign, 0.0, 1.0); }); + rejects([&] { a.set_coefficient(row, y, 1.0); }); + rejects([&] { a.set_coefficient(foreign, x, 1.0); }); + rejects([&] { a.remove(y); }); + rejects([&] { a.remove(foreign); }); + rejects([&] { a.variable(Variable{}); }); + rejects([&] { a.row(Constraint{a.id(), 1000}); }); + assert(a.revision() == revision); +} + +void sparse_terms_and_objective() { + Model model; + Variable x = model.add_integer(-2, 2, "x"); + Variable y = model.add_continuous(-infinity, infinity, "y"); + const std::vector terms{{y, 3}, {x, 4}, {y, -1}, {x, -2}, + {x, 0}, {y, -2}, {x, -1}}; + Constraint row = model.add_row(terms, -3, 4, "range"); + const auto normalized = model.row(row).terms; + assert(normalized.size() == 1 && normalized[0].variable == x); + assert(normalized[0].coefficient == 1.0); + // Check preservation on a small independent domain, including cancellations. + for (int xv = -2; xv <= 2; ++xv) + for (int yv = -2; yv <= 2; ++yv) { + double original = 0, canonical = 0; + for (const auto& term : terms) + original += term.coefficient * (term.variable == x ? xv : yv); + for (const auto& term : normalized) + canonical += term.coefficient * (term.variable == x ? xv : yv); + assert(original == canonical); + } + model.maximize({{y, 2}, {x, 3}, {x, -1}}, -7.5); + auto snapshot = model.snapshot(); + assert(snapshot.objective.sense == ObjectiveSense::Maximize); + assert(snapshot.objective.offset == -7.5); + assert(snapshot.objective.terms.size() == 2); + assert(snapshot.objective.terms[0].variable == x); + assert(snapshot.objective.terms[0].coefficient == 2); + assert(snapshot.objective.terms[1].variable == y); + const Revision before = model.revision(); + model.minimize({}, 3.0); + assert(model.revision() == before + 1); + assert(model.snapshot().objective.terms.empty()); + assert(model.snapshot().objective.sense == ObjectiveSense::Minimize); + assert(snapshot.objective.terms.size() == 2); // The old snapshot owns its data. + + // Cancellation should not depend on the caller's duplicate insertion order. + std::vector values{-1e16, 1.0, 1e16}; + do { + model.minimize({{x, values[0]}, {x, values[1]}, {x, values[2]}}); + const auto objective = model.snapshot().objective; + assert(objective.terms.size() == 1 && objective.terms[0].coefficient == 1.0); + } while (std::next_permutation(values.begin(), values.end())); +} + +void edits_and_tombstones() { + Model model; + Variable x = model.add_binary("x"), y = model.add_integer(-4, 7, "y"); + Constraint first = model.add_row({{x, 2}}, 0, 2, "first"); + Constraint second = model.add_row({{y, 1}}, -4, 7, "second"); + model.minimize({{y, 3}}, 1); + auto old = model.snapshot(); + auto revision = model.revision(); + model.set_coefficient(first, y, 4); + assert(model.revision() == ++revision); + assert(model.row(first).terms.size() == 2); + model.set_coefficient(first, x, -3); + assert(model.revision() == ++revision); + assert(model.row(first).terms[0].coefficient == -3); + model.set_bounds(x, 1, 1); + assert(model.revision() == ++revision && model.variable(x).lower == 1); + model.set_bounds(first, -2, 3); + assert(model.revision() == ++revision && model.row(first).upper == 3); + model.set_name(x, "renamed"); + assert(model.revision() == ++revision && model.variable(x).name == "renamed"); + model.set_name(first, "renamed row"); + assert(model.revision() == ++revision && model.row(first).name == "renamed row"); + model.set_objective_coefficient(x, 5); + assert(model.revision() == ++revision); + model.set_objective_coefficient(y, 0); + assert(model.revision() == ++revision); + model.set_objective_offset(-2); + assert(model.revision() == ++revision && model.snapshot().objective.offset == -2); + rejects([&] { model.remove(x); }); // Objective still refers to x. + rejects([&] { model.remove(y); }); // Active rows still refer to y. + assert(model.revision() == revision); + model.set_objective_coefficient(x, 0); + model.set_coefficient(first, x, 0); + model.remove(x); + assert(!model.snapshot().variables[0].active); + rejects([&] { model.variable(x); }); + rejects([&] { model.set_bounds(x, 0, 1); }); + rejects([&] { model.remove(x); }); + rejects([&] { model.add_row({{x, 0}}, 0, 1); }); + Variable z = model.add_binary("new"); + assert(z.id == 2 && z != x); + model.remove(first); + model.remove(second); + model.remove(y); + rejects([&] { model.row(first); }); + rejects([&] { model.remove(first); }); + Constraint third = model.add_row({{z, 1}}, 0, 1); + assert(third.id == 2); + const auto current = model.snapshot(); + assert(current.rows.size() == 3 && !current.rows[0].active && !current.rows[1].active); + assert(current.rows[0].constraint.model_id == model.id()); + assert(current.rows[0].constraint.id == 0 && current.rows[0].terms.empty()); + assert(old.variables[0].active && old.variables[0].lower == 0); + assert(old.variables[0].name == "x" && old.rows[0].active); + assert(old.rows[0].terms.size() == 1 && old.objective.offset == 1); +} + +void malformed_data_and_rollback() { + Model model; + const double nan = std::numeric_limits::quiet_NaN(); + const double huge = std::numeric_limits::max(); + Variable x = model.add_continuous(); + Constraint row = model.add_row({{x, 2}}, -infinity, 4, "valid"); + model.maximize({{x, 3}}, 7); + const auto revision = model.revision(); + rejects([&] { model.add_continuous(nan, 1); }); + rejects([&] { model.add_integer(2, 1); }); + rejects([&] { model.add_continuous(infinity, infinity); }); + rejects([&] { model.add_continuous(-infinity, -infinity); }); + rejects([&] { model.add_variable(static_cast(99), 0, 1); }); + rejects([&] { model.add_variable(VariableType::Binary, -1, 1); }); + rejects([&] { model.add_variable(VariableType::Binary, 0, 2); }); + rejects([&] { model.add_variable(VariableType::SemiContinuous, 0, 2); }); + rejects([&] { model.add_variable(VariableType::SemiInteger, -1, 2); }); + rejects([&] { model.add_row({{x, nan}}, 0, 1); }); + rejects([&] { model.add_row({{x, infinity}}, 0, 1); }); + rejects([&] { model.add_row({{x, -infinity}}, 0, 1); }); + rejects([&] { model.add_row({{x, huge}, {x, huge}}, 0, 1); }); + rejects([&] { model.add_row({}, nan, 1); }); + rejects([&] { model.set_bounds(row, 0, nan); }); + rejects([&] { model.set_bounds(x, 1, 0); }); + rejects([&] { model.set_coefficient(row, x, infinity); }); + rejects([&] { model.minimize({{x, huge}, {x, huge}}); }); + rejects([&] { model.minimize({}, nan); }); + rejects([&] { model.set_objective({}, static_cast(99)); }); + rejects([&] { model.set_objective_coefficient(x, nan); }); + rejects([&] { model.set_objective_offset(infinity); }); + const auto after = model.snapshot(); + assert(after.revision == revision && after.variables.size() == 1 && after.rows.size() == 1); + assert(after.rows[0].terms.size() == 1 && after.rows[0].terms[0].coefficient == 2); + assert(after.rows[0].upper == 4 && after.rows[0].lower == -infinity); + assert(after.objective.sense == ObjectiveSense::Maximize && after.objective.offset == 7); + assert(after.objective.terms.size() == 1 && after.objective.terms[0].coefficient == 3); + assert(model.add_continuous().id == 1); // Failed insertion did not consume a slot. +} + +void domain_and_empty_models() { + Model model; + auto unbounded = model.add_integer(-infinity, infinity); + assert(model.variable(unbounded).lower == -infinity); + // No integer lies here: it is a valid but infeasible model, not malformed data. + model.add_integer(0.2, 0.8); + auto semi = model.add_variable(VariableType::SemiContinuous, 2, infinity); + auto semi_integer = model.add_variable(VariableType::SemiInteger, 2.2, 5.8); + assert(model.variable(semi).lower == 2 && model.variable(semi_integer).upper == 5.8); + rejects([&] { model.set_bounds(semi, 0, 5); }); + Model empty; + empty.minimize({}, 42); + empty.add_row({}, 1, infinity); // Structurally valid contradiction 0 >= 1. + assert(empty.snapshot().variables.empty() && empty.snapshot().rows.size() == 1); + assert(empty.snapshot().objective.offset == 42); +} + +void move_identity() { + Model original; + Variable x = original.add_binary("x"); + Constraint row = original.add_row({{x, 1}}, 0, 1); + const auto id = original.id(); + const auto revision = original.revision(); + Model moved(std::move(original)); + assert(original.id() == 0 && original.revision() == 0); + rejects([&] { original.snapshot(); }); + rejects([&] { original.add_binary(); }); + assert(moved.id() == id && moved.revision() == revision); + assert(moved.variable(x).name == "x" && moved.row(row).terms.size() == 1); + Model assigned; + Variable obsolete = assigned.add_binary(); + const auto historical = assigned.snapshot(); + assigned = std::move(moved); + assert(assigned.id() == id && moved.id() == 0); + assert(assigned.variable(x).name == "x"); + rejects([&] { assigned.variable(obsolete); }); + assert(historical.variables[0].variable == obsolete); + Model& same = assigned; + assigned = std::move(same); + assert(assigned.id() == id && assigned.variable(x).active); + original = Model{}; + assert(original.id() != 0 && original.id() != id); + assert(original.add_binary().id == 0); +} +} // namespace + +int main() { + defaults_and_ownership(); + sparse_terms_and_objective(); + edits_and_tombstones(); + malformed_data_and_rollback(); + domain_and_empty_models(); + move_identity(); +} diff --git a/test/optimize/native.cpp b/test/optimize/native.cpp new file mode 100644 index 0000000000..80186ea769 --- /dev/null +++ b/test/optimize/native.cpp @@ -0,0 +1,273 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +#ifdef GECODE_OPTIMIZE_WITH_NATIVE +namespace { +constexpr double inf = std::numeric_limits::infinity(); + +bool feasible(const ModelSnapshot& model, const std::vector& values) { + const auto row = [&](const std::vector& terms, double lower, double upper) { + long long activity = 0; + for (const auto& term : terms) + activity += static_cast(term.coefficient) * static_cast(values[term.variable.id]); + return activity >= lower && activity <= upper; + }; + for (const auto& constraint : model.rows) + if (constraint.active && !constraint.indicator_origin && + !row(constraint.terms, constraint.lower, constraint.upper)) return false; + for (const auto& indicator : model.indicators) { + if (!indicator.active) continue; + const bool enabled = values[indicator.activator.id] == (indicator.active_value ? 1 : 0); + if (enabled && !row(indicator.terms, indicator.lower, indicator.upper)) return false; + if (indicator.inactive_gate && values[indicator.inactive_gate->id] != (enabled ? 0 : 1)) return false; + } + return true; +} + +std::optional oracle(const ModelSnapshot& model) { + std::optional optimum; + std::vector values(model.variables.size()); + std::function visit = [&](std::size_t slot) { + if (slot == model.variables.size()) { + if (!feasible(model, values)) return; + long long objective = static_cast(model.objective.offset); + for (const auto& term : model.objective.terms) + objective += static_cast(term.coefficient) * static_cast(values[term.variable.id]); + if (!optimum || (model.objective.sense == ObjectiveSense::Minimize ? objective < *optimum : objective > *optimum)) + optimum = objective; + return; + } + const auto& variable = model.variables[slot]; + if (!variable.active) { visit(slot + 1); return; } + if (variable.type == VariableType::SemiInteger) { values[slot] = 0; visit(slot + 1); } + for (int value = static_cast(variable.lower); value <= variable.upper; ++value) { + values[slot] = value; visit(slot + 1); + } + }; + visit(0); return optimum; +} + +void matches_oracle(const Model& model) { + const auto snapshot = model.snapshot(); + const auto expected = oracle(snapshot); + for (auto guarantee : {Guarantee::Numerical, Guarantee::Exact}) { + SolveOptions options; options.backend = Backend::Native; options.guarantee = guarantee; + auto result = solve_native(snapshot, options); + if (result.termination != (expected ? Termination::Optimal : Termination::Infeasible)) { + std::cerr << "Native oracle mismatch: " << to_string(result.termination) << " " << result.message << '\n'; + assert(false); + } + assert(result.model_id == model.id() && result.revision == model.revision()); + assert(result.guarantee == guarantee && result.elapsed_seconds >= 0); + assert(result.has_solution() == expected.has_value()); + if (expected) { + assert(*result.objective == static_cast(*expected)); + assert(result.best_bound == result.objective && result.absolute_gap == 0 && result.relative_gap == 0); + assert(feasible(snapshot, result.values)); + for (const auto& variable : snapshot.variables) { + if (!variable.active) continue; + const auto value = result.value(variable.variable); + assert(value == std::trunc(value)); + assert((variable.type == VariableType::SemiInteger && value == 0) || + (value >= variable.lower && value <= variable.upper)); + } + } else { + assert(!result.objective && !result.best_bound && !result.solution_validated); + } + } +} + +void exhaustive_models() { + for (int scenario = 0; scenario < 36; ++scenario) { + Model model; + const auto x = model.add_integer(-3, 3); + const auto y = model.add_integer(-2, 2); + const auto b = model.add_binary(); + model.add_row({{x, scenario % 5 - 2.0}, {y, scenario % 3 - 1.0}, {b, 2}}, -2, 4); + model.add_row({{x, -1}, {y, 1}}, -inf, scenario % 4 - 1.0); + const std::vector objective{{x, scenario % 7 - 3.0}, {y, -2}, {b, 3}}; + model.set_objective(objective, scenario % 2 ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, + scenario - 20.0); + matches_oracle(model); + } + Model empty; empty.minimize({}, -9); matches_oracle(empty); + empty.add_row({}, 1, inf); matches_oracle(empty); + Model no_cost; no_cost.add_integer(-2, 2); matches_oracle(no_cost); +} + +void semi_indicators_and_aliases() { + for (bool activation : {false, true}) + for (bool maximize : {false, true}) { + Model model; + auto b = model.add_binary(); + auto x = model.add_integer(-3, 3); + auto semi = model.add_variable(VariableType::SemiInteger, 2, 4); + const auto indicator = add_indicator(model, b, activation, + {{x, 2}, {semi, -1}, {b, 1}}, -2, 1); + assert(indicator.inactive_gate); + model.add_row({{*indicator.inactive_gate, 1}, {semi, 1}}, -inf, 4); + model.set_objective({{x, -2}, {semi, 3}, {*indicator.inactive_gate, 1}}, + maximize ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, -7); + matches_oracle(model); + // Mutated public snapshots must not bypass indicator domain guards. + auto changed = model.snapshot(); changed.variables[x.id].upper = 4; + assert(solve_native(changed).termination == Termination::InvalidModel); + changed = model.snapshot(); changed.indicators.clear(); + assert(solve_native(changed).termination == Termination::InvalidModel); + } + Model redundant; + auto b = redundant.add_binary(); + auto x = redundant.add_integer(0, 2); + auto condition = add_indicator(redundant, b, true, {{x, 1}}, 0, inf); + assert(!condition.inactive_gate); + add_indicator(redundant, b, false, {}, 1, inf); + add_indicator(redundant, b, true, {{x, 1}}, -inf, inf); + matches_oracle(redundant); + + // Large derived M is nonintegral after outward rounding. Native reification + // solves original integral rows, so these generated M coefficients are not + // incorrectly interpreted as an unsupported original fractional model. + Model big; + b = big.add_binary(); x = big.add_integer(-1000000, 1000000); + auto large = add_indicator(big, b, true, {{x, 1}}, 1000000, inf); + big.set_bounds(b, 1, 1); big.minimize({{x, 1}}); + SolveOptions exact; exact.guarantee = Guarantee::Exact; + const auto solution = solve_native(big, exact); + assert(solution.termination == Termination::Optimal && solution.value(x) == 1000000); + assert(solution.value(*large.inactive_gate) == 0 && solution.guarantee == Guarantee::Exact); +} + +void identities_and_history() { + Model model; + auto removed = model.add_integer(-1, 1); model.remove(removed); + auto x = model.add_integer(-2, 2); + auto row = model.add_row({{x, 1}}, -1, inf); model.remove(row); + model.maximize({{x, -3}}, 4); + const auto old = solve_native(model); + assert(old.termination == Termination::Optimal && old.value(x) == -2 && *old.objective == 10); + assert(!old.active_variables[removed.id] && std::isnan(old.values[removed.id])); + model.set_bounds(x, 1, 2); + assert(solve_native(model).value(x) == 1 && old.value(x) == -2); + Model other; auto foreign = other.add_binary(); + bool rejected = false; try { (void) old.value(foreign); } catch (const ModelError&) { rejected = true; } + assert(rejected); + rejected = false; try { (void) old.value(removed); } catch (const ModelError&) { rejected = true; } + assert(rejected); + auto bad = model.snapshot(); bad.rows[0].constraint.model_id = other.id(); + assert(solve_native(bad).termination == Termination::InvalidModel); + Model moved(std::move(model)); + assert(solve_native(model).termination == Termination::InvalidModel); + assert(solve_native(moved).termination == Termination::Optimal); +} + +void options_and_limits() { + Model model; auto x = model.add_integer(-3, 3); model.minimize({{x, 1}}); + for (auto reason : {Termination::TimeLimit, Termination::NodeLimit, Termination::Cancelled}) { + SolveOptions options; + if (reason == Termination::TimeLimit) options.time_limit_seconds = 0; + if (reason == Termination::NodeLimit) options.node_limit = 0; + if (reason == Termination::Cancelled) { + options.cancellation = std::make_shared(); options.cancellation->cancel(); + } + const auto stopped = solve_native(model, options); + assert(stopped.termination == reason && !stopped.has_solution() && !stopped.best_bound); + } + SolveOptions cancelled; cancelled.node_limit = 0; cancelled.time_limit_seconds = 0; + cancelled.cancellation = std::make_shared(); cancelled.cancellation->cancel(); + assert(solve_native(model, cancelled).termination == Termination::Cancelled); + for (std::uint64_t limit : {1, 2, 3, 4, 14, 20}) { + Model hard; std::vector objective; + for (int i = 0; i < 12; ++i) objective.push_back({hard.add_binary(), 1}); + hard.maximize(objective); + SolveOptions limited; limited.node_limit = limit; limited.guarantee = Guarantee::Exact; + const auto stopped = solve_native(hard, limited); + assert(stopped.termination == Termination::NodeLimit && !stopped.best_bound); + if (limit >= 14) assert(stopped.has_solution()); + if (stopped.has_solution()) assert(feasible(hard.snapshot(), stopped.values)); + } + SolveOptions options; options.guarantee = Guarantee::Certified; + assert(solve_native(model, options).termination == Termination::Unsupported); + options = {}; options.threads = 2; + assert(solve_native(model, options).termination == Termination::Unsupported); + options = {}; options.random_seed = 1; + assert(solve_native(model, options).termination == Termination::Unsupported); + options = {}; options.backend = Backend::Highs; + assert(solve_native(model, options).termination == Termination::Unsupported); + options = {}; options.primal_start = {{x, 1}}; + const auto seeded = solve_native(model, options); + assert(seeded.termination == Termination::Optimal && seeded.start_submitted && seeded.objective == -3); + options = {}; options.feasibility_tolerance = -1; + assert(solve_native(model, options).termination == Termination::InvalidModel); +} + +void unsupported_models() { + const auto unsupported = [](Model& model) { + const auto result = solve_native(model); + assert(result.termination == Termination::Unsupported && !result.has_solution() && !result.best_bound); + }; + Model continuous; continuous.add_continuous(0, 0); unsupported(continuous); + Model unbounded; unbounded.add_integer(); unsupported(unbounded); + Model fractional_domain; fractional_domain.add_integer(0.5, 3); unsupported(fractional_domain); + Model fractional_row; auto x = fractional_row.add_integer(0, 2); + fractional_row.add_row({{x, 0.5}}, 0, 1); unsupported(fractional_row); + Model fractional_side; x = fractional_side.add_integer(0, 2); + fractional_side.add_row({{x, 1}}, 0.5, 1); unsupported(fractional_side); + Model fractional_objective; x = fractional_objective.add_integer(0, 2); + fractional_objective.minimize({{x, 0.5}}); unsupported(fractional_objective); + Model offset; offset.minimize({}, 0.5); unsupported(offset); + Model too_big; x = too_big.add_integer(-2000000000, 2000000000); + too_big.add_row({{x, 2}}, 0, 10); unsupported(too_big); + Model objective_overflow; x = objective_overflow.add_integer(0, 2000000000); + objective_overflow.minimize({{x, 1}}); unsupported(objective_overflow); + Model double_limit; x = double_limit.add_integer(0, 2); + double_limit.minimize({{x, 1}}, 9007199254740992.0); unsupported(double_limit); + Model exact_offset; exact_offset.minimize({}, -9007199254740992.0); + SolveOptions exact; exact.guarantee = Guarantee::Exact; + const auto result = solve_native(exact_offset, exact); + assert(result.termination == Termination::Optimal && *result.objective == -9007199254740992.0); +} +} +#endif + +int main() { + const auto capabilities = native_capabilities(); + assert(Gecode::Optimize::capabilities(Backend::Native).available == capabilities.available); + Model routed; + auto route_x = routed.add_integer(-2, 5); + routed.maximize({{route_x,-3}}, 7); + SolveOptions route_options; + route_options.backend = Backend::Native; + route_options.guarantee = Guarantee::Exact; + auto route_result = solve(routed, route_options); + if (capabilities.available) { + assert(route_result.termination == Termination::Optimal && route_result.has_solution()); + assert(route_result.guarantee == Guarantee::Exact && *route_result.objective == 13); + } else assert(route_result.termination == Termination::Unsupported); +#ifdef GECODE_OPTIMIZE_WITH_NATIVE + assert(capabilities.available && capabilities.exact_solving && !capabilities.linear_programming); + exhaustive_models(); semi_indicators_and_aliases(); identities_and_history(); + options_and_limits(); unsupported_models(); + std::cout << "PASS native bridge and exhaustive original integer oracle\n"; +#else + assert(!capabilities.available && !capabilities.exact_solving); + Model model; model.add_integer(0, 1); + assert(solve_native(model).termination == Termination::Unsupported); + auto malformed = model.snapshot(); malformed.model_id = 0; + assert(solve_native(malformed).termination == Termination::InvalidModel); + Model moved(std::move(model)); + assert(solve_native(model).termination == Termination::InvalidModel); + std::cout << "PASS disabled native bridge contract\n"; +#endif +} diff --git a/test/optimize/native_auto.cpp b/test/optimize/native_auto.cpp new file mode 100644 index 0000000000..2702171a7d --- /dev/null +++ b/test/optimize/native_auto.cpp @@ -0,0 +1,126 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); +Model fixture(int kind) { + Model m; std::vector x; std::vector sum, cost; + for (int i=0;i<10;++i) { + x.push_back(m.add_binary()); sum.push_back({x.back(),kind>=3 ? double(i+1):1.0}); + cost.push_back({x.back(),double((i*7)%13+1)}); + } + if (kind>=3) { + if (kind==4) for (auto& t:sum) t.coefficient*=10000; + m.add_row(sum,-inf,kind==4 ? 70000:17);m.maximize(cost); + } else { + m.add_row(sum,3,7);m.minimize(cost); + if(kind==0) m.add_row({{x[0],1},{x[1],1}},1,inf); + if(kind==1) for(int i=0;i<9;++i)m.add_row({{x[i],1},{x[i+1],-1}},-inf,0); + if(kind==2)m.add_row({{x[0],3},{x[1],2},{x[3],4},{x[5],-2}},2,6); + } + return m; +} +// Independent exhaustive binary oracle, without solver or common validator. +std::pair> oracle(const ModelSnapshot& m) { + double best=m.objective.sense==ObjectiveSense::Minimize ? inf:-inf; + std::vector witness; + for(unsigned mask=0;mask<(1U< point(m.variables.size()); + for(unsigned i=0;i>i)&1U; + bool valid=true; + for(const auto& row:m.rows)if(row.active){ + double value=0;for(auto t:row.terms)value+=t.coefficient*point[t.variable.id]; + valid=valid && value>=row.lower && value<=row.upper; + } + if(!valid)continue; + double value=m.objective.offset; + for(auto t:m.objective.terms)value+=t.coefficient*point[t.variable.id]; + if(witness.empty() || (m.objective.sense==ObjectiveSense::Minimize ? valuebest)){ + best=value;witness=point; + } + } + return {best,witness}; +} +void check(const ModelSnapshot& s,const SolveResult& r,double optimum){ + if(r.termination!=Termination::Optimal)std::cerr<=row.lower && a<=row.upper);} +} +} +int main(){ + SolveOptions o;o.backend=Backend::Native;o.guarantee=Guarantee::Exact; + o.relative_gap=o.absolute_gap=0;o.time_limit_seconds=5; + if(!native_capabilities().available){ + auto m=fixture(0); + assert(solve_native_auto(m,o).termination==Termination::Unsupported); + assert(solve(m,o).termination==Termination::Unsupported); + std::cout<<"Automatic native disabled-backend checks passed\n";return 0; + } + const bool lp=native_lp_capabilities().available; + for(int kind=0;kind<5;++kind){ + auto m=fixture(kind);auto s=m.snapshot();auto expected=oracle(s); + for(bool snapshot:{false,true}){ + auto r=snapshot ? solve(s,o):solve(m,o);check(s,r,expected.first); + if(lp && kind!=3)assert(r.backend.find("checked LP")!=std::string::npos); + else assert(r.backend==solve_native(s,o).backend); + if(lp && (kind==2 || kind==4))assert(r.backend.find("frontier")!=std::string::npos); + } + auto started=o;for(unsigned i=0;i();stopped.cancellation->cancel(); + assert(solve_native_auto(s,stopped).termination==Termination::Cancelled); + auto invalid=o;invalid.threads=0; + assert(solve_native_auto(s,invalid).termination==Termination::InvalidModel); + auto certified=o;certified.guarantee=Guarantee::Certified; + assert(solve_native_auto(s,certified).termination==Termination::Unsupported); + auto limited=o;limited.node_limit=1;auto r=solve_native_auto(s,limited); + assert(r.termination==Termination::Optimal || r.termination==Termination::NodeLimit); + if(r.best_bound)assert(s.objective.sense==ObjectiveSense::Minimize ? *r.best_bound<=expected.first:*r.best_bound>=expected.first); + s.rows[0].terms[0].variable.id+=100; + assert(solve_native_auto(s,o).termination==Termination::InvalidModel); + } + Model global;auto a=global.add_integer(0,2),b=global.add_integer(0,2); + add_all_different(global,{a,b});global.minimize({{a,1},{b,1}}); + auto automatic=o;automatic.backend=Backend::Auto;auto g=solve(global,automatic); + assert(g.termination==Termination::Optimal && g.objective==1 && g.backend=="Gecode native"); + Model large;for(int i=0;i<4100;++i)large.add_variable(VariableType::Binary,0,0); + auto l=solve_native_auto(large,o);assert(l.termination==Termination::Optimal && l.objective==0); + auto numeric=fixture(0);auto ns=numeric.snapshot(); + numeric.add_row({{ns.variables[0].variable,1000000001}},-inf,1000000001); + auto nr=solve_native_auto(numeric,o);check(numeric.snapshot(),nr,oracle(numeric.snapshot()).first); + // Presolve can now remove the redundant oversized row. A supplied start + // deliberately skips transformations, still exercising numeric LP fallback. + auto numeric_start=o;auto numeric_snapshot=numeric.snapshot(); + auto numeric_witness=oracle(numeric_snapshot).second; + for(unsigned i=0;i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::uint64_t runs=0; +thread_local std::function hook; +// Independent finite product oracle: no native compiler, propagator or common +// validator is used to compute feasible points or objective bounds. +bool feasible(const ModelSnapshot& model,const std::vector& point) { + const auto row=[&](const std::vector& terms,double lower,double upper) { + std::int64_t sum=0; + for(const auto& term:terms) sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return sum>=lower && sum<=upper; + }; + for(const auto& variable:model.variables) if(variable.active) { + const auto value=point.at(variable.variable.id); + if(value!=std::trunc(value) || !std::isfinite(value)) return false; + if(!(variable.type==VariableType::SemiInteger && value==0) && (valuevariable.upper)) return false; + } + for(const auto& original:model.rows) + if(original.active && !original.indicator_origin && !row(original.terms,original.lower,original.upper)) return false; + for(const auto& indicator:model.indicators) if(indicator.active) { + const bool enabled=point[indicator.activator.id]==(indicator.active_value?1:0); + if(enabled && !row(indicator.terms,indicator.lower,indicator.upper)) return false; + if(indicator.inactive_gate && point[indicator.inactive_gate->id]!=(enabled?0:1)) return false; + } + for(const auto& global:model.globals) if(global.active) { + const bool valid=std::visit([&](const auto& data) { + using T=std::decay_t; + const auto value=[&](Variable v) {return static_cast(point[v.id]);}; + if constexpr(std::is_same_v) { + std::set seen; + for(auto v:data.variables) if(!seen.insert(value(v)).second) return false; + return true; + } else if constexpr(std::is_same_v) { + const auto index=value(data.index)-data.index_base; + return index>=0 && static_cast(index)) { + std::vector tuple;for(auto v:data.variables) tuple.push_back(value(v)); + return std::find(data.tuples.begin(),data.tuples.end(),tuple)!=data.tuples.end(); + } else if constexpr(std::is_same_v) { + std::set starts; + for(std::size_t i=0;idata.capacity) return false; + } + return true; + } else if constexpr(std::is_same_v) { + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=std::find_if(data.transitions.begin(),data.transitions.end(),[&](const RegularTransition& t){return t.from==state&&t.symbol==value(variable);}); + if(edge==data.transitions.end())return false; + state=edge->to; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + if(data.successors.empty()) return false; + std::set seen;std::int64_t next=0; + for(std::size_t i=0;i(next)>=data.successors.size() || !seen.insert(next).second) return false; + next=value(data.successors[next])-data.index_base; + } + return next==0; + } + },global.payload); + if(!valid) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model,const std::vector& point) { + auto value=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms) value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return value; +} +std::optional oracle(const ModelSnapshot& model) { + std::vector point(model.variables.size());std::optional best; + const auto visit=[&](const auto& self,std::size_t slot)->void { + if(slot==model.variables.size()) { + if(!feasible(model,point)) return; + const auto value=objective(model,point); + if(!best || (model.objective.sense==ObjectiveSense::Minimize ? value<*best:value>*best)) best=value; + return; + } + const auto& variable=model.variables[slot]; + if(!variable.active) {self(self,slot+1);return;} + if(variable.type==VariableType::SemiInteger) {point[slot]=0;self(self,slot+1);} + for(int value=static_cast(variable.lower);value<=variable.upper;++value) {point[slot]=value;self(self,slot+1);} + }; + visit(visit,0);return best; +} + +void verify(const ModelSnapshot& source,const NativeSearchOptions& options,const NativeSearchResult& answer,bool operational=false) { + ++runs;const auto best=oracle(source);const auto& r=answer.result;const auto& b=answer.branching; + const bool min=source.objective.sense==ObjectiveSense::Minimize; + assert(r.model_id==source.model_id && r.revision==source.revision && r.guarantee==options.solve.guarantee); + assert(b.requested==bool(options.branching)); + assert(b.budget_nodes==answer.frontier.admitted_nodes+b.probe_status_calls); + assert(b.manual_splits+b.fallback_decisions<=b.decisions); + assert(b.finite_samples==2*b.published_pairs && b.zero_gain_samples<=b.finite_samples); + assert(b.published_pairs<=b.completed_pairs && b.completed_pairs*2<=b.probe_status_calls); + assert(b.failed_directions<=b.completed_pairs*2 && b.probe_lp_calls<=answer.relaxation.lp_calls); + assert(b.probe_lp_seconds<=answer.relaxation.lp_seconds+1e-9); + assert(answer.frontier.peak_open_nodes<=options.max_open_nodes); + if(options.solve.node_limit)assert(b.budget_nodes<=*options.solve.node_limit); + if(options.branching){assert(b.work<=options.branching->max_branching_work);assert(b.history_entries<=options.branching->max_history_entries);assert(b.probe_status_calls<=options.branching->max_probe_status_calls);} + else assert(!b.decisions && !b.probe_status_calls && !b.history_entries && !b.work); + if(r.has_solution()) { + assert(best && feasible(source,r.values) && r.objective==static_cast(objective(source,r.values))); + assert(min ? *r.objective>=*best:*r.objective<=*best); + for(const auto& v:source.variables) {assert(r.active_variables[v.variable.id]==v.active);if(!v.active)assert(std::isnan(r.values[v.variable.id]));} + } + if(r.best_bound) { + assert(std::isfinite(*r.best_bound)); + if(best)assert(min ? *r.best_bound<=*best:*r.best_bound>=*best); + if(r.has_solution())assert(min ? *r.best_bound<=*r.objective:*r.best_bound>=*r.objective); + } + if(r.termination==Termination::Optimal)assert(best && r.has_solution() && *r.objective==*best && r.best_bound==r.objective && !answer.frontier.unresolved_regions); + else if(r.termination==Termination::Infeasible)assert(!best && !r.has_solution() && !r.best_bound && !answer.frontier.unresolved_regions); + else assert(r.termination==Termination::NodeLimit || r.termination==Termination::MemoryLimit || r.termination==Termination::Cancelled || r.termination==Termination::TimeLimit || (operational && r.termination==Termination::BackendError)); +} +NativeSearchOptions settings(){NativeSearchOptions o;o.solve.guarantee=Guarantee::Exact;o.branching=NativeBranchingSettings{};return o;} +void limits(const Model& model,bool lp=false) { + const auto source=model.snapshot(); + for(auto order:{NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound}) { + auto o=settings();o.order=order; + if(lp){o.relaxation=NativeLpSettings{};o.relaxation->frequency=NativeLpFrequency::AfterBoundChanges;o.relaxation->root_cover_cuts=NativeRootCoverSettings{};} + const auto full=solve_native_search(source,o);verify(source,o,full); + assert(full.result.termination==Termination::Optimal || full.result.termination==Termination::Infeasible); + for(std::uint64_t n=0;n<=full.branching.budget_nodes+1;++n){o.solve.node_limit=n;verify(source,o,solve_native_search(source,o));} + o.solve.node_limit.reset(); + for(std::size_t n=0;n<=3;++n){o.max_open_nodes=n;verify(source,o,solve_native_search(source,o));} + o.max_open_nodes=100000; + for(unsigned n=0;n<11;++n){o.branching=NativeBranchingSettings{};auto& s=*o.branching; + switch(n){case 0:s.max_candidates_per_decision=0;break;case 1:s.max_probe_status_calls=0;break;case 2:s.max_probe_status_calls=1;break;case 3:s.max_probe_status_calls=2;break;case 4:s.max_probe_status_calls_per_decision=1;break;case 5:s.max_branching_work=0;break;case 6:s.max_history_entries=0;break;case 7:s.max_history_entries=1;break;case 8:s.max_nonimproving_pairs=0;break;case 9:s.max_candidates_per_decision=1;break;case 10:s.reliability_samples=1;break;} + const auto result=solve_native_search(source,o);verify(source,o,result); + assert(result.result.termination==Termination::Optimal || result.result.termination==Termination::Infeasible); + } + } + assert(model.revision()==source.revision); +} +void fixtures() { + for(int i=0;i<24;++i){Model m;auto dead=m.add_binary();m.remove(dead);const auto a=m.add_binary(),b=m.add_binary(),c=m.add_binary(); + m.add_row({{a,double(i%5-2)},{b,2},{c,-1}},-1,double(i%3)); + m.set_objective({{a,double(i%4-2)},{b,-3},{c,2}},i%2?ObjectiveSense::Minimize:ObjectiveSense::Maximize,i-11);limits(m);} + Model empty;empty.minimize({},-7);limits(empty);empty.add_row({},1,inf);limits(empty); + for(bool min:{false,true})for(bool activation:{false,true}){ + Model m;const auto a=m.add_binary(),b=m.add_binary(),c=m.add_binary(),s=m.add_variable(VariableType::SemiInteger,2,3); + m.add_row({{a,3},{b,3},{c,1}},-inf,5);add_all_different(m,{a,b});add_indicator(m,c,activation,{{s,1},{a,-1}},2,3); + m.set_objective({{a,-2},{b,-1},{c,1},{s,1}},min?ObjectiveSense::Minimize:ObjectiveSense::Maximize,17);limits(m,native_lp_capabilities().available); + } + {Model m;const auto a=m.add_binary(),b=m.add_binary();add_table(m,{a,b},{{0,0},{1,1}});m.minimize({{a,1},{b,-2}});limits(m);} + {Model m;const auto a=m.add_binary(),b=m.add_binary(),i=m.add_integer(-1,0),r=m.add_binary();add_element(m,i,{a,b},r,-1);m.maximize({{r,2},{a,-1}});limits(m);} + {Model m;const auto a=m.add_binary(),b=m.add_binary();add_cumulative(m,{a,b},{1,1},{1,1},1);m.minimize({{a,2},{b,-1}});limits(m);} + {Model m;const auto a=m.add_integer(0,2),b=m.add_integer(0,2),c=m.add_integer(0,2),z=m.add_binary();add_circuit(m,{a,b,c},0);m.add_row({{a,1},{z,-1}},0,1);m.minimize({{a,1},{z,-2}});limits(m);} + {Model m;const auto x=m.add_variable(VariableType::SemiInteger,3,4),y=m.add_integer(-2,2);m.add_row({{x,1},{y,1}},1,3);m.minimize({{x,1},{y,-2}});limits(m);} +} +Model rank_fixture(){Model m;const auto a=m.add_binary(),b=m.add_binary(),c=m.add_binary();m.minimize({{a,1},{b,4},{c,2}},17);return m;} +void boundaries() { + Model m=rank_fixture();const auto source=m.snapshot();auto o=settings(); + auto bad=o;bad.branching->reliability_samples=0;assert(solve_native_search(source,bad).result.termination==Termination::InvalidModel); + bad=o;bad.branching->policy=static_cast(99);assert(solve_native_search(source,bad).result.termination==Termination::InvalidModel); + for(int kind=0;kind<3;++kind){auto z=o;if(kind==0)z.solve.node_limit=0;else if(kind==1)z.solve.time_limit_seconds=0;else{z.solve.cancellation=std::make_shared();z.solve.cancellation->cancel();}auto result=solve_native_search(source,z);verify(source,z,result);assert(!result.branching.decisions && !result.branching.probe_status_calls && !result.result.has_solution());} + auto full=solve_native_search(source,o);verify(source,o,full);assert(full.branching.probe_status_calls && full.branching.manual_splits && full.branching.published_pairs && full.branching.reliable_candidates); + for(std::size_t work=0;work<110;++work){auto limited=o;limited.branching->max_branching_work=work;auto r=solve_native_search(source,limited);verify(source,limited,r);assert(r.result.objective==17);} + for(std::uint64_t n=1;n<5;++n){auto limited=o;limited.solve.node_limit=n;auto r=solve_native_search(source,limited);verify(source,limited,r);assert(!r.branching.probe_status_calls);} + auto baseline=o;baseline.branching.reset();const auto base=solve_native_search(source,baseline);verify(source,baseline,base); + auto zero=o;zero.branching->max_branching_work=0;const auto skipped=solve_native_search(source,zero);verify(source,zero,skipped); + assert(base.frontier.admitted_nodes==skipped.frontier.admitted_nodes && base.frontier.expanded_nodes==skipped.frontier.expanded_nodes && !skipped.branching.manual_splits); + std::vector> tasks;for(int i=0;i<4;++i)tasks.push_back(std::async(std::launch::async,[&]{return solve_native_search(source,o);})); + for(auto& task:tasks){auto r=task.get();verify(source,o,r);assert(r.branching.probe_status_calls==full.branching.probe_status_calls && r.branching.manual_splits==full.branching.manual_splits);} + m.set_bounds(m.snapshot().variables[0].variable,1,1);auto edited=m.snapshot();verify(edited,o,solve_native_search(edited,o));verify(source,o,full); + if(native_lp_capabilities().available){Model lp;auto a=lp.add_binary(),b=lp.add_binary(),c=lp.add_binary();lp.add_row({{a,3},{b,3}},-inf,5);lp.minimize({{a,-2},{b,-2},{c,1}},17); + for(bool covers:{false,true}){auto opts=settings();opts.relaxation=NativeLpSettings{};opts.relaxation->frequency=NativeLpFrequency::AfterBoundChanges;if(covers)opts.relaxation->root_cover_cuts=NativeRootCoverSettings{};const auto snapshot=lp.snapshot();const auto r=solve_native_search(snapshot,opts);verify(snapshot,opts,r);assert(r.result.objective==15 && r.branching.probe_lp_calls>0);} + } + // Two contradictory clause pairs only fail after probing/branching. + {Model impossible;auto x=impossible.add_binary(),a=impossible.add_binary(),b=impossible.add_binary(); + impossible.add_row({{x,1},{a,1}},1,inf);impossible.add_row({{x,1},{a,-1}},0,inf); + impossible.add_row({{x,-1},{b,1}},0,inf);impossible.add_row({{x,-1},{b,-1}},-1,inf); + auto options=settings();options.branching->max_candidates_per_decision=1;const auto snapshot=impossible.snapshot();const auto r=solve_native_search(snapshot,options);verify(snapshot,options,r); + assert(r.result.termination==Termination::Infeasible && r.branching.failed_directions==2 && r.branching.completed_pairs==1 && !r.branching.published_pairs && !r.branching.finite_samples); + } +} +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS +void faults_and_traces() { + Model m=rank_fixture();const auto source=m.snapshot(); + const std::vector events={"candidate_scan","pair_begin","probe_clone","probe_cloned","probe_posted","probe_before_status","probe_after_status","probe_destroyed","pair_before_publication","pair_published","candidate_score","branch_selected"}; + for(const auto& event:events)for(int fault=0;fault<3;++fault){ + auto o=settings();o.solve.cancellation=std::make_shared();bool fired=false; + hook=[&](const char* name,std::size_t,double&,double&){if(!fired && name==event){fired=true;if(fault==0)o.solve.cancellation->cancel();else if(fault==1)throw std::bad_alloc();else throw std::runtime_error("probe injected backend error");}}; + const auto r=solve_native_search(source,o);hook={};assert(fired);verify(source,o,r,true); + assert(r.result.termination==(fault==0?Termination::Cancelled:fault==1?Termination::MemoryLimit:Termination::BackendError)); + assert(!r.result.has_solution() && r.result.best_bound==17 && r.frontier.unresolved_regions==1); + if(event=="pair_before_publication")assert(!r.branching.published_pairs && !r.branching.finite_samples && !r.branching.history_entries); + } + // Interrupt in the second direction: no half-pair history, no proof reuse. + {auto o=settings();o.solve.cancellation=std::make_shared();int statuses=0;hook=[&](const char* e,std::size_t,double&,double&){if(std::string(e)=="probe_after_status" && ++statuses==2)o.solve.cancellation->cancel();};auto r=solve_native_search(source,o);hook={};verify(source,o,r);assert(r.branching.probe_status_calls==2 && !r.branching.published_pairs && r.result.best_bound==17 && !r.result.has_solution());} + {auto o=settings();o.solve.time_limit_seconds=1;bool fired=false;hook=[&](const char* e,std::size_t,double&,double&){if(!fired && std::string(e)=="pair_before_publication"){fired=true;std::this_thread::sleep_for(std::chrono::milliseconds(1050));}};auto r=solve_native_search(source,o);hook={};verify(source,o,r);assert(fired && r.result.termination==Termination::TimeLimit && !r.branching.published_pairs && r.result.best_bound==17 && !r.result.has_solution());} +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS + const std::vector transfers={"child_clone","child_committed","before_propagation","after_propagation","child_enqueued","parent_discharged","before_validation","after_validation"}; + for(const auto& event:transfers)for(int fault=0;fault<3;++fault){ + auto o=settings();o.solve.cancellation=std::make_shared();bool armed=false,fired=false; + hook=[&](const char* name,std::size_t,double&,double&){if(std::string(name)=="branch_selected")armed=true;if(armed && !fired && name==event){fired=true;if(fault==0)o.solve.cancellation->cancel();else if(fault==1)throw std::bad_alloc();else throw std::runtime_error("manual transfer injected failure");}}; + const auto r=solve_native_search(source,o);hook={};assert(armed && fired);verify(source,o,r,true); + assert(r.result.termination==(fault==0?Termination::Cancelled:fault==1?Termination::MemoryLimit:Termination::BackendError)); + assert(!r.result.has_solution() && r.result.best_bound==17); + } + {auto o=settings();o.solve.cancellation=std::make_shared();int children=0;hook=[&](const char* e,std::size_t,double&,double&){if(std::string(e)=="child_clone" && ++children==2)o.solve.cancellation->cancel();};auto r=solve_native_search(source,o);hook={};verify(source,o,r);assert(children==2 && r.frontier.unresolved_regions==2 && r.result.best_bound==17 && !r.result.has_solution());} +#endif + // Scores can change traversal, never feasibility/bounds. Nonfinite scores fall back. + for(int mode=0;mode<4;++mode){auto o=settings();std::vector selected; + hook=[&](const char* e,std::size_t slot,double& down,double& up){if(std::string(e)=="candidate_score"){if(mode==0)down=up=0;else if(mode==1)down=up=std::numeric_limits::quiet_NaN();else if(mode==2)down=up=slot==0?1e300:1;else down=up=-1;}if(std::string(e)=="branch_selected")selected.push_back(slot);}; + auto r=solve_native_search(source,o);hook={};verify(source,o,r);assert(r.result.objective==17);if(mode==2)assert(!selected.empty() && selected.front()==0);else assert(selected.empty()); + } + // Repeated clones followed by built-in fallback respect Choice lifecycle. + {auto o=settings();std::size_t cloned=0,fallback=0;hook=[&](const char* e,std::size_t,double& d,double& u){const std::string name=e;if(name=="probe_cloned")++cloned;if(name=="candidate_score")d=u=0;if(name=="branch_fallback")++fallback;};auto r=solve_native_search(source,o);hook={};verify(source,o,r);assert(cloned && fallback && !r.branching.manual_splits);} + // Gate columns never enter the candidate panel, even when declared Binary. + {Model g;auto a=g.add_binary(),x=g.add_integer(-1,2);auto formulated=add_indicator(g,a,true,{{x,1}},0,1);(void)formulated;auto snapshot=g.snapshot();assert(snapshot.indicators[0].inactive_gate);const auto gate=snapshot.indicators[0].inactive_gate->id; + hook=[&](const char* e,std::size_t slot,double&,double&){if(std::string(e)=="pair_begin" || std::string(e)=="branch_selected")assert(slot!=gate);};auto o=settings();auto r=solve_native_search(snapshot,o);verify(snapshot,o,r); + remove_indicator(g,formulated.indicator);g.minimize({{*formulated.inactive_gate,-9},{a,1}});snapshot=g.snapshot();assert(snapshot.variables[gate].indicator_origin);r=solve_native_search(snapshot,o);hook={};verify(snapshot,o,r);} +} +#endif +} +namespace Gecode {namespace Optimize { +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS +void native_branching_test_event(const char* e,std::size_t slot,double& down,double& up){if(hook)hook(e,slot,down,up);} +#endif +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS +void native_search_test_event(const char* e) {double down=0,up=0;if(hook)hook(e,std::numeric_limits::max(),down,up);} +#endif +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +void native_root_cut_test_event(const char*,NativeRootCoverCompletion&) {} +#endif +}} +int main(){ + if(!native_capabilities().available){Model m;auto o=settings();auto r=solve_native_search(m,o);assert(r.result.termination==Termination::Unsupported && r.branching.requested);o.branching->reliability_samples=0;assert(solve_native_search(m,o).result.termination==Termination::InvalidModel);std::cout<<"Native branching unavailable: explicit boundaries pass\n";return 0;} + fixtures();boundaries(); +#ifdef GECODE_NATIVE_BRANCHING_TEST_HOOKS + faults_and_traces(); +#endif + std::cout< +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +// A tiny independent exhaustive continuation; every enumeration consumes the +// supplied budget. No solver implementation or common validator chooses values. +SolveResult oracle(const ModelSnapshot& m,const SolveOptions& o,SolveBudget& budget) { + SolveResult r;r.model_id=m.model_id;r.revision=m.revision;r.guarantee=o.guarantee; + r.backend="test exhaustive oracle";r.backend_version="1"; + std::vector values(m.variables.size());bool found=false,stopped=false; + double best=m.objective.sense==ObjectiveSense::Minimize?inf:-inf; + std::function visit=[&](std::size_t index) { + if(stopped)return; + if(auto reason=budget.stop_reason()){r.termination=*reason;stopped=true;return;} + if(indexrow.upper)return; + } + double cost=m.objective.offset;for(auto t:m.objective.terms)cost+=t.coefficient*values[t.variable.id]; + if(!found || (m.objective.sense==ObjectiveSense::Minimize?costbest)) { + found=true;best=cost;r.values=values; + } + }; + visit(0); + if(stopped){r.values.clear();return r;} + r.termination=found?Termination::Optimal:Termination::Infeasible; + if(found){r.objective=best;r.best_bound=best;r.solution_validated=true;r.active_variables.assign(values.size(),true);r.update_gaps(m.objective.sense);} + return r; +} + +SolveOptions options() { + SolveOptions o;o.backend=Backend::Native;o.guarantee=Guarantee::Exact; + o.relative_gap=o.absolute_gap=0;return o; +} +Model fixture(ObjectiveSense sense) { + Model m;auto gone=m.add_binary();m.remove(gone); + auto a=m.add_integer(-2,3),b=m.add_binary(),c=m.add_integer(-3,2),d=m.add_binary(); + m.add_row({{a,1},{b,2}},1,3); + m.add_row({{c,1}},-2,1); + auto removed=m.add_row({{a,1},{c,1}},-inf,100);m.remove(removed); + m.add_row({},-1,1); + m.set_objective({{a,-3},{b,2},{c,4},{d,-7}},sense,19); + return m; +} +} + +int main() { + auto o=options(); + for(auto sense:{ObjectiveSense::Minimize,ObjectiveSense::Maximize}) { + auto m=fixture(sense);auto s=m.snapshot();SolveBudget budget(o);unsigned calls=0; + auto r=Detail::native_components(s,o,budget,[&](const ModelSnapshot& part,const SolveOptions& same,SolveBudget& shared){ + assert(&shared==&budget && &same==&o);assert(part.objective.offset==0);++calls; + return oracle(part,same,shared); + }); + assert(r && calls==3 && r->termination==Termination::Optimal && r->has_solution()); + assert(r->model_id==s.model_id && r->revision==s.revision && r->values.size()==5); + assert(!r->active_variables[0] && std::isnan(r->values[0])); + // min: (a,b)=(3,0), c=-2,d=1; max: (a,b)=(-1,1), c=1,d=0. + assert(r->objective==(sense==ObjectiveSense::Minimize?-5:28)); + assert(r->best_bound==r->objective && r->absolute_gap==0 && r->relative_gap==0); + assert(validate(s,r->values,0,0).valid); + } + Model coupled;auto a=coupled.add_binary(),b=coupled.add_binary();coupled.add_row({{a,1},{b,-1}},0,0); + SolveBudget coupled_budget(o);unsigned calls=0; + auto no_call=[&](const ModelSnapshot&,const SolveOptions&,SolveBudget&)->SolveResult{++calls;assert(false);return {};}; + assert(!Detail::native_components(coupled.snapshot(),o,coupled_budget,no_call) && calls==0); + auto m=fixture(ObjectiveSense::Minimize);auto s=m.snapshot(); + auto start=o;start.primal_start.push_back({s.variables[1].variable,1});SolveBudget start_budget(start); + assert(!Detail::native_components(s,start,start_budget,no_call)); + auto fractional=s;fractional.objective.offset=0.5;SolveBudget fractional_budget(o); + assert(!Detail::native_components(fractional,o,fractional_budget,no_call)); + Model many;for(unsigned i=0;i<65;++i)many.add_binary();SolveBudget many_budget(o); + assert(!Detail::native_components(many.snapshot(),o,many_budget,no_call)); + Model impossible;impossible.add_binary();impossible.add_binary();impossible.add_row({},1,inf); + SolveBudget impossible_budget(o); + auto bad=Detail::native_components(impossible.snapshot(),o,impossible_budget,oracle); + assert(bad && bad->termination==Termination::Infeasible && !bad->has_solution() && !bad->best_bound); + auto cancelled=o;cancelled.cancellation=std::make_shared();cancelled.cancellation->cancel();SolveBudget cancel_budget(cancelled); + auto stop=Detail::native_components(s,cancelled,cancel_budget,no_call); + assert(stop && stop->termination==Termination::Cancelled && !stop->has_solution()); + auto limited=o;limited.node_limit=13;SolveBudget node_budget(limited);calls=0; + auto partial=Detail::native_components(s,limited,node_budget,[&](const ModelSnapshot& part,const SolveOptions& same,SolveBudget& shared){ + ++calls;return oracle(part,same,shared); + }); + assert(partial && calls==2 && partial->termination==Termination::NodeLimit); + assert(node_budget.nodes()==13 && !partial->has_solution() && partial->values.empty() && !partial->objective && !partial->best_bound); + // A second component must not turn its local witness into an original point. + SolveBudget partial_budget(o);calls=0; + auto interrupted=Detail::native_components(s,o,partial_budget,[&](const ModelSnapshot& part,const SolveOptions& same,SolveBudget& shared){ + auto local=oracle(part,same,shared);if(++calls==2)local.termination=Termination::TimeLimit;return local; + }); + assert(interrupted && interrupted->termination==Termination::TimeLimit && !interrupted->has_solution() && !interrupted->best_bound); + // Independently reject a claimed optimum carrying an infeasible local point. + SolveBudget dishonest_budget(o); + auto dishonest=Detail::native_components(s,o,dishonest_budget,[&](const ModelSnapshot& part,const SolveOptions& same,SolveBudget& shared){ + auto local=oracle(part,same,shared);local.values[0]=100;return local; + }); + assert(dishonest && dishonest->termination==Termination::BackendError && !dishonest->has_solution()); + std::cout<<"Independent component optima, offsets, mapping, infeasibility and shared budgets passed\n"; +} diff --git a/test/optimize/native_knapsack.cpp b/test/optimize/native_knapsack.cpp new file mode 100644 index 0000000000..c9c23746b4 --- /dev/null +++ b/test/optimize/native_knapsack.cpp @@ -0,0 +1,399 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::uint64_t runs=0; + +// Independent finite product oracle: no native compiler, propagator or common +// validator is used to compute feasible points or objective bounds. +bool feasible(const ModelSnapshot& model,const std::vector& point) { + const auto row=[&](const std::vector& terms,double lower,double upper) { + std::int64_t sum=0; + for(const auto& term:terms) sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return sum>=lower && sum<=upper; + }; + for(const auto& variable:model.variables) if(variable.active) { + const auto value=point.at(variable.variable.id); + if(value!=std::trunc(value) || !std::isfinite(value)) return false; + if(!(variable.type==VariableType::SemiInteger && value==0) && (valuevariable.upper)) return false; + } + for(const auto& original:model.rows) + if(original.active && !original.indicator_origin && !row(original.terms,original.lower,original.upper)) return false; + for(const auto& indicator:model.indicators) if(indicator.active) { + const bool enabled=point[indicator.activator.id]==(indicator.active_value?1:0); + if(enabled && !row(indicator.terms,indicator.lower,indicator.upper)) return false; + if(indicator.inactive_gate && point[indicator.inactive_gate->id]!=(enabled?0:1)) return false; + } + for(const auto& global:model.globals) if(global.active) { + const bool valid=std::visit([&](const auto& data) { + using T=std::decay_t; + const auto value=[&](Variable v) {return static_cast(point[v.id]);}; + if constexpr(std::is_same_v) { + std::set seen; + for(auto v:data.variables) if(!seen.insert(value(v)).second) return false; + return true; + } else if constexpr(std::is_same_v) { + const auto index=value(data.index)-data.index_base; + return index>=0 && static_cast(index)) { + std::vector tuple;for(auto v:data.variables) tuple.push_back(value(v)); + return std::find(data.tuples.begin(),data.tuples.end(),tuple)!=data.tuples.end(); + } else if constexpr(std::is_same_v) { + std::set starts; + for(std::size_t i=0;idata.capacity) return false; + } + return true; + } else if constexpr(std::is_same_v) { + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=std::find_if(data.transitions.begin(),data.transitions.end(),[&](const RegularTransition& t){return t.from==state&&t.symbol==value(variable);}); + if(edge==data.transitions.end())return false; + state=edge->to; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + if(data.successors.empty()) return false; + std::set seen;std::int64_t next=0; + for(std::size_t i=0;i(next)>=data.successors.size() || !seen.insert(next).second) return false; + next=value(data.successors[next])-data.index_base; + } + return next==0; + } + },global.payload); + if(!valid) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model,const std::vector& point) { + auto value=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms) value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return value; +} +std::optional oracle(const ModelSnapshot& model) { + std::vector point(model.variables.size());std::optional best; + const auto visit=[&](const auto& self,std::size_t slot)->void { + if(slot==model.variables.size()) { + if(!feasible(model,point)) return; + const auto value=objective(model,point); + if(!best || (model.objective.sense==ObjectiveSense::Minimize ? value<*best:value>*best)) best=value; + return; + } + const auto& variable=model.variables[slot]; + if(!variable.active) {self(self,slot+1);return;} + if(variable.type==VariableType::SemiInteger) {point[slot]=0;self(self,slot+1);} + for(int value=static_cast(variable.lower);value<=variable.upper;++value) {point[slot]=value;self(self,slot+1);} + }; + visit(visit,0);return best; +} +SolveOptions exact() { + SolveOptions options; options.backend = Backend::Native; options.guarantee = Guarantee::Exact; + return options; +} +void check(const ModelSnapshot& source, const SolveResult& result, + const std::optional& best, bool completed = false) { + ++runs; + const bool minimize = source.objective.sense == ObjectiveSense::Minimize; + assert(result.model_id == source.model_id && result.revision == source.revision); + assert(result.guarantee == Guarantee::Exact); + if (result.has_solution()) { + assert(best && feasible(source, result.values)); + assert(result.objective == static_cast(objective(source, result.values))); + assert(minimize ? *result.objective >= *best : *result.objective <= *best); + for (const auto& v : source.variables) { + assert(result.active_variables.at(v.variable.id) == v.active); + if (!v.active) assert(std::isnan(result.values.at(v.variable.id))); + } + } + if (result.best_bound && best) + assert(minimize ? *result.best_bound <= *best : *result.best_bound >= *best); + if (result.termination == Termination::Optimal) { + assert(best && result.objective == *best && result.best_bound == result.objective); + } else if (result.termination == Termination::Infeasible) { + assert(!best && !result.has_solution() && !result.best_bound); + } else { + assert(!completed && result.termination == Termination::NodeLimit); + } +} +void exercise(const Model& model) { + const auto source = model.snapshot(); const auto best = oracle(source); + auto options = exact(); + check(source, solve_native(source, options), best, true); + for (std::uint64_t limit : {0, 1, 2, 3, 5, 8}) { + options.node_limit = limit; const auto result = solve_native(source, options); + check(source, result, best); + if (result.termination == Termination::NodeLimit) assert(!result.best_bound); + } + for (auto order : {NativeSearchOrder::DepthFirst, NativeSearchOrder::BestBound}) { + NativeSearchOptions search; search.solve = exact(); search.order = order; + check(source, solve_native_search(source, search).result, best, true); + for (std::uint64_t limit = 0; limit <= 6; ++limit) { + search.solve.node_limit = limit; const auto result = solve_native_search(source, search); + check(source, result.result, best); + assert(result.frontier.admitted_nodes <= limit); + } + } +} +Model capacity_model(bool negative = false, bool maximum = false, + int capacity = 3, bool redundant_side = false) { + Model m; const auto dead = m.add_binary(); m.remove(dead); + const auto a = m.add_binary(), b = m.add_binary(); + const double sign = negative ? -1 : 1; + m.add_row({{a, 2 * sign}, {b, 2 * sign}}, + negative ? -capacity : (redundant_side ? -1 : -inf), + negative ? (redundant_side ? 1 : inf) : capacity); + m.set_objective({{a, maximum ? 3.0 : -3.0}, {b, maximum ? 2.0 : -2.0}}, + maximum ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, maximum ? -11 : 11); + return m; +} +void pure_models() { + for (bool negative : {false, true}) for (bool maximum : {false, true}) + for (bool redundant : {false, true}) for (int capacity : {0, 1, 3, 4, 7}) { + auto m = capacity_model(negative, maximum, capacity, redundant); exercise(m); + } + for (int pattern = 0; pattern < 12; ++pattern) { + Model m; std::vector row, cost; + for (int i = 0; i < 5; ++i) { + const auto x = m.add_binary(); row.push_back({x, double(i + 1)}); + cost.push_back({x, double((pattern + 2 * i) % 7 - 3)}); + } + m.add_row(row, -inf, pattern % 9); + m.set_objective(cost, pattern % 2 ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, pattern - 7); + exercise(m); + } + Model ties; auto a = ties.add_binary(), b = ties.add_binary(); + ties.add_row({{a, 2}, {b, 2}}, -inf, 2); ties.minimize({{a, -1}, {b, -1}}); exercise(ties); + ties.minimize({}); exercise(ties); // No-benefit objective must keep the old path. +} +void exact_bound_and_work() { + for (bool negative : {false, true}) for (bool maximum : {false, true}) { + auto m = capacity_model(negative, maximum); const auto source = m.snapshot(); + const auto best = oracle(source); + for (auto order : {NativeSearchOrder::DepthFirst, NativeSearchOrder::BestBound}) { + NativeSearchOptions search; search.solve = exact(); search.order = order; + search.solve.node_limit = 1; + const auto root = solve_native_search(source, search); + check(source, root.result, best); + assert(!root.result.has_solution() && root.result.best_bound == *best); + search.solve.node_limit = 3; + const auto full = solve_native_search(source, search); + check(source, full.result, best, true); + assert(full.frontier.admitted_nodes == 3 && full.frontier.feasible_leaves == 1); + } + auto options = exact(); options.node_limit = 8; + check(source, solve_native(source, options), best, true); + // Both an already optimal and a poor feasible start remain ordinary starts. + for (int selected : {0, 1}) { + options = exact(); options.primal_start = { + {source.variables[1].variable, double(selected)}, {source.variables[2].variable, 0}}; + const auto answer = solve_native(source, options); + check(source, answer, best, true); assert(answer.start_submitted); + } + } +} +void zero_cost_ties() { + // A stable FIFO tie-break alone explores many equal-bound regions before + // reaching a leaf. The unique region retaining the DP witness must remain + // reachable within a linear admission quota despite these zero-cost bits. + constexpr int count = 12; + for (bool maximum : {false, true}) { + Model m; std::vector weights; + for (int i = 0; i < count; ++i) weights.push_back({m.add_binary(), 1}); + m.add_row(weights, -inf, 8); + m.set_objective({{weights.front().variable, maximum ? 1.0 : -1.0}}, + maximum ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, maximum ? -3 : 3); + const auto source = m.snapshot(); const auto best = oracle(source); + auto options = exact(); options.node_limit = 2 * count + 3; + check(source, solve_native(source, options), best, true); + for (auto order : {NativeSearchOrder::DepthFirst, NativeSearchOrder::BestBound}) { + NativeSearchOptions search; search.solve = options; search.order = order; + const auto result = solve_native_search(source, search); + check(source, result.result, best, true); + assert(result.frontier.admitted_nodes <= *options.node_limit); + } + } +} +void packed_reconstruction() { + // Enumerated optima cover decision bits spanning word/row boundaries, signed + // costs, both row orientations and objective senses. Reconstruction must use + // decisions from the original row, never a subsequently overwritten value. + const int weights[] = {3,4,5,7,9,12,13,17}; + const int costs[] = {-7,-8,-11,3,-12,-16,0,-22}; + for (bool negative : {false,true}) for (bool maximum : {false,true}) + for (int capacity : {17,31,63,64,65}) { + Model m; std::vector row, objective_terms; + for (int i=0;i<8;++i) { + const auto x=m.add_binary(); + row.push_back({x,double(negative ? -weights[i] : weights[i])}); + objective_terms.push_back({x,double(maximum ? -costs[i] : costs[i])}); + } + m.add_row(row,negative ? -capacity : -inf,negative ? inf : capacity); + m.set_objective(objective_terms,maximum ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, + maximum ? -9 : 9); + const auto source=m.snapshot(); const auto best=oracle(source); + check(source,solve_native(source,exact()),best,true); + for (auto order : {NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound}) { + NativeSearchOptions options; options.solve=exact(); options.order=order; + check(source,solve_native_search(source,options).result,best,true); + } + } + // Equal-profit choices across multiple packed words retain the first item: + // every later equal-cost recurrence skips its item, including zero-cost bits. + Model ties; std::vector row, costs_with_ties; + std::vector variables; + for (int i=0;i<70;++i) { + variables.push_back(ties.add_binary()); row.push_back({variables.back(),1}); + if (i<69) costs_with_ties.push_back({variables.back(),-1}); + } + ties.add_row(row,-inf,1); ties.minimize(costs_with_ties); + const auto source=ties.snapshot(); + for (int mode=0;mode<3;++mode) { + NativeSearchOptions options; options.solve=exact(); + options.order=mode==1 ? NativeSearchOrder::DepthFirst : NativeSearchOrder::BestBound; + const auto result=mode==0 ? solve_native(source,options.solve) + : solve_native_search(source,options).result; + check(source,result,-1,true); + for (std::size_t i=0;i::infinity(); + assert(solve_native(malformed, exact()).termination == Termination::InvalidModel); +} +void cap_boundaries() { + // Independent optimum: at most one profitable item fits; all other items cost + // zero and can be excluded. These checks need no exponential large-box oracle. + for (int capacity : {65536, 65537}) { + Model m; auto a = m.add_binary(), b = m.add_binary(); + m.add_row({{a, 40000}, {b, 40000}}, -inf, capacity); m.minimize({{a, -3}, {b, -2}}); + NativeSearchOptions o; o.solve = exact(); o.solve.node_limit = 1; + const auto r = solve_native_search(m, o); ++runs; + assert(r.result.termination == Termination::NodeLimit && !r.result.has_solution()); + assert(r.result.best_bound == (capacity == 65536 ? -3 : -5)); + } + // This shape exceeded the old million-int64-cell table, but now passes the + // shared automatic admission. The route assertion does not depend on whether + // optional DP finishes before its local time cap on a slow/contended host. + for (bool negative : {false,true}) for (bool maximum : {false,true}) { + Model m; std::vector weights, costs; + for (int i=0;i<17;++i) { + const auto x=m.add_binary(); weights.push_back({x,negative ? -40000.0 : 40000.0}); + if (i<2) costs.push_back({x,(maximum ? 1.0 : -1.0)*(i ? 2 : 3)}); + } + m.add_row(weights,negative ? -65536 : -inf,negative ? inf : 65536); + m.set_objective(costs,maximum ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, + maximum ? -11 : 11); + auto options=exact(); options.node_limit=1; + const auto selected=solve_native_auto(m,options); ++runs; + if (native_lp_capabilities().available) + assert(selected.message.find("eligible exact knapsack DP")!=std::string::npos); + else assert(selected.backend=="Gecode native"); // Native-only route still runs DP. + assert(selected.termination==Termination::NodeLimit && !selected.has_solution()); + const auto source=m.snapshot(); + check(source,solve_native(source,exact()),maximum ? -8 : 8,true); + // Pre-cancelled large admission cannot publish any partial witness/bound. + // The existing native-search fault gate also cancels after one completed + // recurrence row, so retaining that hook tests interruption after allocation. + options=exact(); options.cancellation=std::make_shared(); + options.cancellation->cancel(); + const auto cancelled=solve_native(source,options); ++runs; + assert(cancelled.termination==Termination::Cancelled); + assert(!cancelled.has_solution() && !cancelled.best_bound); + } + // The new work cap is independent of packed storage: 489*65536 transitions + // exceed 32 million although the compact arrays would fit the byte cap. + Model oversized; std::vector weights, costs; + for (int i=0;i<489;++i) { + const auto x=oversized.add_binary(); weights.push_back({x,40000}); + if (i<2) costs.push_back({x,i ? -2.0 : -3.0}); + } + oversized.add_row(weights,-inf,65535); oversized.minimize(costs); + NativeSearchOptions options; options.solve=exact(); options.solve.node_limit=1; + const auto fallback=solve_native_search(oversized,options); ++runs; + assert(fallback.result.termination==Termination::NodeLimit && !fallback.result.has_solution()); + assert(fallback.result.best_bound==-5); +} +void explicit_lp_and_stops() { + auto m = capacity_model(); const auto source = m.snapshot(); + if (native_lp_capabilities().available) { + NativeLpOptions lp; lp.solve = exact(); + check(source, solve_native_lp(source, lp).result, oracle(source), true); + NativeSearchOptions search; search.solve = exact(); search.solve.node_limit = 1; + search.relaxation = NativeLpSettings{}; + const auto r = solve_native_search(source, search); ++runs; + assert(r.result.termination == Termination::NodeLimit && !r.result.has_solution()); + assert(r.result.best_bound == 7); // Exact LP ceil(-4)+offset11; DP would give8. + } + for (int mode = 0; mode < 3; ++mode) { + auto options = exact(); + if (mode == 0) options.node_limit = 0; + if (mode == 1) options.time_limit_seconds = 0; + if (mode == 2) { options.cancellation = std::make_shared(); options.cancellation->cancel(); } + const auto r = solve_native(source, options); ++runs; + assert(r.termination == (mode == 0 ? Termination::NodeLimit : mode == 1 ? Termination::TimeLimit : Termination::Cancelled)); + assert(!r.has_solution() && !r.best_bound); + } + std::vector> pending; + for (bool maximum : {false, true}) { + pending.push_back(std::async(std::launch::async, [maximum] { + auto local = capacity_model(true, maximum); + return solve_native(local.snapshot(), exact()); // Compiler/root die before result use. + })); + } + assert(pending[0].get().objective == 8); assert(pending[1].get().objective == -8); runs += 2; +} +} // namespace +int main() { + if (!native_capabilities().available) { + auto m = capacity_model(); assert(solve_native(m, exact()).termination == Termination::Unsupported); + NativeSearchOptions o; o.solve = exact(); + assert(solve_native_search(m, o).result.termination == Termination::Unsupported); + std::cout << "Native knapsack unavailable: explicit boundaries pass\n"; return 0; + } + pure_models(); exact_bound_and_work(); zero_cost_ties(); packed_reconstruction(); fallback_models(); + cap_boundaries(); explicit_lp_and_stops(); + std::cout << runs << " native knapsack original-oracle and budget configurations pass\n"; +} diff --git a/test/optimize/native_lp.cpp b/test/optimize/native_lp.cpp new file mode 100644 index 0000000000..8b58bf0bdb --- /dev/null +++ b/test/optimize/native_lp.cpp @@ -0,0 +1,345 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); + +// Deliberately separate integer oracle: no solver/compiler/validator calls. +bool feasible(const ModelSnapshot& model, const std::vector& values) { + const auto row = [&](const std::vector& terms, double lo, double hi) { + std::int64_t sum = 0; + for (const auto& term : terms) + sum += static_cast(term.coefficient) * static_cast(values[term.variable.id]); + return sum >= lo && sum <= hi; + }; + for (const auto& original : model.rows) + if (original.active && !original.indicator_origin && !row(original.terms, original.lower, original.upper)) return false; + for (const auto& original : model.indicators) if (original.active) { + const bool enabled = values[original.activator.id] == (original.active_value ? 1 : 0); + if (enabled && !row(original.terms, original.lower, original.upper)) return false; + if (original.inactive_gate && values[original.inactive_gate->id] != (enabled ? 0 : 1)) return false; + } + // The enumerated global fixture uses all-different only; other native global + // implementations already have their own full-product conformance suite. + for (const auto& original : model.globals) if (original.active) { + const auto& vars = std::get(original.payload).variables; + for (std::size_t i = 0; i < vars.size(); ++i) + for (std::size_t j = i + 1; j < vars.size(); ++j) + if (values[vars[i].id] == values[vars[j].id]) return false; + } + return true; +} + +std::optional oracle(const ModelSnapshot& model) { + std::vector values(model.variables.size()); + std::optional best; + const auto visit = [&](const auto& self, std::size_t slot) -> void { + if (slot == model.variables.size()) { + if (!feasible(model, values)) return; + auto objective = static_cast(model.objective.offset); + for (const auto& term : model.objective.terms) + objective += static_cast(term.coefficient) * static_cast(values[term.variable.id]); + if (!best || (model.objective.sense == ObjectiveSense::Minimize ? objective < *best : objective > *best)) best = objective; + return; + } + const auto& variable = model.variables[slot]; + if (!variable.active) { self(self, slot + 1); return; } + if (variable.type == VariableType::SemiInteger) { values[slot] = 0; self(self, slot + 1); } + for (int value = static_cast(variable.lower); value <= variable.upper; ++value) { + values[slot] = value; self(self, slot + 1); + } + }; + visit(visit, 0); return best; +} + +std::uint64_t calls = 0, bounds = 0, tightened = 0; +std::uint64_t configurations = 0; +void check(const Model& model) { + const auto snapshot = model.snapshot(); + const auto expected = oracle(snapshot); + for (auto frequency : {NativeLpFrequency::Root, NativeLpFrequency::AfterBoundChanges}) + for (bool filtering : {false, true}) + for (unsigned interval : {1U, 3U}) for (bool covers : {false,true}) { + ++configurations; + NativeLpOptions options; options.solve.guarantee = Guarantee::Exact; + options.frequency = frequency; options.bound_tightening = filtering; + options.bound_change_interval = interval; + if(covers) options.root_cover_cuts=NativeRootCoverSettings{}; + const auto solved = solve_native_lp(snapshot, options); + const auto& result = solved.result; + if (result.termination != (expected ? Termination::Optimal : Termination::Infeasible)) { + std::cerr << to_string(result.termination) << ": " << result.message << '\n'; assert(false); + } + assert(result.model_id == model.id() && result.revision == model.revision()); + assert(result.guarantee == Guarantee::Exact && result.elapsed_seconds >= 0); + assert(result.backend == "Gecode native + checked LP"); + assert(result.backend_version.find("HiGHS") != std::string::npos); + assert(result.has_solution() == expected.has_value()); + if (expected) { + assert(result.objective == static_cast(*expected)); + assert(result.best_bound == result.objective && result.absolute_gap == 0); + assert(feasible(snapshot, result.values)); + for (const auto& variable : snapshot.variables) { + if (!variable.active) { assert(!result.active_variables[variable.variable.id]); continue; } + const auto value = result.value(variable.variable); + assert(value == std::trunc(value)); + assert((variable.type == VariableType::SemiInteger && value == 0) || + (value >= variable.lower && value <= variable.upper)); + } + } else assert(!result.objective && !result.best_bound && !result.solution_validated); + calls += solved.relaxation.lp_calls; bounds += solved.relaxation.valid_bounds; + tightened += solved.relaxation.variable_bound_tightenings; + const auto& root=solved.relaxation.root_cover; + assert(root.requested==covers && root.rounds<=4 && root.cuts<=64); + assert(solved.relaxation.lp_calls>=root.lp_calls && solved.relaxation.valid_bounds>=root.valid_bounds); + assert(solved.relaxation.rejected_bounds>=root.rejected_bounds && solved.relaxation.lp_seconds>=root.lp_seconds); + assert(root.completion!=(covers?NativeRootCoverCompletion::NotStarted:NativeRootCoverCompletion::NoNewCuts)); + if(!covers) assert(root.completion==NativeRootCoverCompletion::NotRequested && !root.lp_calls); + } +} + +void enumerated_models() { + for (int i = 0; i < 32; ++i) { + Model model; + const auto gone = model.add_integer(-1, 1); model.remove(gone); + const auto x = model.add_integer(-3, 3), y = model.add_integer(-2, 2), b = model.add_binary(); + model.add_row({{x, i % 5 - 2.0}, {y, i % 3 - 1.0}, {b, 2}}, -2, 4); + model.add_row({{x, -1}, {y, 1}}, -inf, i % 4 - 1.0); + const auto dead = model.add_row({{x, 1}}, -inf, 0); model.remove(dead); + model.set_objective({{x, i % 7 - 3.0}, {y, -2}, {b, 3}}, + i % 2 ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, i - 20); + check(model); + } + for (bool activation : {false, true}) for (bool maximum : {false, true}) { + Model model; + const auto b = model.add_binary(), x = model.add_integer(-2, 3); + const auto semi = model.add_variable(VariableType::SemiInteger, 2, 4); + const auto indicator = add_indicator(model, b, activation, {{x, 2}, {semi, -1}}, -2, 1); + assert(indicator.inactive_gate); + model.add_row({{*indicator.inactive_gate, 1}, {semi, 1}}, -inf, 4); + add_all_different(model, {x, semi}); + model.set_objective({{x, -2}, {semi, 3}, {*indicator.inactive_gate, 1}}, + maximum ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, -7); + check(model); + } + Model empty; empty.minimize({}, -9); check(empty); + empty.add_row({}, 1, inf); check(empty); + Model no_cost; no_cost.add_integer(-2, 2); check(no_cost); + Model coupled; + const auto x = coupled.add_integer(0, 10), y = coupled.add_integer(0, 10); + coupled.add_row({{x, 2}, {y, 3}}, 7, inf); coupled.minimize({{x, 1}, {y, 1}}, 8); + check(coupled); + for(bool activation:{false,true}) for(bool maximum:{false,true}) { + Model hybrid;const auto x=hybrid.add_binary(),y=hybrid.add_binary(),b=hybrid.add_binary(); + const auto s=hybrid.add_variable(VariableType::SemiInteger,2,3); + hybrid.add_row({{x,3},{y,3}},-inf,5); + add_all_different(hybrid,{x,y}); + add_indicator(hybrid,b,activation,{{s,1},{x,1}},2,inf); + hybrid.set_objective({{x,maximum?2.0:-2.0},{y,maximum?2.0:-2.0},{s,maximum?-1.0:1.0}}, + maximum?ObjectiveSense::Maximize:ObjectiveSense::Minimize,maximum?-17:17); + check(hybrid); + } + assert(calls > 0 && bounds > 0 && tightened > 0); +} + +void limits_and_rejections() { + Model model; const auto x = model.add_integer(0, 100), y = model.add_integer(0, 100); + model.add_row({{x, 2}, {y, 3}}, 7, inf); model.minimize({{x, 1}, {y, 1}}); + NativeLpOptions options; + options.solve.time_limit_seconds = 0; + auto result = solve_native_lp(model, options); + assert(result.result.termination == Termination::TimeLimit && result.relaxation.lp_calls == 0); + options = {}; options.solve.cancellation = std::make_shared(); options.solve.cancellation->cancel(); + result = solve_native_lp(model.snapshot(), options); + assert(result.result.termination == Termination::Cancelled && result.relaxation.lp_calls == 0); + options = {}; options.solve.node_limit = 0; + result = solve_native_lp(model, options); + assert(result.result.termination == Termination::NodeLimit && !result.result.best_bound); + options = {}; options.solve.node_limit = 1; + result = solve_native_lp(model, options); + assert(result.result.termination == Termination::NodeLimit && !result.result.best_bound); + options = {}; options.solve.guarantee = Guarantee::Certified; + assert(solve_native_lp(model, options).result.termination == Termination::Unsupported); + options = {}; options.solve.backend = Backend::Highs; + assert(solve_native_lp(model, options).result.termination == Termination::Unsupported); + options = {}; options.solve.threads = 2; + assert(solve_native_lp(model, options).result.termination == Termination::Unsupported); + options = {}; options.solve.primal_start = {{x, 3}}; + assert(solve_native_lp(model, options).result.termination == Termination::Unsupported); + options = {}; options.bound_change_interval = 0; + assert(solve_native_lp(model, options).result.termination == Termination::InvalidModel); + options = {}; options.frequency = static_cast(-1); + assert(solve_native_lp(model, options).result.termination == Termination::InvalidModel); + auto malformed = model.snapshot(); malformed.rows[0].terms[0].variable.model_id++; + assert(solve_native_lp(malformed).result.termination == Termination::InvalidModel); + Model continuous; continuous.add_continuous(0, 1); + assert(solve_native_lp(continuous).result.termination == Termination::Unsupported); + Model fractional; auto variable = fractional.add_integer(0, 1); fractional.minimize({{variable, .5}}); + assert(solve_native_lp(fractional).result.termination == Termination::Unsupported); + Model scale; variable = scale.add_integer(0, 0); scale.add_row({{variable, 1000000001}}, -inf, 0); + assert(solve_native(scale).termination == Termination::Optimal); + assert(solve_native_lp(scale).result.termination == Termination::Unsupported); + auto old = solve_native_lp(model); const auto revision = old.result.revision; + model.set_bounds(x, 5, 10); + auto changed = solve_native_lp(model); + assert(old.result.revision == revision && changed.result.revision != revision); + assert(changed.result.objective == 5 && old.result.objective == 3); + assert(solve_native(model).backend == "Gecode native"); // unchanged native route +} + +Model cover_model() { + Model model;const auto x=model.add_binary(),y=model.add_binary(); + model.add_row({{x,3},{y,3}},-inf,5);model.minimize({{x,-2},{y,-2}},17);return model; +} +void root_cover_limits() { + auto model=cover_model();const auto snapshot=model.snapshot(); + NativeLpOptions options;options.solve.guarantee=Guarantee::Exact; + options.root_cover_cuts=NativeRootCoverSettings{}; + const auto full=solve_native_lp(model,options); + assert(full.result.termination==Termination::Optimal && full.result.objective==15); + const auto& root=full.relaxation.root_cover; + assert(root.requested && root.cuts==1 && root.nonzeros==2 && root.augmentations==1); + assert(root.lp_calls==2 && root.rounds==2 && root.completion==NativeRootCoverCompletion::NoNewCuts); + assert(full.relaxation.lp_calls>=root.lp_calls && full.relaxation.lp_calls<=root.lp_calls+1); + assert(full.relaxation.valid_bounds>=root.valid_bounds); + for(unsigned kind=0;kind<11;++kind) { + options.root_cover_cuts=NativeRootCoverSettings{};auto& limits=*options.root_cover_cuts; + auto expected=NativeRootCoverCompletion::StorageLimit; + if(kind==0){limits.max_rounds=0;expected=NativeRootCoverCompletion::RoundLimit;} + if(kind==1){limits.max_rounds=1;expected=NativeRootCoverCompletion::RoundLimit;} + if(kind==2){limits.max_work=0;expected=NativeRootCoverCompletion::WorkLimit;} + if(kind==3)limits.max_cuts=0; + if(kind==4)limits.max_cut_nonzeros=1; + if(kind==5)limits.max_model_columns=1; + if(kind==6)limits.max_model_rows=1; + if(kind==7)limits.max_model_nonzeros=3; + if(kind==8){limits.max_separation_rows=0;expected=NativeRootCoverCompletion::SeparationLimit;} + if(kind==9){limits.max_terms_per_row=1;expected=NativeRootCoverCompletion::NoNewCuts;} + if(kind==10){limits.max_work=1;expected=NativeRootCoverCompletion::WorkLimit;} + const auto partial=solve_native_lp(model,options);++configurations; + assert(partial.result.termination==Termination::Optimal && partial.result.objective==15); + assert(partial.relaxation.root_cover.completion==expected); + assert(partial.relaxation.root_cover.work<=limits.max_work); + assert(partial.relaxation.lp_calls>=partial.relaxation.root_cover.lp_calls); + if(kind==1)assert(partial.relaxation.root_cover.cuts==1 && partial.relaxation.root_cover.lp_calls==1); + else assert(partial.relaxation.root_cover.cuts==0); + assert(partial.result.model_id==snapshot.model_id && partial.result.revision==snapshot.revision); + assert(feasible(snapshot,partial.result.values)); + } + for(std::size_t work=10;work<400;work+=13) { + options.root_cover_cuts=NativeRootCoverSettings{};options.root_cover_cuts->max_work=work; + auto limited=solve_native_lp(model,options);++configurations; + assert(limited.result.termination==Termination::Optimal && limited.result.objective==15); + assert(limited.relaxation.root_cover.work<=work); + } + for(unsigned reason=0;reason<3;++reason) { + options={};options.solve.guarantee=Guarantee::Exact;options.root_cover_cuts=NativeRootCoverSettings{}; + if(reason==0)options.solve.time_limit_seconds=0; + if(reason==1)options.solve.node_limit=0; + if(reason==2){options.solve.cancellation=std::make_shared();options.solve.cancellation->cancel();} + auto stopped=solve_native_lp(model,options); + assert(stopped.result.guarantee==Guarantee::Exact && !stopped.result.has_solution() && !stopped.result.best_bound); + assert(stopped.result.termination==(reason==0?Termination::TimeLimit:reason==1?Termination::NodeLimit:Termination::Cancelled)); + assert(stopped.relaxation.root_cover.requested && stopped.relaxation.root_cover.completion==NativeRootCoverCompletion::NotStarted); + assert(!stopped.relaxation.lp_calls); + } + Model empty;empty.minimize({},-9);options={};options.root_cover_cuts=NativeRootCoverSettings{}; + auto no_hint=solve_native_lp(empty,options); + assert(no_hint.result.termination==Termination::Optimal && no_hint.result.objective==-9); + assert(no_hint.relaxation.root_cover.completion==NativeRootCoverCompletion::NoPrimalSuggestion); + empty.add_row({},1,inf);no_hint=solve_native_lp(empty,options); + assert(no_hint.result.termination==Termination::Infeasible && !no_hint.result.has_solution()); + assert(no_hint.relaxation.root_cover.completion==NativeRootCoverCompletion::NoPrimalSuggestion); + assert(model.revision()==snapshot.revision); +} + +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +std::string root_event; +std::optional injected_completion; +std::shared_ptr root_cancellation; +int root_exception=0; +void root_failures() { + auto model=cover_model();NativeLpOptions options;options.solve.guarantee=Guarantee::Exact; + options.root_cover_cuts=NativeRootCoverSettings{}; + for(auto completion:{NativeRootCoverCompletion::NoPrimalSuggestion,NativeRootCoverCompletion::InvalidSuggestion, + NativeRootCoverCompletion::CallbackError,NativeRootCoverCompletion::BackendError,NativeRootCoverCompletion::AllocationFailure}) { + root_event="after_loop";injected_completion=completion; + auto result=solve_native_lp(model,options);++configurations; + const bool hint=completion==NativeRootCoverCompletion::NoPrimalSuggestion || completion==NativeRootCoverCompletion::InvalidSuggestion; + assert(result.result.termination==(hint?Termination::Optimal: + completion==NativeRootCoverCompletion::AllocationFailure?Termination::MemoryLimit:Termination::BackendError)); + assert(result.result.has_solution()==hint && result.result.guarantee==Guarantee::Exact); + if(hint)assert(result.result.objective==15); + else assert(!result.result.best_bound && !result.result.objective); + assert(result.relaxation.root_cover.completion==completion && result.relaxation.root_cover.cuts==1); + assert(result.relaxation.lp_calls>=result.relaxation.root_cover.lp_calls); + } + injected_completion.reset(); + for(const auto* event:{"before_loop","after_loop","prepared"})for(int mode=0;mode<3;++mode) { + root_event=event;root_exception=mode;root_cancellation=std::make_shared(); + options.solve.cancellation=root_cancellation; + const auto result=solve_native_lp(model,options);++configurations; + assert(result.result.termination==(mode==0?Termination::Cancelled:mode==1?Termination::MemoryLimit:Termination::BackendError)); + assert(!result.result.has_solution() && !result.result.best_bound && result.result.guarantee==Guarantee::Exact); + assert(result.relaxation.root_cover.requested); + } + root_event.clear();root_cancellation.reset();root_exception=0; +} +#endif +} + +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +namespace Gecode { namespace Optimize { +void native_root_cut_test_event(const char* event,NativeRootCoverCompletion& completion) { + if(root_event!=event)return; + if(injected_completion){completion=*injected_completion;return;} + if(root_exception==1)throw std::bad_alloc(); + if(root_exception==2)throw std::runtime_error("injected root preparation failure"); + root_cancellation->cancel(); +} +}} +#endif + +int main() { + if (!native_lp_capabilities().available) { + Model model; model.add_integer(0, 1); + assert(solve_native_lp(model).result.termination == Termination::Unsupported); + assert(solve_native_lp(model.snapshot()).result.termination == Termination::Unsupported); + NativeLpOptions invalid; invalid.bound_change_interval = 0; + assert(solve_native_lp(model, invalid).result.termination == Termination::InvalidModel); + invalid={};invalid.root_cover_cuts=NativeRootCoverSettings{};invalid.root_cover_cuts->denominator=3; + assert(solve_native_lp(model,invalid).result.termination==Termination::InvalidModel); + invalid.root_cover_cuts->denominator=1048576; + const auto missing=solve_native_lp(model,invalid); + assert(missing.result.termination==Termination::Unsupported && missing.relaxation.root_cover.requested); + std::cout << "Native checked LP unavailable: explicit boundary verified\n"; return 0; + } + enumerated_models(); limits_and_rejections();root_cover_limits(); +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS + root_failures(); +#endif + // Independent solves own LP workspaces; historical results outlive them. + const auto solve_one = [] { + Model model; auto x = model.add_integer(-2, 5), y = model.add_integer(0, 5); + model.add_row({{x, 2}, {y, 3}}, 7, inf); model.minimize({{x, 1}, {y, 1}}); + NativeLpOptions options;options.root_cover_cuts=NativeRootCoverSettings{}; + return solve_native_lp(model,options); + }; + auto a = std::async(std::launch::async, solve_one), b = std::async(std::launch::async, solve_one); + const auto first = a.get(), second = b.get(); + assert(first.result.termination == Termination::Optimal && first.result.objective == 2); + assert(second.result.objective == first.result.objective && second.result.model_id != first.result.model_id); + std::cout << configurations << " native LP oracle/root-cover configurations pass; " << calls << " LP calls, " + << bounds << " checked bounds, " << tightened << " interval tightenings\n"; +} diff --git a/test/optimize/native_neighborhoods.cpp b/test/optimize/native_neighborhoods.cpp new file mode 100644 index 0000000000..80c3e8ebae --- /dev/null +++ b/test/optimize/native_neighborhoods.cpp @@ -0,0 +1,341 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::uint64_t runs=0; +thread_local std::function*)> hook; +// Independent finite product oracle: no native compiler, propagator or common +// validator is used to compute feasible points or objective bounds. +bool feasible(const ModelSnapshot& model,const std::vector& point) { + const auto row=[&](const std::vector& terms,double lower,double upper) { + std::int64_t sum=0; + for(const auto& term:terms) sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return sum>=lower && sum<=upper; + }; + for(const auto& variable:model.variables) if(variable.active) { + const auto value=point.at(variable.variable.id); + if(value!=std::trunc(value) || !std::isfinite(value)) return false; + if(!(variable.type==VariableType::SemiInteger && value==0) && (valuevariable.upper)) return false; + } + for(const auto& original:model.rows) + if(original.active && !original.indicator_origin && !row(original.terms,original.lower,original.upper)) return false; + for(const auto& indicator:model.indicators) if(indicator.active) { + const bool enabled=point[indicator.activator.id]==(indicator.active_value?1:0); + if(enabled && !row(indicator.terms,indicator.lower,indicator.upper)) return false; + if(indicator.inactive_gate && point[indicator.inactive_gate->id]!=(enabled?0:1)) return false; + } + for(const auto& global:model.globals) if(global.active) { + const bool valid=std::visit([&](const auto& data) { + using T=std::decay_t; + const auto value=[&](Variable v) {return static_cast(point[v.id]);}; + if constexpr(std::is_same_v) { + std::set seen; + for(auto v:data.variables) if(!seen.insert(value(v)).second) return false; + return true; + } else if constexpr(std::is_same_v) { + const auto index=value(data.index)-data.index_base; + return index>=0 && static_cast(index)) { + std::vector tuple;for(auto v:data.variables) tuple.push_back(value(v)); + return std::find(data.tuples.begin(),data.tuples.end(),tuple)!=data.tuples.end(); + } else if constexpr(std::is_same_v) { + std::set starts; + for(std::size_t i=0;idata.capacity) return false; + } + return true; + } else if constexpr(std::is_same_v) { + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=std::find_if(data.transitions.begin(),data.transitions.end(),[&](const RegularTransition& t){return t.from==state&&t.symbol==value(variable);}); + if(edge==data.transitions.end())return false; + state=edge->to; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + if(data.successors.empty()) return false; + std::set seen;std::int64_t next=0; + for(std::size_t i=0;i(next)>=data.successors.size() || !seen.insert(next).second) return false; + next=value(data.successors[next])-data.index_base; + } + return next==0; + } + },global.payload); + if(!valid) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model,const std::vector& point) { + auto value=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms) value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return value; +}std::vector> points(const ModelSnapshot& model) { + std::vector point(model.variables.size(),std::numeric_limits::quiet_NaN()); + std::vector> all; + const auto visit=[&](const auto& self,std::size_t slot)->void { + if(slot==model.variables.size()) {all.push_back(point);return;} + const auto& v=model.variables[slot];if(!v.active){self(self,slot+1);return;} + assert(std::isfinite(v.lower) && std::isfinite(v.upper) && v.upper-v.lower<=6); + if(v.type==VariableType::SemiInteger && v.lower>0){point[slot]=0;self(self,slot+1);} + for(std::int64_t value=static_cast(v.lower);value<=v.upper;++value){point[slot]=static_cast(value);self(self,slot+1);} + };visit(visit,0);return all; +} +std::optional oracle(const ModelSnapshot& source) { + std::optional best; + for(const auto& p:points(source))if(feasible(source,p)){ + const auto value=objective(source,p); + if(!best || (source.objective.sense==ObjectiveSense::Minimize?value<*best:value>*best))best=value; + }return best; +} +std::vector entries(const ModelSnapshot& source,const std::vector& p,bool omit_gates=false) { + std::set live; + if(omit_gates)for(const auto& i:source.indicators)if(i.active && i.inactive_gate)live.insert(i.inactive_gate->id); + std::vector out; + for(const auto& v:source.variables)if(v.active && !live.count(v.variable.id))out.push_back({v.variable,p[v.variable.id]}); + return out; +} + +NativeNeighborhoodOptions options() { + NativeNeighborhoodOptions out; + out.search.solve.backend=Backend::Native;out.search.solve.guarantee=Guarantee::Exact; + out.neighborhood.time_limit_seconds=30; + return out; +} +void verify(const ModelSnapshot& source,const NativeNeighborhoodOptions& options, + const NativeNeighborhoodResult& answer) { + ++runs;const auto best=oracle(source);const auto& r=answer.search.result; + const bool minimize=source.objective.sense==ObjectiveSense::Minimize; + assert(r.model_id==source.model_id && r.revision==source.revision); + assert(r.guarantee==options.search.solve.guarantee); + if(r.has_solution()) { + assert(best && feasible(source,r.values));assert(r.objective==static_cast(objective(source,r.values))); + assert(minimize?*r.objective>=*best:*r.objective<=*best); + } + if(r.best_bound && best) assert(minimize?*r.best_bound<=*best:*r.best_bound>=*best); + if(r.termination==Termination::Optimal) { + assert(best && r.has_solution() && r.objective==static_cast(*best) && r.best_bound==r.objective); + } + if(r.termination==Termination::Infeasible) assert(!best && !r.has_solution()); + const auto& n=answer.neighborhood; + assert(n.requested && n.attempts<=1 && n.accepted_improvements<=1); + assert(n.completed_status_calls<=n.status_attempts && n.status_attempts<=options.neighborhood.max_status_calls); + assert(n.source_entries<=options.neighborhood.max_source_entries); + assert(n.coordinator_work<=options.neighborhood.max_coordinator_work); + assert(n.peak_local_spaces<=options.neighborhood.max_local_spaces); + assert(n.peak_total_spaces<=options.search.max_open_nodes); + assert(n.budget_nodes==answer.search.frontier.admitted_nodes+answer.search.branching.probe_status_calls+n.status_attempts); + assert(n.budget_nodes==answer.search.branching.budget_nodes); + if(options.search.solve.node_limit) assert(n.budget_nodes<=*options.search.solve.node_limit); + if(n.accepted_improvements) assert(r.has_solution()); +} +NativeNeighborhoodResult run(const ModelSnapshot& model,const NativeNeighborhoodOptions& o) { + auto result=solve_native_neighborhoods(model,o);verify(model,o,result);return result; +} +std::vector worst(const ModelSnapshot& model) { + std::vector out; + for(auto p:points(model)) if(feasible(model,p) && (out.empty() || + (model.objective.sense==ObjectiveSense::Minimize?objective(model,p)>objective(model,out):objective(model,p)(radius); + if(start && !bad.empty()) o.search.solve.primal_start=entries(source,bad,true); + auto result=run(source,o);assert(result.search.result.termination==Termination::Optimal || result.search.result.termination==Termination::Infeasible); + for(std::uint64_t quota=0;quota<14;++quota) { + o.search.solve.node_limit=quota;run(source,o); + } + } +} +Model outside(bool table=false,bool maximize=false) { + Model model;auto x=model.add_binary(),y=model.add_binary(),z=model.add_binary(); + if(table) add_table(model,{y,z},{{0,0},{1,0},{1,1}}); + else model.add_row({{z,1},{y,-1}},-inf,0); + if(maximize) model.maximize({{x,-100},{y,20},{z,-1}},17); + else model.minimize({{x,100},{y,-20},{z,1}},-9); + return model; +} +void models() { + auto m=outside();exhaustive(m); + auto t=outside(true,true);exhaustive(t); + {Model m;auto x=m.add_binary(),y=m.add_binary(),a=m.add_integer(-2,2); + auto s=m.add_variable(VariableType::SemiInteger,2,3);m.add_row({{x,1},{y,1},{a,1},{s,1}},0,3); + m.minimize({{a,2},{s,-1},{x,3},{y,-2}},11);exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary();m.add_row({{x,1},{y,-1}},0,0); + m.maximize({{x,2},{y,1},{z,-1}});exhaustive(m);} + for(bool activation:{false,true}) { + Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_integer(-1,2); + add_indicator(m,x,activation,{{z,1}},0,1);m.maximize({{x,2},{y,3},{z,-1}},-4);exhaustive(m); + } + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary(); + auto indicator=add_indicator(m,x,true,{{z,1}},-inf,0);auto snap=m.snapshot(); + const auto gate=snap.indicators[indicator.indicator.id].inactive_gate;assert(gate);remove_indicator(m,indicator.indicator); + m.minimize({{x,2},{y,-1},{z,-1},{*gate,-1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_integer(0,2); + add_all_different(m,{x,z});m.minimize({{x,3},{y,1},{z,-1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary(),a=m.add_integer(0,1); + add_element(m,a,{x,y},z);m.minimize({{x,2},{y,-2},{z,3}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),a=m.add_integer(3,5),b=m.add_integer(3,5),c=m.add_integer(3,5); + add_circuit(m,{a,b,c},3);m.minimize({{x,5},{y,-4},{a,1},{b,-1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),a=m.add_integer(-1,1),b=m.add_integer(-1,1); + add_cumulative(m,{a,b,a},{1,1,0},{1,1,8},1);m.minimize({{x,3},{y,-2},{a,2},{b,-1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary(); + add_regular(m,{x,y,x},2,0,{{0,0,0},{0,1,1},{1,0,1},{1,1,0}},{1}); + add_regular(m,{},100000000000ULL,7,{}, {7});m.maximize({{x,3},{y,4},{z,-1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary(); + add_regular(m,{x,y},2,0,{{0,1,1}},{1});m.maximize({{z,1}});exhaustive(m);} + {Model m;auto x=m.add_binary(),dead=m.add_binary(),y=m.add_binary();m.remove(dead); + m.minimize({{x,2},{y,-3}},-9007199254740980.0);exhaustive(m);} +} +void limits_and_skips() { + auto m=outside();const auto source=m.snapshot();auto o=options();o.search.order=NativeSearchOrder::DepthFirst; + const auto full=run(source,o);assert(full.neighborhood.accepted_improvements==1); + for(std::size_t limit:{0U,1U,2U,3U,5U,10U,40U}) { + auto a=o;a.neighborhood.max_coordinator_work=limit;run(source,a); + a=o;a.neighborhood.max_source_entries=limit;run(source,a); + a=o;a.neighborhood.max_local_spaces=limit;run(source,a); + a=o;a.neighborhood.max_status_calls=limit;run(source,a); + a=o;a.search.max_open_nodes=limit;run(source,a); + } + {auto a=o;a.neighborhood.time_limit_seconds=0;auto r=run(source,a);assert(!r.neighborhood.attempts && r.neighborhood.completion==NativeNeighborhoodCompletion::LocalTimeLimit);} + {auto a=o;a.neighborhood.max_distance_variables=2;auto r=run(source,a);assert(!r.neighborhood.attempts && r.neighborhood.completion==NativeNeighborhoodCompletion::FormulationLimit);} + {auto a=o;a.neighborhood.radius=std::numeric_limits::max();auto r=run(source,a);assert(!r.neighborhood.attempts && r.neighborhood.completion==NativeNeighborhoodCompletion::NonrestrictingRadius);} + {Model pure;auto x=pure.add_integer(-2,2),y=pure.add_integer(-2,2);pure.add_row({{x,1},{y,1}},0,3);pure.minimize({{x,2},{y,-1}}); + auto r=run(pure.snapshot(),o);assert(!r.neighborhood.attempts);} + {Model fixed;auto x=fixed.add_binary(),y=fixed.add_binary();fixed.set_bounds(x,0,0);fixed.minimize({{y,1}});run(fixed.snapshot(),o);} + {Model constant;constant.add_binary();constant.add_binary();constant.minimize({},17);auto r=run(constant.snapshot(),o);assert(!r.neighborhood.attempts);} + {auto a=o;a.search.solve.node_limit=0;auto r=run(source,a);assert(r.search.result.termination==Termination::NodeLimit && !r.neighborhood.attempts);} + {auto a=o;a.search.solve.time_limit_seconds=0;auto r=run(source,a);assert(r.search.result.termination==Termination::TimeLimit && !r.neighborhood.attempts);} + for(int lp=0;lp<2;++lp) { + if(lp && !native_lp_capabilities().available) continue; + for(std::uint64_t quota=0;quota<50;++quota) { + auto a=o;a.search.solve.node_limit=quota;a.search.branching=NativeBranchingSettings{}; + if(lp) {a.search.relaxation=NativeLpSettings{};a.search.relaxation->root_cover_cuts=NativeRootCoverSettings{};} + run(source,a); + } + } +} +void bad_inputs() { + Model m;auto x=m.add_binary(),y=m.add_binary();m.minimize({{x,1},{y,-1}}); + auto o=options();o.neighborhood.policy=static_cast(73); + assert(solve_native_neighborhoods(m,o).search.result.termination==Termination::InvalidModel); + o=options();o.neighborhood.time_limit_seconds=inf; + assert(solve_native_neighborhoods(m,o).search.result.termination==Termination::InvalidModel); + auto source=m.snapshot();source.variables[0].variable.model_id++; + assert(solve_native_neighborhoods(source,options()).search.result.termination==Termination::InvalidModel); + source=m.snapshot();source.objective.terms[0].coefficient=0.5; + assert(solve_native_neighborhoods(source,options()).search.result.termination==Termination::Unsupported); + source=m.snapshot();source.variables[0].upper=inf; + assert(solve_native_neighborhoods(source,options()).search.result.termination!=Termination::Infeasible); + Model moved=std::move(m);assert(solve_native_neighborhoods(m,options()).search.result.termination==Termination::InvalidModel); + o=options();o.search.solve.guarantee=Guarantee::Certified; + assert(solve_native_neighborhoods(moved,o).search.result.termination==Termination::Unsupported); + o=options();o.search.solve.backend=Backend::Highs; + assert(solve_native_neighborhoods(moved,o).search.result.termination==Termination::Unsupported); +} +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS +void faults() { + auto m=outside(true);auto source=m.snapshot();auto o=options();o.search.order=NativeSearchOrder::DepthFirst; + std::vector events; + hook=[&](const char* event,std::size_t,int,int,std::vector*) {events.emplace_back(event);}; + auto full=run(source,o);hook={};assert(full.neighborhood.accepted_improvements==1); + bool outside_parent=false,publication=false;int parent_x=-1; + hook=[&](const char* event,std::size_t slot,int lower,int,std::vector* values) { + if(std::string(event)=="neighborhood_parent_variable" && slot==0) parent_x=lower; + if(std::string(event)=="before_neighborhood_validation") outside_parent=parent_x==1 && (*values)[0]==0; + if(std::string(event)=="after_neighborhood_publication") publication=true; + }; + run(source,o);hook={};assert(outside_parent && publication); + // Every actual hook position is a cancellation boundary. Counts need not + // represent executed propagation; the independent full optimum checks proof. + for(std::size_t stop=0;stop();std::size_t count=0; + hook=[&](const char*,std::size_t,int,int,std::vector*) {if(count++==stop)a.search.solve.cancellation->cancel();}; + auto r=run(source,a);hook={};assert(r.search.result.termination==Termination::Cancelled); + } + for(const std::string event:{"neighborhood_root_alloc","neighborhood_constructed","neighborhood_choice", + "neighborhood_child_clone","before_neighborhood_validation","after_neighborhood_release", + "before_neighborhood_publication","after_neighborhood_publication"}) { + bool fired=false; + hook=[&](const char* at,std::size_t,int,int,std::vector*) {if(!fired && event==at){fired=true;throw std::bad_alloc();}}; + auto r=run(source,o);hook={};assert(fired && r.search.result.termination==Termination::MemoryLimit); + if(event=="after_neighborhood_publication") assert(r.neighborhood.accepted_improvements==1); + if(event=="before_neighborhood_publication") assert(!r.neighborhood.accepted_improvements); + } + {bool fired=false;hook=[&](const char* event,std::size_t,int,int,std::vector* values) { + if(!fired && std::string(event)=="before_neighborhood_validation") {fired=true;(*values)[0]=1-1e-12;} + };auto r=run(source,o);hook={};assert(fired && r.search.result.termination==Termination::BackendError && !r.neighborhood.accepted_improvements);} + for(const std::string event:{"neighborhood_construction","before_neighborhood_status","after_neighborhood_validation", + "after_neighborhood_release","before_neighborhood_publication"}) { + auto a=o;a.neighborhood.time_limit_seconds=0.02;bool fired=false; + hook=[&](const char* at,std::size_t,int,int,std::vector*) { + if(!fired && event==at){fired=true;std::this_thread::sleep_for(std::chrono::milliseconds(30));} + }; + auto r=run(source,a);hook={};assert(fired && r.neighborhood.completion==NativeNeighborhoodCompletion::LocalTimeLimit && !r.neighborhood.accepted_improvements); + assert(r.search.result.termination==Termination::Optimal); + } + for(const std::string event:{"before_neighborhood_publication","after_neighborhood_publication"}) { + auto a=o;a.search.solve.time_limit_seconds=0.02;bool fired=false; + hook=[&](const char* at,std::size_t,int,int,std::vector*) { + if(!fired && event==at){fired=true;std::this_thread::sleep_for(std::chrono::milliseconds(30));} + }; + auto r=run(source,a);hook={};assert(fired && r.search.result.termination==Termination::TimeLimit); + assert(r.neighborhood.accepted_improvements==(event=="after_neighborhood_publication"?1U:0U)); + assert(r.neighborhood.elapsed_seconds>=0.03); + } + // Radius zero fixes just Binary slots. Its first local status fixes the + // improving general integer through the strict objective cutoff. + {Model z;auto x=z.add_binary(),y=z.add_binary(),a=z.add_integer(0,1);z.maximize({{a,1}}); + auto p=options();p.search.solve.primal_start={{x,0},{y,0},{a,0}};p.neighborhood.radius=0;p.neighborhood.max_status_calls=1; + auto r=run(z.snapshot(),p);assert(r.neighborhood.status_attempts==1 && r.neighborhood.accepted_improvements==1);} +} +#endif +} // namespace +namespace Gecode { namespace Optimize { +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS +void native_neighborhood_test_event(const char* event,std::size_t slot,int lower,int upper,std::vector* values) { + if(hook) hook(event,slot,lower,upper,values); +} +#endif +}} +int main() { + if(!native_capabilities().available) { + Model m;m.add_binary();auto r=solve_native_neighborhoods(m,options()); + assert(r.search.result.termination==Termination::Unsupported && r.neighborhood.requested); + std::cout<<"Native neighborhoods disabled-backend contract passed\n";return 0; + } + models();limits_and_skips();bad_inputs(); +#ifdef GECODE_NATIVE_NEIGHBORHOOD_TEST_HOOKS + faults(); +#endif + const auto model=outside().snapshot(); + auto a=std::async(std::launch::async,[&]{return solve_native_neighborhoods(model,options());}); + auto b=std::async(std::launch::async,[&]{return solve_native_neighborhoods(model,options());}); + verify(model,options(),a.get());verify(model,options(),b.get()); + std::cout<<"Native neighborhoods passed "< +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); + +// Independent finite-product oracle: no Optimize solve/compiler/validator is +// used to decide feasibility, objective values or the proof status below. +SolveResult oracle(const ModelSnapshot& model) { + SolveResult result; + result.model_id=model.model_id; result.revision=model.revision; + result.guarantee=Guarantee::Exact; result.backend="Gecode native test oracle"; + result.message="Independent finite product exhausted"; + std::vector point(model.variables.size(),std::numeric_limits::quiet_NaN()); + const auto visit=[&](const auto& self,std::size_t slot)->void { + if (slot(variable.lower); value<=variable.upper; ++value) { + point[slot]=value; self(self,slot+1); + } + return; + } + for (const auto& row:model.rows) if (row.active) { + std::int64_t sum=0; + for (const auto& term:row.terms) + sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + if (sumrow.upper) return; + } + auto value=static_cast(model.objective.offset); + for (const auto& term:model.objective.terms) + value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + if (!result.objective || (model.objective.sense==ObjectiveSense::Minimize ? value<*result.objective : value>*result.objective)) { + result.objective=static_cast(value); result.values=point; + } + }; + visit(visit,0); + if (result.objective) { + for (const auto& variable:model.variables) result.active_variables.push_back(variable.active); + result.solution_validated=true; result.termination=Termination::Optimal; + result.best_bound=result.objective; result.update_gaps(model.objective.sense); + } else result.termination=Termination::Infeasible; + return result; +} + +Model reduced_fixture(bool maximum=false) { + Model model; + const auto dead=model.add_integer(-1,1); model.remove(dead); + const auto fixed=model.add_integer(2,2), x=model.add_integer(-2,2); + model.add_row({{fixed,3},{x,-2}},4,8); + model.add_row({{x,1}},-2,2); // A redundant original row. + model.set_objective({{fixed,-3},{x,2}},maximum?ObjectiveSense::Maximize:ObjectiveSense::Minimize,11); + return model; +} + +void fixed_offsets_and_bounds() { + for (bool maximum:{false,true}) for (auto guarantee:{Guarantee::Exact,Guarantee::Numerical}) { + const auto model=reduced_fixture(maximum); const auto source=model.snapshot(); + const auto expected=oracle(source); + for (bool interrupted:{false,true}) { + SolveOptions options; options.backend=Backend::Native; options.guarantee=guarantee; + options.node_limit=2; + SolveBudget budget(options); std::size_t calls=0; + auto answer=Detail::native_presolve(source,options,budget, + [&](const ModelSnapshot& reduced,const SolveOptions& exact,SolveBudget& shared) { + ++calls; assert(&shared==&budget && exact.guarantee==Guarantee::Exact); + assert(reduced.model_id!=source.model_id && reduced.variables.size()guarantee==guarantee); + assert(answer->model_id==source.model_id && answer->revision==source.revision); + assert(answer->has_solution() && answer->objective==expected.objective); + assert(answer->values.size()==source.variables.size()); + assert(!answer->active_variables[0] && std::isnan(answer->values[0])); + assert(answer->values[1]==2 && answer->values[2]==(maximum?1:-1)); + assert(!answer->start_submitted && budget.nodes()==2); + assert(answer->termination==(interrupted?Termination::NodeLimit:Termination::Optimal)); + assert(answer->best_bound==*expected.objective+(interrupted?(maximum?3:-3):0)); + assert(answer->absolute_gap==(interrupted?3:0)); + } + if (native_capabilities().available) { + SolveOptions options; options.backend=Backend::Native; options.guarantee=guarantee; + const auto actual=solve_native_auto(source,options); + assert(actual.termination==Termination::Optimal && actual.objective==expected.objective); + assert(actual.model_id==source.model_id && actual.revision==source.revision); + assert(actual.guarantee==guarantee && actual.has_solution() && actual.best_bound==actual.objective); + } + } +} + +void infeasibility_and_fixpoint() { + SolveOptions options; options.backend=Backend::Native; + for (bool interval:{false,true}) { + Model model; const auto fixed=model.add_integer(2,2); + const auto x=model.add_binary(),y=model.add_binary(),z=model.add_binary(); + if (interval) model.add_row({{x,1}},2,inf); + else model.add_row({{x,2},{y,2},{z,2}},3,3); + model.minimize({{fixed,3},{x,-2}},-11); + const auto source=model.snapshot(); assert(!oracle(source).has_solution()); + SolveBudget budget(options); std::size_t calls=0; + const auto result=Detail::native_presolve(source,options,budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { ++calls; return oracle(reduced); }); + assert(result && result->termination==Termination::Infeasible && !result->has_solution()); + assert(!result->best_bound && !result->objective && result->model_id==source.model_id); + assert(calls==(interval?0U:1U)); + } + Model unchanged; const auto x=unchanged.add_binary(),y=unchanged.add_binary(); + unchanged.add_row({{x,1},{y,1}},1,inf); + SolveBudget budget(options); bool called=false; + const auto result=Detail::native_presolve(unchanged.snapshot(),options,budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { called=true; return oracle(reduced); }); + assert(!result && !called); // A presolve fixpoint is not a solved optimization. +} + +void incomplete_artifact() { + Model model; std::vector x; + for (int i=0;i<8;++i) x.push_back(model.add_binary()); + for (int i=7;i>0;--i) model.add_row({{x[i],1},{x[i-1],-1}},0,0); + model.add_row({{x[0],1}},1,1); model.minimize({{x.back(),-7}},13); + SolveOptions options; SolveBudget budget(options); + const auto result=Detail::native_presolve(model.snapshot(),options,budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { return oracle(reduced); }); + assert(result && result->termination==Termination::Optimal && result->objective==6); + assert(result->message.find("partial reduction")!=std::string::npos); + for (double value:result->values) assert(value==1); +} + +void starts_and_stops() { + const auto model=reduced_fixture(); const auto source=model.snapshot(); + SolveOptions options; options.primal_start={{source.variables[1].variable,2},{source.variables[2].variable,-1}}; + SolveBudget start_budget(options); bool called=false; + const auto skipped=Detail::native_presolve(source,options,start_budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { called=true; return oracle(reduced); }); + assert(!skipped && !called); + options={}; options.time_limit_seconds=0; SolveBudget zero_budget(options); + auto stopped=Detail::native_presolve(source,options,zero_budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { called=true; return oracle(reduced); }); + assert(stopped && stopped->termination==Termination::TimeLimit && !called && !stopped->has_solution()); + options={}; options.cancellation=std::make_shared(); SolveBudget cancelled(options); + stopped=Detail::native_presolve(source,options,cancelled, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget& shared) { + called=true; auto solved=oracle(reduced); shared.cancellation()->cancel(); return solved; + }); + assert(called && stopped && stopped->termination==Termination::Cancelled); + assert(!stopped->has_solution() && !stopped->best_bound && !stopped->objective); + assert(stopped->model_id==source.model_id && stopped->revision==source.revision); + options={}; SolveBudget foreign_budget(options); + const auto foreign=Detail::native_presolve(source,options,foreign_budget, + [&](const ModelSnapshot& reduced,const SolveOptions&,SolveBudget&) { + auto solved=oracle(reduced); ++solved.revision; return solved; + }); + assert(foreign && foreign->termination==Termination::BackendError && !foreign->has_solution()); +} +} + +int main() { + fixed_offsets_and_bounds(); infeasibility_and_fixpoint(); incomplete_artifact(); starts_and_stops(); + std::cout<<"Exact native presolve composition: offsets, proof transfer, partial reductions, starts and stops pass\n"; +} diff --git a/test/optimize/native_race.cpp b/test/optimize/native_race.cpp new file mode 100644 index 0000000000..0955224b13 --- /dev/null +++ b/test/optimize/native_race.cpp @@ -0,0 +1,90 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +const double inf=std::numeric_limits::infinity(); +Model fixture(bool maximize,int seed) { + Model m;std::vector x;std::vector cost; + for(int i=0;i<12;++i){x.push_back(m.add_binary());cost.push_back({x.back(),double((i*7+seed)%17+1)});} + for(int j=0;j<5;++j){std::vector terms; + for(int i=0;i<12;++i)terms.push_back({x[i],double((i*13+j*7+seed)%11+1)}); + m.add_row(terms,20,42+j); + } + if(maximize)m.maximize(cost,-7);else m.minimize(cost,11); + return m; +} +double oracle(const ModelSnapshot& m) { + const bool minimize=m.objective.sense==ObjectiveSense::Minimize; + double best=minimize?inf:-inf; + for(unsigned mask=0;mask<(1U<>t.variable.id)&1U); + valid=valid && a>=row.lower && a<=row.upper;} + if(!valid)continue; + double value=m.objective.offset;for(auto t:m.objective.terms)value+=t.coefficient*((mask>>t.variable.id)&1U); + best=minimize?std::min(best,value):std::max(best,value); + } + return best; +} +void check(const ModelSnapshot& m,const SolveResult& r,double expected) { + assert(r.model_id==m.model_id && r.revision==m.revision); + if(r.has_solution()) { + double value=m.objective.offset; + for(auto t:m.objective.terms)value+=t.coefficient*r.values[t.variable.id]; + assert(r.objective==value); + for(double x:r.values)assert(x==0 || x==1); + for(const auto& row:m.rows){double a=0;for(auto t:row.terms)a+=t.coefficient*r.values[t.variable.id]; + assert(a>=row.lower && a<=row.upper);} + } + if(r.best_bound)assert(m.objective.sense==ObjectiveSense::Minimize ? *r.best_bound<=expected:*r.best_bound>=expected); + if(r.termination==Termination::Optimal)assert(r.has_solution() && r.objective==expected && r.best_bound==expected); +} +} +int main(){ + NativeRaceOptions o;o.solve.backend=Backend::Native;o.solve.guarantee=Guarantee::Exact; + o.solve.relative_gap=o.solve.absolute_gap=0;o.solve.time_limit_seconds=5; + o.exploration_seconds=1;o.probe_node_limit=1; + if(!native_capabilities().available){auto m=fixture(false,0); + assert(solve_native_race(m,o).termination==Termination::Unsupported);return 0;} + bool saw_two=false; + for(bool maximize:{false,true})for(int seed=0;seed<4;++seed){ + auto m=fixture(maximize,seed);auto s=m.snapshot();auto optimum=oracle(s); + auto result=solve_native_race(m,o);check(s,result,optimum); + if(result.termination!=Termination::Optimal)std::cerr<();stopped.solve.cancellation->cancel(); + assert(solve_native_race(s,stopped).termination==Termination::Cancelled); + } + assert(saw_two); + auto m=fixture(false,0);auto invalid=o;invalid.exploration_seconds=-1; + assert(solve_native_race(m,invalid).termination==Termination::InvalidModel); + invalid=o;invalid.probe_node_limit=0; + assert(solve_native_race(m,invalid).termination==Termination::InvalidModel); + auto s=m.snapshot();s.rows[0].terms[0].variable.id+=100; + assert(solve_native_race(s,o).termination==Termination::InvalidModel); + auto saved=std::move(m);assert(solve_native_race(m,o).termination==Termination::InvalidModel); + Model impossible;auto x=impossible.add_binary();impossible.add_row({{x,2}},1,1); + assert(solve_native_race(impossible,o).termination==Termination::Infeasible); + std::cout<<"Native sequential race: exhaustive min/max optima, shared nodes, starts and interruption passed\n"; +} diff --git a/test/optimize/native_search.cpp b/test/optimize/native_search.cpp new file mode 100644 index 0000000000..6458409e81 --- /dev/null +++ b/test/optimize/native_search.cpp @@ -0,0 +1,465 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::uint64_t runs=0; + +// Independent finite product oracle: no native compiler, propagator or common +// validator is used to compute feasible points or objective bounds. +bool feasible(const ModelSnapshot& model,const std::vector& point) { + const auto row=[&](const std::vector& terms,double lower,double upper) { + std::int64_t sum=0; + for(const auto& term:terms) sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return sum>=lower && sum<=upper; + }; + for(const auto& variable:model.variables) if(variable.active) { + const auto value=point.at(variable.variable.id); + if(value!=std::trunc(value) || !std::isfinite(value)) return false; + if(!(variable.type==VariableType::SemiInteger && value==0) && (valuevariable.upper)) return false; + } + for(const auto& original:model.rows) + if(original.active && !original.indicator_origin && !row(original.terms,original.lower,original.upper)) return false; + for(const auto& indicator:model.indicators) if(indicator.active) { + const bool enabled=point[indicator.activator.id]==(indicator.active_value?1:0); + if(enabled && !row(indicator.terms,indicator.lower,indicator.upper)) return false; + if(indicator.inactive_gate && point[indicator.inactive_gate->id]!=(enabled?0:1)) return false; + } + for(const auto& global:model.globals) if(global.active) { + const bool valid=std::visit([&](const auto& data) { + using T=std::decay_t; + const auto value=[&](Variable v) {return static_cast(point[v.id]);}; + if constexpr(std::is_same_v) { + std::set seen; + for(auto v:data.variables) if(!seen.insert(value(v)).second) return false; + return true; + } else if constexpr(std::is_same_v) { + const auto index=value(data.index)-data.index_base; + return index>=0 && static_cast(index)) { + std::vector tuple;for(auto v:data.variables) tuple.push_back(value(v)); + return std::find(data.tuples.begin(),data.tuples.end(),tuple)!=data.tuples.end(); + } else if constexpr(std::is_same_v) { + std::set starts; + for(std::size_t i=0;idata.capacity) return false; + } + return true; + } else if constexpr(std::is_same_v) { + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=std::find_if(data.transitions.begin(),data.transitions.end(),[&](const RegularTransition& t){return t.from==state&&t.symbol==value(variable);}); + if(edge==data.transitions.end())return false; + state=edge->to; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + if(data.successors.empty()) return false; + std::set seen;std::int64_t next=0; + for(std::size_t i=0;i(next)>=data.successors.size() || !seen.insert(next).second) return false; + next=value(data.successors[next])-data.index_base; + } + return next==0; + } + },global.payload); + if(!valid) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model,const std::vector& point) { + auto value=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms) value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return value; +} +std::optional oracle(const ModelSnapshot& model) { + std::vector point(model.variables.size());std::optional best; + const auto visit=[&](const auto& self,std::size_t slot)->void { + if(slot==model.variables.size()) { + if(!feasible(model,point)) return; + const auto value=objective(model,point); + if(!best || (model.objective.sense==ObjectiveSense::Minimize ? value<*best:value>*best)) best=value; + return; + } + const auto& variable=model.variables[slot]; + if(!variable.active) {self(self,slot+1);return;} + if(variable.type==VariableType::SemiInteger) {point[slot]=0;self(self,slot+1);} + for(int value=static_cast(variable.lower);value<=variable.upper;++value) {point[slot]=value;self(self,slot+1);} + }; + visit(visit,0);return best; +} +void evidence(const ModelSnapshot& source,const NativeSearchOptions& options,const NativeSearchResult& solved) { + ++runs;const auto expected=oracle(source);const auto& result=solved.result; + const bool minimize=source.objective.sense==ObjectiveSense::Minimize; + assert(result.model_id==source.model_id && result.revision==source.revision); + assert(result.guarantee==options.solve.guarantee && result.elapsed_seconds>=0); + assert(solved.frontier.peak_open_nodes<=options.max_open_nodes); + const auto& root=solved.relaxation.root_cover; + assert(root.requested==bool(options.relaxation && options.relaxation->root_cover_cuts)); + assert(solved.relaxation.lp_calls>=root.lp_calls && solved.relaxation.valid_bounds>=root.valid_bounds); + assert(solved.relaxation.rejected_bounds>=root.rejected_bounds && solved.relaxation.lp_seconds>=root.lp_seconds); + if(options.solve.node_limit) assert(solved.frontier.admitted_nodes<=*options.solve.node_limit); + if(result.has_solution()) { + assert(expected && feasible(source,result.values)); + assert(result.objective==static_cast(objective(source,result.values))); + assert(minimize ? *result.objective>=*expected:*result.objective<=*expected); + for(const auto& variable:source.variables) { + assert(result.active_variables[variable.variable.id]==variable.active); + if(!variable.active) assert(std::isnan(result.values[variable.variable.id])); + } + } + if(result.best_bound) { + assert(std::isfinite(*result.best_bound)); + if(expected) assert(minimize ? *result.best_bound<=*expected:*result.best_bound>=*expected); + if(result.has_solution()) { + assert(minimize ? *result.best_bound<=*result.objective:*result.best_bound>=*result.objective); + assert(result.absolute_gap==std::fabs(*result.objective-*result.best_bound)); + } + } + if(result.termination==Termination::Optimal) { + assert(expected && result.has_solution() && result.objective==static_cast(*expected)); + assert(result.best_bound==result.objective && result.absolute_gap==0 && solved.frontier.unresolved_regions==0); + } else if(result.termination==Termination::Infeasible) { + assert(!expected && !result.has_solution() && !result.best_bound && solved.frontier.unresolved_regions==0); + } else { + assert(result.termination==Termination::NodeLimit || result.termination==Termination::MemoryLimit || + result.termination==Termination::Cancelled || result.termination==Termination::TimeLimit); + } +} +void all_limits(const Model& model) { + const auto source=model.snapshot(); + for(auto order:{NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound}) { + NativeSearchOptions options;options.order=order;options.solve.guarantee=Guarantee::Exact; + const auto full=solve_native_search(source,options);evidence(source,options,full); + assert(full.result.termination==Termination::Optimal || full.result.termination==Termination::Infeasible); + assert(full.relaxation.lp_calls==0); + for(std::uint64_t nodes=0;nodes<=full.frontier.admitted_nodes+1;++nodes) { + options.solve.node_limit=nodes; + const auto limited=solve_native_search(source,options);evidence(source,options,limited); + if(nodes(5,full.frontier.peak_open_nodes+1);++cap) { + options.max_open_nodes=cap;evidence(source,options,solve_native_search(source,options)); + } + } + assert(model.revision()==source.revision); +} +void ordinary_and_globals() { + for(int i=0;i<48;++i) { + Model model;const auto gone=model.add_binary();model.remove(gone); + const auto x=model.add_integer(-2,2),y=model.add_integer(-1,2),b=model.add_binary(); + model.add_row({{x,double(i%5-2)},{y,double(i%3-1)},{b,2}},-2,3); + model.add_row({{x,1},{y,-1}},-inf,double(i%4-2)); + model.set_objective({{x,double(i%7-3)},{y,2},{b,-3}},i%2?ObjectiveSense::Minimize:ObjectiveSense::Maximize,i-21); + all_limits(model); + } + Model empty;empty.minimize({},-9);all_limits(empty);empty.add_row({},1,inf);all_limits(empty); + Model ties;ties.add_integer(-2,2);ties.add_binary();all_limits(ties); + Model fixed;const auto f=fixed.add_integer(-2,-2);fixed.maximize({{f,-3}},9007199254740900.0);all_limits(fixed); + for(bool activation:{false,true}) { + Model model;const auto b=model.add_binary(),x=model.add_integer(-1,2),s=model.add_variable(VariableType::SemiInteger,2,3); + const auto indicator=add_indicator(model,b,activation,{{x,1},{s,1}},-inf,2); + add_all_different(model,{x,s});model.minimize({{x,2},{s,-1},{*indicator.inactive_gate,1}},-8);all_limits(model); + } + Model element;auto i=element.add_integer(3,4),x=element.add_integer(-1,1),y=element.add_integer(0,2),r=element.add_integer(-1,2); + add_element(element,i,{x,y},r,3);element.maximize({{r,2},{x,-1}},-2);all_limits(element); + Model table;x=table.add_integer(-1,1);y=table.add_integer(0,2); + add_table(table,{x,y},{{-1,2},{0,0},{1,1}});table.minimize({{x,2},{y,1}},5);all_limits(table); + Model cumulative;x=cumulative.add_integer(-1,1);y=cumulative.add_integer(0,2); + add_cumulative(cumulative,{x,y},{2,1},{1,1},1);cumulative.minimize({{x,1},{y,1}},-1);all_limits(cumulative); + Model circuit;std::vector successors; + for(int j=0;j<3;++j) successors.push_back(circuit.add_integer(2,4)); + add_circuit(circuit,successors,2);circuit.minimize({{successors[0],1},{successors[1],-1}});all_limits(circuit); +} +void sibling_bound() { + for(bool maximum:{false,true}) { + Model model;const auto x=model.add_binary(),y=model.add_binary(); + model.set_objective({{x,maximum?-2.0:2.0},{y,maximum?-1.0:1.0}}, + maximum?ObjectiveSense::Maximize:ObjectiveSense::Minimize,maximum?17:-17); + NativeSearchOptions options;options.order=NativeSearchOrder::DepthFirst;options.solve.node_limit=4; + options.solve.guarantee=Guarantee::Exact; + const auto solved=solve_native_search(model,options);evidence(model.snapshot(),options,solved); + assert(solved.result.termination==Termination::NodeLimit && solved.result.has_solution()); + assert(solved.result.objective==(maximum?15:-15)); + assert(solved.result.best_bound==(maximum?17:-17)); + assert(solved.frontier.unresolved_regions>=2); + auto historical=solved.result;model.set_bounds(x,1,1); + assert(historical.revision!=model.revision() && historical.value(x)==1); + } +} +void options_and_boundaries() { + Model model;const auto x=model.add_binary(),y=model.add_binary();model.minimize({{x,2},{y,1}}); + NativeSearchOptions options;options.order=static_cast(-1); + assert(solve_native_search(model,options).result.termination==Termination::InvalidModel); + options={};options.relaxation=NativeLpSettings{};options.relaxation->bound_change_interval=0; + assert(solve_native_search(model,options).result.termination==Termination::InvalidModel); + options={};options.relaxation=NativeLpSettings{};options.relaxation->root_cover_cuts=NativeRootCoverSettings{}; + options.relaxation->root_cover_cuts->denominator=3; + assert(solve_native_search(model,options).result.termination==Termination::InvalidModel); + options={};options.solve.time_limit_seconds=-1; + assert(solve_native_search(model,options).result.termination==Termination::InvalidModel); + auto bad=model.snapshot();bad.variables[0].variable.model_id++; + assert(solve_native_search(bad).result.termination==Termination::InvalidModel); + if(!native_capabilities().available) { + options={};options.solve.guarantee=Guarantee::Exact; + const auto missing=solve_native_search(model,options); + assert(missing.result.termination==Termination::Unsupported && !missing.result.has_solution() && !missing.result.best_bound); + assert(missing.result.guarantee==Guarantee::Exact && missing.frontier.admitted_nodes==0); + assert(solve_native_search(model.snapshot(),options).result.termination==Termination::Unsupported);return; + } + options={};options.solve.time_limit_seconds=0; + auto solved=solve_native_search(model,options);evidence(model.snapshot(),options,solved); + assert(solved.result.termination==Termination::TimeLimit && !solved.result.has_solution()); + options={};options.solve.cancellation=std::make_shared();options.solve.cancellation->cancel(); + solved=solve_native_search(model,options);evidence(model.snapshot(),options,solved); + assert(solved.result.termination==Termination::Cancelled && !solved.result.has_solution()); + options={};options.solve.guarantee=Guarantee::Certified; + assert(solve_native_search(model,options).result.termination==Termination::Unsupported); + options={};options.solve.backend=Backend::Highs; + assert(solve_native_search(model,options).result.termination==Termination::Unsupported); + options={};options.solve.threads=2; + assert(solve_native_search(model,options).result.termination==Termination::Unsupported); + options={};options.solve.primal_start={{x,1}}; + assert(solve_native_search(model,options).result.termination==Termination::Unsupported); + Model continuous;continuous.add_continuous(0,1); + assert(solve_native_search(continuous).result.termination==Termination::Unsupported); + Model fractional;const auto z=fractional.add_integer(0,1);fractional.minimize({{z,.5}}); + assert(solve_native_search(fractional).result.termination==Termination::Unsupported); + options={};options.relaxation=NativeLpSettings{}; + if(!native_lp_capabilities().available) + assert(solve_native_search(model,options).result.termination==Termination::Unsupported); + // Existing explicit solver behavior and native BAB limit contract are unchanged. + assert(solve_native(model).backend=="Gecode native"); + SolveOptions old;old.node_limit=1; + assert(!solve_native(model,old).best_bound); + NativeLpOptions old_lp;old_lp.frequency=NativeLpFrequency::AfterBoundChanges; + old_lp.bound_change_interval=3;old_lp.bound_tightening=false;old_lp.validate(); +} +void with_lp() { + if(!native_lp_capabilities().available) return; + Model model;const auto x=model.add_integer(0,5),y=model.add_integer(-1,5); + model.add_row({{x,2},{y,3}},7,inf);model.minimize({{x,1},{y,1}},-6); + std::uint64_t calls=0; + for(auto frequency:{NativeLpFrequency::Root,NativeLpFrequency::AfterBoundChanges}) + for(auto order:{NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound}) for(bool covers:{false,true}) { + NativeSearchOptions options;options.solve.guarantee=Guarantee::Exact;options.order=order; + options.relaxation=NativeLpSettings{};options.relaxation->frequency=frequency; + if(covers)options.relaxation->root_cover_cuts=NativeRootCoverSettings{}; + auto result=solve_native_search(model,options);evidence(model.snapshot(),options,result); + calls+=result.relaxation.lp_calls; + for(std::uint64_t limit=0;limit<=result.frontier.admitted_nodes+1;++limit) { + options.solve.node_limit=limit;evidence(model.snapshot(),options,solve_native_search(model,options)); + } + } + assert(calls>0); +} + +void root_covers() { + if(!native_lp_capabilities().available)return; + for(bool maximum:{false,true})for(bool activation:{false,true}) { + Model model;const auto gone=model.add_binary();model.remove(gone); + const auto x=model.add_binary(),y=model.add_binary(),b=model.add_binary(); + const auto s=model.add_variable(VariableType::SemiInteger,2,3); + model.add_row({{x,3},{y,3}},-inf,5);add_all_different(model,{x,y}); + add_indicator(model,b,activation,{{s,1},{x,1}},2,inf); + model.set_objective({{x,maximum?2.0:-2.0},{y,maximum?2.0:-2.0},{s,maximum?-1.0:1.0}}, + maximum?ObjectiveSense::Maximize:ObjectiveSense::Minimize,maximum?-17:17); + const auto source=model.snapshot(); + for(auto order:{NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound})for(unsigned rounds:{0U,1U,4U}) { + NativeSearchOptions options;options.solve.guarantee=Guarantee::Exact;options.order=order; + options.relaxation=NativeLpSettings{};options.relaxation->root_cover_cuts=NativeRootCoverSettings{}; + options.relaxation->root_cover_cuts->max_rounds=rounds; + const auto full=solve_native_search(model,options);evidence(source,options,full); + assert(full.result.termination==Termination::Optimal); + assert(full.relaxation.root_cover.cuts==(rounds?1U:0U)); + for(std::uint64_t nodes=0;nodes<=full.frontier.admitted_nodes+1;++nodes) { + options.solve.node_limit=nodes;const auto limited=solve_native_search(model,options);evidence(source,options,limited); + if(!nodes)assert(!limited.relaxation.root_cover.lp_calls); + } + options.solve.node_limit.reset(); + for(std::size_t cap=0;cap<=2;++cap) { + options.max_open_nodes=cap;evidence(source,options,solve_native_search(model,options)); + } + } + } + Model simple;auto x=simple.add_binary(),y=simple.add_binary(); + simple.add_row({{x,3},{y,3}},-inf,5);simple.minimize({{x,-2},{y,-2}},17); + for(unsigned kind=0;kind<6;++kind) { + NativeSearchOptions options;options.solve.guarantee=Guarantee::Exact; + options.relaxation=NativeLpSettings{};options.relaxation->root_cover_cuts=NativeRootCoverSettings{}; + auto& limits=*options.relaxation->root_cover_cuts; + if(kind==0)limits.max_work=0; + if(kind==1)limits.max_cuts=0; + if(kind==2)limits.max_cut_nonzeros=1; + if(kind==3)limits.max_model_rows=1; + if(kind==4)limits.max_separation_rows=0; + if(kind==5)limits.max_terms_per_row=1; + const auto solved=solve_native_search(simple,options);evidence(simple.snapshot(),options,solved); + assert(solved.result.termination==Termination::Optimal && solved.result.objective==15); + assert(!solved.relaxation.root_cover.cuts); + } +} + +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +std::string cut_event; +std::optional cut_completion; +std::shared_ptr cut_cancellation; +int cut_exception=0; +void root_cut_failures() { + if(!native_lp_capabilities().available)return; + Model model;const auto x=model.add_binary(),y=model.add_binary(); + model.add_row({{x,3},{y,3}},-inf,5);model.minimize({{x,-2},{y,-2}},17); + NativeSearchOptions options;options.solve.guarantee=Guarantee::Exact; + options.relaxation=NativeLpSettings{};options.relaxation->root_cover_cuts=NativeRootCoverSettings{}; + for(auto completion:{NativeRootCoverCompletion::NoPrimalSuggestion,NativeRootCoverCompletion::InvalidSuggestion, + NativeRootCoverCompletion::CallbackError,NativeRootCoverCompletion::BackendError,NativeRootCoverCompletion::AllocationFailure}) { + cut_event="after_loop";cut_completion=completion; + const auto solved=solve_native_search(model,options);++runs; + const bool hint=completion==NativeRootCoverCompletion::NoPrimalSuggestion || completion==NativeRootCoverCompletion::InvalidSuggestion; + assert(solved.result.termination==(hint?Termination::Optimal: + completion==NativeRootCoverCompletion::AllocationFailure?Termination::MemoryLimit:Termination::BackendError)); + assert(solved.result.guarantee==Guarantee::Exact && solved.result.has_solution()==hint); + assert(solved.result.best_bound && *solved.result.best_bound<=15); + if(hint)assert(solved.result.objective==15 && feasible(model.snapshot(),solved.result.values)); + else assert(!solved.result.objective && solved.frontier.admitted_nodes==0 && solved.result.best_bound==13); + assert(solved.relaxation.root_cover.completion==completion); + assert(solved.relaxation.lp_calls>=solved.relaxation.root_cover.lp_calls); + } + cut_completion.reset(); + for(const auto* event:{"before_loop","after_loop","prepared"})for(int mode=0;mode<3;++mode) { + cut_event=event;cut_exception=mode;cut_cancellation=std::make_shared(); + options.solve.cancellation=cut_cancellation; + const auto solved=solve_native_search(model,options);++runs; + assert(solved.result.termination==(mode==0?Termination::Cancelled:mode==1?Termination::MemoryLimit:Termination::BackendError)); + assert(!solved.result.has_solution() && solved.result.best_bound==13); + assert(solved.frontier.admitted_nodes==0 && solved.result.guarantee==Guarantee::Exact); + assert(solved.relaxation.root_cover.requested); + } + cut_event.clear();cut_cancellation.reset();cut_exception=0; +} +#endif +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS +std::string selected_event; +unsigned selected_occurrence=0,event_occurrences=0; +bool allocation_failure=false; +std::shared_ptr cancellation; +std::map event_counts; +void knapsack_interruptions() { + Model model; + const auto x = model.add_binary(), y = model.add_binary(); + model.add_row({{x,2},{y,2}},-inf,3); + model.minimize({{x,-3},{y,-2}},11); + NativeSearchOptions options; + options.solve.guarantee = Guarantee::Exact; + assert(oracle(model.snapshot()) == 8); + for (bool fail : {false,true}) { + selected_event = "knapsack_row_completed"; + selected_occurrence = 1; + event_occurrences = 0; + allocation_failure = fail; + cancellation = std::make_shared(); + options.solve.cancellation = cancellation; + const auto solved = solve_native_search(model,options); + assert(event_occurrences == 1); + assert(solved.result.termination == + (fail ? Termination::MemoryLimit : Termination::Cancelled)); + assert(!solved.result.has_solution()); + // The first table row cannot publish a partial DP bound. The original + // objective box still represents the whole unconstructed root region. + assert(solved.result.best_bound == 6); + assert(solved.frontier.admitted_nodes == 0); + assert(solved.frontier.unresolved_regions == 1); + evidence(model.snapshot(),options,solved); + } + selected_event.clear(); + cancellation.reset(); +} +void fault_injections() { + Model model;const auto x=model.add_binary(),y=model.add_binary();model.minimize({{x,2},{y,1}},-17); + NativeSearchOptions options;options.order=NativeSearchOrder::DepthFirst;options.solve.guarantee=Guarantee::Exact; + event_counts.clear(); + solve_native_search(model,options); + const auto counts=event_counts; + for(const auto& event:counts) for(unsigned occurrence=1;occurrence<=std::min(2U,event.second);++occurrence) + for(bool fail:{false,true}) { + selected_event=event.first;selected_occurrence=occurrence;event_occurrences=0;allocation_failure=fail; + cancellation=std::make_shared();options.solve.cancellation=cancellation; + const auto result=solve_native_search(model,options); + assert(event_occurrences==occurrence); + assert(result.result.termination==(fail?Termination::MemoryLimit:Termination::Cancelled)); + evidence(model.snapshot(),options,result); + if(event.first=="after_validation" && occurrence==1) assert(!result.result.has_solution()); + if(event.first=="after_validation" && occurrence==2) assert(result.result.objective==-15); + } + selected_event.clear();cancellation.reset(); +} +#endif +} +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +namespace Gecode { namespace Optimize { +void native_root_cut_test_event(const char* event,NativeRootCoverCompletion& completion) { + if(cut_event!=event)return; + if(cut_completion){completion=*cut_completion;return;} + if(cut_exception==1)throw std::bad_alloc(); + if(cut_exception==2)throw std::runtime_error("injected frontier root preparation failure"); + cut_cancellation->cancel(); +} +}} +#endif +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS +namespace Gecode { namespace Optimize { +void native_search_test_event(const char* event) { + ++event_counts[event]; + if(selected_event!=event || ++event_occurrences!=selected_occurrence) return; + if(allocation_failure) throw std::bad_alloc(); + cancellation->cancel(); +} +}} +#endif +int main() { + options_and_boundaries(); + if(!native_capabilities().available) {std::cout<<"Native frontier unavailable: explicit boundaries pass\n";return 0;} + ordinary_and_globals();sibling_bound();with_lp();root_covers(); +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS + root_cut_failures(); +#endif +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS + knapsack_interruptions();fault_injections(); +#else + // Production builds have no shared coordinator hook or search state. + const auto isolated=[] { + Model model;const auto x=model.add_integer(-1,3),y=model.add_integer(0,3); + model.add_row({{x,2},{y,3}},5,inf);model.minimize({{x,1},{y,1}},-3); + NativeSearchOptions options;options.solve.guarantee=Guarantee::Exact; + if(native_lp_capabilities().available) options.relaxation=NativeLpSettings{}; + return solve_native_search(model,options); + }; + auto left=std::async(std::launch::async,isolated),right=std::async(std::launch::async,isolated); + const auto a=left.get(),b=right.get(); + assert(a.result.termination==Termination::Optimal && a.result.objective==-1); + assert(b.result.objective==a.result.objective && a.result.model_id!=b.result.model_id); +#endif + std::cout< +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::uint64_t runs=0; +thread_local std::function hook; +// Independent finite product oracle: no native compiler, propagator or common +// validator is used to compute feasible points or objective bounds. +bool feasible(const ModelSnapshot& model,const std::vector& point) { + const auto row=[&](const std::vector& terms,double lower,double upper) { + std::int64_t sum=0; + for(const auto& term:terms) sum+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return sum>=lower && sum<=upper; + }; + for(const auto& variable:model.variables) if(variable.active) { + const auto value=point.at(variable.variable.id); + if(value!=std::trunc(value) || !std::isfinite(value)) return false; + if(!(variable.type==VariableType::SemiInteger && value==0) && (valuevariable.upper)) return false; + } + for(const auto& original:model.rows) + if(original.active && !original.indicator_origin && !row(original.terms,original.lower,original.upper)) return false; + for(const auto& indicator:model.indicators) if(indicator.active) { + const bool enabled=point[indicator.activator.id]==(indicator.active_value?1:0); + if(enabled && !row(indicator.terms,indicator.lower,indicator.upper)) return false; + if(indicator.inactive_gate && point[indicator.inactive_gate->id]!=(enabled?0:1)) return false; + } + for(const auto& global:model.globals) if(global.active) { + const bool valid=std::visit([&](const auto& data) { + using T=std::decay_t; + const auto value=[&](Variable v) {return static_cast(point[v.id]);}; + if constexpr(std::is_same_v) { + std::set seen; + for(auto v:data.variables) if(!seen.insert(value(v)).second) return false; + return true; + } else if constexpr(std::is_same_v) { + const auto index=value(data.index)-data.index_base; + return index>=0 && static_cast(index)) { + std::vector tuple;for(auto v:data.variables) tuple.push_back(value(v)); + return std::find(data.tuples.begin(),data.tuples.end(),tuple)!=data.tuples.end(); + } else if constexpr(std::is_same_v) { + std::set starts; + for(std::size_t i=0;idata.capacity) return false; + } + return true; + } else if constexpr(std::is_same_v) { + auto state=data.initial_state; + for(auto variable:data.variables){ + const auto edge=std::find_if(data.transitions.begin(),data.transitions.end(),[&](const RegularTransition& t){return t.from==state&&t.symbol==value(variable);}); + if(edge==data.transitions.end())return false; + state=edge->to; + } + return std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end(); + } else { + if(data.successors.empty()) return false; + std::set seen;std::int64_t next=0; + for(std::size_t i=0;i(next)>=data.successors.size() || !seen.insert(next).second) return false; + next=value(data.successors[next])-data.index_base; + } + return next==0; + } + },global.payload); + if(!valid) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model,const std::vector& point) { + auto value=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms) value+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return value; +}std::vector> points(const ModelSnapshot& model) { + std::vector point(model.variables.size(),std::numeric_limits::quiet_NaN()); + std::vector> all; + const auto visit=[&](const auto& self,std::size_t slot)->void { + if(slot==model.variables.size()) {all.push_back(point);return;} + const auto& v=model.variables[slot];if(!v.active){self(self,slot+1);return;} + assert(std::isfinite(v.lower) && std::isfinite(v.upper) && v.upper-v.lower<=6); + if(v.type==VariableType::SemiInteger && v.lower>0){point[slot]=0;self(self,slot+1);} + for(std::int64_t value=static_cast(v.lower);value<=v.upper;++value){point[slot]=static_cast(value);self(self,slot+1);} + };visit(visit,0);return all; +} +std::optional oracle(const ModelSnapshot& source) { + std::optional best; + for(const auto& p:points(source))if(feasible(source,p)){ + const auto value=objective(source,p); + if(!best || (source.objective.sense==ObjectiveSense::Minimize?value<*best:value>*best))best=value; + }return best; +} +std::vector entries(const ModelSnapshot& source,const std::vector& p,bool omit_gates=false) { + std::set live; + if(omit_gates)for(const auto& i:source.indicators)if(i.active && i.inactive_gate)live.insert(i.inactive_gate->id); + std::vector out; + for(const auto& v:source.variables)if(v.active && !live.count(v.variable.id))out.push_back({v.variable,p[v.variable.id]}); + return out; +} +struct Answer {SolveResult result;NativeFrontierStatistics frontier;NativeBranchingStatistics branching;NativeLpStatistics lp;}; +bool is_frontier(int route){return route>=2 && route<=6;} +std::vector routes(){return native_lp_capabilities().available?std::vector{0,1,2,3,4,5,6,7}:std::vector{0,2,3,5};} +Answer solve(const ModelSnapshot& source,const SolveOptions& options,int route,std::size_t resident=100000) { + Answer out; + if(route==0)out.result=solve_native(source,options); + else if(route==1 || route==7){NativeLpOptions lp;lp.solve=options;lp.frequency=NativeLpFrequency::AfterBoundChanges;if(route==7)lp.root_cover_cuts=NativeRootCoverSettings{}; + auto r=solve_native_lp(source,lp);out.result=std::move(r.result);out.lp=r.relaxation; + }else{NativeSearchOptions search;search.solve=options;search.max_open_nodes=resident;search.order=route==2?NativeSearchOrder::DepthFirst:NativeSearchOrder::BestBound; + if(route==4 || route==6){search.relaxation=NativeLpSettings{};search.relaxation->frequency=NativeLpFrequency::AfterBoundChanges;if(route==6)search.relaxation->root_cover_cuts=NativeRootCoverSettings{};} + if(route==5 || route==6)search.branching=NativeBranchingSettings{}; + auto r=solve_native_search(source,search);out.result=std::move(r.result);out.frontier=r.frontier;out.branching=r.branching;out.lp=r.relaxation; + }return out; +} +SolveOptions options(){SolveOptions out;out.backend=Backend::Native;out.guarantee=Guarantee::Exact;return out;} +void verify(const ModelSnapshot& source,const Answer& answer,int route,const SolveOptions& o) { + ++runs;const auto best=oracle(source);const auto& r=answer.result;const bool min=source.objective.sense==ObjectiveSense::Minimize; + assert(r.model_id==source.model_id && r.revision==source.revision && r.guarantee==o.guarantee); + if(r.has_solution()){ + assert(best && feasible(source,r.values) && r.objective==static_cast(objective(source,r.values))); + assert(min?*r.objective>=*best:*r.objective<=*best); + for(const auto& v:source.variables){assert(r.active_variables[v.variable.id]==v.active);if(!v.active)assert(std::isnan(r.values[v.variable.id]));} + } + if(r.start_submitted)assert(r.has_solution()); + if(r.best_bound){assert(std::isfinite(*r.best_bound));if(best)assert(min?*r.best_bound<=*best:*r.best_bound>=*best);if(r.has_solution())assert(min?*r.best_bound<=*r.objective:*r.best_bound>=*r.objective);} + if(r.termination==Termination::Optimal)assert(best && r.has_solution() && r.objective==static_cast(*best) && r.best_bound==r.objective); + if(r.termination==Termination::Infeasible)assert(!best && !r.has_solution() && !r.start_submitted && !r.best_bound); + if(!is_frontier(route) && r.termination!=Termination::Optimal)assert(!r.best_bound && !r.absolute_gap && !r.relative_gap); + if(is_frontier(route)){assert(answer.branching.budget_nodes==answer.frontier.admitted_nodes+answer.branching.probe_status_calls);if(o.node_limit)assert(answer.branching.budget_nodes<=*o.node_limit);} +} +void exhaustive(const Model& model) { + const auto source=model.snapshot();const auto all=points(source);const auto best=oracle(source); + for(auto route:routes()){ + auto o=options();const auto cold=solve(source,o,route);verify(source,cold,route,o);assert(!cold.result.start_submitted); + assert(cold.result.termination==(best?Termination::Optimal:Termination::Infeasible)); + for(const auto& point:all){o.primal_start=entries(source,point);if(o.primal_start.empty())continue; + const auto r=solve(source,o,route);verify(source,r,route,o); + if(feasible(source,point)){ + assert(r.result.start_submitted && r.result.termination==Termination::Optimal); + if(!source.indicators.empty()){o.primal_start=entries(source,point,true);const auto derived=solve(source,o,route);verify(source,derived,route,o);assert(derived.result.start_submitted && derived.result.termination==Termination::Optimal);} + }else assert(r.result.termination==Termination::InvalidModel && !r.result.has_solution() && !r.result.start_submitted && !r.lp.lp_calls); + } + } + assert(source.revision==model.revision()); +} +void fixtures(){ + for(int n=0;n<8;++n){Model m;const auto dead=m.add_binary();m.remove(dead);const auto x=m.add_integer(-1,1),y=m.add_binary();m.add_row({{x,2},{y,1}},-1,1);m.set_objective({{x,double(n%3-1)},{y,double(n%2?2:-3)}},n%2?ObjectiveSense::Maximize:ObjectiveSense::Minimize,n-4);exhaustive(m);} + {Model m;m.minimize({},-3);exhaustive(m);m.add_row({},1,inf);exhaustive(m);} + for(bool active:{false,true}){Model m;auto a=m.add_binary(),x=m.add_integer(-1,2);add_indicator(m,a,active,{{x,1}},0,1);m.maximize({{x,2},{a,-1}},-17);exhaustive(m);} + {Model m;auto x=m.add_variable(VariableType::SemiInteger,2,3),y=m.add_integer(-1,1);m.add_row({{x,1},{y,1}},0,3);m.minimize({{x,1},{y,-2}},9);exhaustive(m);} + {Model m;auto a=m.add_binary(),b=m.add_binary();add_all_different(m,{a,b});m.minimize({{a,1},{b,-3}});exhaustive(m);} + {Model m;auto a=m.add_binary();add_all_different(m,{a,a});exhaustive(m);} + {Model m;auto a=m.add_binary(),b=m.add_binary();add_table(m,{a,b},{{0,1},{1,0}});m.maximize({{a,2}});exhaustive(m);} + {Model m;auto a=m.add_binary(),b=m.add_binary(),i=m.add_integer(-1,0),r=m.add_binary();add_element(m,i,{a,b},r,-1);m.minimize({{r,2},{a,-1}});exhaustive(m);} + {Model m;auto a=m.add_binary(),b=m.add_binary();add_cumulative(m,{a,b,a},{1,1,0},{1,1,9},1);m.maximize({{a,1},{b,2}});exhaustive(m);} + {Model m;std::vector s;for(int i=0;i<3;++i)s.push_back(m.add_integer(0,2));add_circuit(m,s);m.minimize({{s[0],2},{s[1],-1}},5);exhaustive(m);} + for(bool minimize:{false,true}){Model m;const auto x=m.add_binary(),y=m.add_binary(),z=m.add_binary();m.add_row({{x,3},{y,3},{z,1}},-inf,5);m.set_objective({{x,-2},{y,-3},{z,1}},minimize?ObjectiveSense::Minimize:ObjectiveSense::Maximize,-5);exhaustive(m);} + for(int value:{-INT_MAX+1,INT_MAX-1,-(INT_MAX-1)/2,(INT_MAX-1)/2}){Model m;auto x=m.add_integer(value,value); + if(std::abs(value)>(INT_MAX-1)/2)m.minimize({},1);else m.minimize({{x,1}},1); + auto o=options();o.primal_start={{x,double(value)}}; + for(int route:{0,2,3,5}){auto r=solve(m.snapshot(),o,route);verify(m.snapshot(),r,route,o);assert(r.result.termination==Termination::Optimal && r.result.start_submitted);} + } +} +void limits(){ + Model m;std::vector vars;std::vector terms;for(int i=0;i<4;++i){vars.push_back(m.add_binary());terms.push_back({vars.back(),double(i+1)});}m.maximize(terms,-13); + const auto source=m.snapshot();std::vector zero(vars.size(),0); + for(auto route:routes()){ + auto o=options();o.primal_start=entries(source,zero);const auto full=solve(source,o,route);verify(source,full,route,o);assert(full.result.start_submitted); + const auto cap=is_frontier(route)?full.branching.budget_nodes+1:24; + for(std::uint64_t n=0;n<=cap;++n){o.node_limit=n;const auto r=solve(source,o,route);verify(source,r,route,o);assert(r.result.termination==Termination::Optimal || r.result.termination==Termination::NodeLimit);assert(r.result.start_submitted==(n>0));} + o.node_limit.reset(); + for(std::size_t n=0;n<4;++n)if(is_frontier(route)){const auto r=solve(source,o,route,n);verify(source,r,route,o);assert(r.result.start_submitted && r.result.has_solution() && r.frontier.peak_open_nodes<=n);} + for(int kind=0;kind<3;++kind){auto stop=o;if(kind==0)stop.time_limit_seconds=0;else if(kind==1)stop.node_limit=0;else{stop.cancellation=std::make_shared();stop.cancellation->cancel();}auto r=solve(source,stop,route);verify(source,r,route,stop);assert(!r.result.start_submitted && !r.result.has_solution() && !r.lp.lp_calls);} + } +} +void input_boundaries(){ + Model m;auto dead=m.add_binary();m.remove(dead);auto x=m.add_integer(-1,1),y=m.add_variable(VariableType::SemiInteger,2,3);m.minimize({{x,1},{y,1}},7);const auto source=m.snapshot();Model foreign;auto other=foreign.add_binary(); + for(auto route:routes()){ + auto o=options();o.primal_start={{x,0},{y,0}}; + const auto good=solve(source,o,route);verify(source,good,route,o);assert(good.result.start_submitted); + for(int kind=0;kind<8;++kind){auto bad=o; + if(kind==0)bad.primal_start.push_back({x,0});else if(kind==1)bad.primal_start.push_back({other,0});else if(kind==2)bad.primal_start.push_back({dead,0});else if(kind==3)bad.primal_start[0].variable.id=source.variables.size();else if(kind==4)bad.primal_start[0].value=1-1e-12;else if(kind==5)bad.primal_start[1].value=1;else if(kind==6)bad.primal_start[0].value=inf;else bad.primal_start[0].value=std::numeric_limits::quiet_NaN(); + const auto r=solve(source,bad,route);assert(r.result.termination==Termination::InvalidModel && !r.result.start_submitted && !r.result.has_solution());++runs; + } + o.primal_start={{x,0}};const auto partial=solve(source,o,route);assert(partial.result.termination==Termination::Unsupported && !partial.result.start_submitted);++runs; + auto malformed=source;malformed.variables[x.id].variable.model_id++;o.primal_start={{x,0},{y,0}};assert(solve(malformed,o,route).result.termination==Termination::InvalidModel);++runs; + o.guarantee=Guarantee::Numerical;o.primal_start[0].value=1-1e-12;assert(solve(source,o,route).result.termination==Termination::InvalidModel);++runs; + o.primal_start[0].value=0;const auto numerical=solve(source,o,route);verify(source,numerical,route,o);assert(numerical.result.start_submitted && numerical.result.termination==Termination::Optimal); + o=options();o.guarantee=Guarantee::Certified;o.primal_start={{x,0},{y,0}};assert(solve(source,o,route).result.termination==Termination::Unsupported);++runs; + Model fractional;auto v=fractional.add_binary();fractional.minimize({{v,.5}});o=options();o.primal_start={{v,0}};assert(solve(fractional.snapshot(),o,route).result.termination==Termination::Unsupported);++runs; + Model overflow;v=overflow.add_integer(0,INT_MAX-1);overflow.minimize({{v,2}});o.primal_start={{v,0}};assert(solve(overflow.snapshot(),o,route).result.termination==Termination::Unsupported);++runs; + } + auto o=options();o.primal_start={{x,0},{y,0}};const auto old=solve_native(m,o);assert(old.start_submitted); + m.maximize({{x,-2},{y,3}},-4);const auto revised=solve_native(m,o);verify(m.snapshot(),Answer{revised,{},{},{}},0,o);assert(revised.start_submitted && old.revision!=revised.revision && old.value(y)==0); + m.set_bounds(x,1,1);assert(solve_native(m,o).termination==Termination::InvalidModel); + Model moved(std::move(m));assert(solve_native(m,o).termination==Termination::InvalidModel);assert(solve_native_search(m).result.termination==Termination::InvalidModel); + NativeLpOptions lp;lp.solve=o;assert(solve_native_lp(m,lp).result.termination==Termination::InvalidModel); + o.primal_start={{x,1},{y,0}};std::vector> tasks;auto snapshot=moved.snapshot();for(int n=0;n<4;++n)tasks.push_back(std::async(std::launch::async,[&]{return solve_native(snapshot,o);}));for(auto& task:tasks){const auto r=task.get();assert(r.start_submitted);verify(snapshot,Answer{r,{},{},{}},0,o);} +} +// Swap logical slots while retaining every structural identity and owned row/gate. +void reverse_indicators(ModelSnapshot& source){ + std::reverse(source.indicators.begin(),source.indicators.end()); + for(std::size_t i=0;iid].indicator_origin=d.indicator; + for(auto row:d.generated_rows)source.rows[row.id].indicator_origin=d.indicator; + } +} +void gates(){ + Model m;auto a=m.add_binary(),x=m.add_integer(0,3);auto first=add_indicator(m,a,true,{{x,1}},2,inf);assert(first.inactive_gate);auto second=add_indicator(m,*first.inactive_gate,true,{{x,1}},-inf,1);assert(second.inactive_gate);m.minimize({{x,-1}},9); + auto source=m.snapshot();reverse_indicators(source); + for(auto route:routes())for(bool active:{false,true}){ + auto o=options();o.primal_start={{a,active?1.:0.},{x,active?2.:1.}};const auto r=solve(source,o,route);verify(source,r,route,o);assert(r.result.start_submitted); + o.primal_start.push_back({*first.inactive_gate,active?1.:0.});assert(solve(source,o,route).result.termination==Termination::InvalidModel);++runs; + } + // A structurally valid cyclic equation set has no guessed orientation. + source=m.snapshot();auto& d=source.indicators[first.indicator.id];d.activator=*second.inactive_gate; + for(auto row:d.generated_rows){auto& terms=source.rows[row.id].terms;for(auto& t:terms)if(t.variable==a)t.variable=*second.inactive_gate;std::sort(terms.begin(),terms.end(),[](const Term& l,const Term& r){return l.variable.id stages={"before_start","map_entry","gate_dependency","known_slot","derive_gate","start_completeness","before_exact_start","exact_variable","exact_term","exact_row","exact_indicator","exact_global","after_exact_global","exact_objective","after_exact_start","before_numerical_start","after_numerical_start","before_start_publication","after_start_publication","before_start_cutoff","after_start_cutoff","after_start_release"}; + for(auto route:routes())for(const auto& stage:stages)for(int mode=0;mode<3;++mode){ + auto o=base;o.cancellation=std::make_shared();bool fired=false,published=false; + hook=[&](const char* raw){const std::string event=raw;if(event=="after_start_publication")published=true;if(!fired && event==stage){fired=true;if(mode==0)o.cancellation->cancel();else if(mode==1)throw std::bad_alloc();else throw std::runtime_error("injected native start failure");}}; + const auto r=solve(source,o,route);hook={};assert(fired);verify(source,r,route,o); + assert(r.result.termination==(mode==0?Termination::Cancelled:mode==1?Termination::MemoryLimit:Termination::BackendError)); + assert(r.result.start_submitted==published && r.result.has_solution()==published); + if(published)assert(*r.result.objective<=10); + if(is_frontier(route) && stage!="after_start_release")assert(r.result.best_bound==6 && r.frontier.unresolved_regions==1 && !r.frontier.admitted_nodes); + if(stage=="after_start_publication")assert(r.result.objective==10 && !r.lp.lp_calls); + } + // Every injected failure after the incumbent is published retains it. + for(int route:{0,1,7})if(route==0 || native_lp_capabilities().available){ + for(const std::string stage:{"start_root_alloc","start_search_ready","before_start_search_next","before_start_candidate_validation","before_start_candidate_publication"}){ + auto o=base;o.cancellation=std::make_shared();bool fired=false; + hook=[&](const char* event){if(!fired && stage==event){fired=true;o.cancellation->cancel();}}; + const auto r=solve(source,o,route);hook={};assert(fired);verify(source,r,route,o);assert(r.result.start_submitted && r.result.objective==10 && r.result.termination==Termination::Cancelled); + } + } +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS + for(int route:{2,3,5})for(const std::string stage:{"frontier:root_alloc","frontier:before_propagation","frontier:after_propagation","frontier:child_clone","frontier:child_committed","frontier:child_enqueued","frontier:before_validation","frontier:after_validation"})for(int mode=0;mode<3;++mode){ + auto o=base;o.cancellation=std::make_shared();bool fired=false; + hook=[&](const char* event){if(!fired && stage==event){fired=true;if(mode==0)o.cancellation->cancel();else if(mode==1)throw std::bad_alloc();else throw std::runtime_error("injected frontier transfer failure");}}; + const auto r=solve(source,o,route);hook={};assert(fired);verify(source,r,route,o);assert(r.result.start_submitted && r.result.has_solution());assert(r.result.termination==(mode==0?Termination::Cancelled:mode==1?Termination::MemoryLimit:Termination::BackendError)); + } +#endif +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS + if(native_lp_capabilities().available)for(int route:{6,7})for(const std::string stage:{"root_cut:before_loop","root_cut:after_loop","root_cut:prepared"})for(int mode=0;mode<3;++mode){ + auto o=base;o.cancellation=std::make_shared();bool fired=false; + hook=[&](const char* event){if(!fired && stage==event){fired=true;if(mode==0)o.cancellation->cancel();else if(mode==1)throw std::bad_alloc();else throw std::runtime_error("injected start LP setup failure");}}; + const auto r=solve(source,o,route);hook={};assert(fired);verify(source,r,route,o);assert(r.result.start_submitted && r.result.objective==10 && r.result.termination==(mode==0?Termination::Cancelled:mode==1?Termination::MemoryLimit:Termination::BackendError)); + } +#endif + for(int route:{0,3})for(const std::string stage:{"before_start_publication","after_start_publication"}){ + auto o=base;o.time_limit_seconds=.5;bool fired=false;hook=[&](const char* event){if(!fired && stage==event){fired=true;std::this_thread::sleep_for(std::chrono::milliseconds(550));}}; + const auto r=solve(source,o,route);hook={};assert(fired);verify(source,r,route,o);assert(r.result.termination==Termination::TimeLimit && r.result.start_submitted==(stage=="after_start_publication")); + } + // No start invokes no start-specific work/hooks, including explicit empty input. + for(auto route:routes()){ + auto o=options();std::uint64_t events=0;hook=[&](const char* event){const std::string e=event;if(e.find("frontier:")!=0 && e.find("root_cut:")!=0)++events;}; + const auto first=solve(source,o,route);o.primal_start={};const auto second=solve(source,o,route);hook={};verify(source,first,route,o);verify(source,second,route,o);assert(!events && first.result.objective==second.result.objective && first.frontier.admitted_nodes==second.frontier.admitted_nodes && first.lp.lp_calls==second.lp.lp_calls); + } +} +#endif +} +namespace Gecode {namespace Optimize { +#ifdef GECODE_NATIVE_START_TEST_HOOKS +void native_start_test_event(const char* event){if(hook)hook(event);} +#endif +#ifdef GECODE_NATIVE_SEARCH_TEST_HOOKS +void native_search_test_event(const char* event){if(hook)hook((std::string("frontier:")+event).c_str());} +#endif +#ifdef GECODE_NATIVE_ROOT_CUT_TEST_HOOKS +void native_root_cut_test_event(const char* event,NativeRootCoverCompletion&){if(hook)hook((std::string("root_cut:")+event).c_str());} +#endif +}} +int main(){ + if(!native_capabilities().available){Model m;auto x=m.add_binary();auto o=options();o.primal_start={{x,0}};assert(solve_native(m,o).termination==Termination::Unsupported);NativeSearchOptions search;search.solve=o;assert(solve_native_search(m,search).result.termination==Termination::Unsupported);NativeLpOptions lp;lp.solve=o;assert(solve_native_lp(m,lp).result.termination==Termination::Unsupported);o.primal_start[0].value=inf;assert(solve_native(m,o).termination==Termination::InvalidModel);std::cout<<"Native starts unavailable: explicit boundaries pass\n";return 0;} + fixtures();limits();input_boundaries();gates(); +#ifdef GECODE_NATIVE_START_TEST_HOOKS + faults(); +#endif + std::cout< +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +std::optional oracle(const ModelSnapshot& m){ + std::optional best;std::vector v(m.variables.size()); + const auto visit=[&](const auto& self,std::size_t i)->void{ + if(irow.upper)return;} + double a=m.objective.offset;for(auto t:m.objective.terms)a+=t.coefficient*v[t.variable.id]; + if(!best || (m.objective.sense==ObjectiveSense::Minimize ? a<*best:a>*best))best=a; + };visit(visit,0);return best; +} +Model fixture(bool binary,bool maximize,bool identical){ + Model m;std::vector sum,twice,cost; + for(int i=0;i<5;++i){auto x=binary?m.add_binary():m.add_integer(-1,2); + sum.push_back({x,1});twice.push_back({x,2});cost.push_back({x,identical?1.0:double(i+1)});} + m.add_row(sum,2,inf);m.add_row(twice,-inf,8); + m.set_objective(cost,maximize?ObjectiveSense::Maximize:ObjectiveSense::Minimize,-13); + return m; +} +} +int main(){ + if(!native_capabilities().available){std::cout<<"Symmetry native integration unavailable\n";return 0;} + SolveOptions o;o.backend=Backend::Native;o.guarantee=Guarantee::Exact;o.relative_gap=o.absolute_gap=0;o.time_limit_seconds=5; + for(bool binary:{false,true})for(bool maximize:{false,true})for(bool identical:{false,true}){ + auto m=fixture(binary,maximize,identical);auto s=m.snapshot();auto expected=oracle(s); + auto result=solve(m,o); + if(result.termination!=Termination::Optimal)std::cerr<();stopped.cancellation->cancel(); + auto cancelled=solve(m,stopped);assert(cancelled.termination==Termination::Cancelled && !cancelled.has_solution()); + // Two coupled rows prohibit swapping the differently occurring variables. + Model asymmetric;auto x=asymmetric.add_binary(),y=asymmetric.add_binary(); + asymmetric.add_row({{x,1},{y,2}},1,1);asymmetric.minimize({{x,1},{y,1}}); + auto a=solve(asymmetric,o);assert(a.termination==Termination::Optimal && a.value(x)==1 && a.value(y)==0); + // Public automatic path assembles two separate components and the offset once. + Model disconnected;auto p=disconnected.add_integer(0,3),q=disconnected.add_integer(0,3); + disconnected.add_row({{p,1}},1,3);disconnected.add_row({{q,1}},1,3); + disconnected.minimize({{p,2},{q,-3}},7);auto d=solve(disconnected,o); + assert(d.termination==Termination::Optimal && d.objective==0 && validate(disconnected.snapshot(),d.values,0,0).valid); + assert(d.message.find("independent components")!=std::string::npos); + std::cout<<"Symmetry and public preprocessing integration checks passed\n"; +} diff --git a/test/optimize/package_origin/consumer/CMakeLists.txt b/test/optimize/package_origin/consumer/CMakeLists.txt new file mode 100644 index 0000000000..6b79c6008a --- /dev/null +++ b/test/optimize/package_origin/consumer/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.21) +project(OptimizationPackageOriginConsumer LANGUAGES CXX) + +if(IMPORT_MODE STREQUAL "combined-first") + find_package(Gecode CONFIG REQUIRED COMPONENTS int search + PATHS "${COMBINED_PREFIX}/lib/cmake/Gecode" NO_DEFAULT_PATH) +elseif(IMPORT_MODE STREQUAL "alias-first") + add_library(Gecode::optimize INTERFACE IMPORTED) +elseif(IMPORT_MODE STREQUAL "c-alias-first") + add_library(Gecode::optimize_c INTERFACE IMPORTED) +elseif(IMPORT_MODE STREQUAL "c-target-first") + add_library(Gecode::gecodeoptimize_c INTERFACE IMPORTED) +endif() + +set(GecodeOptimize_DIR "${STANDALONE_PREFIX}/lib/cmake/GecodeOptimize") +find_package(GecodeOptimize CONFIG REQUIRED) +if(IMPORT_MODE STREQUAL "repeat") + find_package(GecodeOptimize CONFIG REQUIRED) + get_target_property(origin Gecode::gecodeoptimize GECODE_OPTIMIZE_PACKAGE_ORIGIN) + get_filename_component(expected "${GecodeOptimize_DIR}" REALPATH) + if(NOT origin STREQUAL expected) + message(FATAL_ERROR "Repeated package find did not retain its original target") + endif() +elseif(IMPORT_MODE STREQUAL "different-prefix") + set(GecodeOptimize_DIR "${SECOND_STANDALONE_PREFIX}/lib/cmake/GecodeOptimize") + find_package(GecodeOptimize CONFIG REQUIRED) +endif() diff --git a/test/optimize/package_origin/producer/CMakeLists.txt b/test/optimize/package_origin/producer/CMakeLists.txt new file mode 100644 index 0000000000..f1e738b761 --- /dev/null +++ b/test/optimize/package_origin/producer/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.21) +project(OptimizationPackageOriginFixture VERSION 0.1.0 LANGUAGES CXX) +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +# Interface-only fixtures exercise CMake's real generated export behavior. +# Installing them requires no solver compilation or linked binaries. +add_library(gecodeoptimize INTERFACE) +if(PACKAGE_KIND STREQUAL "standalone") + set(GECODE_OPTIMIZE_WITH_HIGHS OFF) + configure_package_config_file("${OPTIMIZE_CONFIG_TEMPLATE}" + "${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfig.cmake" + INSTALL_DESTINATION lib/cmake/GecodeOptimize) + install(TARGETS gecodeoptimize EXPORT GecodeOptimizeTargets) + install(EXPORT GecodeOptimizeTargets NAMESPACE Gecode:: DESTINATION lib/cmake/GecodeOptimize) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/GecodeOptimizeConfig.cmake" + DESTINATION lib/cmake/GecodeOptimize) +elseif(PACKAGE_KIND STREQUAL "combined") + add_library(gecodeint INTERFACE) + add_library(gecodesearch INTERFACE) + install(TARGETS gecodeint gecodesearch gecodeoptimize EXPORT GecodeTargets) + install(EXPORT GecodeTargets NAMESPACE Gecode:: DESTINATION lib/cmake/Gecode) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/GecodeConfig.cmake" [=[ +include("${CMAKE_CURRENT_LIST_DIR}/GecodeTargets.cmake") +add_library(Gecode::optimize INTERFACE IMPORTED) +set_target_properties(Gecode::optimize PROPERTIES INTERFACE_LINK_LIBRARIES Gecode::gecodeoptimize) +set(Gecode_int_FOUND TRUE) +set(Gecode_search_FOUND TRUE) +]=]) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/GecodeConfig.cmake" DESTINATION lib/cmake/Gecode) +else() + message(FATAL_ERROR "Specify PACKAGE_KIND=standalone or combined") +endif() diff --git a/test/optimize/package_origin/run.py b/test/optimize/package_origin/run.py new file mode 100644 index 0000000000..db11d78856 --- /dev/null +++ b/test/optimize/package_origin/run.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +"""Configure-only package ownership regressions; no solver builds or benchmarks. + +Creates and installs interface-only export fixtures using the actual standalone +package config template. Repeated discovery must succeed; foreign combined, +standalone-prefix, or alias targets must produce the explicit ownership error. +--check-native-boundary also checks the real standalone Native=ON rejection. +""" +import argparse +from pathlib import Path +import subprocess +import tempfile + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[2] + + +def run(arguments, expected_error=None): + result = subprocess.run(arguments, text=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, timeout=120) + if expected_error is None: + if result.returncode: + raise RuntimeError("Command failed: " + repr(arguments) + "\n" + result.stdout) + elif result.returncode == 0 or expected_error not in " ".join(result.stdout.split()): + raise RuntimeError("Expected explicit rejection: " + expected_error + "\n" + result.stdout) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--cmake", default="cmake") + parser.add_argument("--generator") + parser.add_argument("--work-root", type=Path) + parser.add_argument("--source-root", type=Path, default=ROOT) + parser.add_argument("--check-native-boundary", action="store_true") + args = parser.parse_args() + args.source_root = args.source_root.resolve(strict=True) + if args.work_root: + args.work_root.mkdir(parents=True, exist_ok=True) + generator = ["-G", args.generator] if args.generator else [] + with tempfile.TemporaryDirectory(prefix="gecode-optimize-origin-", dir=args.work_root) as temporary: + work = Path(temporary) + prefixes = {} + for name, kind in (("standalone", "standalone"), ("second", "standalone"), ("combined", "combined")): + prefixes[name] = work / (name + "-install") + build = work / (name + "-build") + run([args.cmake, "-S", str(HERE / "producer"), "-B", str(build), *generator, + "-DPACKAGE_KIND=" + kind, + "-DOPTIMIZE_CONFIG_TEMPLATE=" + str(args.source_root / "gecode/optimize/GecodeOptimizeConfig.cmake.in"), + "-DCMAKE_INSTALL_PREFIX=" + str(prefixes[name]), "-DCMAKE_INSTALL_LIBDIR=lib"]) + run([args.cmake, "--install", str(build), "--config", "Release"]) + rejection = "already belongs to a different optimization package" + for mode in ("repeat", "combined-first", "different-prefix", "alias-first", "c-alias-first", "c-target-first"): + run([args.cmake, "-S", str(HERE / "consumer"), "-B", str(work / mode), *generator, + "-DIMPORT_MODE=" + mode, "-DSTANDALONE_PREFIX=" + str(prefixes["standalone"]), + "-DSECOND_STANDALONE_PREFIX=" + str(prefixes["second"]), + "-DCOMBINED_PREFIX=" + str(prefixes["combined"])], + None if mode == "repeat" else rejection) + print("PASS package origin: " + mode, flush=True) + if args.check_native_boundary: + run([args.cmake, "-S", str(args.source_root / "gecode/optimize"), + "-B", str(work / "unsupported-native"), *generator, + "-DGECODE_OPTIMIZE_WITH_NATIVE=ON", "-DGECODE_OPTIMIZE_WITH_HIGHS=OFF", + "-DGECODE_OPTIMIZE_BUILD_TESTS=OFF"], + "Native optimization bridge requires a top-level Gecode build") + print("PASS standalone native support boundary", flush=True) + + +if __name__ == "__main__": + main() diff --git a/test/optimize/pool.cpp b/test/optimize/pool.cpp new file mode 100644 index 0000000000..49c35d2e73 --- /dev/null +++ b/test/optimize/pool.cpp @@ -0,0 +1,333 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); +[[maybe_unused]] bool near(double a, double b) { return std::fabs(a-b) <= 1e-6; } +void historical(const ModelSnapshot& model, const PoolResult& result) { + assert(result.model_id == model.model_id && result.revision == model.revision); + std::set> keys; + for (const auto& entry : result.entries) { + assert(keys.insert(entry.projection_values).second); + assert(entry.solution.has_solution()); + assert(entry.solution.model_id == model.model_id && entry.solution.revision == model.revision); + assert(entry.solution.values.size() == model.variables.size()); + assert(entry.solution.termination == Termination::Unknown); + assert(!entry.solution.best_bound && !entry.solution.absolute_gap && !entry.solution.relative_gap); + auto checked = validate(model, entry.solution.values); + assert(checked.valid && checked.objective == entry.solution.objective); + for (std::size_t i=0; i first; +// Independent small exact arithmetic oracle, including every private binary +// witness. Does not call the implementation's validator or no-good generator. +std::vector enumerate(const ModelSnapshot& model, bool reverse) { + std::vector values(model.variables.size()), best; + double optimum = model.objective.sense == ObjectiveSense::Minimize ? inf : -inf; + std::function visit = [&](std::size_t slot) { + if (slot != model.variables.size()) { + const auto& variable = model.variables[slot]; + if (!variable.active) { values[slot] = 0; visit(slot+1); return; } + assert(variable.type == VariableType::Integer || variable.type == VariableType::Binary); + assert(std::isfinite(variable.lower) && std::isfinite(variable.upper)); + for (int x=static_cast(std::ceil(variable.lower)); x<=std::floor(variable.upper); ++x) { + values[slot]=x; visit(slot+1); + } + return; + } + for (const auto& row : model.rows) if (row.active) { + double activity=0; for (const auto& term : row.terms) activity += term.coefficient*values[term.variable.id]; + if (activity < row.lower || activity > row.upper) return; + } + double objective=model.objective.offset; + for (const auto& term : model.objective.terms) objective += term.coefficient*values[term.variable.id]; + const bool minimize = (model.objective.sense == ObjectiveSense::Minimize) != reverse; + if (best.empty() || (minimize ? objectiveoptimum)) { + best=values; optimum=objective; + } + }; + visit(0); return best; +} +} +namespace Gecode { namespace Optimize { +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options) { + assert(options.relative_gap == 0 && options.absolute_gap == 0); + assert(options.time_limit_seconds <= remaining); remaining=options.time_limit_seconds; + if (calls != 0) assert(options.primal_start.empty()); + SolveResult result; + result.model_id=model.model_id; result.revision=model.revision; + result.guarantee=options.guarantee; + result.values=enumerate(model, calls==0 && (scenario==Scenario::ReversedRank || scenario==Scenario::ReversedLimitedRank || scenario==Scenario::ReversedInfeasible)); + for (const auto& variable : model.variables) result.active_variables.push_back(variable.active); + result.termination = result.values.empty() ? Termination::Infeasible : Termination::Optimal; + if (!result.values.empty()) { + result.solution_validated=true; result.objective=model.objective.offset; + for (const auto& term : model.objective.terms) *result.objective += term.coefficient*result.values[term.variable.id]; + if (scenario==Scenario::OffsetHonest) result.objective=1; + if (scenario==Scenario::OffsetForged) result.objective=0; + result.best_bound=result.objective; result.update_gaps(model.objective.sense); + if (calls==0) first=result.values; + } + if (scenario==Scenario::BadOwner || scenario==Scenario::BadInfeasibleOwner) ++result.model_id; + if (scenario==Scenario::BadRevision) ++result.revision; + if (scenario==Scenario::BadMask) result.active_variables[0]=false; + if (scenario==Scenario::BadPrimal) result.values[0]=99; + if (scenario==Scenario::MissingBound) { result.best_bound.reset(); result.absolute_gap.reset(); } + if (scenario==Scenario::BadBound) result.best_bound=*result.objective+1; + if (scenario==Scenario::OpenBound) result.best_bound=*result.objective-1; + if (scenario==Scenario::BadObjective) { result.objective=0; result.best_bound=0; } + if (scenario==Scenario::WrongGuarantee) result.guarantee=Guarantee::Certified; + if (scenario==Scenario::Duplicate && calls==1) { + result.values.assign(model.variables.size(), 0); + std::copy(first.begin(), first.end(), result.values.begin()); + } + if ((scenario==Scenario::FirstLimit && calls==0) || (scenario==Scenario::SecondLimit && calls==1) || + (scenario==Scenario::ReversedLimitedRank && calls==1)) result.termination=Termination::TimeLimit; + if (scenario==Scenario::FirstMemory) result.termination=Termination::MemoryLimit; + if ((scenario==Scenario::FirstCancel && calls==0) || (scenario==Scenario::SecondCancel && calls==1)) options.cancellation->cancel(); + if (scenario==Scenario::Ambiguous || scenario==Scenario::BadInfeasibleOwner) { + result.solution_validated=false; result.values.clear(); result.objective.reset(); result.best_bound.reset(); + result.termination=scenario==Scenario::Ambiguous ? Termination::InfeasibleOrUnbounded : Termination::Infeasible; + } + if (scenario==Scenario::UnvalidatedFeasible || (scenario==Scenario::ReversedInfeasible && calls==1)) { + result.solution_validated=false; result.termination=Termination::Infeasible; + } + if (scenario==Scenario::NanInfeasible) { + result.solution_validated=false; result.values.clear(); result.termination=Termination::Infeasible; + result.objective=std::numeric_limits::quiet_NaN(); + } + ++calls; return result; +} +}} +int main() { + Model model; auto x=model.add_integer(0,2); auto y=model.add_binary(); + model.minimize({{x,1},{y,3}},7); + PoolOptions options; options.projection=std::vector{x}; options.solve.time_limit_seconds=60; + options.solve.primal_start={{x,2},{y,1}}; + for (auto selected : {Scenario::Good,Scenario::FirstLimit,Scenario::SecondLimit,Scenario::FirstCancel, + Scenario::SecondCancel,Scenario::BadOwner,Scenario::BadRevision,Scenario::BadMask,Scenario::BadPrimal, + Scenario::MissingBound,Scenario::BadBound,Scenario::OpenBound,Scenario::BadObjective,Scenario::Duplicate, + Scenario::Ambiguous,Scenario::BadInfeasibleOwner,Scenario::WrongGuarantee,Scenario::ReversedRank, + Scenario::ReversedLimitedRank,Scenario::UnvalidatedFeasible,Scenario::NanInfeasible,Scenario::FirstMemory,Scenario::ReversedInfeasible}) { + scenario=selected; calls=0; remaining=inf; + auto result=solve_pool(model,options); + historical(model.snapshot(),result); + if (selected==Scenario::Good) { + assert(result.exhausted() && result.entries.size()==3 && result.ranked_prefix==3 && calls==4); + for (unsigned i=0;i<3;++i) { + assert(result.entries[i].projection_values==std::vector{i}); + assert(result.entries[i].solution.objective==7+i); + } + } else { + assert(!result.exhausted() && result.completion==PoolCompletion::Incomplete); + if (selected==Scenario::FirstLimit || selected==Scenario::SecondLimit || selected==Scenario::FirstMemory) { + assert(result.termination==(selected==Scenario::FirstMemory ? Termination::MemoryLimit:Termination::TimeLimit)); + assert(result.entries.size()==(selected==Scenario::SecondLimit ? 2u:1u)); + assert(result.ranked_prefix+1==result.entries.size() && !result.entries.back().rank_established); + } else if (selected==Scenario::FirstCancel || selected==Scenario::SecondCancel) { + assert(result.termination==Termination::Cancelled); + assert(result.entries.size()==(selected==Scenario::FirstCancel ? 0u : 1u)); + assert(result.ranked_prefix==result.entries.size()); + } else if (selected==Scenario::Ambiguous) { + assert(result.termination==Termination::InfeasibleOrUnbounded && result.entries.empty()); + } else { + assert(result.termination==Termination::NumericalFailure); + if (selected==Scenario::ReversedRank || selected==Scenario::ReversedLimitedRank || selected==Scenario::ReversedInfeasible) { + assert(result.entries.size()==1 && result.ranked_prefix==0 && !result.entries[0].rank_established); + } + } + } + } + for (auto selected : {Scenario::OffsetHonest,Scenario::OffsetForged}) { + scenario=selected; calls=0; remaining=inf; + Model cancellation; auto a=cancellation.add_integer(1,1); auto b=cancellation.add_integer(1e6,1e6); + auto choice=cancellation.add_binary(); cancellation.minimize({{a,1},{b,1e10}},-1e16); + PoolOptions selected_options; selected_options.projection=std::vector{choice}; + auto result=solve_pool(cancellation,selected_options); + if (selected==Scenario::OffsetHonest) { + assert(result.exhausted() && result.ranked_prefix==2); + for (const auto& entry:result.entries) assert(entry.solution.objective==1); + } else { + assert(result.termination==Termination::NumericalFailure && result.entries.empty() && !result.exhausted()); + } + } + scenario=Scenario::Good; calls=0; remaining=inf; options.max_solutions=2; + auto result=solve_pool(model,options); + assert(result.completion==PoolCompletion::RequestedLimit && result.termination==Termination::SolutionLimit); + assert(result.ranked_prefix==2 && calls==2 && !result.exhausted()); + calls=0; options.solve.time_limit_seconds=0; + assert(solve_pool(model,options).termination==Termination::TimeLimit && calls==0); + options.solve.time_limit_seconds=60; options.solve.node_limit=1; + assert(solve_pool(model,options).termination==Termination::Unsupported && calls==0); +} +#else +namespace { +void discrete_oracles(Backend backend, Guarantee guarantee) { + for (auto sense : {ObjectiveSense::Minimize,ObjectiveSense::Maximize}) { + Model model; auto x=model.add_integer(-2,2); auto y=model.add_integer(0,2); + model.add_row({{x,1},{y,1}},0,inf); model.set_objective({{x,2},{y,-1}},sense,-9); + const auto before=model.snapshot(); + std::map,double> expected; + for (int a=-2;a<=2;++a) for(int b=0;b<=2;++b) if(a+b>=0) expected[{a,b}]=2*a-b-9; + PoolOptions options; options.max_solutions=20; options.solve.backend=backend; options.solve.guarantee=guarantee; + auto result=solve_pool(model,options); historical(before,result); + assert(result.exhausted() && result.termination==Termination::Optimal && result.guarantee==guarantee); + assert(result.entries.size()==expected.size() && result.ranked_prefix==expected.size()); + double previous=sense==ObjectiveSense::Minimize ? -inf:inf; + for (const auto& entry:result.entries) { + assert(entry.rank_established && entry.solution.objective==expected.at(entry.projection_values)); + assert(sense==ObjectiveSense::Minimize ? *entry.solution.objective>=previous:*entry.solution.objective<=previous); + previous=*entry.solution.objective; + } + // Excluding x removes all y completions, so there are exactly five classes. + options.projection=std::vector{x}; + result=solve_pool(model,options); historical(before,result); + assert(result.exhausted() && result.entries.size()==5 && result.ranked_prefix==5); + for (const auto& entry:result.entries) { + auto a=entry.projection_values[0]; double best=sense==ObjectiveSense::Minimize ? inf:-inf; + for(int b=0;b<=2;++b) if(a+b>=0) best=sense==ObjectiveSense::Minimize ? std::min(best,double(2*a-b-9)):std::max(best,double(2*a-b-9)); + assert(entry.solution.objective==best); + } + assert(model.revision()==before.revision && model.snapshot().variables.size()==before.variables.size()); + assert(model.snapshot().rows.size()==before.rows.size() && model.snapshot().objective.offset==-9); + auto historical_value=result.entries[0].solution.value(x); + model.set_bounds(x,-1,1); + assert(result.entries[0].solution.value(x)==historical_value && result.revision==before.revision); + } +} +void recourse() { + for (auto sense : {ObjectiveSense::Minimize,ObjectiveSense::Maximize}) { + Model model; auto x=model.add_integer(0,3); auto y=model.add_continuous(-inf,inf); + model.add_row({{x,-1},{y,1}},-inf,2.25); // y <= x+2.25 + model.add_row({{x,1},{y,1}},3.5,inf); // y >= 3.5-x: x=0 infeasible + model.set_objective({{x,2},{y,1}},sense,-5); + PoolOptions options; options.max_solutions=10; options.projection=std::vector{x}; + auto result=solve_pool(model,options); historical(model.snapshot(),result); + assert(result.exhausted() && result.entries.size()==3); + for(const auto& entry:result.entries) { + const double a=entry.projection_values[0]; + const double completion=sense==ObjectiveSense::Minimize ? 3.5-a:a+2.25; + assert(near(entry.solution.value(y),completion)); + assert(near(*entry.solution.objective,2*a+completion-5)); + } + } + { + Model model; auto x=model.add_binary(); auto y=model.add_integer(-inf,inf); + model.add_row({{x,1},{y,1}},1,inf); model.add_row({{x,-1},{y,1}},-inf,2); + model.minimize({{x,3},{y,1}}); + PoolOptions options; options.projection=std::vector{x}; + auto result=solve_pool(model,options); historical(model.snapshot(),result); + assert(result.exhausted() && result.ranked_prefix==2); + assert(result.entries[0].solution.objective==1 && result.entries[1].solution.objective==3); + } + Model unbounded; auto choice=unbounded.add_binary(); auto free=unbounded.add_continuous(-inf,inf); + unbounded.maximize({{free,1}}); + PoolOptions options; options.projection=std::vector{choice}; + auto result=solve_pool(unbounded,options); + assert((result.termination==Termination::Unbounded || result.termination==Termination::InfeasibleOrUnbounded) && + result.entries.empty() && !result.exhausted()); +} +void boundaries() { + Model binary; auto x=binary.add_binary(); auto y=binary.add_binary(); + binary.add_row({{x,1},{y,1}},1,inf); // three tied representatives + PoolOptions options; options.max_solutions=3; options.solve.primal_start={{x,1},{y,0}}; + auto result=solve_pool(binary,options); historical(binary.snapshot(),result); + assert(result.completion==PoolCompletion::RequestedLimit && result.ranked_prefix==3 && !result.exhausted()); + assert(result.entries[0].solution.start_submitted && !result.entries[1].solution.start_submitted); + options.max_solutions=4; result=solve_pool(binary,options); + assert(result.exhausted() && result.entries.size()==3); + options.projection=std::vector{y,x}; result=solve_pool(binary,options); + assert(result.exhausted() && result.projection[0]==y && result.projection[1]==x); + options.projection=std::vector{x,x}; + assert(solve_pool(binary,options).termination==Termination::InvalidModel); + options.projection=std::vector{Variable{binary.id()+1,x.id}}; + assert(solve_pool(binary,options).termination==Termination::InvalidModel); + options.projection=std::vector{}; + assert(solve_pool(binary,options).termination==Termination::Unsupported); + options={}; options.max_solutions=0; + assert(solve_pool(binary,options).termination==Termination::InvalidModel); + options.max_solutions=2; options.solve.node_limit=0; + assert(solve_pool(binary,options).termination==Termination::NodeLimit); + options.solve.node_limit=10; + assert(solve_pool(binary,options).termination==Termination::Unsupported); + options.solve.node_limit.reset(); options.solve.time_limit_seconds=0; + assert(solve_pool(binary,options).termination==Termination::TimeLimit); + options.solve.time_limit_seconds=inf; options.solve.cancellation=std::make_shared(); options.solve.cancellation->cancel(); + assert(solve_pool(binary,options).termination==Termination::Cancelled); + options={}; options.solve.guarantee=Guarantee::Certified; + assert(solve_pool(binary,options).termination==Termination::Unsupported); + options.solve.guarantee=Guarantee::Exact; + assert(solve_pool(binary,options).termination==Termination::Unsupported); + options={}; + Model empty; empty.minimize({},7); + result=solve_pool(empty,options); historical(empty.snapshot(),result); + assert(result.exhausted() && result.entries.size()==1 && result.entries[0].solution.objective==7); + empty.add_row({},1,inf); result=solve_pool(empty,options); + assert(result.exhausted() && result.entries.empty()); + Model fractional; fractional.add_integer(0.2,0.8); + result=solve_pool(fractional,options); assert(result.exhausted() && result.entries.empty()); + Model tombstones; auto deleted=tombstones.add_binary(); tombstones.remove(deleted); tombstones.add_binary(); + result=solve_pool(tombstones,options); historical(tombstones.snapshot(),result); + assert(result.exhausted() && result.entries.size()==2 && result.entries[0].solution.values.size()==2); + options.projection=std::vector{deleted}; + assert(solve_pool(tombstones,options).termination==Termination::InvalidModel); + options={}; + Model continuous; auto c=continuous.add_continuous(0,1); + assert(solve_pool(continuous,options).termination==Termination::Unsupported); + options.projection=std::vector{c}; + assert(solve_pool(continuous,options).termination==Termination::Unsupported); + options={}; + Model wide; wide.add_integer(-inf,inf); + assert(solve_pool(wide,options).termination==Termination::Unsupported); + Model huge; huge.add_integer(-9007199254740992.0,9007199254740992.0); + assert(solve_pool(huge,options).termination==Termination::Unsupported); + Model semi; semi.add_variable(VariableType::SemiInteger,2,4); + assert(solve_pool(semi,options).termination==Termination::Unsupported); + options.max_solutions=20; + Model logical; auto b=logical.add_binary(); auto v=logical.add_integer(0,2); + auto indicator=add_indicator(logical,b,true,{{v,1}},1,inf); + assert(solve_pool(logical,options).termination==Termination::Unsupported); + remove_indicator(logical,indicator.indicator); + assert(solve_pool(logical,options).completion==PoolCompletion::Exhausted); + auto global=add_all_different(logical,{b,v}); + assert(solve_pool(logical,options).termination==Termination::Unsupported); + logical.remove(global); + assert(solve_pool(logical,options).completion==PoolCompletion::Exhausted); +} +} +int main() { + if(capabilities(Backend::Native).available) discrete_oracles(Backend::Native,Guarantee::Exact); + if(!capabilities(Backend::Highs).available) { + Model model; model.add_binary(); + auto result=solve_pool(model); + assert(result.termination==Termination::Unsupported && result.entries.empty() && !result.exhausted()); + return 0; + } + discrete_oracles(Backend::Highs,Guarantee::Numerical); + recourse(); boundaries(); +} +#endif diff --git a/test/optimize/presolve.cpp b/test/optimize/presolve.cpp new file mode 100644 index 0000000000..f551b8a3be --- /dev/null +++ b/test/optimize/presolve.cpp @@ -0,0 +1,273 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +using Point = std::vector; +constexpr double inf = std::numeric_limits::infinity(); +bool feasible(const ModelSnapshot& model, const Point& values) { + for (const auto& row : model.rows) if (row.active) { + std::int64_t sum=0; + for (const auto& term : row.terms) sum += static_cast(term.coefficient)*values[term.variable.id]; + if (sum < row.lower || sum > row.upper) return false; + } + return true; +} +std::int64_t objective(const ModelSnapshot& model, const Point& values) { + auto sum=static_cast(model.objective.offset); + for (const auto& term : model.objective.terms) sum += static_cast(term.coefficient)*values[term.variable.id]; + return sum; +} +std::set enumerate(const ModelSnapshot& model) { + std::set points; Point values(model.variables.size()); + std::function visit=[&](std::size_t slot) { + if(slot==values.size()) { if(feasible(model,values)) points.insert(values); return; } + const auto& variable=model.variables[slot]; + if(!variable.active) { visit(slot+1); return; } + for(auto x=static_cast(variable.lower);x<=variable.upper;++x) { values[slot]=x; visit(slot+1); } + }; + visit(0); return points; +} +SolveResult candidate(const ModelSnapshot& model, const Point& point) { + SolveResult result; result.model_id=model.model_id; result.revision=model.revision; + for(auto value:point) result.values.push_back(static_cast(value)); + for(const auto& variable:model.variables) result.active_variables.push_back(variable.active); + // Deliberately untrusted objective/proof flags: postsolve must recompute. + result.objective=-999; result.best_bound=-999; result.termination=Termination::Optimal; + result.absolute_gap=0; result.relative_gap=0; result.solution_validated=false; + return result; +} +void equivalent(const ModelSnapshot& source, const PresolveOptions& options={}) { + const auto before=enumerate(source); + auto result=presolve_integer(source,options); + assert(result.model_id==source.model_id && result.revision==source.revision && result.guarantee==Guarantee::Exact); + if(result.status==PresolveStatus::Infeasible) { + assert(before.empty() && result.termination==Termination::Infeasible && !result.model && result.infeasible_row); + return; + } + assert(result.model && (result.status==PresolveStatus::Fixpoint || result.status==PresolveStatus::Incomplete)); + const auto& artifact=*result.model; + assert(artifact.original().model_id==source.model_id && artifact.original().revision==source.revision); + assert(artifact.reduced().model_id!=source.model_id); + assert(artifact.reduced().objective.sense==source.objective.sense); + assert(artifact.variables().size()==source.variables.size() && artifact.rows().size()==source.rows.size()); + std::set reconstructed; + for(const auto& point:enumerate(artifact.reduced())) { + auto post=artifact.postsolve(candidate(artifact.reduced(),point)); + assert(post.exact_witness_validated && post.solution.has_solution()); + assert(post.solution.model_id==source.model_id && post.solution.revision==source.revision); + assert(post.solution.termination==Termination::Unknown && !post.solution.best_bound); + assert(!post.solution.absolute_gap && !post.solution.relative_gap && !post.solution.native_backend_gap); + Point original(source.variables.size()); + for(std::size_t i=0;i(post.solution.values[i]); + else assert(std::isnan(post.solution.values[i])); + } + assert(feasible(source,original) && before.count(original)); + assert(reconstructed.insert(original).second); + assert(post.solution.objective==objective(source,original)); + assert(objective(source,original)==objective(artifact.reduced(),point)); + } + assert(reconstructed==before); // full feasible-set preservation, both directions + for(const auto& point:before) { + Point projected(artifact.reduced().variables.size()); + for(const auto& mapping:artifact.variables()) if(mapping.active) { + if(mapping.fixed_value) assert(point[mapping.original.id]==*mapping.fixed_value); + else projected[mapping.reduced->id]=point[mapping.original.id]; + } + assert(feasible(artifact.reduced(),projected)); + } + for(const auto& change:result.changes) { + assert(change.variable.model_id==source.model_id && change.row.model_id==source.model_id); + assert(source.rows[change.row.id].active); + assert(change.side==PresolveBoundSide::Lower ? change.after>change.before : change.after variables; + for(unsigned i=0;i<3;++i) { + if(i==0 && trial%3==0) variables.push_back(model.add_binary()); + else { const int lo=int(random()%3)-2; variables.push_back(model.add_integer(lo,lo+int(random()%3))); } + } + for(unsigned i=0,n=1+random()%4;i terms; + for(auto variable:variables) terms.push_back({variable,double(int(random()%7)-3)}); + const int lower=int(random()%13)-6, upper=lower+int(random()%7); + const unsigned form=random()%3; + model.add_row(terms,form==0 ? -inf:double(lower),form==1 ? inf:double(upper)); + } + model.set_objective({{variables[0],-2},{variables[1],1},{variables[2],3}}, + trial%2 ? ObjectiveSense::Minimize:ObjectiveSense::Maximize,-5); + equivalent(model.snapshot()); + PresolveOptions partial; partial.max_passes=trial%2; + equivalent(model.snapshot(),partial); + partial.max_passes=100; partial.max_row_visits=trial%3; + equivalent(model.snapshot(),partial); + } +} +void substitution_and_history() { + Model model; auto deleted=model.add_binary(); auto old=model.add_row({{deleted,1}},0,1); + model.remove(old); model.remove(deleted); + auto x=model.add_integer(2,2,"fixed"); auto y=model.add_integer(-2,2,"kept"); + auto row=model.add_row({{x,3},{y,-2}},4,8,"range"); + model.maximize({{x,-3},{y,2}},11); + auto before=model.snapshot(); auto result=presolve_integer(model); + equivalent(before); + assert(model.revision()==before.revision && model.row(row).lower==4 && model.variable(y).lower==-2); + assert(result.model && result.model->variables()[x.id].fixed_value==2); + assert(!result.model->variables()[deleted.id].active && !result.model->rows()[old.id].active); + assert(result.model->reduced().objective.offset==5 && result.model->reduced().objective.sense==ObjectiveSense::Maximize); + assert(result.model->reduced().variables.size()==1 && result.model->reduced().variables[0].name=="kept"); + assert(result.model->variables()[y.id].lower==-1 && result.model->variables()[y.id].upper==1); + auto post=result.model->postsolve(candidate(result.model->reduced(),{0})); + assert(post.exact_witness_validated && post.solution.value(x)==2 && post.solution.value(y)==0 && post.solution.objective==5); + model.set_bounds(y,1,1); + assert(result.model->original().variables[y.id].lower==-2 && post.solution.value(y)==0); + + // Fixed substitution must shift a row that remains a genuine restriction. + Model retained; auto f=retained.add_integer(-2,-2); + auto u=retained.add_integer(0,2); auto v=retained.add_integer(0,2); + auto restricted=retained.add_row({{f,-3},{u,1},{v,1}},7,8,"retained range"); + retained.minimize({{f,-4},{u,2},{v,-1}},-3); + auto mapped=presolve_integer(retained); + assert(mapped.model && mapped.model->rows()[restricted.id].reduced); + assert(mapped.model->rows()[restricted.id].substituted_constant==6); + const auto& private_row=mapped.model->reduced().rows[mapped.model->rows()[restricted.id].reduced->id]; + assert(private_row.lower==1 && private_row.upper==2 && private_row.name=="retained range"); + assert(mapped.model->reduced().objective.offset==5); + equivalent(retained.snapshot()); + PresolveOptions no_passes; no_passes.max_passes=0; + mapped=presolve_integer(retained,no_passes); + assert(mapped.status==PresolveStatus::Incomplete && mapped.model && mapped.passes==0); + assert(mapped.model->rows()[restricted.id].substituted_constant==6); + equivalent(retained.snapshot(),no_passes); + + Model fixed; auto a=fixed.add_integer(1,1); auto b=fixed.add_integer(9007199254740992.0,9007199254740992.0); + fixed.minimize({{a,1},{b,1}},-9007199254740992.0); + auto collapsed=presolve_integer(fixed); + assert(collapsed.model && collapsed.model->reduced().variables.empty()); + assert(collapsed.model->reduced().objective.offset==1); + post=collapsed.model->postsolve(candidate(collapsed.model->reduced(),{})); + assert(post.exact_witness_validated && post.solution.objective==1); + + Model equality; auto e=equality.add_integer(-2,2); equality.add_row({{e,-3}},-3,-3); + equivalent(equality.snapshot()); + auto unique=presolve_integer(equality); + assert(unique.model && unique.fixed_variables==1 && unique.model->variables()[e.id].fixed_value==1); + Model empty; empty.minimize({},-9); equivalent(empty.snapshot()); + empty.add_row({},1,inf); equivalent(empty.snapshot()); + + Model parity; auto p=parity.add_binary(); auto q=parity.add_binary(); auto r=parity.add_binary(); + parity.add_row({{p,2},{q,2},{r,2}},3,3); + auto incomplete_knowledge=presolve_integer(parity); + assert(incomplete_knowledge.status==PresolveStatus::Fixpoint && incomplete_knowledge.model); + assert(enumerate(parity.snapshot()).empty()); // fixpoint is not a feasibility/optimality decision + equivalent(parity.snapshot()); +} +void limits() { + Model model; auto x=model.add_integer(0,10); auto y=model.add_integer(0,10); auto z=model.add_integer(0,10); + model.add_row({{x,1},{y,-1}},-inf,0); model.add_row({{y,1},{z,-1}},-inf,0); model.add_row({{z,1}},-inf,2); + PresolveOptions options; options.max_passes=1; + auto result=presolve_integer(model,options); + assert(result.status==PresolveStatus::Incomplete && result.termination==Termination::IterationLimit && result.model); + assert(result.passes==1 && result.model->variables()[z.id].upper==2 && result.model->variables()[x.id].upper==10); + equivalent(model.snapshot(),options); + options.max_passes=100; options.max_row_visits=1; + result=presolve_integer(model,options); + assert(result.model && result.row_visits==1 && result.status==PresolveStatus::Incomplete); + equivalent(model.snapshot(),options); + options.max_row_visits.reset(); result=presolve_integer(model,options); + assert(result.status==PresolveStatus::Fixpoint && result.passes==4 && result.model->variables()[x.id].upper==2); + options.time_limit_seconds=0; result=presolve_integer(model,options); + assert(result.status==PresolveStatus::Incomplete && result.termination==Termination::TimeLimit && !result.model && !result.infeasible_row); + options.time_limit_seconds=-1; + assert(presolve_integer(model,options).termination==Termination::InvalidModel); + options.time_limit_seconds=inf; options.cancellation=std::make_shared(); options.cancellation->cancel(); + result=presolve_integer(model,options); + assert(result.termination==Termination::Cancelled && !result.model && !result.infeasible_row); +} +void unsupported_and_overflow() { + auto unsupported=[](const Model& model) { + auto result=presolve_integer(model); + assert(result.status==PresolveStatus::Unsupported && result.termination==Termination::Unsupported); + assert(!result.model && !result.infeasible_row); + }; + Model continuous; continuous.add_continuous(0,1); unsupported(continuous); + Model semi; semi.add_variable(VariableType::SemiInteger,2,4); unsupported(semi); + Model unbounded; unbounded.add_integer(0,inf); unsupported(unbounded); + Model fractional; fractional.add_integer(0.25,1); unsupported(fractional); + Model coefficient; auto c=coefficient.add_binary(); coefficient.add_row({{c,0.5}},0,1); unsupported(coefficient); + Model sides; auto s=sides.add_binary(); sides.add_row({{s,1}},0.5,1); unsupported(sides); + Model offset; offset.minimize({},0.5); unsupported(offset); + Model logical; auto b=logical.add_binary(); auto x=logical.add_integer(0,2); + auto indicator=add_indicator(logical,b,true,{{x,1}},1,inf); unsupported(logical); + remove_indicator(logical,indicator.indicator); equivalent(logical.snapshot()); + auto global=add_all_different(logical,{b,x}); unsupported(logical); + logical.remove(global); equivalent(logical.snapshot()); + auto malformed=logical.snapshot(); malformed.variables[0].variable.model_id++; + assert(presolve_integer(malformed).status==PresolveStatus::InvalidModel); + Model product; auto large=product.add_integer(4294967296.0,4294967296.0); + product.add_row({{large,4294967296.0}},-inf,0); unsupported(product); + Model sum; std::vector terms; + for(int i=0;i<4;++i) terms.push_back({sum.add_integer(2147483648.0,2147483648.0),1073741824.0}); + sum.add_row(terms,-inf,0); unsupported(sum); + Model quotient; auto a=quotient.add_integer(0,1); auto y=quotient.add_integer(-2147483647.0,2147483647.0); + auto constant=quotient.add_integer(4294967295.0,4294967295.0); + quotient.add_row({{a,-1},{y,4294967296.0},{constant,1}},-1,inf); + auto division=presolve_integer(quotient); + assert(division.status==PresolveStatus::Unsupported && division.message.find("division")!=std::string::npos && !division.model); + Model export_range; auto small=export_range.add_integer(1,1); + auto big=export_range.add_integer(9007199254740992.0,9007199254740992.0); + export_range.minimize({{small,1},{big,1}}); unsupported(export_range); +} +void postsolve_guards() { + Model model; auto x=model.add_integer(0,2); model.minimize({{x,3}},4); + auto result=presolve_integer(model); const auto& artifact=*result.model; + auto raw=candidate(artifact.reduced(),{1}); raw.values[0]+=4e-7; + auto good=artifact.postsolve(raw); assert(good.exact_witness_validated && good.solution.objective==7); + assert(!good.solution.best_bound && good.solution.termination==Termination::Unknown); + assert(artifact.postsolve(raw,0).solution.termination==Termination::NumericalFailure); + raw=candidate(artifact.reduced(),{1}); raw.model_id++; + assert(artifact.postsolve(raw).solution.termination==Termination::InvalidModel); + raw=candidate(artifact.reduced(),{1}); raw.revision++; + assert(artifact.postsolve(raw).solution.termination==Termination::InvalidModel); + raw=candidate(artifact.reduced(),{1}); raw.active_variables[0]=false; + assert(artifact.postsolve(raw).solution.termination==Termination::InvalidModel); + raw=candidate(artifact.reduced(),{1}); raw.values[0]=std::numeric_limits::quiet_NaN(); + assert(artifact.postsolve(raw).solution.termination==Termination::NumericalFailure); + raw=candidate(artifact.reduced(),{3}); + assert(artifact.postsolve(raw).solution.termination==Termination::NumericalFailure); + raw=candidate(artifact.reduced(),{1}); raw.guarantee=Guarantee::Certified; + assert(artifact.postsolve(raw).solution.termination==Termination::Unsupported); + assert(artifact.postsolve(raw,0.5).solution.termination==Termination::InvalidModel); + Model row_model; auto a=row_model.add_integer(0,2); auto b=row_model.add_integer(0,2); + row_model.add_row({{a,1},{b,1}},-inf,2); + auto rows=presolve_integer(row_model); + auto invalid=rows.model->postsolve(candidate(rows.model->reduced(),{2,2})); + assert(invalid.solution.termination==Termination::NumericalFailure && !invalid.exact_witness_validated && !invalid.solution.has_solution()); + Model future; auto snapshot=future.snapshot(); ++snapshot.model_id; + auto distinct=presolve_integer(snapshot); + assert(distinct.model && distinct.model->reduced().model_id!=snapshot.model_id); +} +} +int main() { + signed_oracles(); substitution_and_history(); limits(); unsupported_and_overflow(); postsolve_guards(); +} diff --git a/test/optimize/presolve_solve.cpp b/test/optimize/presolve_solve.cpp new file mode 100644 index 0000000000..15ee6af820 --- /dev/null +++ b/test/optimize/presolve_solve.cpp @@ -0,0 +1,63 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif +#include +#include +#include +#include + +using namespace Gecode::Optimize; +int main() { + std::size_t solved = 0; + for (bool maximize : {false, true}) for (std::size_t passes : {0U, 100U}) { + Model source; + auto removed = source.add_integer(-3, 3); source.remove(removed); + auto fixed = source.add_integer(2, 2), variable = source.add_integer(-2, 2); + source.add_row({{fixed, 3}, {variable, -2}}, 4, 8, "range"); + source.set_objective({{fixed, -3}, {variable, 2}}, + maximize ? ObjectiveSense::Maximize : ObjectiveSense::Minimize, 11); + PresolveOptions options; options.max_passes = passes; + const auto prepared = presolve_integer(source, options); + assert(prepared.model && prepared.fixed_variables == 1); + assert(prepared.status == (passes ? PresolveStatus::Fixpoint : PresolveStatus::Incomplete)); + const auto saved_revision = source.revision(); + source.set_bounds(variable, 0, 0); // transformation remains historical + for (int backend = 0; backend < 3; ++backend) { + const bool available = backend == 0 ? capabilities(Backend::Highs).available : + backend == 1 ? native_capabilities().available : native_lp_capabilities().available; + if (!available) continue; + SolveOptions solve_options; + solve_options.backend = backend == 0 ? Backend::Highs : Backend::Native; + solve_options.guarantee = backend == 0 ? Guarantee::Numerical : Guarantee::Exact; + SolveResult reduced; + if (backend == 2) { + NativeLpOptions hybrid; hybrid.solve = solve_options; + reduced = solve_native_lp(prepared.model->reduced(), hybrid).result; + } else reduced = solve(prepared.model->reduced(), solve_options); + assert(reduced.termination == Termination::Optimal && reduced.has_solution()); + const auto restored = prepared.model->postsolve(reduced); + assert(restored.exact_witness_validated && restored.solution.has_solution()); + assert(restored.solution.objective == (maximize ? 7 : 3)); + assert(restored.solution.value(fixed) == 2 && restored.solution.value(variable) == (maximize ? 1 : -1)); + assert(restored.solution.model_id == source.id() && restored.solution.revision == saved_revision); + assert(restored.solution.revision != source.revision()); + assert(!restored.solution.active_variables[removed.id] && std::isnan(restored.solution.values[removed.id])); + assert(restored.solution.termination == Termination::Unknown && !restored.solution.best_bound && !restored.solution.absolute_gap); + assert(validate(prepared.model->original(), restored.solution.values, 0, 0).valid); + assert(!validate(source.snapshot(), restored.solution.values, 0, 0).valid); + ++solved; + } + } + // A propagation fixpoint is not a feasibility or optimization result. + Model parity; + const auto x = parity.add_binary(), y = parity.add_binary(), z = parity.add_binary(); + parity.add_row({{x, 2}, {y, 2}, {z, 2}}, 3, 3); + const auto prepared = presolve_integer(parity); + assert(prepared.status == PresolveStatus::Fixpoint && prepared.model); + for (const auto backend : {Backend::Highs, Backend::Native}) if (capabilities(backend).available) { + SolveOptions options; options.backend = backend; + const auto result = solve(prepared.model->reduced(), options); + assert(result.termination == Termination::Infeasible && !result.has_solution()); + } + std::cout << solved << " actual backend solves with exact historical reconstruction pass\n"; +} diff --git a/test/optimize/quadratic.cpp b/test/optimize/quadratic.cpp new file mode 100644 index 0000000000..2cfd3a13d9 --- /dev/null +++ b/test/optimize/quadratic.cpp @@ -0,0 +1,251 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#if __has_include() +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +namespace { +templateclass Expression,class=void>struct Callable:std::false_type{}; +templateclass Expression>struct Callable>>:std::true_type{}; +templateusing LinearCall=decltype(solve(std::declval())); +templateusing NativeCall=decltype(solve_native(std::declval())); +templateusing HybridCall=decltype(solve_native_lp(std::declval())); +templateusing FrontierCall=decltype(solve_native_search(std::declval())); +templateusing PoolCall=decltype(solve_pool(std::declval())); +templateusing RepairCall=decltype(relax_feasibility(std::declval(),RelaxationOptions{})); +templateusing LexCall=decltype(solve_lexicographic(std::declval(),std::vector{})); +templateusing ConflictCall=decltype(analyze_conflict(std::declval())); +templateusing SessionCall=decltype(std::declval().solve(std::declval())); +templateusing ValidateCall=decltype(validate(std::declval(),std::vector{})); +templateusing WriteCall=decltype(write_model(std::declval(),std::string{})); +#if __has_include() +templateusing PresolveCall=decltype(presolve_integer(std::declval())); +#endif +templatevoid type_boundary(){ + static_assert(!Callable::value&&!Callable::value&&!Callable::value,""); + static_assert(!Callable::value&&!Callable::value&&!Callable::value,""); + static_assert(!Callable::value&&!Callable::value&&!Callable::value,""); + static_assert(!Callable::value&&!Callable::value,""); +#if __has_include() + static_assert(!Callable::value,""); +#endif +} +std::size_t solved=0; +void close(double a,double b,double t=1e-6){assert(std::abs(a-b)<=t);} +void optimum(const QuadraticResult& r,double expected){ + if(r.result.termination!=Termination::Optimal)std::cerr<<"Unexpected "<void rejects(F f){bool thrown=false;try{f();}catch(const ModelError&){thrown=true;}assert(thrown);} +// Small exact rational KKT oracle. Test coefficients keep int64 arithmetic bounded. +struct Rat { + std::int64_t n=0,d=1; + Rat(std::int64_t a=0,std::int64_t b=1):n(a),d(b){assert(b);if(d<0){n=-n;d=-d;}auto g=std::gcd(n,d);n/=g;d/=g;} + double value()const{return double(n)/d;} +}; +Rat operator+(Rat a,Rat b){return {a.n*b.d+b.n*a.d,a.d*b.d};} +Rat operator-(Rat a,Rat b){return {a.n*b.d-b.n*a.d,a.d*b.d};} +Rat operator*(Rat a,Rat b){return {a.n*b.n,a.d*b.d};} +Rat operator/(Rat a,Rat b){return {a.n*b.d,a.d*b.n};} +bool operator<(Rat a,Rat b){return a.n*b.d& rows){ + const Rat q00=2*(1+a*a),q01=2*a*b,q11=2*(1+b*b),p0=2*a*c+d,p1=2*b*c+e; + std::vector points; + const auto det=q00*q11-q01*q01; + points.push_back({(q01*p1-q11*p0)/det,(q01*p0-q00*p1)/det}); + for(const auto& r:rows){ + Point base=r.x?Point{Rat(r.b,r.x),0}:Point{0,Rat(r.b,r.y)}; + const Rat tx=-r.y,ty=r.x; + const Rat curvature=q00*tx*tx+Rat(2)*q01*tx*ty+q11*ty*ty; + const Rat slope=tx*(q00*base.x+q01*base.y+p0)+ty*(q01*base.x+q11*base.y+p1); + const Rat t=(Rat(0)-slope)/curvature;points.push_back({base.x+t*tx,base.y+t*ty}); + } + for(std::size_t i=0;i best; + for(auto p:points){bool feasible=true;for(auto r:rows)feasible &= Rat(r.x)*p.x+Rat(r.y)*p.y<=Rat(r.b);if(!feasible)continue; + const auto z=Rat(a)*p.x+Rat(b)*p.y+Rat(c); + const auto f=p.x*p.x+p.y*p.y+z*z+Rat(d)*p.x+Rat(e)*p.y; + if(!best||f<*best)best=f; + } + assert(best);return *best; +} +#ifdef GECODE_QUADRATIC_TEST_HOOKS +int fake=0; +std::string cancel_event; +std::string throw_event; +std::shared_ptr token; +#endif +} +#ifdef GECODE_QUADRATIC_TEST_HOOKS +namespace Gecode{namespace Optimize{namespace Detail{ +double quadratic_test_regularization=0; +void quadratic_test_event(const char* event){if(cancel_event==event&&token)token->cancel();if(throw_event==event)throw std::bad_alloc();} +bool quadratic_test_oracle(const QuadraticSnapshot& q,const QuadraticOptions&,QuadraticRaw& raw){ + if(!fake)return false; + raw.model_id=q.id();raw.revision=q.revision();for(auto& v:q.variables())raw.active_variables.push_back(v.active); + raw.values.assign(q.variables().size(),0);raw.residual_values.assign(q.squares().size(),0); + raw.row_duals.assign(q.rows().size(),0);raw.column_duals.assign(q.variables().size(),0); + raw.value_valid=true;raw.dual_valid=true;raw.objective=q.linear_part().offset;raw.termination=Termination::Optimal; + if(fake==2)raw.values[0]=0.25; + if(fake==3)++raw.model_id; + if(fake==4)++raw.revision; + if(fake==5)raw.active_variables.clear(); + if(fake==6)raw.objective=1; + if(fake==7)raw.residual_values[0]=1; + if(fake==8)raw.column_duals[0]=1; + if(fake==9)raw.dual_valid=false; + if(fake==10){raw.termination=Termination::Infeasible;raw.value_valid=false;} + if(fake==11)raw.termination=Termination::Unbounded; + if(fake==12)raw.termination=Termination::IterationLimit; + if(fake==13)raw.objective=std::numeric_limits::quiet_NaN(); + if(fake==14)raw.values[0]=std::numeric_limits::quiet_NaN(); + if(fake==15){raw.values[0]=1;raw.residual_values[0]=1;raw.objective=q.linear_part().offset+1;raw.column_duals[0]=2;} + return true; +} +}}} +#endif +int main(){ + type_boundary();type_boundary(); + static_assert(!std::is_convertible::value,""); + static_assert(!std::is_convertible::value,""); + using Ordinary=SolveResult(*)(const ModelSnapshot&,const SolveOptions&); + static_assert(!std::is_invocable::value,""); + static_assert(!std::is_constructible::value,""); + QuadraticModel m;const auto x=m.add_continuous(-2,2);const auto dead=m.add_continuous(-1,1);m.remove(dead); + m.minimize_squares({{{{x,2},{x,-1},{x,0}},0,1,"square"}}); + const auto historical=m.snapshot();const auto rev=m.revision();assert(historical.squares()[0].terms[0].coefficient==1); + rejects([&]{m.remove(x);});assert(m.revision()==rev); + rejects([&]{m.minimize_squares({{{{x,1}},0,-1,""}});});assert(m.revision()==rev); + rejects([&]{m.add_continuous(0,std::numeric_limits::infinity());});assert(m.revision()==rev); + QuadraticModel foreign;auto alien=foreign.add_continuous(-1,1); + rejects([&]{m.minimize_squares({{{{alien,1}},0,1,""}});});assert(m.revision()==rev); + m.minimize_squares({{{{x,1}},-1,1,""}});assert(m.revision()==rev+1);assert(historical.squares()[0].offset==0); + auto snap=historical;auto moved_snapshot=std::move(snap);assert(snap.id()==moved_snapshot.id()); + QuadraticModel moved=std::move(m);assert(m.id()==0);rejects([&]{m.snapshot();});assert(moved.id()==historical.id()); + auto check=validate_quadratic(historical,{0,std::numeric_limits::quiet_NaN()});assert(check.primal_valid&&check.objective_valid); + assert(!validate_quadratic(historical,{3,0}).primal_valid); + QuadraticOptions o;o.solve.time_limit_seconds=0;assert(solve_quadratic(historical,o).result.termination==Termination::TimeLimit); + o={};o.solve.cancellation=std::make_shared();o.solve.cancellation->cancel();assert(solve_quadratic(historical,o).result.termination==Termination::Cancelled); + o={};o.optimality_tolerance=-1;assert(solve_quadratic(historical,o).result.termination==Termination::InvalidModel); + for(int k=0;k<5;++k){o={};if(k==0)o.solve.backend=Backend::Native;if(k==1)o.solve.guarantee=Guarantee::Exact;if(k==2)o.solve.node_limit=0;if(k==3)o.solve.threads=2;if(k==4)o.solve.primal_start={{x,0}};assert(solve_quadratic(historical,o).result.termination==Termination::Unsupported);} + const int rounding=std::fegetround();assert(std::fesetround(FE_DOWNWARD)==0);assert(solve_quadratic(historical).result.termination==Termination::Unsupported);assert(std::fesetround(rounding)==0); +#ifdef GECODE_QUADRATIC_TEST_HOOKS + QuadraticModel fm;auto fx=fm.add_continuous(-2,2);fm.minimize_squares({{{{fx,1}},0,1,""}}); + for(fake=1;fake<=14;++fake){auto r=solve_quadratic(fm);if(fake==1)optimum(r,0);else if(fake==12){assert(r.result.termination==Termination::IterationLimit);assert(r.result.has_solution());}else assert(r.result.termination==Termination::NumericalFailure);} + // Large constants cannot make a nonoptimal point pass the closure/KKT gate. + fm.minimize_squares({{{{fx,1}},0,1,""}},{},1e16);fake=15;assert(solve_quadratic(fm).result.termination==Termination::NumericalFailure); + fake=1; + for(const char* name:{"after_preflight","after_validation"}){token=std::make_shared();cancel_event=name;o={};o.solve.cancellation=token;auto r=solve_quadratic(fm,o);assert(r.result.termination==Termination::Cancelled);assert(!r.result.has_solution());assert(!r.checks.bound_valid);} + cancel_event.clear();token.reset();fake=0; + fake=1;throw_event="after_validation";const auto failed=solve_quadratic(fm); + assert(failed.result.termination==Termination::MemoryLimit&&!failed.result.has_solution()); + assert(failed.result.model_id==fm.id()&&failed.result.revision==fm.revision());throw_event.clear();fake=0; +#endif + if(!quadratic_capabilities().available){auto r=solve_quadratic(historical);assert(r.result.termination==Termination::Unsupported);assert(!r.result.has_solution());std::cout<<"quadratic foundation/backend-off passed\n";return 0;} + optimum(solve_quadratic(historical),0);optimum(solve_quadratic(moved),0); + const auto old_result=solve_quadratic(historical);close(old_result.result.value(x),0);rejects([&]{old_result.result.value(dead);});rejects([&]{old_result.result.value(alien);}); + std::mt19937 rng(119); +#ifdef GECODE_QUADRATIC_TEST_HOOKS + unsigned perturbed_accepted=0,perturbed_rejected=0; +#endif + for(int k=0;k<180;++k){ + const int a=int(rng()%5)-2,b=int(rng()%5)-2,c=int(rng()%5)-2,d=int(rng()%5)-2,e=int(rng()%5)-2; + std::vector rows={{1,0,2},{-1,0,2},{0,1,2},{0,-1,2},{1,1,1},{-1,2,2}}; + const auto exact=oracle(a,b,c,d,e,rows); + for(int sense=0;sense<2;++sense){QuadraticModel q;auto u=q.add_continuous(-2,2),v=q.add_continuous(-2,2); + for(std::size_t i=4;i::infinity(),rows[i].b); + std::vector squares={{{{u,1}},0,1,"x"},{{{v,1}},0,1,"y"},{{{u,double(a)},{v,double(b)}},double(c),1,"coupled"}}; + if(sense)q.maximize_concave_squares(squares,{{u,double(-d)},{v,double(-e)}},7);else q.minimize_squares(squares,{{u,double(d)},{v,double(e)}},7); + optimum(solve_quadratic(q),7+(sense?-1:1)*exact.value()); +#ifdef GECODE_QUADRATIC_TEST_HOOKS + Detail::quadratic_test_regularization=1e-7; + const auto perturbed=solve_quadratic(q); + if(perturbed.result.termination==Termination::Optimal){ + close(*perturbed.result.objective,7+(sense?-1:1)*exact.value()); + assert(perturbed.checks.kkt_valid&&perturbed.checks.bound_valid);++perturbed_accepted; + }else{ + assert(perturbed.result.termination==Termination::NumericalFailure || perturbed.result.termination==Termination::IterationLimit); + ++perturbed_rejected; + } + Detail::quadratic_test_regularization=0; +#endif + } + } + // Singular, equality-constrained, constant, fixed, and ill-conditioned cases. + for(int k=0;k<6;++k){QuadraticModel q;auto u=q.add_continuous(-4,4),v=q.add_continuous(-4,4); + if(k==0)q.minimize_squares({{{{u,1},{v,1}},-2,1,"rank-one"}}); + if(k==1){q.minimize_squares({{{{u,1}},0,1,""},{{{v,1}},0,1,""}});q.add_row({{u,1},{v,1}},2,2);} + if(k==2)q.minimize_squares({{{},3,2,"constant"}}); + if(k==3){q.set_bounds(u,2,2);q.minimize_squares({{{{u,1}},0,1,""}});} + if(k==4)q.minimize_squares({{{{u,1}},-1,1e-6,""},{{{v,1}},-2,1e6,""}}); + if(k==5)q.minimize_squares({},{{u,1}},5); + optimum(solve_quadratic(q),k==1?2:k==2?18:k==3?4:k==5?1:0); + } + QuadraticModel empty;empty.minimize_squares({}, {}, 7);optimum(solve_quadratic(empty),7); + QuadraticModel constant_only;constant_only.minimize_squares({{{},3,2,"constant"}}); + optimum(solve_quadratic(constant_only),18); + for(int variant=0;variant<3;++variant){ + QuadraticModel q;auto a=q.add_continuous(-3,3),b=q.add_continuous(-3,3); + q.add_row({{a,1},{b,1}},1,1); + std::vector squares={{{{a,1}},0,1,"a"},{{{b,1}},0,1,"b"}}; + if(variant==1)squares[0].terms[0].coefficient=-1; + if(variant==2){squares[0].weight=0.5;squares.push_back(squares[0]);} + q.minimize_squares(squares);optimum(solve_quadratic(q),0.5); + } + QuadraticModel offset_model;auto offset_x=offset_model.add_continuous(-1,1); + offset_model.minimize_squares({{{{offset_x,1}},-1,1,""}}, {{offset_x,2}}, 1e16); + const auto offset_result=solve_quadratic(offset_model);optimum(offset_result,1e16); + assert(*offset_result.result.absolute_gap>=1); + assert(*offset_result.checks.gap_upper_bound<=1e-6); + assert(*offset_result.result.best_bound<*offset_result.result.objective); + empty.add_row({},1,2);auto infeasible=solve_quadratic(empty);assert(infeasible.result.termination==Termination::Infeasible&&!infeasible.result.has_solution()); + QuadraticModel bad;auto u=bad.add_continuous(-1,1);bad.minimize_squares({{{{u,1}},0,1,""}});bad.add_row({{u,1}},2,3);assert(solve_quadratic(bad).result.termination==Termination::Infeasible); + QuadraticModel tiny;tiny.minimize_squares({{{},0,1e-15,""}});assert(solve_quadratic(tiny).result.termination==Termination::Unsupported); + o={};o.max_auxiliary_variables=0;assert(solve_quadratic(historical,o).result.termination==Termination::Unsupported); + o={};o.max_lifted_nonzeros=0;assert(solve_quadratic(historical,o).result.termination==Termination::Unsupported); + o={};o.iteration_limit=0;auto limited=solve_quadratic(moved,o);assert(limited.result.termination==Termination::IterationLimit || limited.result.termination==Termination::Optimal); +#ifdef GECODE_QUADRATIC_TEST_HOOKS + std::cout<<"regularization exact-oracle acceptance: zero360/360, vendor default "<();cancel_event=name;o={};o.solve.cancellation=token;auto r=solve_quadratic(moved,o);assert(r.result.termination==Termination::Cancelled);assert(!r.result.has_solution());} +#endif + std::cout<<"quadratic: "< +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +using namespace Gecode::Optimize::Detail; +namespace { +// Independent exact signed dyadic reference: arbitrary-width base-2^32 integer. +// No floating arithmetic is used to compare the exact sum/product with endpoints. +struct Dyadic { + int sign=0, exponent=0; + std::vector words; + explicit Dyadic(double d=0) { + assert(std::isfinite(d));std::uint64_t bits;std::memcpy(&bits,&d,8); + const auto e=(bits>>52)&2047, fraction=bits&((std::uint64_t{1}<<52)-1); + const auto mantissa=e?fraction+(std::uint64_t{1}<<52):fraction; + if(!mantissa)return; + sign=(bits>>63)?-1:1;exponent=e?static_cast(e)-1023-52:-1074; + words={static_cast(mantissa),static_cast(mantissa>>32)};trim(); + } + void trim(){while(!words.empty()&&!words.back())words.pop_back();if(words.empty())sign=0;} + std::vector shifted(int shift)const { + assert(shift>=0);if(!sign)return {}; + std::vector out(words.size()+shift/32+1,0); + const unsigned r=shift%32;std::uint64_t carry=0; + for(std::size_t i=0;i(z);carry=z>>32;} + out[words.size()+shift/32]=static_cast(carry);while(!out.empty()&&!out.back())out.pop_back();return out; + } +}; +int magcmp(const std::vector& a,const std::vector& b){ + if(a.size()!=b.size())return a.size()(z);c=z>>32;}out.words[n]=static_cast(c); + }else{if(magcmp(x,y)<0){x.swap(y);out.sign=b.sign;}y.resize(x.size());out.words.resize(x.size());std::uint64_t borrow=0; + for(std::size_t i=0;i(std::uint64_t(x[i])-sub);borrow=std::uint64_t(x[i])(v);carry=v>>32;}out.words[i+b.words.size()]=static_cast(carry);}out.trim();return out; +} +void enclosed(QpInterval interval,const Dyadic& exact){assert(compare(Dyadic(interval.lower),exact)<=0);assert(compare(Dyadic(interval.upper),exact)>=0);} +} +int main(){ +#if defined(__FAST_MATH__) || defined(GECODE_QUADRATIC_EXPECT_UNSUPPORTED_ARITHMETIC) + assert(!quadratic_arithmetic_supported()); + QuadraticModel m;auto x=m.add_continuous(-1,1);m.minimize_squares({{{{x,1}},0,1,""}}); + assert(!quadratic_bound(m.snapshot(),{0},{0},{}).normalized_lower); + std::cout<<"quadratic fast-math proof boundary rejected\n";return 0; +#else + assert(quadratic_arithmetic_supported());std::mt19937_64 rng(813);std::size_t checked=0; + for(int i=0;i<12000;++i){ + const double a=std::ldexp(double(static_cast(rng()%2000001)-1000000),int(rng()%2050)-1074); + const double b=std::ldexp(double(static_cast(rng()%2000001)-1000000),int(rng()%2050)-1074); + if(!std::isfinite(a)||!std::isfinite(b))continue; + try{enclosed(qp_add(qp_point(a),qp_point(b)),add(Dyadic(a),Dyadic(b)));++checked;}catch(const std::overflow_error&){} + try{enclosed(qp_multiply(qp_point(a),qp_point(b)),multiply(Dyadic(a),Dyadic(b)));++checked;}catch(const std::overflow_error&){} + } + const double tiny=std::numeric_limits::denorm_min(); + enclosed(qp_multiply(qp_point(tiny),qp_point(0.5)),multiply(Dyadic(tiny),Dyadic(0.5))); + enclosed(qp_add(qp_point(1e16),qp_point(1)),add(Dyadic(1e16),Dyadic(1))); + enclosed(qp_add(qp_point(-1e16),qp_point(-1)),add(Dyadic(-1e16),Dyadic(-1))); + for(int k=0;k<400;++k){ + QuadraticModel m;const double lo=-3,hi=4; + auto x=m.add_continuous(lo,hi);const double a=int(rng()%9)-4,b=int(rng()%9)-4,w=1+int(rng()%4),t=int(rng()%11)-5; + const double c=int(rng()%9)-4,d=int(rng()%9)-4; + m.minimize_squares({{{{x,a}},b,w,""}},{{x,c}},1e16); + m.add_row({{x,2}},-4,6);const auto q=m.snapshot(); + const auto got=quadratic_bound(q,{1},{t},{d});assert(got.normalized_lower&&got.gap_upper); + // Exact tangent/row bound formula for this one-variable instance. + const double residual=c+2*w*t*a-2*d; + const double constant=2*w*t*b-w*t*t+d*(d>=0?-4:6); + auto exact=add(Dyadic(1e16),add(Dyadic(constant),multiply(Dyadic(residual),Dyadic(residual>=0?lo:hi)))); + assert(compare(Dyadic(*got.normalized_lower),exact)<=0); + const double primal=c+w*(a+b)*(a+b); + const double dual=constant+residual*(residual>=0?lo:hi); + assert(compare(Dyadic(*got.gap_upper),Dyadic(primal-dual))>=0); + // Also check the claimed global bound at every feasible integer point. + for(int value=-2;value<=3;++value){auto objective=add(Dyadic(1e16),Dyadic(c*value+w*(a*value+b)*(a*value+b)));assert(compare(Dyadic(*got.normalized_lower),objective)<=0);} + } + QuadraticModel m;auto x=m.add_continuous(-1,1);m.minimize_squares({{{{x,1}},0,1,""}});const auto q=m.snapshot(); + const int old=std::fegetround();assert(std::fesetround(FE_UPWARD)==0);assert(!quadratic_arithmetic_supported());assert(!quadratic_bound(q,{0},{0},{}).normalized_lower);assert(std::fesetround(old)==0); + assert(!quadratic_bound(q,{0},{std::numeric_limits::infinity()},{}).normalized_lower); + assert(!quadratic_bound(q,{0},{1e308},{}).normalized_lower); + SolveOptions o;o.time_limit_seconds=0;SolveBudget budget(o);assert(!quadratic_bound(q,{0},{0},{},&budget).normalized_lower); + std::cout<<"quadratic bound: "< +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Gecode::Optimize; +using I=std::int64_t; +using Word=std::vector; +namespace { +std::size_t configurations=0,assignments=0,solves=0; +// Generate the finite accepted language from labeled paths. This never looks +// up the next transition by a proposed word and never uses the common checker. +std::set language(const RegularData& data) { + std::set accepted;Word word; + const auto visit=[&](const auto& self,std::uint64_t state)->void { + if(word.size()==data.variables.size()){ + if(std::find(data.final_states.begin(),data.final_states.end(),state)!=data.final_states.end())accepted.insert(word); + return; + } + for(const auto& edge:data.transitions)if(edge.from==state){word.push_back(edge.symbol);self(self,edge.to);word.pop_back();} + };visit(visit,data.initial_state);return accepted; +} +I objective(const ModelSnapshot& model,const std::vector& point) { + I result=static_cast(model.objective.offset); + for(const auto& term:model.objective.terms)result+=static_cast(term.coefficient)*static_cast(point[term.variable.id]); + return result; +} +std::vector> points(const ModelSnapshot& model,const RegularData& data) { + const auto accepted=language(data);std::vector> feasible; + std::vector point(model.variables.size(),std::numeric_limits::quiet_NaN()); + const auto visit=[&](const auto& self,std::size_t index)->void { + if(index(variable.lower),upper=static_cast(variable.upper); + assert(upper-lower<=5); + for(I value=lower;value<=upper;++value)if(value>=variable.lower||(variable.type==VariableType::SemiInteger&&value==0)){point[index]=value;self(self,index+1);} + return; + } + Word word;for(auto variable:data.variables)word.push_back(static_cast(point[variable.id])); + const bool expected=accepted.count(word)!=0;const auto checked=validate(model,point,0,0); + assert(checked.valid==expected);++assignments; + if(expected){assert(checked.objective==objective(model,point));feasible.push_back(point);} + };visit(visit,0);++configurations;return feasible; +} +void checked_result(const ModelSnapshot& model,const RegularData& data,const SolveResult& result, + const std::vector>& feasible,bool complete) { + assert(result.model_id==model.model_id&&result.revision==model.revision); + if(result.has_solution()){ + assert(result.solution_validated&&result.guarantee==Guarantee::Exact); + assert(result.values.size()==model.variables.size()&&result.active_variables.size()==model.variables.size()); + for(std::size_t i=0;i(result.values[variable.id])); + assert(language(data).count(word));assert(result.objective==objective(model,result.values)); + } + std::optional best; + for(const auto& point:feasible){auto value=objective(model,point);if(!best||(model.objective.sense==ObjectiveSense::Minimize?value<*best:value>*best))best=value;} + if(result.best_bound&&best)assert(model.objective.sense==ObjectiveSense::Minimize?*result.best_bound<=*best:*result.best_bound>=*best); + if(complete){ + assert(result.termination==(best?Termination::Optimal:Termination::Infeasible)); + assert(result.has_solution()==bool(best));if(best)assert(result.objective==*best&&result.best_bound==*best); + } +} +void solve_routes(const ModelSnapshot& model,const RegularData& data,const std::vector>& feasible,bool limits=false) { + SolveOptions options;options.backend=Backend::Native;options.guarantee=Guarantee::Exact; + if(!native_capabilities().available){auto result=solve_native(model,options);assert(result.termination==Termination::Unsupported&&!result.has_solution());++solves;return;} + auto result=solve_native(model,options);checked_result(model,data,result,feasible,true);++solves; + NativeSearchOptions search;search.solve=options; + for(auto strategy:{NativeSearchOrder::DepthFirst,NativeSearchOrder::BestBound}){ + search.order=strategy;auto solved=solve_native_search(model,search);checked_result(model,data,solved.result,feasible,true);++solves; + if(limits)for(std::uint64_t cap=0;cap<=solved.frontier.admitted_nodes+1;++cap){search.solve.node_limit=cap;auto stopped=solve_native_search(model,search);checked_result(model,data,stopped.result,feasible,false);search.solve.node_limit.reset();++solves;} + } + if(native_lp_capabilities().available){NativeLpOptions lp;lp.solve=options;auto solved=solve_native_lp(model,lp);checked_result(model,data,solved.result,feasible,true);++solves;} + for(const auto& point:feasible){options.primal_start.clear();for(const auto& variable:model.variables)if(variable.active)options.primal_start.push_back({variable.variable,point[variable.variable.id]}); + auto started=solve_native(model,options);assert(started.start_submitted==!options.primal_start.empty());checked_result(model,data,started,feasible,true);++solves;if(!limits)break; + } +} +void exhaustive(){ + // Every partial deterministic transition function on two states and signed + // alphabet {-1,1}, every initial/final set, word lengths zero through three. + for(unsigned code=0;code<81;++code)for(unsigned initial=0;initial<2;++initial)for(unsigned final=0;final<4;++final)for(unsigned size=0;size<=3;++size){ + Model model;RegularData data;data.state_count=2;data.initial_state=initial; + for(unsigned i=0;i::max(); + RegularData sparse_data{{a},huge,huge-2,{{huge-2,-1,huge-2},{2,1,3}},{huge-2,huge-2,huge-3}}; + sparse.add_global(sparse_data);sparse.minimize({{a,1}});auto s=sparse.snapshot();solve_routes(s,sparse_data,points(s,sparse_data),true); + // Zero is a real typed state and symbol; missing transitions reject. + Model zero;auto z=zero.add_binary();RegularData zdata{{z},1,0,{{0,0,0}},{0}};zero.add_global(zdata); + auto zs=zero.snapshot();solve_routes(zs,zdata,points(zs,zdata),true); + SolveOptions opts;opts.backend=Backend::Native;opts.guarantee=Guarantee::Exact;opts.primal_start={{z,1}}; + assert(solve_native(zero,opts).termination==(native_capabilities().available?Termination::InvalidModel:Termination::Unsupported)); + for(int stop=0;stop<3;++stop){opts.primal_start={{z,0}};if(stop==0)opts.node_limit=0;if(stop==1){opts.node_limit.reset();opts.time_limit_seconds=0;} + if(stop==2){opts.time_limit_seconds=std::numeric_limits::infinity();opts.cancellation=std::make_shared();opts.cancellation->cancel();} + const auto result=solve_native(zero,opts);assert(!result.start_submitted&&!result.has_solution()); + } + const auto zpoints=points(zs,zdata); + std::vector> jobs;for(int i=0;i<4;++i)jobs.push_back(std::async(std::launch::async,[zs,zdata,zpoints]{SolveOptions o;o.backend=Backend::Native;o.guarantee=Guarantee::Exact;auto r=solve_native(zs,o);if(native_capabilities().available)checked_result(zs,zdata,r,zpoints,true);})); + for(auto& job:jobs)job.get(); +} +void invalid(){ + Model model;const auto x=model.add_integer(0,1);RegularData valid{{x},2,0,{{0,0,1}},{1}}; + const auto reject=[&](RegularData data){const auto before=model.revision();bool failed=false;try{model.add_global(data);}catch(const ModelError&){failed=true;}assert(failed&&model.revision()==before&&model.snapshot().globals.empty());++configurations;}; + auto data=valid;data.state_count=0;reject(data);data=valid;data.initial_state=2;reject(data); + data=valid;data.transitions[0].from=2;reject(data);data=valid;data.transitions[0].to=2;reject(data); + data=valid;data.final_states={2};reject(data);data=valid;data.transitions.push_back(data.transitions[0]);reject(data); + data.transitions.back().to=0;reject(data);data=valid;data.transitions[0].symbol=9007199254740993LL;reject(data); + Model other;auto foreign=other.add_binary();data=valid;data.variables={foreign};reject(data); + auto dead=model.add_integer(0,1);model.remove(dead);data=valid;data.variables={dead};reject(data); + auto continuous=model.add_continuous(0,1);data=valid;data.variables={continuous};reject(data); + model.add_global(valid);auto snapshot=model.snapshot(); + for(int failure=0;failure<6;++failure){auto corrupt=snapshot;auto& original=std::get(corrupt.globals[0].payload); + if(failure==0)original.initial_state=2;if(failure==1)original.transitions.push_back(original.transitions[0]); + if(failure==2)original.final_states={2};if(failure==3)original.variables={foreign};if(failure==4)original.variables={dead}; + if(failure==5){corrupt.globals[0].active=false;original.variables.clear();original.state_count=0;} + bool failed=false;try{validate_structure(corrupt);}catch(const ModelError&){failed=true;}assert(failed);++configurations; + assert(solve_native(corrupt).termination==Termination::InvalidModel); + } + // Exact public constants can exceed native symbols even for an empty word; + // unused transitions do not bypass full native admission. + for(bool empty:{false,true}){Model large;auto v=large.add_integer(0,0); + RegularData wide{empty?std::vector{}:std::vector{v},1,0,{{0,0,0},{0,9007199254740992LL,0}},{0}}; + large.add_global(wide);assert(validate(large.snapshot(),{0},0,0).valid); + assert(solve_native(large).termination==Termination::Unsupported); + } +} +void combined_original(){ + Model model;auto x=model.add_binary(),y=model.add_binary(),b=model.add_binary(); + RegularData data{{x,y},3,0,{{0,0,1},{0,1,2},{1,0,1},{1,1,1},{2,0,1}},{1}}; + model.add_global(data);add_all_different(model,{x,y}); + model.add_row({{x,1},{y,1}},1,std::numeric_limits::infinity()); + const auto indicator=add_indicator(model,b,true,{{x,1}},1,std::numeric_limits::infinity()); + assert(indicator.inactive_gate);model.maximize({{x,-2},{y,1},{b,4}},-3); + const auto snapshot=model.snapshot();std::vector> feasible; + for(int xv=0;xv<=1;++xv)for(int yv=0;yv<=1;++yv)for(int bv=0;bv<=1;++bv)for(int gate=0;gate<=1;++gate){ + std::vector point(snapshot.variables.size());point[x.id]=xv;point[y.id]=yv;point[b.id]=bv;point[indicator.inactive_gate->id]=gate; + const bool expected=!(xv&&yv)&&xv!=yv&&xv+yv>=1&&(!bv||xv==1)&&gate==1-bv; + assert(validate(snapshot,point,0,0).valid==expected);++assignments;if(expected)feasible.push_back(point); + } + ++configurations;solve_routes(snapshot,data,feasible,true); + if(native_capabilities().available){ + NativeSearchOptions options;options.solve.backend=Backend::Native;options.solve.guarantee=Guarantee::Exact; + options.branching=NativeBranchingSettings{}; + if(native_lp_capabilities().available)options.relaxation=NativeLpSettings{}; + const auto searched=solve_native_search(snapshot,options);checked_result(snapshot,data,searched.result,feasible,true);++solves; + } +} +void cross_boundaries(){ + Model model;auto dead=model.add_binary();model.remove(dead);auto x=model.add_integer(-1,1); + RegularData data{{x},1,0,{{0,-1,0},{0,1,0}},{0}}; + const auto handle=model.add_global(data);model.minimize({{x,1}},2); + const auto snapshot=model.snapshot();const auto feasible=points(snapshot,data);solve_routes(snapshot,data,feasible,true); + auto automatic=solve(snapshot);if(native_capabilities().available){assert(automatic.backend=="Gecode native");assert(automatic.objective==1);}else assert(automatic.termination==Termination::Unsupported); + SolveOptions highs;highs.backend=Backend::Highs; + assert(solve(snapshot,highs).termination==Termination::Unsupported); + assert(analyze_conflict(snapshot).status==ConflictStatus::Unsupported); + assert(presolve_integer(snapshot).status==PresolveStatus::Unsupported); + assert(relax_feasibility(snapshot).termination==Termination::Unsupported); + SolveSession session;assert(session.solve(snapshot).termination==Termination::Unsupported); + const auto path=std::filesystem::temp_directory_path()/("gecode-regular-"+std::to_string(std::chrono::steady_clock::now().time_since_epoch().count())+".lp"); + {std::ofstream out(path);out<<"unchanged destination";} + bool rejected=false;try{write_model(snapshot,path.string());}catch(const ModelError&){rejected=true;}assert(rejected); + {std::ifstream in(path);std::string contents((std::istreambuf_iterator(in)),{});assert(contents=="unchanged destination");} + std::filesystem::remove(path); + // The original word is rechecked after numerical rounding, with no row-only + // shortcut; exact native start admission never rounds a near-integer hint. + assert(validate(snapshot,{0,-1.0000001},1e-6,1e-6).valid); + assert(!validate(snapshot,{0,0},0,0).valid); + SolveOptions start;start.backend=Backend::Native;start.guarantee=Guarantee::Exact;start.primal_start={{x,-1.0000001}}; + assert(solve_native(snapshot,start).termination==(native_capabilities().available?Termination::InvalidModel:Termination::Unsupported)); + model.remove(handle);model.minimize({});model.remove(x);validate_structure(model.snapshot()); + const auto id=model.id();Model moved(std::move(model));assert(moved.id()==id);validate_structure(moved.snapshot()); + assert(snapshot.globals[0].active&&snapshot.variables[x.id].active); +} +void size_boundaries(){ + const auto okay=[](std::uint64_t w,std::uint64_t q,std::uint64_t t,std::uint64_t a,bool small=false){return Detail::native_regular_size_error(w,q,t,a,small)==nullptr;}; + constexpr auto imax=static_cast(std::numeric_limits::max()); + constexpr auto umax=static_cast(std::numeric_limits::max()); + assert(okay(imax-1,1,0,0));assert(!okay(imax,1,0,0));assert(okay(0,imax-1,0,0));assert(!okay(0,imax,0,0)); + assert(okay(0,1,imax-1,0));assert(!okay(0,1,imax,0));assert(!okay(0,0,0,0)); + assert(okay(1,imax/2,0,0));assert(!okay(1,imax/2+1,0,0)); + assert(okay(100000,1,umax/100000,1));assert(!okay(100000,1,umax/100000+1,1)); + const auto hash=imax/2+1;assert(okay(0,1,hash-1,hash-1));assert(!okay(0,1,hash,hash)); + const auto short_max=std::numeric_limits::max();assert(okay(1,1,short_max,short_max,true));assert(!okay(1,1,std::uint64_t(short_max)+1,std::uint64_t(short_max)+1,true)); + assert(!okay(std::numeric_limits::max(),1,0,0)); + // This concrete alphabet fits int16 values but has 65536 possible supports. + // Do not enter the native graph's ushort support-count overflow. + Model model;auto x=model.add_integer(0,0);RegularData data{{x},1,0,{},{0}}; + for(I symbol=std::numeric_limits::min();symbol<=std::numeric_limits::max();++symbol)data.transitions.push_back({0,symbol,0}); + model.add_global(data);assert(validate(model.snapshot(),{0},0,0).valid); + auto result=solve_native(model);assert(result.termination==Termination::Unsupported); + if(native_capabilities().available)assert(result.message.find("short-symbol")!=std::string::npos); +} +} +int main(){size_boundaries();exhaustive();variants_and_history();invalid();combined_original();cross_boundaries();std::cout< +#include +#include +#include +#include +#define OK(call) do {int32_t code=(call);if(code)fprintf(stderr,"%s: %s\n",#call,gecode_opt_v1_last_error());assert(code==GECODE_OPT_OK);}while(0) +static gecode_opt_regular_transition_v1 edge(uint64_t from,int64_t symbol,uint64_t to) { + gecode_opt_regular_transition_v1 out;memset(&out,0,sizeof(out));out.struct_size=sizeof(out);out.from=from;out.symbol=symbol;out.to=to;return out; +} +static int accepted(int x,int y,int z) { + /* This language is exactly signed words with an even count of +1 symbols. */ + return (x==-1||x==1)&&(y==-1||y==1)&&(z==-1||z==1)&&((x==1)+(y==1)+(z==1))%2==0; +} +int main(void) { + int32_t native=0,lp=0,mip=0,maximize; + OK(gecode_opt_v1_capabilities(GECODE_OPT_NATIVE,&native,&lp,&mip)); + for(maximize=0;maximize<2;++maximize) { + gecode_opt_handle model=0,foreign_model=0,result=0,rejected=0; + gecode_opt_id vars[3],dead,foreign,global,row,other,bad,out; + gecode_opt_regular_transition_v1 edges[4],duplicate[2];uint64_t finals[2]={0,0},owner,revision,after; + gecode_opt_term terms[3];gecode_opt_options_v1 options;gecode_opt_result_info_v1 info; + int x,y,z,found=0,best=0;double value=0;int32_t present=0;size_t i; + char label[]="parity"; + edges[0]=edge(0,-1,0);edges[1]=edge(0,1,1);edges[2]=edge(1,-1,1);edges[3]=edge(1,1,0); + OK(gecode_opt_v1_model_create(&model));OK(gecode_opt_v1_model_create(&foreign_model)); + for(i=0;i<3;++i){OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,-1,1,"",&vars[i]));terms[i].variable=vars[i];terms[i].coefficient=1;} + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,1,"deleted",&dead));OK(gecode_opt_v1_model_remove_variable(model,dead)); + OK(gecode_opt_v1_model_add_variable(foreign_model,GECODE_OPT_INTEGER,0,1,"foreign",&foreign)); + OK(gecode_opt_v1_model_identity(model,&owner,&revision)); +#define ADD(v,n,st,in,es,en,sz,fs,fn,name,target) gecode_opt_v1_model_add_regular(model,v,n,st,in,es,en,sz,fs,fn,name,target) +#define BAD(call,expected) do {memset(&out,0x55,sizeof(out));assert((call)==(expected));assert(out.model_id==0&&out.slot==0&&out.kind==0&&out.reserved==0);OK(gecode_opt_v1_model_identity(model,&owner,&after));assert(after==revision);}while(0) + assert(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,NULL)==GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(NULL,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,UINT64_MAX,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,NULL,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,edges,UINT64_MAX,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0])-1,finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),NULL,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,UINT64_MAX,label,&out),GECODE_OPT_INVALID_ARGUMENT); + edges[3].reserved=1;BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT);edges[3].reserved=0; + edges[3].struct_size--;BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT);edges[3].struct_size++; + BAD(ADD(vars,3,0,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + BAD(ADD(vars,3,2,2,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + edges[3].to=2;BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR);edges[3].to=0; + edges[3].symbol=INT64_C(9007199254740993);BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR);edges[3].symbol=1; + finals[1]=2;BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR);finals[1]=0; + duplicate[0]=duplicate[1]=edges[0];BAD(ADD(vars,3,2,0,duplicate,2,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + duplicate[1].to=1;BAD(ADD(vars,3,2,0,duplicate,2,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + BAD(ADD(&foreign,1,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + BAD(ADD(&dead,1,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_MODEL_ERROR); + bad=vars[0];bad.reserved=1;BAD(ADD(&bad,1,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + bad=vars[0];bad.kind=GECODE_OPT_ROW_ID;BAD(ADD(&bad,1,2,0,edges,4,sizeof(edges[0]),finals,2,label,&out),GECODE_OPT_INVALID_ARGUMENT); + BAD(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,"\xed\xa0\x80",&out),GECODE_OPT_INVALID_ARGUMENT); + OK(ADD(vars,3,2,0,edges,4,sizeof(edges[0]),finals,2,label,&global)); + OK(gecode_opt_v1_model_identity(model,&owner,&after));assert(after==revision+1&&global.kind==GECODE_OPT_GLOBAL_ID&&global.model_id==owner); + memset(edges,0,sizeof(edges));memset(finals,0xff,sizeof(finals));label[0]='X'; /* Caller storage cannot alter posted meaning. */ + OK(gecode_opt_v1_model_add_all_different(model,vars,2,"",&other)); + OK(gecode_opt_v1_model_add_row(model,terms,3,-1,INFINITY,"",&row)); + terms[0].coefficient=2;terms[1].coefficient=-1;terms[2].coefficient=3; + OK(gecode_opt_v1_model_set_objective(model,terms,3,maximize,7)); + for(x=-1;x<=1;++x)for(y=-1;y<=1;++y)for(z=-1;z<=1;++z)if(accepted(x,y,z)&&x!=y&&x+y+z>=-1) { + int objective=2*x-y+3*z+7;if(!found||(maximize?objective>best:objective +#include + +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; +namespace { +constexpr double inf = std::numeric_limits::infinity(); +bool near(double a, double b) { return std::fabs(a-b) < 1e-6; } +void repaired(const RelaxationResult& result, double violation) { + assert(result.termination == Termination::Optimal); + assert(result.has_repair() && result.minimum_violation_established); + assert(result.guarantee == Guarantee::Numerical); + assert(result.minimum_weighted_violation && near(*result.minimum_weighted_violation, violation)); + assert(result.weighted_violation && near(*result.weighted_violation, violation)); + assert(result.private_model && result.private_model->model_id != result.source_model_id); + assert(result.workflow.final_solution.model_id == result.private_model->model_id); + assert(validate(*result.private_model, result.workflow.final_solution.values).valid); + double sum = 0; + for (const auto& item : result.items) { + assert(item.activity && item.violation && item.weighted_violation && item.slack_value); + assert(*item.violation >= 0 && *item.slack_value >= -1e-7); + assert(near(*item.weighted_violation, item.penalty * *item.violation)); + assert(item.source_row.has_value() != item.source_variable.has_value()); + sum += *item.weighted_violation; + } + assert(near(sum, violation)); +} +} + +#ifdef GECODE_RELAXATION_TEST_FAKE_SOLVER +namespace { +enum class Scenario { Good, IncompleteFirst, IncompleteSecond, CancelFirst, CancelSecond, + BadPrimal, BadObjective, BadBound, OpenBound, MissingBound, BadSecondBound, + FalseInfeasible, FirstInfeasible, BadOwner, BadMask, IncompleteBadOwner, IncompleteBadRevision, OffsetHonest, OffsetForged, ResidualHonest, ResidualForged }; +Scenario scenario = Scenario::Good; +unsigned calls = 0; +double previous_remaining = inf; +} +namespace Gecode { namespace Optimize { +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options) { + assert(options.primal_start.empty()); + assert(options.relative_gap == 0 && options.absolute_gap == 0); + assert(options.time_limit_seconds <= previous_remaining); + previous_remaining = options.time_limit_seconds; + const bool residual_case = scenario == Scenario::ResidualHonest || scenario == Scenario::ResidualForged; + const bool offset_case = scenario == Scenario::OffsetHonest || scenario == Scenario::OffsetForged || residual_case; + assert(model.variables.size() == (offset_case ? 3u : 2u)); + SolveResult result; + result.model_id = model.model_id; result.revision = model.revision; + result.backend = "deterministic repair oracle"; + result.values = offset_case ? std::vector{1, 1e6, 1} : std::vector{1, 1}; + if (scenario == Scenario::ResidualForged) result.values[2] = 0; + result.active_variables.assign(model.variables.size(), true); + result.objective = calls == 0 || offset_case ? 1.0 : 8.0; + if ((scenario == Scenario::OffsetForged && calls == 1) || scenario == Scenario::ResidualForged) result.objective = 0; + result.best_bound = result.objective; + result.solution_validated = true; + result.termination = Termination::Optimal; + result.update_gaps(model.objective.sense); + if (scenario == Scenario::BadOwner || scenario == Scenario::IncompleteBadOwner) ++result.model_id; + if (scenario == Scenario::IncompleteBadRevision) ++result.revision; + if (scenario == Scenario::BadMask) result.active_variables[0] = false; + if (scenario == Scenario::BadPrimal) result.values = {2, 0}; + if (scenario == Scenario::BadObjective) { + result.objective = 0; result.best_bound = 0; + } + if (scenario == Scenario::BadBound || (scenario == Scenario::BadSecondBound && calls == 1)) + result.best_bound = *result.objective + 1; + if (scenario == Scenario::OpenBound) result.best_bound = 0; + // Keep a forged zero absolute_gap to verify callers recompute bound evidence. + if (scenario == Scenario::MissingBound) { + result.best_bound.reset(); result.absolute_gap.reset(); result.relative_gap.reset(); + } + if (scenario == Scenario::IncompleteBadOwner || scenario == Scenario::IncompleteBadRevision) + result.termination = Termination::TimeLimit; + if ((calls == 0 && scenario == Scenario::IncompleteFirst) || + (calls == 1 && scenario == Scenario::IncompleteSecond)) result.termination = Termination::TimeLimit; + if ((calls == 0 && scenario == Scenario::CancelFirst) || + (calls == 1 && scenario == Scenario::CancelSecond)) options.cancellation->cancel(); + if (scenario == Scenario::FirstInfeasible || (calls == 1 && scenario == Scenario::FalseInfeasible)) { + result.termination = Termination::Infeasible; + result.solution_validated = false; result.values.clear(); result.objective.reset(); + } + ++calls; + return result; +} +}} +int main() { + Model model; + auto x = model.add_integer(0, 1); + auto demand = model.add_row({{x, 1}}, 2, inf); + model.minimize({{x, 1}}, 7); + for (auto selected : {Scenario::Good, Scenario::IncompleteFirst, Scenario::IncompleteSecond, + Scenario::CancelFirst, Scenario::CancelSecond, Scenario::BadPrimal, + Scenario::BadObjective, Scenario::BadBound, Scenario::OpenBound, Scenario::MissingBound, + Scenario::BadSecondBound, Scenario::FalseInfeasible, Scenario::FirstInfeasible, + Scenario::BadOwner, Scenario::BadMask, Scenario::IncompleteBadOwner, Scenario::IncompleteBadRevision}) { + scenario = selected; calls = 0; previous_remaining = inf; + RelaxationOptions options; + options.rows = {{demand, RelaxationSide::Lower, 1}}; + options.optimize_original_objective = true; + options.solve.time_limit_seconds = 60; + auto result = relax_feasibility(model, options); + assert(calls >= 1 && calls <= 2); + assert(model.row(demand).lower == 2); + if (result.minimum_violation_established) { + assert(result.violation_lock && result.private_model); + assert(result.violation_lock->model_id == result.private_model->model_id); + assert(result.violation_lock->id + 1 == result.private_model->rows.size()); + assert(result.private_model->rows.back().upper == 1); + if (result.has_repair()) assert(validate(*result.private_model, result.workflow.final_solution.values).valid); + } + if (selected == Scenario::Good) { + repaired(result, 1); + assert(result.original_objective_optimized && result.violation_lock); + assert(!result.original_validation.valid); + } else { + assert(!result.original_objective_optimized); + if (selected == Scenario::IncompleteFirst) { + assert(result.termination == Termination::TimeLimit && calls == 1); + assert(result.has_repair() && !result.minimum_violation_established); + } else if (selected == Scenario::IncompleteSecond) { + assert(result.termination == Termination::TimeLimit && calls == 2); + assert(result.has_repair() && result.minimum_violation_established && result.violation_lock); + } else if (selected == Scenario::CancelFirst || selected == Scenario::CancelSecond) { + assert(result.termination == Termination::Cancelled && !result.has_repair()); + assert(!result.minimum_violation_established); + } else if (selected == Scenario::FirstInfeasible) { + assert(result.termination == Termination::Infeasible && !result.has_repair()); + assert(!result.minimum_violation_established); + } else { + assert(result.termination == Termination::NumericalFailure); + // A later contradictory oracle does not revoke earlier valid evidence. + assert(!result.minimum_violation_established || selected == Scenario::FalseInfeasible || + selected == Scenario::BadSecondBound); + } + } + } + // Exact arithmetic total is 1, even when long double == double and the + // objective offset cancels a 1e16 linear term. A forged zero bound is invalid. + for (auto selected : {Scenario::OffsetHonest, Scenario::OffsetForged}) { + scenario = selected; calls = 0; previous_remaining = inf; + Model cancellation; + auto a = cancellation.add_integer(1, 1); + auto b = cancellation.add_integer(1e6, 1e6); + auto constant = cancellation.add_row({}, 1, inf); + cancellation.minimize({{a, 1}, {b, 1e10}}, -1e16); + RelaxationOptions options; + options.rows = {{constant, RelaxationSide::Lower, 1}}; + options.optimize_original_objective = true; + auto result = relax_feasibility(cancellation, options); + assert(calls == 2); + if (selected == Scenario::OffsetHonest) { + repaired(result, 1); + assert(result.original_objective == 1 && result.original_objective_optimized); + } else { + assert(result.termination == Termination::NumericalFailure); + assert(!result.original_objective_optimized); + assert(result.minimum_violation_established); // the valid first stage remains established + } + } + for (auto selected : {Scenario::ResidualHonest, Scenario::ResidualForged}) { + scenario = selected; calls = 0; previous_remaining = inf; + Model cancellation; + auto a = cancellation.add_integer(1, 1); + auto b = cancellation.add_integer(1e6, 1e6); + auto row = cancellation.add_row({{a, 1}, {b, 1e10}}, -inf, 1e16); + RelaxationOptions options; options.rows = {{row, RelaxationSide::Upper, 1}}; + auto result = relax_feasibility(cancellation, options); + assert(calls == 1); + if (selected == Scenario::ResidualHonest) { + repaired(result, 1); + assert(result.items[0].violation == 1); + assert(!result.original_validation.valid && result.original_validation.max_row_violation == 1); + } else { + assert(result.termination == Termination::NumericalFailure); + assert(!result.has_repair() && !result.minimum_violation_established); + } + } + calls = 0; + RelaxationOptions options; options.rows = {{demand, RelaxationSide::Lower, 1}}; + options.solve.time_limit_seconds = 0; + auto result = relax_feasibility(model, options); + assert(result.termination == Termination::TimeLimit && calls == 0 && !result.has_repair()); + options.solve.time_limit_seconds = inf; + options.solve.node_limit = 0; + result = relax_feasibility(model, options); + assert(result.termination == Termination::NodeLimit && calls == 0); + options.optimize_original_objective = true; + options.solve.node_limit = 10; + result = relax_feasibility(model, options); + assert(result.termination == Termination::Unsupported && calls == 0); +} +#else +namespace { +void row_and_bound_oracles() { + for (auto sense : {ObjectiveSense::Minimize, ObjectiveSense::Maximize}) { + Model model; + auto x = model.add_integer(0, 4, "x"); + auto y = model.add_integer(1, 2, "y"); + model.add_row({{x, 1}}, -2, inf); // hard finite range for independent enumeration + model.add_row({{y, 1}}, -inf, 3); + model.add_row({{x, 1}, {y, 1}}, -inf, 4); + auto demand = model.add_row({{x, 1}, {y, 1}}, 5, inf, "demand"); + auto balance = model.add_row({{x, 1}, {y, -1}}, -inf, 0, "balance"); + model.set_objective({{x, -2}, {y, 3}}, sense, -17); + const auto before = model.snapshot(); + RelaxationOptions options; + options.rows = {{balance, RelaxationSide::Upper, 2}, {demand, RelaxationSide::Lower, 3}}; + options.bounds = {{y, RelaxationSide::Upper, 4}, {x, RelaxationSide::Lower, 1}}; + options.optimize_original_objective = true; + double best_penalty = inf, best_objective = sense == ObjectiveSense::Minimize ? inf : -inf; + std::vector> best_points; + for (int a = -2; a <= 4; ++a) for (int b = 1; b <= 3; ++b) if (a+b <= 4) { + const double penalty = 3*std::max(0, 5-a-b) + 2*std::max(0, a-b) + + std::max(0, -a) + 4*std::max(0, b-2); + const double objective = -2*a + 3*b - 17; + if (penalty < best_penalty) { + best_penalty = penalty; + best_objective = sense == ObjectiveSense::Minimize ? inf : -inf; + best_points.clear(); + } + if (penalty != best_penalty) continue; + if ((sense == ObjectiveSense::Minimize && objective < best_objective) || + (sense == ObjectiveSense::Maximize && objective > best_objective)) { + best_objective = objective; best_points.clear(); + } + if (objective == best_objective) best_points.push_back({double(a), double(b)}); + } + auto result = relax_feasibility(model, options); + repaired(result, best_penalty); + assert(result.original_objective_optimized && result.violation_lock); + assert(near(*result.original_objective, best_objective)); + assert(std::find(best_points.begin(), best_points.end(), result.original_values) != best_points.end()); + assert(!result.original_validation.valid && result.original_validation.model_valid); + assert(result.items[0].source_row->id == demand.id && result.items[1].source_row->id == balance.id); + assert(result.items[2].source_variable == x && result.items[3].source_variable == y); + assert(result.private_variables.size() == 2); + assert(result.private_model->variables[0].type == VariableType::Integer); + bool foreign = false; + try { (void)result.workflow.final_solution.value(x); } catch (const ModelError&) { foreign = true; } + assert(foreign); + assert(model.id() == before.model_id && model.revision() == before.revision); + assert(model.row(demand).lower == 5 && model.row(balance).upper == 0); + assert(model.variable(x).lower == 0 && model.variable(y).upper == 2); + assert(model.snapshot().rows.size() == before.rows.size()); + assert(model.snapshot().objective.offset == -17 && model.snapshot().objective.sense == sense); + } +} +void penalty_priorities_and_ties() { + for (auto sense : {ObjectiveSense::Minimize, ObjectiveSense::Maximize}) { + Model model; auto x = model.add_integer(0, 4); + auto lower = model.add_row({{x, 1}}, 3, inf); + auto upper = model.add_row({{x, 1}}, -inf, 1); + model.set_objective({{x, 2}}, sense, -11); + RelaxationOptions options; + options.rows = {{lower, RelaxationSide::Lower, 1}, {upper, RelaxationSide::Upper, 1}}; + options.optimize_original_objective = true; + auto result = relax_feasibility(model, options); repaired(result, 2); + assert(result.original_objective_optimized); + assert(near(result.original_values[0], sense == ObjectiveSense::Minimize ? 1 : 3)); + assert(near(*result.original_objective, sense == ObjectiveSense::Minimize ? -9 : -5)); + // Positive weights change the optimum before the original objective matters. + options.rows[0].penalty = 3; + result = relax_feasibility(model, options); repaired(result, 2); + assert(near(result.original_values[0], 3)); + options.rows[0].penalty = 1; options.rows[1].penalty = 3; + result = relax_feasibility(model, options); repaired(result, 2); + assert(near(result.original_values[0], 1)); + } +} +void continuous_and_constants() { + Model model; + auto x = model.add_continuous(0, 10); + auto row = model.add_row({{x, 1}}, 3, 7); + auto hard = model.add_row({{x, 1}}, 9, inf); + RelaxationOptions options; options.rows = {{row, RelaxationSide::Upper, 2}}; + auto result = relax_feasibility(model, options); + repaired(result, 4); assert(near(result.original_values[0], 9)); + assert(!result.original_objective_optimized && !result.violation_lock); + model.remove(hard); + result = relax_feasibility(model, options); repaired(result, 0); + assert(result.original_validation.valid); + + Model constants; + auto positive = constants.add_row({}, 2, inf, "constant lower"); + auto negative = constants.add_row({}, -inf, -3, "constant upper"); + constants.minimize({}, 13); + options.rows = {{negative, RelaxationSide::Upper, 5}, {positive, RelaxationSide::Lower, 2}}; + options.optimize_original_objective = true; + result = relax_feasibility(constants, options); repaired(result, 19); + assert(result.original_values.empty() && result.original_objective_optimized); + assert(result.original_objective == 13 && !result.original_validation.valid); + assert(result.items[0].violation == 2 && result.items[1].violation == 3); + + Model hard_integer; + auto integer = hard_integer.add_integer(0.2, 0.8); + result = relax_feasibility(hard_integer); + assert(result.termination == Termination::Infeasible && !result.has_repair()); + options = {}; options.bounds = {{integer, RelaxationSide::Lower, 2}}; + result = relax_feasibility(hard_integer, options); repaired(result, 0.4); + assert(result.original_values[0] == 0 && result.private_model->variables[0].type == VariableType::Integer); + + Model free; + auto z = free.add_continuous(-inf, inf); + free.maximize({{z, 1}}, -4); + options = {}; options.optimize_original_objective = true; + result = relax_feasibility(free, options); + assert(result.termination == Termination::Unbounded); + assert(result.minimum_violation_established && !result.original_objective_optimized); + assert(result.has_repair() && result.weighted_violation == 0); +} +void binary_semi_indicator() { + for (bool fixed_one : {false, true}) { + Model model; + auto x = model.add_binary(); + model.set_bounds(x, fixed_one ? 1 : 0, fixed_one ? 1 : 0); + model.add_row({{x, 1}}, fixed_one ? 0 : 1, fixed_one ? 0 : 1); + RelaxationOptions options; + options.bounds = {{x, fixed_one ? RelaxationSide::Lower : RelaxationSide::Upper, 3}}; + auto result = relax_feasibility(model, options); repaired(result, 3); + assert(result.original_values[0] == (fixed_one ? 0 : 1)); + assert(result.private_model->variables[0].type == VariableType::Binary); + assert(result.private_model->variables[0].lower == 0 && result.private_model->variables[0].upper == 1); + assert(!result.original_validation.valid); + } + { + Model model; + auto x = model.add_binary(); model.set_bounds(x, 0.25, 0.75); + RelaxationOptions options; + options.bounds = {{x, RelaxationSide::Lower, 2}, {x, RelaxationSide::Upper, 3}}; + auto result = relax_feasibility(model, options); repaired(result, 0.5); + assert(result.original_values[0] == 0); + assert(result.private_model->variables[0].lower == 0 && result.private_model->variables[0].upper == 1); + } + for (auto type : {VariableType::SemiContinuous, VariableType::SemiInteger}) { + Model model; + auto x = model.add_variable(type, 2, 4); + auto row = model.add_row({{x, 1}}, 1, 1); + RelaxationOptions options; + options.rows = {{row, RelaxationSide::Lower, 1}, {row, RelaxationSide::Upper, 3}}; + auto result = relax_feasibility(model, options); repaired(result, 1); + assert(result.original_values[0] == 0 && !result.original_validation.valid); + options.bounds = {{x, RelaxationSide::Upper, 1}}; + result = relax_feasibility(model, options); + assert(result.termination == Termination::Unsupported && !result.has_repair()); + } + Model model; + auto active = model.add_binary(); auto x = model.add_integer(0, 4); + model.set_bounds(active, 1, 1); + auto indicator = add_indicator(model, active, true, {{x, 1}}, 3, inf); + auto row = model.add_row({{x, 1}}, -inf, 1); + model.maximize({{x, 1}}, 31); + RelaxationOptions options; options.rows = {{row, RelaxationSide::Upper, 1}}; + options.optimize_original_objective = true; + const auto before = model.snapshot(); + auto result = relax_feasibility(model, options); repaired(result, 2); + assert(result.original_values[x.id] == 3 && result.original_objective_optimized); + assert(result.private_model->indicators.size() == 1); + assert(result.private_model->indicators[0].activator.model_id == result.private_model->model_id); + assert(model.revision() == before.revision && model.snapshot().indicators[0].active); + options.bounds = {{x, RelaxationSide::Upper, 1}}; + assert(relax_feasibility(model, options).termination == Termination::Unsupported); + options.bounds.clear(); options.rows = {{indicator.rows[0], RelaxationSide::Lower, 1}}; + assert(relax_feasibility(model, options).termination == Termination::Unsupported); +} +void rejected_and_stopped() { + Model model; auto x = model.add_continuous(0, 2); + auto row = model.add_row({{x, 1}}, 3, inf); + RelaxationOptions options; options.rows = {{row, RelaxationSide::Lower, 1}}; + for (double penalty : {0.0, -1.0, inf, std::numeric_limits::quiet_NaN()}) { + options.rows[0].penalty = penalty; + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + } + options.rows[0].penalty = 1; + options.rows.push_back(options.rows[0]); + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + options.rows.pop_back(); options.rows[0].side = RelaxationSide::Upper; + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + options.rows[0].side = static_cast(42); + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + options.rows[0].side = RelaxationSide::Lower; + options.rows[0].row.model_id += 100000; + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + options.rows[0].row = row; + options.solve.primal_start = {{x, 0}}; + assert(relax_feasibility(model, options).termination == Termination::Unsupported); + options.solve.primal_start.clear(); + for (auto guarantee : {Guarantee::Exact, Guarantee::Certified}) { + options.solve.guarantee = guarantee; + assert(relax_feasibility(model, options).termination == Termination::Unsupported); + } + options.solve.guarantee = Guarantee::Numerical; + options.solve.time_limit_seconds = 0; + assert(relax_feasibility(model, options).termination == Termination::TimeLimit); + options.solve.time_limit_seconds = inf; + options.solve.cancellation = std::make_shared(); options.solve.cancellation->cancel(); + assert(relax_feasibility(model, options).termination == Termination::Cancelled); + options.solve.cancellation.reset(); options.solve.node_limit = 0; + assert(relax_feasibility(model, options).termination == Termination::NodeLimit); + options.solve.node_limit = 1; options.optimize_original_objective = true; + assert(relax_feasibility(model, options).termination == Termination::Unsupported); + options.solve.node_limit.reset(); options.optimize_original_objective = false; + auto malformed = model.snapshot(); malformed.rows[0].terms[0].coefficient = inf; + assert(relax_feasibility(malformed, options).termination == Termination::InvalidModel); + auto with_global = model.snapshot(); + with_global.globals.push_back({{model.id(), 0}, AllDifferentData{}, "", true}); + assert(relax_feasibility(with_global, options).termination == Termination::Unsupported); + with_global.globals[0].active = false; + auto result = relax_feasibility(with_global, options); repaired(result, 1); + assert(result.private_model->globals.empty()); + with_global.globals[0].global.model_id += 100000; + assert(relax_feasibility(with_global, options).termination == Termination::InvalidModel); + model.remove(row); + assert(relax_feasibility(model, options).termination == Termination::InvalidModel); + Model tombstones; + auto deleted = tombstones.add_binary(); tombstones.remove(deleted); + auto only = tombstones.add_integer(0, 1); + auto missing = tombstones.add_row({{only, 1}}, 2, inf); + options = {}; options.rows = {{missing, RelaxationSide::Lower, 1}}; + result = relax_feasibility(tombstones, options); repaired(result, 1); + assert(result.original_values.size() == 2 && result.private_variables.size() == 2); + assert(!result.private_model->variables[0].active); + // Untrusted snapshots can use the allocator's next otherwise valid identity. + Model future; + auto snapshot = future.snapshot(); ++snapshot.model_id; + result = relax_feasibility(snapshot); repaired(result, 0); + assert(result.private_model->model_id != snapshot.model_id); +} +} +int main() { + if (!capabilities(Backend::Highs).available) { + Model model; auto x = model.add_integer(0, 1); + auto row = model.add_row({{x, 1}}, 2, inf); + const auto revision = model.revision(); + RelaxationOptions options; options.rows = {{row, RelaxationSide::Lower, 1}}; + auto result = relax_feasibility(model, options); + assert(result.termination == Termination::Unsupported); + assert(!result.has_repair() && !result.minimum_violation_established && !result.original_objective_optimized); + assert(model.revision() == revision && model.row(row).lower == 2); + options.solve.time_limit_seconds = 0; + assert(relax_feasibility(model, options).termination == Termination::TimeLimit); + options.solve.time_limit_seconds = inf; + options.solve.cancellation = std::make_shared(); options.solve.cancellation->cancel(); + assert(relax_feasibility(model, options).termination == Termination::Cancelled); + return 0; + } + row_and_bound_oracles(); + penalty_priorities_and_ties(); + continuous_and_constants(); + binary_semi_indicator(); + rejected_and_stopped(); +} +#endif diff --git a/test/optimize/result.cpp b/test/optimize/result.cpp new file mode 100644 index 0000000000..5ab8cafdc5 --- /dev/null +++ b/test/optimize/result.cpp @@ -0,0 +1,287 @@ +#include + +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; + +namespace { +template void rejects(F action) { + bool rejected = false; + try { action(); } catch (const ModelError&) { rejected = true; } + assert(rejected); +} + +void option_tests() { + SolveOptions options; + options.validate(); + assert(options.threads == 1 && options.random_seed == 0); + assert(options.guarantee == Guarantee::Numerical); + const double inf = std::numeric_limits::infinity(); + const double nan = std::numeric_limits::quiet_NaN(); + + for (double invalid : {-1.0, -inf, nan}) { + auto changed = options; + changed.time_limit_seconds = invalid; + rejects([&] { changed.validate(); }); + rejects([&] { SolveBudget budget(changed); }); + } + for (double valid : {0.0, -0.0, 1.0, std::numeric_limits::max(), inf}) { + auto changed = options; + changed.time_limit_seconds = valid; + changed.validate(); + } + for (int invalid : {0, -1}) { + auto changed = options; + changed.threads = invalid; + rejects([&] { changed.validate(); }); + } + auto changed = options; + changed.random_seed = -1; + rejects([&] { changed.validate(); }); + changed = options; + changed.backend = static_cast(999); + rejects([&] { changed.validate(); }); + changed = options; + changed.guarantee = static_cast(999); + rejects([&] { changed.validate(); }); + for (Guarantee policy : {Guarantee::Exact, Guarantee::Certified}) { + changed = options; + changed.guarantee = policy; + changed.validate(); // unsupported policy is a backend result, not bad input + } + for (double invalid : {-1.0, inf, nan}) { + changed = options; + changed.relative_gap = invalid; + rejects([&] { changed.validate(); }); + changed = options; + changed.absolute_gap = invalid; + rejects([&] { changed.validate(); }); + } + for (double invalid : {0.0, -1.0, inf, nan}) { + changed = options; + changed.feasibility_tolerance = invalid; + rejects([&] { changed.validate(); }); + changed = options; + changed.integrality_tolerance = invalid; + rejects([&] { changed.validate(); }); + } + changed = options; + changed.integrality_tolerance = 0.5; + rejects([&] { changed.validate(); }); + changed = options; + changed.relative_gap = 0.0; + changed.absolute_gap = 0.0; + changed.node_limit = 0; + changed.validate(); +} + +void budget_tests() { + SolveOptions options; + SolveBudget unlimited(options); + assert(!unlimited.expired() && !unlimited.stop_reason()); + assert(std::isinf(unlimited.remaining_seconds())); + assert(!unlimited.node_limit_reached()); + unlimited.add_nodes(std::numeric_limits::max()); + unlimited.add_nodes(); + assert(unlimited.nodes() == std::numeric_limits::max()); + assert(!unlimited.node_limit_reached()); // no implicit limit at UINT64_MAX + + SolveBudget parent(options); + auto child=parent.slice(3600,2); + auto nested=child.slice(7200,100); + assert(nested.remaining_seconds()<=3600); + nested.add_nodes(2); + assert(child.node_limit_reached() && nested.node_limit_reached()); + assert(parent.nodes()==2 && !parent.expired()); + auto next=parent.slice(3600,1); + next.add_nodes(); + assert(next.node_limit_reached() && parent.nodes()==3 && !parent.expired()); + auto zero=parent.slice(0,10); + assert(zero.stop_reason()==Termination::TimeLimit && !parent.expired()); + rejects([&]{parent.slice(-1,1);}); + rejects([&]{parent.slice(std::numeric_limits::quiet_NaN(),1);}); + parent.cancellation()->cancel(); + assert(next.cancelled() && child.stop_reason()==Termination::Cancelled); + + options.time_limit_seconds = 0.0; + SolveBudget immediate(options); + assert(immediate.remaining_seconds() == 0.0); + assert(immediate.stop_reason() == Termination::TimeLimit); + options.time_limit_seconds = std::numeric_limits::infinity(); + options.node_limit = 0; + SolveBudget no_nodes(options); + assert(no_nodes.stop_reason() == Termination::NodeLimit); + + options.node_limit = 2; + SolveBudget nodes(options); + auto shared = nodes; + nodes.add_nodes(); + assert(!shared.expired()); + shared.add_nodes(); + assert(nodes.nodes() == 2 && nodes.stop_reason() == Termination::NodeLimit); + shared.cancellation()->cancel(); + assert(nodes.cancelled()); + assert(nodes.stop_reason() == Termination::Cancelled); + + options.node_limit.reset(); + options.time_limit_seconds = 3600.0; + options.cancellation = std::make_shared(); + SolveBudget clock(options); + auto same_clock = clock; + const auto elapsed = clock.elapsed_seconds(); + const auto remaining = clock.remaining_seconds(); + assert(elapsed >= 0.0 && remaining >= 0.0 && remaining <= 3600.0); + assert(same_clock.elapsed_seconds() >= elapsed); + assert(same_clock.remaining_seconds() <= remaining); + options.time_limit_seconds = 0.0; // options are copied, not retained by reference + assert(!clock.time_limit_reached()); + options.cancellation->cancel(); + assert(clock.stop_reason() == Termination::Cancelled); + SolveBudget pre_cancelled(options); + assert(pre_cancelled.stop_reason() == Termination::Cancelled); + + SolveOptions parallel_options; + SolveBudget parallel(parallel_options); + std::vector workers; + for (unsigned i = 0; i < 4; ++i) + workers.emplace_back([parallel]() mutable { + for (unsigned j = 0; j < 1000; ++j) parallel.add_nodes(); + parallel.cancellation()->cancel(); + }); + for (auto& worker : workers) worker.join(); + assert(parallel.nodes() == 4000 && parallel.cancelled()); +} + +void result_tests() { + const double nan = std::numeric_limits::quiet_NaN(); + SolveResult result; + assert(!result.has_solution()); + assert(result.guarantee == Guarantee::Numerical); + result.model_id = 42; + result.revision = 7; + result.objective = 3.0; + result.values = {1.0, nan, 2.0}; + result.active_variables = {true, false, true}; + assert(!result.has_solution()); + result.solution_validated = true; + result.termination = Termination::TimeLimit; + assert(result.has_solution()); + assert(result.value({42, 0}) == 1.0 && result.value({42, 2}) == 2.0); + rejects([&] { result.value({43, 0}); }); + rejects([&] { result.value({42, 1}); }); + rejects([&] { result.value({42, 3}); }); + rejects([&] { result.value({42, std::numeric_limits::max()}); }); + + const auto historical = result; + result.revision = 8; + result.values[0] = 9.0; + result.active_variables[0] = false; + assert(historical.revision == 7 && historical.value({42, 0}) == 1.0); + result.active_variables[1] = true; + assert(!result.has_solution()); + result = historical; + result.values.pop_back(); + assert(!result.has_solution()); + result = historical; + result.objective = nan; + assert(!result.has_solution()); + result = historical; + result.solution_validated = false; + rejects([&] { result.value({42, 0}); }); + + SolveResult empty; + empty.model_id = 9; + empty.objective = 0.0; + empty.solution_validated = true; + assert(empty.has_solution()); // a zero-variable feasible solution is present + rejects([&] { empty.value({9, 0}); }); + assert(std::string(to_string(Termination::Unsupported)) == "unsupported"); + assert(std::string(to_string(Termination::MemoryLimit)) == "memory_limit"); + assert(std::string(to_string(Termination::InfeasibleOrUnbounded)) == + "infeasible_or_unbounded"); +} + +void gap_tests() { + SolveResult result; + result.objective = -10.0; + result.best_bound = -12.0; + result.native_backend_gap = 0.125; + result.update_gaps(ObjectiveSense::Minimize); + assert(result.absolute_gap == 2.0); + assert(std::fabs(*result.relative_gap - 1.0/6.0) < 1e-15); + assert(result.native_backend_gap == 0.125); + result.objective = -12.0; + result.best_bound = -10.0; + result.update_gaps(ObjectiveSense::Maximize); + assert(result.absolute_gap == 2.0); + assert(std::fabs(*result.relative_gap - 1.0/6.0) < 1e-15); + result.objective = 1.0; + result.best_bound = -1.0; + result.update_gaps(ObjectiveSense::Minimize); + assert(result.absolute_gap == 2.0 && result.relative_gap == 2.0); + + result.objective = 0.0; + result.best_bound = -1.0; + result.update_gaps(ObjectiveSense::Minimize); + assert(result.absolute_gap == 1.0 && result.relative_gap == 1.0); + result.best_bound = 1.0; + result.update_gaps(ObjectiveSense::Maximize); + assert(result.absolute_gap == 1.0 && result.relative_gap == 1.0); + result.best_bound = -0.0; + result.update_gaps(ObjectiveSense::Minimize); + assert(result.absolute_gap == 0.0 && result.relative_gap == 0.0); + result.objective = 0.25; + result.best_bound = -0.25; + result.update_gaps(ObjectiveSense::Minimize); + assert(result.absolute_gap == 0.5 && result.relative_gap == 0.5); + result.objective.reset(); + result.update_gaps(ObjectiveSense::Minimize); + assert(!result.absolute_gap && !result.relative_gap); + result.objective = 2.0; + result.best_bound.reset(); + result.update_gaps(ObjectiveSense::Minimize); + assert(!result.absolute_gap && !result.relative_gap); + + result.best_bound = 3.0; + rejects([&] { result.update_gaps(ObjectiveSense::Minimize); }); + assert(!result.absolute_gap && !result.relative_gap); + result.best_bound = std::nextafter(2.0, 3.0); + rejects([&] { result.update_gaps(ObjectiveSense::Minimize); }); + result.best_bound = 1.0; + rejects([&] { result.update_gaps(ObjectiveSense::Maximize); }); + rejects([&] { result.update_gaps(static_cast(999)); }); + + const auto inf = std::numeric_limits::infinity(); + result.best_bound = -inf; + result.update_gaps(ObjectiveSense::Minimize); + assert(!result.absolute_gap && !result.relative_gap); + rejects([&] { result.update_gaps(ObjectiveSense::Maximize); }); + result.best_bound = inf; + result.update_gaps(ObjectiveSense::Maximize); + assert(!result.absolute_gap && !result.relative_gap); + rejects([&] { result.update_gaps(ObjectiveSense::Minimize); }); + result.best_bound = std::numeric_limits::quiet_NaN(); + rejects([&] { result.update_gaps(ObjectiveSense::Minimize); }); + result.best_bound = 0.0; + result.objective = inf; + rejects([&] { result.update_gaps(ObjectiveSense::Minimize); }); + + result.objective = std::numeric_limits::max(); + result.best_bound = -std::numeric_limits::max(); + result.update_gaps(ObjectiveSense::Minimize); + assert(std::isinf(*result.absolute_gap)); + assert(result.relative_gap == 2.0); +} +} + +int main() { + option_tests(); + budget_tests(); + result_tests(); + gap_tests(); +} diff --git a/test/optimize/scenarios.cpp b/test/optimize/scenarios.cpp new file mode 100644 index 0000000000..2d8f7c0f10 --- /dev/null +++ b/test/optimize/scenarios.cpp @@ -0,0 +1,201 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +constexpr double inf=std::numeric_limits::infinity(); +static std::size_t cases=0,points=0; +templatestatic void invalid(F fn){bool caught=false;try{fn();}catch(const O::ModelError&){caught=true;}assert(caught);} +struct Oracle {std::optional objective;std::vector,bool>> membership;}; +// This oracle reads raw base+patch records. It does not materialize the batch or +// call its validator, sparse normalizer, mappings, or solver implementation. +static Oracle enumerate(const O::ModelSnapshot& base,const O::ScenarioDefinition& def) { + Oracle out;std::vector values(base.variables.size(),std::numeric_limits::quiet_NaN()); + const auto visit=[&] { + ++points; + const auto allowed=[&] { + for(const auto& v:base.variables)if(v.active){ + double lo=v.lower,hi=v.upper; + for(const auto& p:def.variable_bounds)if(p.variable.id==v.variable.id){if(p.lower)lo=*p.lower;if(p.upper)hi=*p.upper;} + if(values[v.variable.id]hi)return false; + } + for(const auto& row:base.rows)if(row.active){ + double lo=row.lower,hi=row.upper; + for(const auto& p:def.row_bounds)if(p.row.id==row.constraint.id){if(p.lower)lo=*p.lower;if(p.upper)hi=*p.upper;} + long long sum=0;for(const auto& t:row.terms)sum+=static_cast(t.coefficient)*static_cast(values[t.variable.id]); + if(sumhi)return false; + } + return true; + }; + const bool accepted=allowed();out.membership.emplace_back(values,accepted);if(!accepted)return; + long long objective=static_cast(def.objective_offset.value_or(base.objective.offset)); + for(std::size_t i=0;i(coefficient)*static_cast(values[i]); + } + if(!out.objective || (base.objective.sense==O::ObjectiveSense::Minimize?objective<*out.objective:objective>*out.objective))out.objective=static_cast(objective); + }; + std::function next=[&](std::size_t slot) { + if(slot==values.size()){visit();return;} + const auto& v=base.variables[slot];if(!v.active){next(slot+1);return;} + double lo=v.lower,hi=v.upper;for(const auto& p:def.variable_bounds)if(p.variable.id==slot){if(p.lower)lo=std::min(lo,*p.lower);if(p.upper)hi=std::max(hi,*p.upper);} + assert(std::isfinite(lo)&&std::isfinite(hi)&&hi-lo<10); + for(int x=static_cast(std::ceil(lo));x<=static_cast(std::floor(hi));++x){values[slot]=x;next(slot+1);} + }; + next(0);return out; +} +static void assert_outcome(const O::ScenarioBatchResult& batch,std::size_t i,const Oracle& oracle) { + ++cases;const auto& outcome=batch.outcomes[i];assert(outcome.result&&outcome.state==O::ScenarioRunState::Attempted); + const auto& result=*outcome.result; + const auto model=batch.batch->materialize(outcome.scenario); + for(const auto& point:oracle.membership)assert(O::validate(model,point.first).valid==point.second); + if(!oracle.objective){assert(result.termination==O::Termination::Infeasible&&!result.has_solution());return;} + if(result.termination!=O::Termination::Optimal)std::cerr<validation.valid); + assert(outcome.check->identity_valid&&outcome.check->objective_matches); + assert(result.model_id==batch.batch->id()&&result.revision==i+1); + assert(O::validate(model,result.values).valid); +} +static void discrete(O::Backend backend) { + for(bool maximize:{false,true})for(int a=-2;a<=2;++a)for(int b=-1;b<=1;++b){ + O::Model model;const auto removed=model.add_integer(-1,1);model.remove(removed); + const auto x=model.add_integer(-2,2),y=model.add_binary(); + const auto deleted=model.add_row({},-1,1);model.remove(deleted); + const auto row=model.add_row({{x,static_cast(a)},{y,static_cast(b)}},-1,2); + model.set_objective({{x,2},{y,-1}},maximize?O::ObjectiveSense::Maximize:O::ObjectiveSense::Minimize,7); + const auto base=model.snapshot(); + std::vector definitions(6); + definitions[1].objective_coefficients={{x,0},{y,3}};definitions[1].objective_offset=-9; + definitions[2].variable_bounds={{x,-1,1},{y,1,1}}; + definitions[3].row_bounds={{row,2,2}}; + definitions[5].variable_bounds={{x,-3,3}};definitions[5].row_bounds={{row,-4,4}}; + definitions[5].objective_coefficients={{x,-3}};definitions[5].objective_offset=8; + O::ScenarioBatchOptions options;options.solve.backend=backend; + if(backend==O::Backend::Native)options.solve.guarantee=O::Guarantee::Exact; + const auto result=O::solve_scenarios(model,definitions,options); + if(!result.all_resolved())std::cerr<id()!=model.id()); + assert(model.revision()==base.revision&&model.snapshot().objective.offset==7); + for(std::size_t i=0;ihas_solution()) { + assert(result.value(result.batch->scenario(i),x)==result.outcomes[i].result->values[x.id]); + if(backend==O::Backend::Native)assert(result.outcomes[i].check->exact_witness_validated); + } + } + invalid([&]{result.batch->map(removed);});invalid([&]{result.batch->map(deleted);}); + invalid([&]{result.value({model.id(),0},x);});invalid([&]{result.batch->scenario(6);}); + invalid([&]{result.value(result.batch->scenario(0),O::Variable{model.id()+1,x.id});}); + } +} +static void admission(){ + O::Model model;auto x=model.add_integer(0,3);auto row=model.add_row({{x,1}},0,3);model.minimize({{x,1}},1); + std::vector definitions(2);O::ScenarioBatchOptions options; + for(int mode=0;mode<15;++mode){ + auto defs=definitions; + if(mode==0)defs[1].objective_coefficients={{x,1},{x,2}}; + if(mode==1)defs[1].objective_coefficients={{{999,x.id},1}}; + if(mode==2)defs[1].objective_coefficients={{x,inf}}; + if(mode==3)defs[1].objective_offset=inf; + if(mode==4)defs[1].variable_bounds={{x,2,1}}; + if(mode==5)defs[1].variable_bounds={{x,{},{} }}; + if(mode==6)defs[1].variable_bounds={{x,0,2},{x,0,1}}; + if(mode==7)defs[1].variable_bounds={{x,inf,{}}}; + if(mode==8)defs[1].row_bounds={{row,0,1},{row,0,2}}; + if(mode==9)defs[1].row_bounds={{row,{},{} }}; + if(mode==10)defs[1].row_bounds={{row,4,2}}; + if(mode==11)defs[1].row_bounds={{{999,row.id},0,1}}; + if(mode==12)defs[1].row_bounds={{row,{},-inf}}; + if(mode==13)defs[1].variable_bounds={{x,std::numeric_limits::quiet_NaN(),{}}}; + if(mode==14)defs[1].objective_coefficients={{{model.id(),99},1}}; + const auto out=O::solve_scenarios(model,defs,options); + assert(!out.batch&&out.outcomes.empty()&&out.attempted==0&&out.stop_reason==O::Termination::InvalidModel&&out.offending_scenario==1); + } + for(int mode=0;mode<4;++mode){auto capped=options; + if(mode==0)capped.max_scenarios=1; + if(mode==1){capped.max_patch_entries=0;definitions[1].objective_offset=2;definitions[1].objective_coefficients={{x,1}};} + if(mode==2)capped.max_saved_value_slots=1; + if(mode==3)capped.max_work=0; + const auto out=O::solve_scenarios(model,definitions,capped); + assert(!out.batch&&!out.attempted&&out.stop_reason==(mode==3?O::Termination::IterationLimit:O::Termination::MemoryLimit)); + definitions=std::vector(2); + } + auto empty=O::solve_scenarios(model,{});assert(empty.all_resolved()&&empty.attempted==0&&empty.outcomes.empty()); + options.solve.node_limit=1;auto nodes=O::solve_scenarios(model,definitions,options);assert(nodes.stop_reason==O::Termination::Unsupported&&!nodes.attempted); + options.solve.node_limit=0;nodes=O::solve_scenarios(model,definitions,options);assert(nodes.stop_reason==O::Termination::NodeLimit&&!nodes.attempted); + options={};options.solve.time_limit_seconds=0;assert(O::solve_scenarios(model,definitions,options).stop_reason==O::Termination::TimeLimit); + options={};options.solve.cancellation=std::make_shared();options.solve.cancellation->cancel(); + assert(O::solve_scenarios(model,definitions,options).stop_reason==O::Termination::Cancelled); + options={};options.solve.primal_start={{x,0}};assert(O::solve_scenarios(model,definitions,options).stop_reason==O::Termination::Unsupported); + options={};options.reuse=static_cast(55);assert(O::solve_scenarios(model,definitions,options).stop_reason==O::Termination::InvalidModel); + auto malformed=model.snapshot();malformed.rows[0].terms[0].variable.model_id=999; + assert(O::solve_scenarios(malformed,definitions).stop_reason==O::Termination::InvalidModel); + O::Model binary;auto b=binary.add_binary();O::ScenarioDefinition bad;bad.variable_bounds={{b,-1,2}}; + assert(O::solve_scenarios(binary,{bad}).stop_reason==O::Termination::InvalidModel); + O::Model semi;semi.add_variable(O::VariableType::SemiInteger,2,4); + assert(O::solve_scenarios(semi,{{}}).stop_reason==O::Termination::Unsupported); + auto g=binary.add_global(O::AllDifferentData{{b}}); + assert(O::solve_scenarios(binary,{{}}).stop_reason==O::Termination::Unsupported); + binary.remove(g);assert(O::solve_scenarios(binary,{{}}).stop_reason==O::Termination::Unsupported); +} +static void guarantees(){ + O::Model model;auto x=model.add_integer(0,2);model.minimize({{x,1}}); + for(auto backend:{O::Backend::Auto,O::Backend::Highs,O::Backend::Native}) + for(auto guarantee:{O::Guarantee::Numerical,O::Guarantee::Exact,O::Guarantee::Certified}) + for(std::size_t count:{std::size_t(0),std::size_t(1)}){ + O::ScenarioBatchOptions opts;opts.solve.backend=backend;opts.solve.guarantee=guarantee; + const auto result=O::solve_scenarios(model,std::vector(count),opts); + const bool rejected=guarantee==O::Guarantee::Certified || (guarantee==O::Guarantee::Exact&&backend!=O::Backend::Native); + if(rejected){assert(result.stop_reason==O::Termination::Unsupported&&!result.batch&&!result.attempted);} + else if(count==0){assert(result.all_resolved()&&result.attempted==0);} + else if(O::capabilities(backend==O::Backend::Auto?O::Backend::Highs:backend).available){ + assert(result.all_resolved()&&result.outcomes[0].result->guarantee==guarantee); + }else{assert(result.stop_reason==O::Termination::Unsupported&&result.attempted==1);} + } +} +static void numerical(){ + O::Model model;auto x=model.add_continuous(0,10),y=model.add_continuous(0,10); + auto row=model.add_row({{x,1},{y,1}},3,inf);model.minimize({{x,2},{y,3}},7); + std::vector defs(5);defs[1].objective_coefficients={{x,4}}; + defs[2].variable_bounds={{x,{},1}};defs[3].row_bounds={{row,4,{}}}; + O::ScenarioBatchOptions options;options.solve.backend=O::Backend::Highs; + const auto warm=O::solve_scenarios(model,defs,options);assert(warm.all_resolved()); + const double expected[]={13,16,15,15,13}; + for(std::size_t i=0;i<5;++i)assert(std::abs(*warm.outcomes[i].result->objective-expected[i])<1e-7); + assert(warm.reuse_statistics.solve_calls==5&&warm.reuse_statistics.model_loads==1&&warm.reuse_statistics.incremental_updates==4); + options.reuse=O::ScenarioReuse::Cold;const auto cold=O::solve_scenarios(model,defs,options); + assert(cold.all_resolved()&&cold.reuse_statistics.solve_calls==0); + for(std::size_t i=0;i<5;++i)assert(cold.outcomes[i].result->objective==warm.outcomes[i].result->objective); + model.set_bounds(x,9,10);defs.clear(); + assert(warm.batch->base().variables[x.id].lower==0&&warm.value(warm.batch->scenario(0),x)==3); + auto changed=warm.batch->materialize(warm.batch->scenario(0));changed.variables[x.id].lower=8; + assert(warm.batch->materialize(warm.batch->scenario(0)).variables[x.id].lower==0); + O::Model unbounded;auto z=unbounded.add_continuous();unbounded.minimize({{z,-1}}); + O::ScenarioDefinition finite;finite.variable_bounds={{z,{},2}}; + auto result=O::solve_scenarios(unbounded,{finite,{}});assert(result.all_resolved()); + assert(result.outcomes[0].result->objective==-2&&result.outcomes[1].result->termination==O::Termination::Unbounded); + O::Model constant;auto c=constant.add_row({},0,inf);O::ScenarioDefinition impossible;impossible.row_bounds={{c,1,{}}}; + result=O::solve_scenarios(constant,{{},impossible,{}});assert(result.all_resolved()); + assert(result.outcomes[0].result->objective==0&&result.outcomes[1].result->termination==O::Termination::Infeasible); + O::Model recourse;auto decision=recourse.add_integer(0,2),completion=recourse.add_continuous(0,10); + recourse.add_row({{decision,1},{completion,1}},2,inf);recourse.minimize({{decision,1},{completion,2}}); + O::ScenarioDefinition fixed;fixed.variable_bounds={{decision,0,0}}; + result=O::solve_scenarios(recourse,{{},fixed});assert(result.all_resolved()); + assert(result.outcomes[0].result->objective==2&&result.outcomes[1].result->objective==4); + O::Model cancellation;auto a=cancellation.add_continuous(1,1),b=cancellation.add_continuous(1e6,1e6); + cancellation.minimize({{a,1},{b,1e10}},-1e16); + result=O::solve_scenarios(cancellation,{{}});assert(result.all_resolved()&&result.outcomes[0].result->objective==1); +} +int main(){ + admission();guarantees(); + if(O::capabilities(O::Backend::Highs).available){discrete(O::Backend::Highs);numerical();} + else {O::Model m;m.add_integer(0,1);auto out=O::solve_scenarios(m,{{}});assert(out.stop_reason==O::Termination::Unsupported&&!out.all_resolved());} + if(O::native_capabilities().available)discrete(O::Backend::Native); + std::cout<<"Scenario admission, histories and cold/reuse: "< +#include +#include +#include +#include +#include +#define OK(call) do { int32_t code_=(call); if(code_){fprintf(stderr,"%s: %d %s\n",#call,(int)code_,gecode_opt_v1_last_error());assert(code_==0);} } while(0) +static gecode_opt_scenario_definition_v1 definition(void){ + gecode_opt_scenario_definition_v1 d;memset(&d,0,sizeof(d));d.struct_size=sizeof(d);return d; +} +static gecode_opt_scenario_bounds_v1 bound(gecode_opt_id id,int32_t lo,double lower,int32_t up,double upper){ + gecode_opt_scenario_bounds_v1 d;memset(&d,0,sizeof(d));d.struct_size=sizeof(d);d.entity=id; + d.has_lower=lo;d.lower=lower;d.has_upper=up;d.upper=upper;return d; +} +static gecode_opt_scenario_info_v1 info(gecode_opt_handle h){ + gecode_opt_scenario_info_v1 i;memset(&i,0xa5,sizeof(i));OK(gecode_opt_v1_scenario_batch_info(h,&i,sizeof(i)));assert(!i.reserved);return i; +} +static gecode_opt_handle solve(gecode_opt_handle m,const gecode_opt_scenario_definition_v1* d,uint64_t n,const gecode_opt_scenario_options_v1* o){ + gecode_opt_handle r=0;OK(gecode_opt_v1_solve_scenarios(m,d,n,sizeof(*d),o,&r));assert(r);return r; +} +static void run(int backend){ + gecode_opt_handle model=0,result=0,child=0;gecode_opt_id x,y,dead,row,gone,mapped,mapped_row; + gecode_opt_term terms[2];gecode_opt_scenario_options_v1 options; + gecode_opt_scenario_definition_v1 defs[3];gecode_opt_scenario_bounds_v1 bounds[2]; + gecode_opt_scenario_id id,id1,id2,bad;gecode_opt_scenario_outcome_v1 outcome;gecode_opt_scenario_check_v1 checks; + gecode_opt_scenario_info_v1 summary;gecode_opt_result_info_v1 ordinary; + int32_t available,lp,mip,present;double value;uint64_t owner,revision,needed;char name[]="copied name"; + OK(gecode_opt_v1_capabilities(backend,&available,&lp,&mip)); + OK(gecode_opt_v1_model_create(&model)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,8,"x",&x)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,8,"y",&y)); + OK(gecode_opt_v1_model_add_variable(model,GECODE_OPT_INTEGER,0,8,"dead",&dead)); + OK(gecode_opt_v1_model_remove_variable(model,dead)); + OK(gecode_opt_v1_model_add_row(model,NULL,0,-INFINITY,INFINITY,"gone",&gone)); + OK(gecode_opt_v1_model_remove_row(model,gone)); + terms[0].variable=x;terms[0].coefficient=1;terms[1].variable=y;terms[1].coefficient=1; + OK(gecode_opt_v1_model_add_row(model,terms,2,4,INFINITY,"demand",&row)); + terms[0].coefficient=2;terms[1].coefficient=3; + OK(gecode_opt_v1_model_set_objective(model,terms,2,GECODE_OPT_MINIMIZE,7)); + OK(gecode_opt_v1_model_identity(model,&owner,&revision)); + OK(gecode_opt_v1_scenario_options_default(&options,sizeof(options)));assert(options.struct_size==sizeof(options)); + assert(!options.reserved&&!options.reserved_flags&&!options.solve.reserved);options.solve.backend=backend; + if(backend==GECODE_OPT_NATIVE)options.solve.guarantee=GECODE_OPT_EXACT; + defs[0]=definition();defs[0].name=name; + defs[1]=definition();bounds[0]=bound(x,0,NAN,1,1);defs[1].variable_bounds=bounds;defs[1].variable_count=1; + defs[2]=definition();bounds[1]=bound(y,0,0,1,1);defs[2].variable_bounds=bounds;defs[2].variable_count=2; + result=solve(model,defs,3,&options);name[0]='X';bounds[0].upper=7; + summary=info(result);assert(summary.model_id==owner&&summary.revision==revision&&summary.has_batch); + assert(summary.batch_id!=owner);assert(summary.scenario_count==3&&summary.outcome_count==3); + OK(gecode_opt_v1_scenario_batch_id(result,0,&id));OK(gecode_opt_v1_scenario_batch_id(result,1,&id1));OK(gecode_opt_v1_scenario_batch_id(result,2,&id2)); + OK(gecode_opt_v1_scenario_batch_map(result,x,&mapped));OK(gecode_opt_v1_scenario_batch_map(result,row,&mapped_row)); + assert(mapped.model_id==id.batch_id&&mapped.slot==x.slot&&mapped.kind==GECODE_OPT_VARIABLE_ID); + assert(mapped_row.model_id==id.batch_id&&mapped_row.slot==row.slot&&mapped_row.kind==GECODE_OPT_ROW_ID); + assert(gecode_opt_v1_scenario_batch_map(result,dead,&mapped_row)==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_scenario_batch_map(result,gone,&mapped_row)==GECODE_OPT_MODEL_ERROR); + {char buffer[32];OK(gecode_opt_v1_scenario_batch_text(result,id,GECODE_OPT_SCENARIO_NAME,buffer,sizeof(buffer),&needed));assert(!strcmp(buffer,"copied name"));} + {gecode_opt_scenario_bounds_v1 b;OK(gecode_opt_v1_scenario_batch_bounds(result,id1,GECODE_OPT_VARIABLE_ID,&b,sizeof(b),1,&needed)); + assert(needed==1&&b.upper==1&&!b.has_lower&&b.lower==0&&b.reserved==0);} + {gecode_opt_scenario_bounds_v1 b;memset(&b,0xa5,sizeof(b)); + assert(gecode_opt_v1_scenario_batch_bounds(result,id2,GECODE_OPT_VARIABLE_ID,&b,sizeof(b),1,&needed)==GECODE_OPT_BUFFER_TOO_SMALL); + assert(needed==2&&b.struct_size==UINT64_C(0xa5a5a5a5a5a5a5a5)); + assert(gecode_opt_v1_scenario_batch_bounds(result,id,GECODE_OPT_VARIABLE_ID,NULL,sizeof(b)-1,0,&needed)==GECODE_OPT_INVALID_ARGUMENT);} + bad=id;bad.batch_id++; + assert(gecode_opt_v1_scenario_batch_outcome(result,bad,&outcome,sizeof(outcome))==GECODE_OPT_MODEL_ERROR); + bad=id;bad.index=3;assert(gecode_opt_v1_scenario_batch_check(result,bad,&checks,sizeof(checks))==GECODE_OPT_MODEL_ERROR); + assert(gecode_opt_v1_scenario_batch_info(model,&summary,sizeof(summary))==GECODE_OPT_INVALID_HANDLE); + assert(gecode_opt_v1_result_info(result,&ordinary,sizeof(ordinary))==GECODE_OPT_INVALID_HANDLE); + assert(gecode_opt_v1_scenario_batch_outcome(result,id,&outcome,sizeof(outcome)-1)==GECODE_OPT_INVALID_ARGUMENT); + OK(gecode_opt_v1_scenario_batch_outcome(result,id,&outcome,sizeof(outcome))); + assert(outcome.has_result&&outcome.state==GECODE_OPT_SCENARIO_ATTEMPTED&&!outcome.reserved&&!outcome.reserved_flags); + OK(gecode_opt_v1_scenario_batch_check(result,id,&checks,sizeof(checks)));assert(!checks.reserved&&!checks.reserved_flags); + if(available){ + summary=info(result);assert(summary.all_resolved&&summary.resolved==3&&summary.completion==GECODE_OPT_SCENARIO_COMPLETE); + assert(!summary.has_stop_reason&&!summary.has_offending_scenario); + assert(outcome.result.termination==GECODE_OPT_OPTIMAL&&checks.has_check&&checks.candidate_examined&&checks.validation.valid); + OK(gecode_opt_v1_scenario_batch_value(result,id,x,&value));assert(value==4); + OK(gecode_opt_v1_scenario_batch_value(result,id1,x,&value));assert(value==1); + OK(gecode_opt_v1_scenario_batch_check(result,id2,&checks,sizeof(checks))); + assert(checks.has_check&&!checks.candidate_examined&&!checks.validation.valid&&!checks.validation.objective.present); + assert(gecode_opt_v1_scenario_batch_value(result,id2,x,&value)==GECODE_OPT_NO_SOLUTION); + }else{ + assert(outcome.result.termination==GECODE_OPT_UNSUPPORTED);assert(!checks.candidate_examined&&!checks.validation.objective.present); + OK(gecode_opt_v1_scenario_batch_outcome(result,id1,&outcome,sizeof(outcome))); + assert(!outcome.has_result&&!outcome.has_check&&outcome.state==GECODE_OPT_SCENARIO_NOT_STARTED); + memset(&checks,0xa5,sizeof(checks));OK(gecode_opt_v1_scenario_batch_check(result,id1,&checks,sizeof(checks))); + assert(!checks.has_check&&!checks.candidate_examined&&!checks.validation.valid&&!checks.validation.objective.present); + child=99;assert(gecode_opt_v1_scenario_batch_copy_result(result,id1,&child)==GECODE_OPT_NO_SOLUTION&&child==0); + } + OK(gecode_opt_v1_scenario_batch_copy_result(result,id,&child));OK(gecode_opt_v1_model_destroy(model)); + OK(gecode_opt_v1_scenario_batch_destroy(result));OK(gecode_opt_v1_result_info(child,&ordinary,sizeof(ordinary))); + assert(ordinary.model_id==id.batch_id&&ordinary.revision==1); + if(available){OK(gecode_opt_v1_result_value(child,mapped,&value));assert(value==4); + assert(gecode_opt_v1_result_value(child,x,&value)==GECODE_OPT_MODEL_ERROR); + OK(gecode_opt_v1_result_number(child,GECODE_OPT_OBJECTIVE,&present,&value));assert(present&&value==15);} + OK(gecode_opt_v1_result_destroy(child));assert(gecode_opt_v1_scenario_batch_destroy(result)==GECODE_OPT_INVALID_HANDLE); +} +static void malformed_and_limits(void){ + gecode_opt_handle m=0,r=0,cancel=0;gecode_opt_id x;gecode_opt_scenario_options_v1 o,bad; + gecode_opt_scenario_definition_v1 d[2];gecode_opt_scenario_bounds_v1 bounds;gecode_opt_term t[2]; + gecode_opt_scenario_info_v1 summary;gecode_opt_scenario_definition_info_v1 definition_info; + uint64_t owner,revision,needed;int i;gecode_opt_scenario_id id; + OK(gecode_opt_v1_model_create(&m));OK(gecode_opt_v1_model_add_variable(m,GECODE_OPT_INTEGER,0,2,"x",&x)); + OK(gecode_opt_v1_model_identity(m,&owner,&revision));OK(gecode_opt_v1_scenario_options_default(&o,sizeof(o))); + d[0]=definition();d[1]=definition(); + for(i=0;i<7;i++){ + bad=o;switch(i){case 0:bad.struct_size--;break;case 1:bad.reserved=1;break;case 2:bad.reserved_flags=1;break; + case 3:bad.solve.struct_size--;break;case 4:bad.solve.reserved=1;break;case 5:bad.reuse=9;break;case 6:bad.solve.has_node_limit=2;break;} + r=99;assert(gecode_opt_v1_solve_scenarios(m,d,2,sizeof(d[0]),&bad,&r)==GECODE_OPT_INVALID_ARGUMENT&&r==0); + } + r=99;assert(gecode_opt_v1_solve_scenarios(m,d,1,sizeof(d[0])-1,&o,&r)==GECODE_OPT_INVALID_ARGUMENT&&r==0); + r=99;assert(gecode_opt_v1_solve_scenarios(m,NULL,1,sizeof(d[0]),&o,&r)==GECODE_OPT_INVALID_ARGUMENT&&r==0); + r=99;assert(gecode_opt_v1_solve_scenarios(m,d,UINT64_MAX,sizeof(d[0]),&o,&r)==GECODE_OPT_INVALID_ARGUMENT&&r==0); + for(i=0;i<5;i++){ + d[0]=definition();bounds=bound(x,1,1,0,0);d[0].variable_bounds=&bounds;d[0].variable_count=1; + switch(i){case 0:d[0].struct_size=0;break;case 1:d[0].reserved=1;break;case 2:d[0].objective_offset.present=2;break; + case 3:bounds.struct_size=0;break;case 4:bounds.has_lower=2;break;} + assert(gecode_opt_v1_solve_scenarios(m,d,1,sizeof(d[0]),&o,&r)==GECODE_OPT_INVALID_ARGUMENT&&r==0); + } + d[0]=definition();d[1]=definition();t[0].variable=x;t[0].coefficient=1;t[1]=t[0]; + d[1].objective_coefficients=t;d[1].objective_count=2;r=solve(m,d,2,&o);summary=info(r); + assert(summary.completion==GECODE_OPT_SCENARIO_REJECTED&&summary.stop_reason==GECODE_OPT_INVALID_MODEL); + assert(summary.has_offending_scenario&&summary.offending_scenario==1&&!summary.attempted&&!summary.has_batch); + assert(summary.model_id==owner&&summary.revision==revision);OK(gecode_opt_v1_scenario_batch_message(r,NULL,0,&needed));assert(needed>1); + OK(gecode_opt_v1_scenario_batch_destroy(r));d[1]=definition(); + for(i=0;i<5;i++){ + int expected;bad=o;switch(i){case 0:bad.solve.time_limit_seconds=0;expected=GECODE_OPT_TIME_LIMIT;break; + case 1:bad.solve.has_node_limit=1;bad.solve.node_limit=0;expected=GECODE_OPT_NODE_LIMIT;break; + case 2:bad.solve.has_node_limit=1;bad.solve.node_limit=1;expected=GECODE_OPT_UNSUPPORTED;break; + case 3:bad.max_scenarios=1;expected=GECODE_OPT_MEMORY_LIMIT;break; + default:bad.max_work=0;expected=GECODE_OPT_ITERATION_LIMIT;break;} + r=solve(m,d,2,&bad);summary=info(r);assert(summary.has_stop_reason&&summary.stop_reason==expected&&!summary.attempted); + OK(gecode_opt_v1_scenario_batch_destroy(r)); + } + OK(gecode_opt_v1_cancellation_create(&cancel));OK(gecode_opt_v1_cancellation_cancel(cancel));bad=o;bad.solve.cancellation=cancel; + r=solve(m,d,2,&bad);summary=info(r);assert(summary.stop_reason==GECODE_OPT_CANCELLED);OK(gecode_opt_v1_cancellation_destroy(cancel));OK(gecode_opt_v1_scenario_batch_destroy(r)); + r=solve(m,NULL,0,&o);summary=info(r);assert(summary.all_resolved&&summary.has_batch&&!summary.scenario_count); + assert(gecode_opt_v1_scenario_batch_id(r,0,&id)==GECODE_OPT_MODEL_ERROR);OK(gecode_opt_v1_scenario_batch_destroy(r)); + d[0].objective_coefficients=t;d[0].objective_count=1;d[0].objective_offset.present=1;d[0].objective_offset.value=0; + r=solve(m,d,1,&o);OK(gecode_opt_v1_scenario_batch_id(r,0,&id)); + memset(&definition_info,0xa5,sizeof(definition_info));OK(gecode_opt_v1_scenario_batch_definition(r,id,&definition_info,sizeof(definition_info))); + assert(definition_info.objective_count==1&&definition_info.objective_offset.present&&definition_info.objective_offset.value==0&&!definition_info.reserved); + OK(gecode_opt_v1_scenario_batch_destroy(r));OK(gecode_opt_v1_model_destroy(m)); +} +int main(void){run(GECODE_OPT_HIGHS);run(GECODE_OPT_NATIVE);malformed_and_limits();puts("C99 scenario ownership/boundary tests passed");return 0;} diff --git a/test/optimize/scenarios_coordinator.cpp b/test/optimize/scenarios_coordinator.cpp new file mode 100644 index 0000000000..6e566b8720 --- /dev/null +++ b/test/optimize/scenarios_coordinator.cpp @@ -0,0 +1,149 @@ +// Compile scenarios.cpp separately with GECODE_OPTIMIZE_TEST_SCENARIOS=1. +// The oracle below enumerates the original finite box; no backend calls occur. +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace { +enum class Fault {None,Owner,Revision,Mask,Objective,NaNObjective,NaNBound,Bound, + FalseInfeasible,FalseUnbounded,NoWitness,Guarantee,Incomplete,InfiniteBound, + Infeasible,Exception,ExactFraction,UnvalidatedObjective,InvalidUnvalidatedPoint,VendorGap, + UnknownStatus,LooseExactBound,MissingExactBound}; +Fault fault=Fault::None; +std::size_t calls=0,fault_call=1; +std::string cancel_point; +std::size_t cancel_index=1; +std::shared_ptr token; +double last_allowance=std::numeric_limits::infinity(); +std::optional observed_nodes; +O::SolveResult oracle(const O::ModelSnapshot& model) { + O::SolveResult out;out.model_id=model.model_id;out.revision=model.revision; + for(const auto& v:model.variables)out.active_variables.push_back(v.active); + std::vector values(model.variables.size(),std::numeric_limits::quiet_NaN()); + std::function visit=[&](std::size_t slot) { + if(slot(std::ceil(v.lower));x<=static_cast(std::floor(v.upper));++x){values[slot]=x;visit(slot+1);}return; + } + for(const auto& r:model.rows)if(r.active){long long sum=0; + for(const auto& t:r.terms)sum+=static_cast(t.coefficient)*static_cast(values[t.variable.id]); + if(sumr.upper)return;} + long long objective=static_cast(model.objective.offset); + for(const auto& t:model.objective.terms)objective+=static_cast(t.coefficient)*static_cast(values[t.variable.id]); + if(!out.objective || (model.objective.sense==O::ObjectiveSense::Minimize?objective<*out.objective:objective>*out.objective)){ + out.objective=static_cast(objective);out.values=values;} + }; + visit(0);out.solution_validated=out.objective.has_value();out.best_bound=out.objective; + out.termination=out.objective?O::Termination::Optimal:O::Termination::Infeasible;return out; +} +void reset(){fault=Fault::None;calls=0;cancel_point.clear();token=std::make_shared();last_allowance=std::numeric_limits::infinity();observed_nodes.reset();} +} +namespace Gecode { namespace Optimize { namespace Detail { +SolveResult scenario_test_solve(const ModelSnapshot& model,const SolveOptions& options,SolveSession*) { + assert(options.time_limit_seconds<=last_allowance);last_allowance=options.time_limit_seconds;observed_nodes=options.node_limit; + auto out=oracle(model);out.guarantee=options.guarantee;const auto number=calls++; + if(number!=fault_call)return out; + switch(fault){ + case Fault::None:break; + case Fault::Owner:++out.model_id;break; + case Fault::Revision:++out.revision;break; + case Fault::Mask:out.active_variables[0]=true;break; + case Fault::Objective:*out.objective+=1;break; + case Fault::NaNObjective:out.objective=std::numeric_limits::quiet_NaN();break; + case Fault::NaNBound:out.best_bound=std::numeric_limits::quiet_NaN();break; + case Fault::Bound:*out.best_bound=*out.objective+1;break; + case Fault::FalseInfeasible:out.termination=Termination::Infeasible;out.solution_validated=false;break; + case Fault::FalseUnbounded:out.termination=Termination::Unbounded;break; + case Fault::NoWitness:out.values.clear();out.objective.reset();out.best_bound.reset();out.solution_validated=false;break; + case Fault::Guarantee:out.guarantee=Guarantee::Certified;break; + case Fault::Incomplete:out.termination=Termination::NodeLimit;break; + case Fault::InfiniteBound:out.termination=Termination::NodeLimit;out.best_bound=-std::numeric_limits::infinity();break; + case Fault::Infeasible:out.termination=Termination::Infeasible;out.values.clear();out.objective.reset();out.best_bound.reset();out.solution_validated=false;break; + case Fault::Exception:throw std::bad_alloc(); + case Fault::ExactFraction:out.values[1]+=.0000001;out.objective=*out.objective+.0000001;out.best_bound=out.objective;break; + case Fault::UnvalidatedObjective:out.solution_validated=false;out.termination=Termination::NodeLimit;*out.objective+=1;break; + case Fault::InvalidUnvalidatedPoint:out.solution_validated=false;out.termination=Termination::NodeLimit;out.values[1]=-100;break; + case Fault::VendorGap:out.native_backend_gap=-1;break; + case Fault::UnknownStatus:out.termination=static_cast(99);break; + case Fault::LooseExactBound:*out.best_bound=*out.objective-1;break; + case Fault::MissingExactBound:out.best_bound.reset();break; + } + return out; +} +void scenario_test_checkpoint(const char* point,std::size_t index) { + if(cancel_point==point&&index==cancel_index)token->cancel(); +} +}}} +int main(){ + O::Model model;auto removed=model.add_integer(0,1);model.remove(removed); + auto x=model.add_integer(0,4);model.minimize({{x,1}},3); + std::vector defs(3);defs[1].variable_bounds={{x,2,{}}};defs[2].objective_offset=-7; + O::ScenarioBatchOptions options;options.solve.time_limit_seconds=30; + reset();auto good=O::solve_scenarios(model,defs,options);assert(good.all_resolved()&&calls==3&&last_allowance<30); + assert(good.outcomes[0].result->objective==3&&good.outcomes[1].result->objective==5&&good.outcomes[2].result->objective==-7); + for(auto f:{Fault::Owner,Fault::Revision,Fault::Mask,Fault::Objective,Fault::NaNObjective,Fault::NaNBound, + Fault::Bound,Fault::FalseInfeasible,Fault::FalseUnbounded,Fault::NoWitness,Fault::Guarantee, + Fault::UnvalidatedObjective,Fault::InvalidUnvalidatedPoint,Fault::VendorGap,Fault::UnknownStatus}) { + reset();fault=f;const auto out=O::solve_scenarios(model,defs,options); + assert(out.stop_reason==O::Termination::NumericalFailure&&out.resolved==1&&out.attempted==2&&calls==2); + assert(out.outcomes[0].result->has_solution()&&out.outcomes[0].result->objective==3); + assert(out.outcomes[1].result&&out.outcomes[1].result->termination==O::Termination::NumericalFailure&&!out.outcomes[1].result->has_solution()); + assert(out.outcomes[2].state==O::ScenarioRunState::NotStarted&&!out.outcomes[2].result); + } + for(auto f:{Fault::Incomplete,Fault::InfiniteBound}){ + reset();fault=f;const auto out=O::solve_scenarios(model,defs,options); + assert(out.stop_reason==O::Termination::NodeLimit&&out.resolved==1&&calls==2); + assert(out.outcomes[1].result->has_solution()&&out.outcomes[1].check->validation.valid); + if(f==Fault::InfiniteBound)assert(out.outcomes[1].result->best_bound&&!std::isfinite(*out.outcomes[1].result->best_bound)&&!out.outcomes[1].result->absolute_gap); + } + reset();fault=Fault::Infeasible;auto infeasible=O::solve_scenarios(model,defs,options);assert(infeasible.all_resolved()&&calls==3); + reset();fault=Fault::Exception;auto allocation=O::solve_scenarios(model,defs,options); + assert(allocation.stop_reason==O::Termination::MemoryLimit&&allocation.resolved==1&&allocation.outcomes[1].result->termination==O::Termination::MemoryLimit); + for(const auto* point: {"admission","before_solve","after_solve","after_check","after_cleanup"}) { + reset();cancel_point=point;options.solve.cancellation=token; + const auto out=O::solve_scenarios(model,defs,options);assert(out.stop_reason==O::Termination::Cancelled); + if(cancel_point=="admission")assert(!out.batch&&calls==0); + else { + assert(out.batch&&out.resolved==1&&out.outcomes[0].result->has_solution()); + assert(!out.outcomes[1].result||!out.outcomes[1].result->has_solution()); + assert(calls==(cancel_point=="before_solve"?1:2)); + } + } + reset();cancel_point="batch_cleanup";cancel_index=3;options.solve.cancellation=token; + auto late=O::solve_scenarios(model,defs,options);assert(late.stop_reason==O::Termination::Cancelled&&!late.all_resolved()&&late.resolved==3); + for(const auto& stage:late.outcomes)assert(stage.result->has_solution()); + options={};reset();options.solve.backend=O::Backend::Native;options.solve.guarantee=O::Guarantee::Exact; + auto native=O::solve_scenarios(model,defs,options);assert(native.all_resolved());for(const auto& stage:native.outcomes)assert(stage.check->exact_witness_validated); + reset();fault=Fault::ExactFraction;auto fraction=O::solve_scenarios(model,defs,options);assert(fraction.stop_reason==O::Termination::NumericalFailure&&fraction.resolved==1); + for(auto f:{Fault::LooseExactBound,Fault::MissingExactBound}) { + reset();fault=f;auto bad=O::solve_scenarios(model,defs,options); + assert(bad.stop_reason==O::Termination::NumericalFailure&&bad.resolved==1&&!bad.all_resolved()); + } + reset();options.solve.node_limit=7;auto one=O::solve_scenarios(model,{{}},options);assert(one.all_resolved()&&calls==1&&observed_nodes==7); + reset();options.solve.node_limit=0;auto zero=O::solve_scenarios(model,{{}},options);assert(zero.stop_reason==O::Termination::NodeLimit&&calls==0); + options={};reset();auto measured=O::solve_scenarios(model,defs,options);assert(measured.all_resolved()); + bool partial=false; + for(std::size_t cap=0;cap<=measured.work;++cap){reset();options.max_work=cap;auto capped=O::solve_scenarios(model,defs,options); + assert(capped.work<=cap);if(capped.resolved>0&&capped.resolved<3)partial=true; + if(!capped.all_resolved())assert(capped.stop_reason==O::Termination::IterationLimit); + if(capped.resolved)assert(capped.outcomes[0].result->has_solution());} + assert(partial); + // The private historical snapshot survives original edits/destruction. + O::ScenarioBatchResult historical; + {O::Model local;auto v=local.add_integer(1,2);local.minimize({{v,1}},5);reset();options={};historical=O::solve_scenarios(local,{{}},options);} + assert(historical.all_resolved()&&historical.batch->materialize(historical.batch->scenario(0)).objective.offset==5); + // A public snapshot can guess the next process-local owner number; the + // artifact must still keep its private identity distinct from that source. + O::Model predicted;auto p=predicted.add_integer(0,1);predicted.minimize({{p,1}}); + auto forged=predicted.snapshot();++forged.model_id; + forged.variables[0].variable.model_id=forged.model_id;forged.objective.terms[0].variable.model_id=forged.model_id; + reset();auto distinct=O::solve_scenarios(forged,{{}},options); + assert(distinct.all_resolved()&&distinct.batch->id()!=forged.model_id); + std::cout<<"Scenario coordinator evidence, every work boundary and interruption gates passed\n"; +} diff --git a/test/optimize/session.cpp b/test/optimize/session.cpp new file mode 100644 index 0000000000..352f1d03f6 --- /dev/null +++ b/test/optimize/session.cpp @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +constexpr double inf = std::numeric_limits::infinity(); +static void close(double a, double b) { assert(std::abs(a-b) < 1e-6); } +static O::SolveResult compare(O::SolveSession& session, const O::ModelSnapshot& model, + const O::SolveOptions& options = {}) { + const auto warm = session.solve(model, options); + const auto cold = O::solve(model, options); + assert(warm.termination == cold.termination); + assert(warm.has_solution() == cold.has_solution()); + if (warm.has_solution()) { + assert(O::validate(model, warm.values).valid); + close(*warm.objective, *cold.objective); + } + return warm; +} + +int main() { + O::Model model; + const auto x = model.add_continuous(0, 100); + const auto y = model.add_continuous(0, 100); + const auto demand = model.add_row({{x,1},{y,1}}, 4, inf); + model.minimize({{x,2},{y,3}}, -3); + O::SolveSession session; + O::SolveOptions options; + options.time_limit_seconds = 0; + assert(session.solve(model, options).termination == O::Termination::TimeLimit); + assert(session.statistics().model_loads == 0); + options = {}; + if (!O::capabilities().available) { + assert(session.solve(model).termination == O::Termination::Unsupported); + assert(session.statistics().model_loads == 0); + std::cout << "session backend-unavailable contract passed\n"; + return 0; + } + auto first = compare(session, model.snapshot()); + close(*first.objective, 5); + assert(session.statistics().model_loads == 1); + model.set_bounds(demand, 8, inf); + close(*compare(session, model.snapshot()).objective, 13); + assert(session.statistics().incremental_updates == 1); + assert(session.statistics().basis_warm_starts == 1); + model.set_bounds(x, 0, 3); + close(*compare(session, model.snapshot()).objective, 18); + model.maximize({{x,-4},{y,-2}}, 10); + close(*compare(session, model.snapshot()).objective, -6); + assert(session.statistics().model_loads == 1); + close(first.value(x), 4); // Historical result survives every mutation. + + // Public snapshots can change without a revision increment: content decides. + auto snapshot = model.snapshot(); + snapshot.rows[demand.id].lower = 9; + close(*compare(session, snapshot).objective, -8); + snapshot.rows[demand.id].terms[0].coefficient = 2; + compare(session, snapshot); + assert(session.statistics().model_loads == 2); + snapshot.variables[x.id].type = O::VariableType::Integer; + compare(session, snapshot); + assert(session.statistics().model_loads == 3); + + O::Model typed; + const auto bit = typed.add_integer(0, 1); + typed.minimize({{bit,1}}); + compare(session, typed.snapshot()); + auto typed_snapshot = typed.snapshot(); + typed_snapshot.variables[bit.id].type = O::VariableType::Binary; + const auto type_loads = session.statistics().model_loads; + compare(session, typed_snapshot); + assert(session.statistics().model_loads == type_loads+1); + + // Row replacement with the same shape cannot reuse stale row identity. + compare(session, model.snapshot()); + auto loads = session.statistics().model_loads; + model.remove(demand); + model.add_row({{x,1},{y,1}}, 8, inf); + compare(session, model.snapshot()); + assert(session.statistics().model_loads == loads+1); + model.set_name(x, "renamed"); + auto unchanged = session.statistics().unchanged_models; + compare(session, model.snapshot()); + assert(session.statistics().unchanged_models == unchanged+1); + auto bad = model.snapshot(); + bad.rows.back().terms[0].variable.model_id = 0; + assert(session.solve(bad).termination == O::Termination::InvalidModel); + compare(session, model.snapshot()); + + // MIP starts are revalidated after each edit and user hints have precedence. + O::Model mip; + const auto z = mip.add_integer(0, 5); + mip.minimize({{z,1}}, 2); + close(*compare(session, mip.snapshot()).objective, 2); + mip.set_objective_offset(3); + auto warm = compare(session, mip.snapshot()); + assert(warm.start_submitted); + assert(session.statistics().incumbent_starts == 1); + mip.set_bounds(z, 2, 5); + warm = compare(session, mip.snapshot()); + assert(!warm.start_submitted); + close(*warm.objective, 5); + options.primal_start = {{z,4}}; + auto before = session.statistics().incumbent_starts; + warm = compare(session, mip.snapshot(), options); + assert(warm.start_submitted); + assert(session.statistics().incumbent_starts == before); + options = {}; + options.node_limit = 1; + compare(session, mip.snapshot(), options); + options = {}; + compare(session, mip.snapshot(), options); // Resets persistent node option. + options.cancellation = std::make_shared(); + options.cancellation->cancel(); + assert(session.solve(mip, options).termination == O::Termination::Cancelled); + compare(session, mip.snapshot()); // Fresh token and no dangling callback. + + O::Model semi; + auto sc = semi.add_variable(O::VariableType::SemiContinuous, 3, 8); + auto si = semi.add_variable(O::VariableType::SemiInteger, 2.5, 7); + auto sc_row = semi.add_row({{sc,1}}, 0, inf); + auto si_row = semi.add_row({{si,1}}, 0, inf); + semi.minimize({{sc,2},{si,1}}, -1); + close(*compare(session, semi.snapshot()).objective, -1); + semi.set_bounds(sc_row, 1, inf); semi.set_bounds(si_row, 1, inf); + close(*compare(session, semi.snapshot()).objective, 8); + semi.set_bounds(sc_row, 0, inf); semi.set_bounds(si_row, 0, inf); + close(*compare(session, semi.snapshot()).objective, -1); + + O::Model logic; + auto on = logic.add_binary(); auto quantity = logic.add_continuous(0, 10); + O::add_indicator(logic, on, true, {{quantity,1}}, 7, inf); + logic.minimize({{on,-20},{quantity,1}}); + close(*compare(session, logic.snapshot()).objective, -13); + logic.set_bounds(quantity, 8, 10); + close(*compare(session, logic.snapshot()).objective, -12); + logic.minimize({{on,20},{quantity,1}}); + close(*compare(session, logic.snapshot()).objective, 8); + + // Diagnostic reductions can leave only constant rows and integer columns. + // These must never enter HiGHS MIP presolve with an empty nonzero matrix. + O::Model constants; + const auto unused_bit = constants.add_binary(); + const auto constant_row = constants.add_row({}, -1, 1); + constants.minimize({{unused_bit,2}}, -4); + close(*compare(session, constants.snapshot()).objective, -4); + constants.set_bounds(constant_row, 1, inf); + assert(compare(session, constants.snapshot()).termination == O::Termination::Infeasible); + constants.set_bounds(constant_row, 0, inf); + close(*compare(session, constants.snapshot()).objective, -4); + constants.set_bounds(constant_row, 1e-8, inf); + close(*compare(session, constants.snapshot()).objective, -4); + O::SolveOptions tighter; + tighter.feasibility_tolerance = 1e-9; + assert(compare(session, constants.snapshot(), tighter).termination == O::Termination::Infeasible); + + // Seeded finite integer edits checked by a separate exhaustive oracle. + O::Model finite; + const auto a = finite.add_integer(-3, 5); + const auto b = finite.add_integer(-3, 5); + const auto row = finite.add_row({{a,2},{b,-1}}, 1, inf); + std::mt19937 rng(219); + for (int iteration=0; iteration<80; ++iteration) { + const int cost_a = int(rng()%9)-4, cost_b = int(rng()%9)-4; + const int lower = int(rng()%14)-4; + finite.set_bounds(row, lower, inf); + finite.minimize({{a,double(cost_a)},{b,double(cost_b)}}, -7); + double expected = inf; + for (int av=-3; av<=5; ++av) + for (int bv=-3; bv<=5; ++bv) + if (2*av-bv >= lower) + expected = std::min(expected, double(cost_a*av+cost_b*bv-7)); + const auto answer = session.solve(finite); + assert(answer.termination == O::Termination::Optimal && answer.has_solution()); + close(*answer.objective, expected); + } + + // LP infeasibility/unboundedness must not poison a later feasible revision. + O::Model lp; + const auto free = lp.add_continuous(-inf, inf); + lp.minimize({{free,1}}); + assert(compare(session, lp.snapshot()).termination == O::Termination::Unbounded); + lp.set_bounds(free, 2, 5); + close(*compare(session, lp.snapshot()).objective, 2); + const auto impossible = lp.add_row({{free,1}}, 6, inf); + assert(compare(session, lp.snapshot()).termination == O::Termination::Infeasible); + lp.set_bounds(impossible, 3, inf); + close(*compare(session, lp.snapshot()).objective, 3); + options = {}; + options.time_limit_seconds = 0.5; + for (int i=0; i<30; ++i) { + lp.set_objective_offset(i); + close(*compare(session, lp.snapshot(), options).objective, i+3); + } + + auto transferred = std::move(session); + assert(session.solve(lp).termination == O::Termination::InvalidModel); + compare(transferred, lp.snapshot()); + session.reset(); + assert(session.statistics().solve_calls == 0); + compare(session, lp.snapshot()); + assert(session.statistics().model_loads == 1); + O::Model empty; + empty.minimize({}, 11); + close(*session.solve(empty).objective, 11); + compare(session, lp.snapshot()); + assert(session.statistics().model_loads == 2); + O::Model moved; + O::Model owner(std::move(moved)); + assert(session.solve(moved).termination == O::Termination::InvalidModel); + std::cout << "persistent session and exhaustive edit conformance passed\n"; +} diff --git a/test/optimize/session_limits.cpp b/test/optimize/session_limits.cpp new file mode 100644 index 0000000000..7c2659e830 --- /dev/null +++ b/test/optimize/session_limits.cpp @@ -0,0 +1,93 @@ +/* Persistent option reset and callback lifetime regression, HiGHS 1.15.1. */ +#include +#include +#include +#include +#include +#include +#include + +namespace O=Gecode::Optimize; +namespace { +constexpr double inf=std::numeric_limits::infinity(); +void require(bool condition,const char* message){if(!condition)throw std::runtime_error(message);} +void near(double a,double b){require(std::isfinite(a)&&std::isfinite(b)&&std::abs(a-b)<1e-6,"objective mismatch");} + +O::Model node_fixture(){ + // Fixed mt19937 outputs (no implementation-dependent uniform distribution). + // Five-dimensional 0/1 knapsack. With HiGHS 1.15.1, seed 219, one thread + // and zero gap, node one leaves incumbent 1579 and upper bound 1590. + // Both a cold run and a retained-incumbent run need more search to close + // that gap. Do not replace it with a root-solved bound-only MIP. + std::mt19937 random(219); + O::Model m;std::vector variables;std::vector objective; + for(int i=0;i<48;++i){variables.push_back(m.add_binary());objective.push_back({variables.back(),double(1+random()%100)});} + for(int row=0;row<5;++row){std::vector terms;int sum=0; + for(auto v:variables){const int weight=1+random()%100;sum+=weight;terms.push_back({v,double(weight)});} + m.add_row(terms,-inf,(45*sum)/100); + } + m.maximize(objective);return m; +} + +O::SolveOptions unlimited_options(){ + O::SolveOptions options;options.threads=1;options.random_seed=219; + options.relative_gap=options.absolute_gap=0;options.time_limit_seconds=120; + return options; +} + +void require_limited(const O::Model& model,const O::SolveResult& result){ + require(result.termination==O::Termination::NodeLimit,"fixture no longer exercises a post-registration node cutoff"); + require(result.has_solution(),"node-limited fixture lost its known incumbent"); + require(O::validate(model.snapshot(),result.values).valid,"limited incumbent fails original validation"); + require(result.best_bound&&*result.best_bound>*result.objective+1,"node-one bound already closes the gap; reset test is vacuous"); +} +} + +int main(){ + try{ + auto model=node_fixture();O::SolveSession session; + if(!O::capabilities().available){ + require(session.solve(model).termination==O::Termination::Unsupported,"missing-backend session contract"); + std::cout<<"session limits backend-unavailable contract passed\n";return 0; + } + auto limited_options=unlimited_options();limited_options.node_limit=1; + const auto first=session.solve(model,limited_options);require_limited(model,first); + require(session.statistics().model_loads==1,"first limited model was not loaded"); + + // Positive control: retained hints alone must not let node one solve the + // fixture. Thus removing the persistent mip_max_nodes reset is detected. + const auto again=session.solve(model,limited_options);require_limited(model,again); + require(again.start_submitted&&session.statistics().incumbent_starts==1,"retained incumbent path was not exercised"); + + // A NEW options object has no node limit. Neither the previous native + // option nor its budget/callback captures may survive this call. + const auto unlimited=unlimited_options(); + const auto warm=session.solve(model,unlimited); + const auto cold=O::solve(model,unlimited); + require(warm.termination==O::Termination::Optimal&&warm.has_solution(),"old node limit contaminated unlimited session solve"); + require(cold.termination==O::Termination::Optimal&&cold.has_solution(),"cold oracle did not complete"); + require(O::validate(model.snapshot(),warm.values).valid&&O::validate(model.snapshot(),cold.values).valid,"completed original-model validation failed"); + near(*warm.objective,*cold.objective);near(*warm.objective,1579); + require(session.statistics().model_loads==1,"option reset unexpectedly reloaded the model"); + require(warm.start_submitted&&session.statistics().incumbent_starts==2,"unlimited solve did not exercise incumbent reuse"); + + // NodeLimit with a positive limit is only obtained after highs.run() and + // callback registration; the adapter's pre-run node counter is zero. + // Follow an interruption with a changed model to exercise teardown + // and replacement of callbacks that captured expired budgets/vectors. + // This is deterministic post-registration LIMIT interruption, not a claim + // to deterministically observe an asynchronous CancellationToken callback. + // That narrower test needs a registration hook; sleep-based races are not + // used here. Run this executable with the full library under ASan/UBSan. + { + require_limited(model,session.solve(model,limited_options)); + O::Model lp;const auto x=lp.add_continuous(2,5);lp.minimize({{x,3}},-1); + const auto fresh=session.solve(lp,unlimited_options()); + require(fresh.termination==O::Termination::Optimal&&fresh.has_solution(),"post-interruption fresh model failed"); + near(fresh.value(x),2);near(*fresh.objective,5); + // The original owning result must survive replacements and interrupts. + near(*first.objective,1579);require(first.has_solution(),"historical limited result was invalidated"); + } + std::cout<<"persistent node-limit reset and post-registration callback lifetime passed\n";return 0; + }catch(const std::exception& error){std::cerr<<"FAIL: "< +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; +constexpr double inf = std::numeric_limits::infinity(); +static void close(double a, double b) { assert(std::abs(a-b) < 1e-6); } + +int main() { + O::Model basic; + auto x = basic.add_continuous(0, 100, "x"); + basic.add_row({{x, 1}}, 4, inf, "demand"); + basic.minimize({{x, 2}}, -3); + O::SolveOptions options; + options.guarantee = O::Guarantee::Certified; + assert(O::solve(basic, options).termination == O::Termination::Unsupported); + options.guarantee = O::Guarantee::Numerical; + options.time_limit_seconds = 0; + assert(O::solve(basic, options).termination == O::Termination::TimeLimit); + options.time_limit_seconds = inf; + options.cancellation = std::make_shared(); + options.cancellation->cancel(); + assert(O::solve(basic, options).termination == O::Termination::Cancelled); + options = {}; + auto malformed = basic.snapshot(); + malformed.rows[0].terms[0].variable.model_id = 0; + assert(O::solve(malformed).termination == O::Termination::InvalidModel); + O::Model moved_from; + O::Model moved_to(std::move(moved_from)); + assert(O::solve(moved_from).termination==O::Termination::InvalidModel); + if (!O::capabilities().available) { + assert(O::solve(basic).termination == O::Termination::Unsupported); + std::cout << "backend-unavailable contract passed\n"; + return 0; + } + auto result = O::solve(basic); + assert(result.termination == O::Termination::Optimal && result.has_solution()); + close(result.value(x), 4); close(*result.objective, 5); + assert(result.backend == "HiGHS" && !result.backend_version.empty()); + assert(result.guarantee == O::Guarantee::Numerical); + const auto old_revision = result.revision; + basic.set_bounds(x, 5, 100); + auto edited = O::solve(basic); + close(*edited.objective, 7); close(result.value(x), 4); + assert(edited.revision > old_revision); + basic.maximize({{x, -2}}, 3); + auto maximum = O::solve(basic); + close(*maximum.objective, -7); close(maximum.value(x), 5); + if (maximum.relative_gap) close(*maximum.relative_gap, 0); + + O::Model mixed; + auto open = mixed.add_binary("open"); + auto q = mixed.add_continuous(0, 100, "quantity"); + auto count = mixed.add_integer(0, 4, "count"); + mixed.add_row({{q,1},{open,-100}}, -inf, 0, "capacity"); + mixed.add_row({{q,1},{count,3}}, 43, inf, "demand"); + mixed.minimize({{open,12},{q,0.5},{count,2}}); + auto mip = O::solve(mixed); + assert(mip.termination == O::Termination::Optimal && mip.has_solution()); + close(*mip.objective, 33.5); + assert(O::validate(mixed.snapshot(), mip.values).valid); + + // Sparse starts guide the solver without fixing the supplied variables. + options.primal_start = {{open,1}}; + auto started = O::solve(mixed,options); + assert(started.start_submitted && started.has_solution()); + close(*started.objective,33.5); + options.primal_start = {{open,1},{q,50},{count,0}}; + started = O::solve(mixed,options); + assert(started.start_submitted && started.has_solution()); + close(*started.objective,33.5); + options.primal_start = {{open,0},{q,0},{count,0}}; + assert(O::solve(mixed,options).termination==O::Termination::InvalidModel); + options.primal_start = {{open,1},{open,1}}; + assert(O::solve(mixed,options).termination==O::Termination::InvalidModel); + options.primal_start = {{x,5}}; + assert(O::solve(mixed,options).termination==O::Termination::InvalidModel); + options.primal_start = {{count,1.5}}; + assert(O::solve(mixed,options).termination==O::Termination::InvalidModel); + options.primal_start = {{q,std::numeric_limits::quiet_NaN()}}; + assert(O::solve(mixed,options).termination==O::Termination::InvalidModel); + options = {}; + options.threads=2; + assert(O::solve(mixed,options).termination==O::Termination::Unsupported); + options = {}; + + // Cross-feature conformance: typed indicators retain their original meaning + // through native backend presolve, primal starts and multiobjective locks. + O::Model logical; + auto enabled=logical.add_binary("enabled"); + auto amount=logical.add_continuous(0,10,"amount"); + auto lower=O::add_indicator(logical,enabled,true,{{amount,1}},7,inf); + O::add_indicator(logical,enabled,false,{{amount,1}},-inf,3); + logical.minimize({{enabled,-20},{amount,1}}); + options.primal_start={{enabled,0},{amount,0}}; + auto lr=O::solve(logical,options); + assert(lr.has_solution() && lr.start_submitted); + close(lr.value(enabled),1); close(lr.value(amount),7); close(*lr.objective,-13); + O::ObjectiveData first{{{enabled,1}},0,O::ObjectiveSense::Maximize}; + O::ObjectiveData second{{{amount,1}},0,O::ObjectiveSense::Minimize}; + auto lex=O::solve_lexicographic(logical,{{first,0,0,"activate"},{second,0,0,"quantity"}},options); + assert(lex.completed_numerically() && lex.has_solution()); + close(lex.final_solution.value(amount),7); + O::remove_indicator(logical,lower.indicator); + options={}; + lr=O::solve(logical); + assert(lr.has_solution()); close(*lr.objective,-20); + + O::Model infeasible; + auto z = infeasible.add_integer(0, 0.5); + infeasible.add_row({{z,1}}, 0.25, inf); + assert(O::solve(infeasible).termination == O::Termination::Infeasible); + O::Model unbounded; + auto free = unbounded.add_continuous(-inf,inf); + unbounded.minimize({{free,1}}); + auto unb = O::solve(unbounded); + assert(unb.termination == O::Termination::Unbounded || unb.termination == O::Termination::InfeasibleOrUnbounded); + O::Model empty; + empty.minimize({},7); + auto emp = O::solve(empty); assert(emp.has_solution()); close(*emp.objective,7); + empty.add_row({},1,inf); + assert(O::solve(empty).termination == O::Termination::Infeasible); + options.time_limit_seconds=0; + assert(O::solve(empty,options).termination==O::Termination::TimeLimit); + options = {}; + + O::Model deleted; + auto dead = deleted.add_binary(); + deleted.remove(dead); + auto live = deleted.add_integer(2,5); + deleted.minimize({{live,1}}); + auto del = O::solve(deleted); close(del.value(live),2); + bool threw = false; try { del.value(dead); } catch (const O::ModelError&) { threw=true; } + assert(threw && std::isnan(del.values[dead.id])); + + O::Model semi; + auto s = semi.add_variable(O::VariableType::SemiContinuous,3,8,"semi"); + semi.add_row({{s,1}},1,inf); + semi.minimize({{s,1}}); + auto sr = O::solve(semi); assert(sr.has_solution()); close(sr.value(s),3); + semi.set_bounds(semi.snapshot().rows[0].constraint,0,inf); + sr=O::solve(semi); assert(sr.has_solution()); close(sr.value(s),0); + options.primal_start={{s,0}}; + sr=O::solve(semi,options); + assert(sr.has_solution() && sr.start_submitted); close(sr.value(s),0); + auto semi_other=semi.add_binary("other"); + sr=O::solve(semi,options); // A zero-valued semi variable in a partial start. + assert(sr.has_solution() && sr.start_submitted); close(sr.value(s),0); + options.primal_start={{s,0},{semi_other,0}}; + sr=O::solve(semi,options); assert(sr.has_solution() && sr.start_submitted); + options={}; + O::Model semi_integer; + auto si=semi_integer.add_variable(O::VariableType::SemiInteger,3,8); + semi_integer.minimize({{si,1}}); + options.primal_start={{si,0}}; + sr=O::solve(semi_integer,options); + assert(sr.has_solution() && sr.start_submitted); close(sr.value(si),0); + options={}; + + O::Model tiny; + auto t = tiny.add_continuous(0,1); + tiny.add_row({{t,1e-14}},0,1); + assert(O::solve(tiny).termination == O::Termination::Unsupported); + + // Differential tiny MILPs: exhaustive integer choice plus analytic recourse. + std::mt19937 rng(1701); + for (int iteration=0; iteration<30; ++iteration) { + const int demand=1+static_cast(rng()%12), fixed=1+static_cast(rng()%7); + const int rate=1+static_cast(rng()%4); + O::Model problem; + auto n=problem.add_integer(0,5), y=problem.add_continuous(0,20); + problem.add_row({{n,3},{y,1}},demand,inf); + problem.minimize({{n,static_cast(fixed)},{y,static_cast(rate)}},-10); + double oracle=inf; + for (int i=0;i<=5;++i) oracle=std::min(oracle,-10.0+fixed*i+rate*std::max(0,demand-3*i)); + auto r=O::solve(problem); assert(r.termination==O::Termination::Optimal && r.has_solution()); + close(*r.objective,oracle); + } + + const auto temp = std::filesystem::temp_directory_path()/ + ("gecode-optimize-test-"+std::to_string(std::random_device{}())); + std::filesystem::create_directory(temp); + for (const auto extension : {".lp",".mps"}) { + auto path=(temp/(std::string("roundtrip")+extension)).string(); + O::write_model(mixed,path); + auto restored=O::read_model(path); + auto r=O::solve(restored); assert(r.has_solution()); close(*r.objective,*mip.objective); + assert(restored.snapshot().rows.size()==mixed.snapshot().rows.size()); + } + auto qp=(temp/"quadratic.lp").string(); + { std::ofstream file(qp); file << "Minimize\n obj: [ x ^ 2 ] / 2\nSubject To\n c: x >= 1\nEnd\n"; } + threw=false; try { auto ignored=O::read_model(qp); } catch (const std::exception&) { threw=true; } + assert(threw); + std::filesystem::remove_all(temp); + std::cout << "LP/MILP integration, original validation, limits and I/O passed\n"; +} diff --git a/test/optimize/validate.cpp b/test/optimize/validate.cpp new file mode 100644 index 0000000000..b5297d3542 --- /dev/null +++ b/test/optimize/validate.cpp @@ -0,0 +1,336 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace O = Gecode::Optimize; + +namespace { + +constexpr double infinity = std::numeric_limits::infinity(); +constexpr double nan = std::numeric_limits::quiet_NaN(); + +void require(bool condition, const std::string& message) { + if (!condition) + throw std::runtime_error(message); +} + +void near(double actual, double expected, const std::string& message) { + require(std::fabs(actual - expected) <= 1e-12, message); +} + +O::ModelSnapshot empty_model() { + O::ModelSnapshot model; + model.model_id = 42; + return model; +} + +O::Variable add_variable(O::ModelSnapshot& model, O::VariableType type, + double lower, double upper, bool active = true) { + O::VariableData data; + data.variable = {model.model_id, static_cast(model.variables.size())}; + data.type = type; + data.lower = lower; + data.upper = upper; + data.active = active; + model.variables.push_back(data); + return data.variable; +} + +void add_row(O::ModelSnapshot& model, std::vector terms, + double lower, double upper, bool active = true) { + O::RowData data; + data.constraint = {model.model_id, static_cast(model.rows.size())}; + data.terms = std::move(terms); + data.lower = lower; + data.upper = upper; + data.active = active; + model.rows.push_back(std::move(data)); +} + +O::ModelSnapshot production() { + auto model = empty_model(); + const auto open = add_variable(model, O::VariableType::Binary, 0.0, 1.0); + const auto quantity = add_variable(model, O::VariableType::Continuous, 0.0, 100.0); + add_row(model, {{open, -100.0}, {quantity, 1.0}}, -infinity, 0.0); + add_row(model, {{quantity, 1.0}}, 40.0, infinity); + model.objective.terms = {{open, 12.0}, {quantity, 0.5}}; + model.objective.offset = 7.0; + return model; +} + +void malformed(const O::ModelSnapshot& model, const std::string& description) { + bool threw = false; + try { + O::validate_structure(model); + } catch (const O::ModelError&) { + threw = true; + } + require(threw, "structure accepted " + description); + const auto report = O::validate(model, std::vector(model.variables.size(), 0.0)); + require(!report.valid && !report.model_valid && !report.message.empty() && !report.objective, + "malformed model did not return an invalid report: " + description); +} + +void analytic_checks() { + // The residual is one even when a platform rounds the row activity to 1e16. + // Check both range sides and the independent original indicator predicate. + for (double sign : {-1.0, 1.0}) { + O::Model cancellation; + auto x = cancellation.add_continuous(1, 1); + auto y = cancellation.add_continuous(1e6, 1e6); + auto active = cancellation.add_binary(); + auto row = cancellation.add_row({{x, sign}, {y, 1e10}}, 1e16, 1e16); + auto snapshot = cancellation.snapshot(); + auto failed = O::validate(snapshot, {1, 1e6, 1}, 0.9, 0); + require(!failed.valid, "small residual lost after large row cancellation"); + near(failed.max_row_violation, 1, "large row cancellation residual incorrect"); + require(O::validate(snapshot, {1, 1e6, 1}, 1, 0).valid, + "absolute tolerance mishandled after large row cancellation"); + cancellation.remove(row); + O::add_indicator(cancellation, active, true, {{x, sign}, {y, 1e10}}, 1e16, 1e16); + snapshot = cancellation.snapshot(); + std::vector values(snapshot.variables.size(), 0); + values[x.id] = 1; values[y.id] = 1e6; values[active.id] = 1; + failed = O::validate(snapshot, values, 0.9, 0); + require(!failed.valid, "small residual lost after large indicator cancellation"); + near(failed.max_indicator_violation, 1, "indicator cancellation residual incorrect"); + } + const auto model = production(); + O::validate_structure(model); + auto report = O::validate(model, {1.0, 40.0}); + require(report.valid && report.model_valid && report.objective, "feasible production rejected"); + near(*report.objective, 39.0, "objective offset not included"); + near(report.max_bound_violation, 0.0, "valid bounds have violation"); + near(report.max_row_violation, 0.0, "valid rows have violation"); + near(report.max_integrality_violation, 0.0, "valid integers have violation"); + + report = O::validate(model, {1.0, 39.0}); + require(!report.valid && report.model_valid, "demand violation accepted"); + near(report.max_row_violation, 1.0, "demand residual incorrect"); + report = O::validate(model, {0.5, 50.0}); + require(!report.valid, "fractional binary accepted"); + near(report.max_integrality_violation, 0.5, "integrality residual incorrect"); + report = O::validate(model, {1.25, 40.0}); + require(!report.valid, "binary bound violation accepted"); + near(report.max_bound_violation, 0.25, "binary bound residual incorrect"); + + auto negative = empty_model(); + const auto x = add_variable(negative, O::VariableType::Integer, -10.0, -2.0); + add_row(negative, {{x, -2.0}}, 6.0, 8.0); + negative.objective.terms = {{x, 3.0}}; + negative.objective.offset = -1.0; + negative.objective.sense = O::ObjectiveSense::Maximize; + report = O::validate(negative, {-3.0}); + require(report.valid && report.objective, "negative integer/ranged row rejected"); + near(*report.objective, -10.0, "maximize objective was wrongly negated"); + report = O::validate(negative, {-5.0}); + require(!report.valid, "upper ranged-row violation accepted"); + near(report.max_row_violation, 2.0, "upper ranged-row residual incorrect"); + + auto empty = empty_model(); + empty.objective.offset = 9.0; + report = O::validate(empty, {}); + require(report.valid && report.objective, "empty feasible model rejected"); + near(*report.objective, 9.0, "empty objective offset incorrect"); + add_row(empty, {}, 1.0, infinity); + O::validate_structure(empty); + report = O::validate(empty, {}); + require(!report.valid && report.model_valid, "constant infeasible row accepted"); + near(report.max_row_violation, 1.0, "constant infeasible row residual incorrect"); + + auto no_integer = empty_model(); + add_variable(no_integer, O::VariableType::Integer, 0.2, 0.8); + O::validate_structure(no_integer); + report = O::validate(no_integer, {0.5}); + require(report.model_valid && !report.valid, "empty integer interval is not treated as infeasible"); +} + +void semi_checks() { + auto model = empty_model(); + add_variable(model, O::VariableType::SemiContinuous, 2.0, 5.0); + add_variable(model, O::VariableType::SemiInteger, 3.0, 7.0); + require(O::validate(model, {0.0, 0.0}).valid, "zero semi-variable alternatives rejected"); + require(O::validate(model, {2.25, 4.0}).valid, "nonzero semi-variable alternatives rejected"); + auto report = O::validate(model, {1.0, 2.0}); + require(!report.valid, "semi-variable holes accepted"); + near(report.max_bound_violation, 1.0, "semi-variable distance incorrect"); + report = O::validate(model, {2.25, 3.5}); + require(!report.valid, "fractional semi-integer accepted"); + near(report.max_integrality_violation, 0.5, "semi-integer residual incorrect"); + report = O::validate(model, {-0.25, 0.0}); + require(!report.valid, "negative semi-continuous accepted"); + near(report.max_bound_violation, 0.25, "semi-variable zero distance incorrect"); + require(O::validate(model, {-5e-8, 0.0}, 1e-7, 0.0).valid, + "semi-continuous zero tolerance rejected"); + require(!O::validate(model, {0.0, 5e-8}, 1e-7, 0.0).valid, + "semi-integer zero bypassed integrality tolerance"); + model.variables[0].upper = infinity; + require(O::validate(model, {1e100, 0.0}).valid, + "abstract semi-variable infinite upper bound rejected"); + + auto semi_empty = empty_model(); + add_variable(semi_empty, O::VariableType::SemiInteger, 0.2, 0.8); + require(O::validate(semi_empty, {0.0}).valid, + "semi-integer with empty positive interval lost zero alternative"); +} + +void malformed_checks() { + using Mutation = std::function; + const std::vector> cases = { + {"zero model ID", [](auto& m) { m.model_id = 0; }}, + {"variable wrong owner", [](auto& m) { m.variables[0].variable.model_id = 999; }}, + {"variable wrong slot", [](auto& m) { m.variables[0].variable.id = 1; }}, + {"row wrong owner", [](auto& m) { m.rows[0].constraint.model_id = 999; }}, + {"row wrong slot", [](auto& m) { m.rows[0].constraint.id = 1; }}, + {"variable NaN lower", [](auto& m) { m.variables[1].lower = nan; }}, + {"variable NaN upper", [](auto& m) { m.variables[1].upper = nan; }}, + {"variable positive infinite lower", [](auto& m) { m.variables[1].lower = infinity; }}, + {"variable negative infinite upper", [](auto& m) { m.variables[1].upper = -infinity; }}, + {"reversed variable bounds", [](auto& m) { m.variables[1].lower = 101.0; }}, + {"binary lower below zero", [](auto& m) { m.variables[0].lower = -1.0; }}, + {"binary upper above one", [](auto& m) { m.variables[0].upper = 2.0; }}, + {"row NaN lower", [](auto& m) { m.rows[0].lower = nan; }}, + {"row NaN upper", [](auto& m) { m.rows[0].upper = nan; }}, + {"row positive infinite lower", [](auto& m) { m.rows[0].lower = infinity; }}, + {"row negative infinite upper", [](auto& m) { m.rows[0].upper = -infinity; }}, + {"reversed row bounds", [](auto& m) { m.rows[0].lower = 1.0; }}, + {"negative variable type", [](auto& m) { m.variables[0].type = static_cast(-1); }}, + {"unknown variable type", [](auto& m) { m.variables[0].type = static_cast(99); }}, + {"negative objective sense", [](auto& m) { m.objective.sense = static_cast(-1); }}, + {"unknown objective sense", [](auto& m) { m.objective.sense = static_cast(99); }}, + {"NaN offset", [](auto& m) { m.objective.offset = nan; }}, + {"infinite offset", [](auto& m) { m.objective.offset = infinity; }}, + {"row wrong term owner", [](auto& m) { m.rows[0].terms[0].variable.model_id = 999; }}, + {"row dangling term", [](auto& m) { m.rows[0].terms[1].variable.id = 99; }}, + {"objective wrong term owner", [](auto& m) { m.objective.terms[0].variable.model_id = 999; }}, + {"objective dangling term", [](auto& m) { m.objective.terms[1].variable.id = 99; }}, + {"row NaN coefficient", [](auto& m) { m.rows[0].terms[0].coefficient = nan; }}, + {"row infinite coefficient", [](auto& m) { m.rows[0].terms[0].coefficient = infinity; }}, + {"objective NaN coefficient", [](auto& m) { m.objective.terms[0].coefficient = nan; }}, + {"objective infinite coefficient", [](auto& m) { m.objective.terms[0].coefficient = infinity; }}, + {"row zero coefficient", [](auto& m) { m.rows[0].terms[0].coefficient = 0.0; }}, + {"objective zero coefficient", [](auto& m) { m.objective.terms[0].coefficient = -0.0; }}, + {"duplicate row terms", [](auto& m) { m.rows[0].terms.push_back(m.rows[0].terms.back()); }}, + {"duplicate objective terms", [](auto& m) { m.objective.terms.push_back(m.objective.terms.back()); }}, + {"unsorted row terms", [](auto& m) { std::swap(m.rows[0].terms[0], m.rows[0].terms[1]); }}, + {"unsorted objective terms", [](auto& m) { std::swap(m.objective.terms[0], m.objective.terms[1]); }}, + {"active deleted-variable reference", [](auto& m) { m.variables[0].active = false; }} + }; + for (const auto& test : cases) { + auto model = production(); + test.second(model); + malformed(model, test.first); + } + for (const double lower : {0.0, -1.0, -infinity, infinity}) { + auto model = empty_model(); + add_variable(model, O::VariableType::SemiContinuous, lower, infinity); + malformed(model, "unsupported semi-variable lower bound"); + } +} + +void assignment_and_tolerance_checks() { + const auto model = production(); + for (const auto& values : std::vector>{ + {}, {1.0}, {1.0, 40.0, 0.0}, {nan, 40.0}, {1.0, infinity}, {1.0, -infinity}}) { + const auto report = O::validate(model, values); + require(!report.valid && report.model_valid && !report.objective, + "invalid assignment accepted or mislabeled as malformed model"); + } + for (const double tolerance : {-1.0, infinity, -infinity, nan}) { + auto report = O::validate(model, {1.0, 40.0}, tolerance, 0.0); + require(!report.valid && report.model_valid, "invalid feasibility tolerance accepted"); + report = O::validate(model, {1.0, 40.0}, 0.0, tolerance); + require(!report.valid && report.model_valid, "invalid integrality tolerance accepted"); + } + require(O::validate(model, {1.0 + 5e-8, 40.0}, 1e-7, 1e-6).valid, + "absolute bound/integrality tolerance rejected"); + require(!O::validate(model, {1.0 + 5e-8, 40.0}, 0.0, 1e-6).valid, + "zero feasibility tolerance ignored"); + auto scaled = empty_model(); + const auto x = add_variable(scaled, O::VariableType::Continuous, -infinity, infinity); + add_row(scaled, {{x, 1e9}}, -infinity, 1e9); + const auto report = O::validate(scaled, {1.0 + 1e-8}, 1e-7, 1e-6); + require(!report.valid && report.max_row_violation > 9.0, + "row tolerance was silently normalized by scale"); +} + +void deleted_slot_checks() { + auto model = production(); + const auto removed = add_variable(model, O::VariableType::Continuous, -infinity, infinity, false); + add_row(model, {{removed, 1.0}}, 99.0, 99.0, false); + auto report = O::validate(model, {1.0, 40.0, nan}); + require(report.valid && report.objective, "unreferenced deleted NaN slot was evaluated"); + near(*report.objective, 39.0, "deleted row changed objective"); + require(!O::validate(model, {1.0, 40.0}).valid, "deleted slot omitted from assignment dimension"); + auto altered = model; + altered.rows.back().active = true; + malformed(altered, "reactivated row referencing deleted slot"); + altered = model; + altered.objective.terms.push_back({removed, 1.0}); + malformed(altered, "objective references deleted slot"); + altered = model; + altered.variables.back().variable.model_id = 999; + malformed(altered, "deleted slot wrong owner"); + altered = model; + altered.rows.back().constraint.id = 999; + malformed(altered, "deleted row wrong slot"); +} + +void accumulation_checks() { + auto model = empty_model(); + const auto x = add_variable(model, O::VariableType::Continuous, -infinity, infinity); + model.objective.terms = {{x, std::numeric_limits::max()}}; + model.objective.offset = std::numeric_limits::max(); + auto report = O::validate(model, {1.0}); + require(!report.valid && report.model_valid && !report.objective, + "objective offset accumulation overflow accepted"); + model.objective.offset = 0.0; + report = O::validate(model, {std::numeric_limits::max()}); + require(!report.valid && !report.objective, "objective product overflow accepted"); + model.objective.terms.clear(); + add_row(model, {{x, std::numeric_limits::max()}}, -infinity, 1.0); + report = O::validate(model, {std::numeric_limits::max()}); + require(!report.valid, "large row activity accepted"); + + // Many large positive terms, a small term, then many large negative terms + // exercise cancellation independently of sparse coalescing in Model. + auto cancellation = empty_model(); + std::vector terms; + constexpr std::size_t side = 1024; + for (std::size_t i = 0; i < 2 * side + 1; ++i) { + const auto variable = add_variable(cancellation, O::VariableType::Continuous, 1.0, 1.0); + terms.push_back({variable, i < side ? 1e16 : (i == side ? 1.0 : -1e16)}); + } + add_row(cancellation, terms, 1.0, 1.0); + cancellation.objective.terms = terms; + cancellation.objective.offset = 11.0; + report = O::validate(cancellation, std::vector(terms.size(), 1.0), 0.0, 0.0); + require(report.valid && report.objective, "compensated large-term cancellation failed"); + near(*report.objective, 12.0, "compensated objective incorrect"); +} + +} + +int main() { + try { + analytic_checks(); + semi_checks(); + malformed_checks(); + assignment_and_tolerance_checks(); + deleted_slot_checks(); + accumulation_checks(); + std::cout << "PASS independent original-model validation\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << "FAIL: " << error.what() << '\n'; + return 1; + } +} diff --git a/test/optimize/workflow.cpp b/test/optimize/workflow.cpp new file mode 100644 index 0000000000..8871dbbe22 --- /dev/null +++ b/test/optimize/workflow.cpp @@ -0,0 +1,434 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace Gecode::Optimize; + +#ifdef GECODE_WORKFLOW_TEST_FAKE_SOLVER + +namespace { +enum class Scenario { Incomplete, CancelDuringSolve, BadLock, MissingBound, FalseInfeasible, + CancellationResidual, ForgedCancellationObjective, ForgedCancellationGap }; +Scenario scenario = Scenario::Incomplete; +unsigned calls = 0; +double previous_remaining = std::numeric_limits::infinity(); +} + +// Compile this test mode with model/result/validate/workflow.cpp, without the +// real solve.cpp. Deterministic stops exercise the coordinator without sleeping +// or relying on solver/runtime speed. It also distrusts a malformed candidate. +namespace Gecode { namespace Optimize { +SolveResult solve(const ModelSnapshot& model, const SolveOptions& options) { + assert(options.relative_gap == 0 && options.absolute_gap == 0); + assert(options.time_limit_seconds <= previous_remaining); + previous_remaining = options.time_limit_seconds; + if (calls != 0) { + assert(options.primal_start.empty()); + assert(model.rows.size() == calls); // one independently checked prior lock + } + if (scenario == Scenario::CancellationResidual || + scenario == Scenario::ForgedCancellationObjective || + scenario == Scenario::ForgedCancellationGap) { + assert(calls == 0 && model.variables.size() == 2); + SolveResult result; + result.model_id = model.model_id; result.revision = model.revision; + result.values = {1, 1}; result.active_variables = {true, true}; + const auto checked = validate(model, result.values); + // This fixture's exact objective is 1 + big - big = 1. Its + // coefficient/offset scale exceeds even an x87 long-double significand. + assert(checked.valid && checked.objective == 1); + result.solution_validated = true; + result.objective = 1; result.best_bound = 1; + result.update_gaps(model.objective.sense); + result.termination = Termination::Optimal; + if (scenario == Scenario::ForgedCancellationObjective) result.objective = 0; + if (scenario != Scenario::CancellationResidual) result.best_bound = 0; + // The forged cases deliberately retain the prior cached zero gap. + ++calls; + return result; + } + SolveResult result; + result.model_id = model.model_id; + result.revision = model.revision; + result.backend = "deterministic test backend"; + result.values = {calls == 0 ? 0.0 : 1.0}; + if (scenario != Scenario::BadLock) result.values[0] = 0.0; + for (const auto& variable : model.variables) result.active_variables.push_back(variable.active); + const auto report = validate(model, result.values); + result.solution_validated = scenario == Scenario::BadLock || report.valid; + result.objective = calls == 0 ? 0.0 : result.values[0]; + result.best_bound = result.objective; + result.update_gaps(model.objective.sense); + result.termination = Termination::Optimal; + if (scenario == Scenario::MissingBound) { + result.best_bound.reset(); + result.absolute_gap.reset(); + result.relative_gap.reset(); + } + if (scenario == Scenario::CancelDuringSolve) options.cancellation->cancel(); + if (calls == 1 && scenario == Scenario::Incomplete) + result.termination = Termination::TimeLimit; + if (calls == 1 && scenario == Scenario::FalseInfeasible) { + result.termination = Termination::Infeasible; + result.solution_validated = false; + result.objective.reset(); + result.values.clear(); + } + ++calls; + return result; +} +}} + +int main() { + Model model; + auto x = model.add_binary(); + LexicographicObjective first; + first.objective.terms = {{x, 1}}; + auto second = first; + second.objective.sense = ObjectiveSense::Maximize; + const std::vector objectives{first, second, first}; + for (Scenario selected : {Scenario::Incomplete, Scenario::CancelDuringSolve, + Scenario::BadLock, Scenario::MissingBound, Scenario::FalseInfeasible}) { + scenario = selected; + calls = 0; + previous_remaining = std::numeric_limits::infinity(); + SolveOptions options; + options.time_limit_seconds = 60; + options.primal_start = {{x, 1}}; + auto result = solve_lexicographic(model, objectives, options); + assert(!result.completed_numerically()); + if (selected == Scenario::CancelDuringSolve) { + assert(calls == 1 && result.termination == Termination::Cancelled); + assert(!result.has_solution() && result.completed_stages == 0); + assert(!result.stages[0].result.has_solution()); + } else if (selected == Scenario::MissingBound) { + assert(calls == 1 && result.termination == Termination::NumericalFailure); + assert(result.has_solution() && result.completed_stages == 0); + } else { + assert(calls == 2 && result.completed_stages == 1); + assert(result.stages.size() == 2 && !result.stages.back().completed); + assert(result.has_solution() && result.final_solution.value(x) == 0); + assert(result.termination == (selected == Scenario::Incomplete + ? Termination::TimeLimit : Termination::NumericalFailure)); + } + } + for (auto selected : {Scenario::CancellationResidual, + Scenario::ForgedCancellationObjective, Scenario::ForgedCancellationGap}) { + scenario = selected; calls = 0; + previous_remaining = std::numeric_limits::infinity(); + Model cancellation; + auto residual = cancellation.add_continuous(1, 1); + auto fixed = cancellation.add_continuous(1, 1); + const double big = std::ldexp(1.0, std::numeric_limits::digits + 2); + assert(std::isfinite(big)); + cancellation.minimize({{residual, 1}, {fixed, big}}, -big); + LexicographicObjective objective; + objective.objective = cancellation.snapshot().objective; + auto result = solve_lexicographic(cancellation, {objective}); + assert(calls == 1 && result.has_solution()); + assert(result.final_solution.objective == 1); + assert(result.objective_values == std::vector{1}); + if (selected == Scenario::CancellationResidual) { + assert(result.completed_numerically() && result.completed_stages == 1); + } else { + assert(result.termination == Termination::NumericalFailure); + assert(!result.completed_numerically() && result.completed_stages == 0); + } + } +} + +#else + +namespace { +const double infinity = std::numeric_limits::infinity(); + +LexicographicObjective objective(Variable variable, ObjectiveSense sense, + double offset = 0.0) { + LexicographicObjective objective; + objective.objective = {{{variable, 1.0}}, offset, sense}; + return objective; +} + +double value(const ObjectiveData& objective, const std::vector& point) { + double total = objective.offset; + for (const auto& term : objective.terms) + total += term.coefficient * point[term.variable.id]; + return total; +} + +struct Oracle { + std::vector stage_optima; + std::vector> final_points; +}; + +// Independent exhaustive arithmetic oracle: input points are generated by +// explicit test-case inequalities, not by the solver or its model validator. +Oracle enumerate(std::vector> points, + const std::vector& objectives) { + Oracle oracle; + for (const auto& descriptor : objectives) { + const auto& objective = descriptor.objective; + double best = objective.sense == ObjectiveSense::Minimize ? infinity : -infinity; + for (const auto& point : points) { + const auto candidate = value(objective, point); + best = objective.sense == ObjectiveSense::Minimize + ? std::min(best, candidate) : std::max(best, candidate); + } + assert(std::isfinite(best)); + oracle.stage_optima.push_back(best); + const auto degradation = descriptor.absolute_degradation + + descriptor.relative_degradation * std::fabs(best); + points.erase(std::remove_if(points.begin(), points.end(), [&](const auto& point) { + const auto candidate = value(objective, point); + return objective.sense == ObjectiveSense::Minimize + ? candidate > best + degradation : candidate < best - degradation; + }), points.end()); + } + oracle.final_points = std::move(points); + return oracle; +} + +void verify(const LexicographicResult& result, const Oracle& oracle, + const std::vector& objectives) { + assert(result.completed_numerically()); + assert(result.termination == Termination::Optimal); + assert(result.guarantee == Guarantee::Numerical); + assert(result.has_solution()); + assert(result.completed_stages == objectives.size()); + assert(result.stages.size() == objectives.size()); + for (std::size_t i = 0; i < objectives.size(); ++i) { + assert(result.stages[i].completed); + assert(result.stages[i].index == i); + assert(result.stages[i].result.termination == Termination::Optimal); + assert(result.stages[i].result.objective == oracle.stage_optima[i]); + assert(result.objective_values[i] == value(objectives[i].objective, + result.final_solution.values)); + } + assert(std::find(oracle.final_points.begin(), oracle.final_points.end(), + result.final_solution.values) != oracle.final_points.end()); + assert(result.final_solution.termination == Termination::Unknown); + assert(!result.final_solution.best_bound && !result.final_solution.absolute_gap && + !result.final_solution.relative_gap && !result.final_solution.native_backend_gap); +} + +void discrete_oracle_tests() { + Model model; + auto x = model.add_integer(0, 4, "x"); + auto y = model.add_integer(0, 4, "y"); + auto demand = model.add_row({{x, 1}, {y, 1}}, 2, infinity, "demand"); + model.maximize({{x, 3}, {y, 2}}, 7); + const auto before = model.snapshot(); + std::vector> points; + for (int a = 0; a <= 4; ++a) + for (int b = 0; b <= 4; ++b) + if (a + b >= 2) points.push_back({static_cast(a), static_cast(b)}); + std::vector objectives{ + objective(x, ObjectiveSense::Minimize), objective(y, ObjectiveSense::Minimize)}; + objectives[0].name = "highest priority"; + auto result = solve_lexicographic(model, objectives); + verify(result, enumerate(points, objectives), objectives); + assert(result.final_solution.value(x) == 0 && result.final_solution.value(y) == 2); + assert(result.final_solution.objective == 11); // ORIGINAL scalar objective + assert(result.stages[0].name == "highest priority"); + assert(result.stages[0].retention_bound == 0); + assert(!result.stages[1].retention_bound); + assert(result.model_id == before.model_id && result.revision == before.revision); + assert(model.revision() == before.revision); + assert(model.snapshot().rows.size() == before.rows.size()); + assert(model.row(demand).lower == 2 && model.row(demand).upper == infinity); + assert(model.snapshot().objective.offset == 7); + assert(model.snapshot().objective.sense == ObjectiveSense::Maximize); + assert(model.snapshot().objective.terms[0].coefficient == 3); + assert(model.snapshot().objective.terms[1].coefficient == 2); + + SolveOptions started; + started.primal_start = {{x, 4}, {y, 4}}; // feasible initially, violates first x<=0 lock + auto with_start = solve_lexicographic(model, objectives, started); + verify(with_start, enumerate(points, objectives), objectives); + assert(with_start.stages[0].result.start_submitted); + assert(!with_start.stages[1].result.start_submitted); + + std::reverse(objectives.begin(), objectives.end()); // priority is input order + result = solve_lexicographic(before, objectives); + verify(result, enumerate(points, objectives), objectives); + assert(result.final_solution.value(x) == 2 && result.final_solution.value(y) == 0); + + objectives = {objective(x, ObjectiveSense::Minimize), objective(y, ObjectiveSense::Minimize)}; + objectives[0].absolute_degradation = 1; + result = solve_lexicographic(model, objectives); + verify(result, enumerate(points, objectives), objectives); + assert(result.final_solution.value(x) == 1 && result.final_solution.value(y) == 1); + + objectives[0] = objective(x, ObjectiveSense::Minimize, 2); + objectives[0].relative_degradation = 0.5; // f*=2, allowance=1, hence x<=1 + result = solve_lexicographic(model, objectives); + verify(result, enumerate(points, objectives), objectives); + assert(result.stages[0].retention_bound == 3); + assert(result.final_solution.value(x) == 1 && result.final_solution.value(y) == 1); + + model.set_bounds(demand, -infinity, 5); + points.clear(); + for (int a = 0; a <= 4; ++a) + for (int b = 0; b <= 4; ++b) + if (a + b <= 5) points.push_back({static_cast(a), static_cast(b)}); + objectives = {objective(x, ObjectiveSense::Maximize, -10), + objective(y, ObjectiveSense::Maximize, 3)}; + objectives[0].absolute_degradation = 1; + result = solve_lexicographic(model, objectives); + verify(result, enumerate(points, objectives), objectives); + assert(result.stages[0].retention_bound == -7); + assert(result.final_solution.value(x) == 3 && result.final_solution.value(y) == 2); + + objectives[1].objective.sense = ObjectiveSense::Minimize; + result = solve_lexicographic(model, objectives); + verify(result, enumerate(points, objectives), objectives); +} + +void numerical_and_empty_tests() { + Model offset_model; + auto x = offset_model.add_integer(1, 4); + auto result = solve_lexicographic(offset_model, + {objective(x, ObjectiveSense::Minimize, 1e16), objective(x, ObjectiveSense::Maximize)}); + assert(result.completed_numerically()); + assert(result.final_solution.value(x) == 1); // do not lock x <= round(1e16+1)-1e16 + + // A large linear subtotal and offset cancel to an exact small residual. + // An extreme-scale backend bound can remain unresolved; the workflow must + // still report the independently computed objective vector faithfully. + Model cancellation; + auto residual = cancellation.add_continuous(1, 1); + auto fixed = cancellation.add_continuous(1e6, 1e6); + cancellation.minimize({{residual, 1}, {fixed, 1e10}}, -1e16); + LexicographicObjective cancellation_objective; + cancellation_objective.objective = cancellation.snapshot().objective; + result = solve_lexicographic(cancellation, {cancellation_objective}); + assert(result.has_solution() && result.final_solution.objective == 1); + assert(result.objective_values == std::vector{1}); + assert(result.termination == Termination::Optimal || + result.termination == Termination::NumericalFailure); + if (result.completed_numerically()) { + assert(result.stages[0].result.objective == 1); + assert(result.stages[0].result.best_bound && + std::fabs(*result.stages[0].result.best_bound - 1) <= 1e-7); + } + + Model continuous; + auto a = continuous.add_continuous(0, 4); + auto b = continuous.add_continuous(0, 4); + continuous.add_row({{a, 1}, {b, 1}}, 2, infinity); + result = solve_lexicographic(continuous, + {objective(a, ObjectiveSense::Minimize), objective(b, ObjectiveSense::Maximize)}); + assert(result.completed_numerically()); + assert(result.final_solution.value(a) == 0 && result.final_solution.value(b) == 4); + + Model empty; + LexicographicObjective constant; + constant.objective.offset = 3; + LexicographicObjective other; + other.objective.offset = -2; + result = solve_lexicographic(empty, {constant, other}); + assert(result.completed_numerically() && result.has_solution()); + assert(result.objective_values == std::vector({3, -2})); + assert(result.final_solution.values.empty()); + + Model tombstones; + auto removed = tombstones.add_binary(); + tombstones.remove(removed); + result = solve_lexicographic(tombstones, {constant, other}); + assert(result.completed_numerically() && result.has_solution()); + assert(result.final_solution.active_variables == std::vector({false})); +} + +void status_tests() { + Model model; + auto x = model.add_integer(0, 4); + std::vector objectives{ + objective(x, ObjectiveSense::Minimize), objective(x, ObjectiveSense::Maximize)}; + SolveOptions options; + options.time_limit_seconds = 0; + auto result = solve_lexicographic(model, objectives, options); + assert(result.termination == Termination::TimeLimit && !result.has_solution()); + assert(result.stages.empty() && result.completed_stages == 0); + options = {}; + options.cancellation = std::make_shared(); + options.cancellation->cancel(); + result = solve_lexicographic(model, objectives, options); + assert(result.termination == Termination::Cancelled && !result.completed_numerically()); + options = {}; + options.node_limit = 0; + result = solve_lexicographic(model, objectives, options); + assert(result.termination == Termination::Unsupported && result.stages.empty()); + result = solve_lexicographic(model, {objectives[0]}, options); + assert(result.termination == Termination::NodeLimit && result.completed_stages == 0); + options = {}; + options.guarantee = Guarantee::Exact; + assert(solve_lexicographic(model, objectives, options).termination == Termination::Unsupported); + options.guarantee = Guarantee::Certified; + assert(solve_lexicographic(model, objectives, options).termination == Termination::Unsupported); + + options = {}; + options.relative_gap = -1; + assert(solve_lexicographic(model, objectives, options).termination == Termination::InvalidModel); + assert(solve_lexicographic(model, {}).termination == Termination::InvalidModel); + auto invalid = objectives; + invalid[1].absolute_degradation = -1; + result = solve_lexicographic(model, invalid); + assert(result.termination == Termination::InvalidModel && result.stages.empty()); + invalid = objectives; + invalid[1].relative_degradation = infinity; + assert(solve_lexicographic(model, invalid).termination == Termination::InvalidModel); + invalid = objectives; + invalid[0].objective.terms[0].variable.model_id += 100; + assert(solve_lexicographic(model, invalid).termination == Termination::InvalidModel); + + options = {}; + options.relative_gap = 1.0; + options.absolute_gap = 100.0; // workflow requests zero gaps for each phase + if (capabilities().available) + assert(solve_lexicographic(model, objectives, options).completed_numerically()); + + if (!capabilities().available) { + assert(solve_lexicographic(model, objectives).termination == Termination::Unsupported); + return; + } + Model infeasible; + auto impossible = infeasible.add_binary(); + infeasible.add_row({{impossible, 1}}, 2, infinity); + result = solve_lexicographic(infeasible, + {objective(impossible, ObjectiveSense::Minimize), objective(impossible, ObjectiveSense::Maximize)}); + assert(result.termination == Termination::Infeasible); + assert(result.stages.size() == 1 && result.completed_stages == 0 && !result.has_solution()); + + Model unbounded; + auto bounded = unbounded.add_continuous(0, 1); + auto free = unbounded.add_continuous(-infinity, infinity); + result = solve_lexicographic(unbounded, + {objective(bounded, ObjectiveSense::Minimize), objective(free, ObjectiveSense::Maximize)}); + assert(result.termination == Termination::Unbounded); + assert(result.stages.size() == 2 && result.completed_stages == 1); + assert(!result.completed_numerically()); + + auto overflow = objectives; + overflow[0].objective.offset = 2; + overflow[0].relative_degradation = std::numeric_limits::max(); + result = solve_lexicographic(model, overflow); + assert(result.termination == Termination::Unsupported && result.stages.size() == 1); + assert(!result.completed_numerically()); +} +} + +int main() { + status_tests(); + if (capabilities().available) { + discrete_oracle_tests(); + numerical_and_empty_tests(); + } +} + +#endif diff --git a/tools/flatzinc/configure-optimize-msc.cmake b/tools/flatzinc/configure-optimize-msc.cmake new file mode 100644 index 0000000000..ace412f286 --- /dev/null +++ b/tools/flatzinc/configure-optimize-msc.cmake @@ -0,0 +1,44 @@ +# Pure post-build/install JSON configuration, after target-file expansion. +# cmake -DTEMPLATE=... -DVERSION=... -DDRIVER=... -DMZNLIB=... -DOUTPUT=... -P this-file +cmake_minimum_required(VERSION 3.16) + +foreach(required TEMPLATE VERSION DRIVER MZNLIB OUTPUT) + if(NOT DEFINED ${required} OR "${${required}}" STREQUAL "") + message(FATAL_ERROR "Required input ${required} is missing or empty") + endif() +endforeach() +if(NOT EXISTS "${TEMPLATE}" OR IS_DIRECTORY "${TEMPLATE}") + message(FATAL_ERROR "TEMPLATE is not an existing file") +endif() + +# JSON strings require escaping all U+0001..U+001F controls, not just newlines. +# NUL cannot be supplied in an OS command-line argument/CMake string. UTF-8 +# characters otherwise remain intact. Do not normalize relative path spelling. +function(json_string input output) + string(REPLACE "\\" "\\\\" encoded "${input}") + string(REPLACE "\"" "\\\"" encoded "${encoded}") + set(hex "0123456789abcdef") + foreach(code RANGE 1 31) + string(ASCII ${code} control) + math(EXPR high "${code} / 16") + math(EXPR low "${code} % 16") + string(SUBSTRING "${hex}" ${high} 1 high_hex) + string(SUBSTRING "${hex}" ${low} 1 low_hex) + string(REPLACE "${control}" "\\u00${high_hex}${low_hex}" encoded "${encoded}") + endforeach() + set(${output} "${encoded}" PARENT_SCOPE) +endfunction() + +json_string("${VERSION}" GECODE_VERSION) +json_string("${DRIVER}" GECODE_OPTIMIZE_MSC_EXECUTABLE) +json_string("${MZNLIB}" GECODE_OPTIMIZE_MSC_MZNLIB) +get_filename_component(output_directory "${OUTPUT}" DIRECTORY) +if(NOT "${output_directory}" STREQUAL "") + file(MAKE_DIRECTORY "${output_directory}") +endif() +# configure_file substitutes the original template once; placeholder-like text +# inside values stays literal, unlike a sequence of string(REPLACE) operations. +string(RANDOM LENGTH 16 ALPHABET 0123456789abcdef nonce) +set(temporary "${OUTPUT}.${nonce}.tmp") +configure_file("${TEMPLATE}" "${temporary}" @ONLY) +file(RENAME "${temporary}" "${OUTPUT}") diff --git a/tools/flatzinc/fzn-gecode-optimize.cpp b/tools/flatzinc/fzn-gecode-optimize.cpp new file mode 100644 index 0000000000..c035023f83 --- /dev/null +++ b/tools/flatzinc/fzn-gecode-optimize.cpp @@ -0,0 +1,219 @@ +/* Explicit, bounded FlatZinc capture/compiler frontend. Legacy driver is separate. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace FznOptimizeDriver { +namespace O=Gecode::Optimize; +namespace F=Gecode::FlatZinc::Capture; +using Clock=std::chrono::steady_clock; +struct Options { + std::string filename; + bool minizinc=false; + F::Options capture; + O::SolveOptions solve; + Options() { + solve.backend=O::Backend::Native;solve.guarantee=O::Guarantee::Exact; + solve.relative_gap=0;solve.absolute_gap=0; + } +}; +const char* usage() { + return "Usage: fzn-gecode-optimize MODEL.fzn|- [--backend native|highs] " + "[--time-limit SECONDS] [--node-limit N] [--max-input-bytes N]\n" + "One satisfaction solution or final optimization; bounded integer/Boolean subset.\n" + "Native uses exact integer search; HiGHS is explicitly numerical.\n" + "MiniZinc protocol: --minizinc [-t MILLISECONDS] MODEL.fzn|-\n"; +} +std::uint64_t count(const std::string& text) { + if(text.empty())throw std::invalid_argument("Empty count"); + std::uint64_t value=0; + for(unsigned char c:text) { + if(c<'0'||c>'9'||value>(std::numeric_limits::max()-(c-'0'))/10) + throw std::invalid_argument("Count must be an unsigned decimal integer in range"); + value=value*10+(c-'0'); + } + return value; +} +double seconds(const std::string& text) { + std::istringstream input(text);input.imbue(std::locale::classic());double value; + input>>std::noskipws>>value; + if(input.fail()||!input.eof()||!std::isfinite(value)||value<0) + throw std::invalid_argument("Time limit must be finite and nonnegative"); + return value; +} +Options arguments(const std::vector& args) { + if(!args.empty()&&args[0]=="--minizinc") { + Options options;options.minizinc=true;bool timed=false,filename_only=false; + for(std::size_t i=1;i(milliseconds)/1000.0; + } else if(arg.empty()||(!filename_only&&arg[0]=='-'&&arg!="-")) + throw std::invalid_argument("Unsupported MiniZinc protocol option: "+arg); + else { + if(!options.filename.empty())throw std::invalid_argument("MiniZinc protocol requires exactly one model"); + options.filename=arg; + } + } + if(options.filename.empty())throw std::invalid_argument("MiniZinc protocol requires exactly one model"); + options.capture.source=options.filename;options.solve.validate();return options; + } + if(args.empty()||args[0].empty()||(args[0][0]=='-'&&args[0]!="-")) + throw std::invalid_argument(usage()); + Options options;options.filename=args[0];options.capture.source=args[0];std::set seen; + for(std::size_t i=1;istatic_cast(std::numeric_limits::max()))throw std::invalid_argument("Input limit exceeds parser index range"); + options.capture.max_input_bytes=static_cast(n); + } else throw std::invalid_argument("Unsupported option: "+key); + } + options.solve.validate();return options; +} +#ifdef GECODE_FLATZINC_DRIVER_TEST +O::SolveResult test_solve(const O::ModelSnapshot&,const O::SolveOptions&); +#endif +std::string location(const F::Location& at) { + return at.source+(at.line?":"+std::to_string(at.line):""); +} +struct Output {std::string text;int code=1;}; +Output render(const O::CompiledFlatZinc& compiled,const O::SolveResult& result,const Options& options) { + switch(result.termination) { + case O::Termination::Unsupported:case O::Termination::InvalidModel: + case O::Termination::BackendError:case O::Termination::NumericalFailure: + throw std::runtime_error(std::string(O::to_string(result.termination))+": "+result.message); + default:break; + } + if(result.model_id!=compiled.model().model_id||result.revision!=compiled.model().revision) + throw std::runtime_error("Backend returned a result for a different model"); + if(result.guarantee!=options.solve.guarantee)throw std::runtime_error("Backend returned a different guarantee"); + if(result.objective&&!std::isfinite(*result.objective))throw std::runtime_error("Backend returned a nonfinite objective"); + if(result.termination==O::Termination::Infeasible&&result.values.size()==compiled.model().variables.size()) { + auto candidate=result;bool complete=true; + candidate.active_variables.clear(); + for(const auto& v:compiled.model().variables) { + candidate.active_variables.push_back(v.active); + if(!v.active)continue; + auto& x=candidate.values[v.variable.id];const auto rounded=std::round(x); + if(!std::isfinite(x)||std::abs(x-rounded)>options.solve.integrality_tolerance) {complete=false;break;} + x=rounded; + } + if(complete) { + const auto checked=O::validate(compiled.model(),candidate.values,0,0); + if(checked.valid&&checked.objective) { + candidate.objective=checked.objective;candidate.solution_validated=true; + if(O::validate_flatzinc(compiled,candidate,0).valid) + throw std::runtime_error("Infeasible status contradicts the backend's original feasible assignment"); + } + } + } + for(const auto& gap:{result.absolute_gap,result.relative_gap,result.native_backend_gap}) + if(gap&&(!std::isfinite(*gap)||*gap<0))throw std::runtime_error("Backend returned an invalid gap"); + if(result.best_bound&&!std::isfinite(*result.best_bound))throw std::runtime_error("Backend returned a nonfinite bound for the bounded model"); + if(result.objective&&result.best_bound) { + auto checked=result;checked.update_gaps(compiled.model().objective.sense); + if((result.absolute_gap&&result.absolute_gap!=checked.absolute_gap)|| + (result.relative_gap&&result.relative_gap!=checked.relative_gap)) + throw std::runtime_error("Backend returned inconsistent gap fields"); + } else if(result.absolute_gap||result.relative_gap)throw std::runtime_error("Backend returned gaps without an objective and bound"); + const bool point=result.has_solution(); + if((result.termination==O::Termination::Optimal&&!point)|| + (result.termination==O::Termination::Infeasible&&point)) + throw std::runtime_error("Backend returned inconsistent status and assignment"); + if(result.termination==O::Termination::Unbounded||result.termination==O::Termination::InfeasibleOrUnbounded) + throw std::runtime_error("Unexpected unbounded status for the finite discrete model"); + // Do not silently hide a malformed claimed incumbent behind UNKNOWN or UNSAT. + if(result.solution_validated&&!point)throw std::runtime_error("Backend returned a malformed incumbent"); + if(result.termination==O::Termination::Optimal&&compiled.source().solve.method!=F::Method::Satisfy) { + if(!result.best_bound)throw std::runtime_error("Completed optimization has no bound"); + if(options.solve.guarantee==O::Guarantee::Exact&&result.best_bound!=result.objective) + throw std::runtime_error("Exact optimal status has an open objective gap"); + } + Output output; + output.text=options.solve.backend==O::Backend::Native ? "% guarantee: exact integer search\n" : "% guarantee: numerical; requested MIP gaps: 0\n"; + if(point) { + output.text+=O::format_flatzinc_solution(compiled,result,options.solve.integrality_tolerance); + if(result.termination==O::Termination::Optimal) { + if(compiled.source().solve.method!=F::Method::Satisfy)output.text+="==========\n"; + output.code=0; + } + } else if(result.termination==O::Termination::Infeasible) { + output.text+="=====UNSATISFIABLE=====\n";output.code=0; + } else output.text+="=====UNKNOWN=====\n"; + return output; +} +int execute(const Options& options,std::istream& input,std::ostream& out,std::ostream& errors) { + const auto begin=Clock::now(); + const auto remaining=[&] {return std::max(0.0,options.solve.time_limit_seconds- + std::chrono::duration(Clock::now()-begin).count());}; + const auto expired=[&] {return remaining()==0;}; + const auto unknown=[&] {out<<"% time limit reached\n=====UNKNOWN=====\n";return options.minizinc?0:1;}; + try { + if(expired())return unknown(); + auto captured=F::parse(input,options.capture); + if(expired())return unknown(); + if(captured.status!=F::Status::Complete||!captured.records) { + std::string message="FlatZinc capture failed"; + if(!captured.diagnostics.empty())message=location(captured.diagnostics[0].location)+": "+captured.diagnostics[0].message; + throw std::runtime_error(message); + } + O::FlatZincCompileOptions compiler;compiler.time_limit_seconds=remaining(); + auto compiled=O::compile_flatzinc(*captured.records,compiler); + if(expired()||compiled.status==O::FlatZincCompileStatus::TimeLimit)return unknown(); + if(compiled.status!=O::FlatZincCompileStatus::Complete||!compiled.compiled) + throw std::runtime_error(location(compiled.location)+": "+compiled.message); + auto solve_options=options.solve;solve_options.time_limit_seconds=remaining(); +#ifdef GECODE_FLATZINC_DRIVER_TEST + auto result=test_solve(compiled.compiled->model(),solve_options); +#else + auto result=O::solve(compiled.compiled->model(),solve_options); +#endif + // The parser has cooperative stage boundaries, not token-level interruption. + // Never publish a newly returned point after the overall frontend deadline. + if(expired())return unknown(); + auto output=render(*compiled.compiled,result,options); + if(expired())return unknown(); + out<(argv+1,argv+argc)); + if(options.filename=="-")return execute(options,std::cin,std::cout,std::cerr); + std::ifstream input(options.filename,std::ios::binary); + if(!input)throw std::runtime_error("Cannot open input: "+options.filename); + return execute(options,input,std::cout,std::cerr); + } catch(const std::exception& e) {std::cerr<<"FlatZinc optimization: "< 0, "Gecode Optimize: empty circuits are unsupported", + if min(index_set(x)) >= 0 then + gecode_circuit(min(index_set(x)), x) + else + gecode_circuit(0, [x[i] - min(index_set(x)) | i in index_set(x)]) + endif); diff --git a/tools/flatzinc/mznlib-optimize/fzn_cumulative.mzn b/tools/flatzinc/mznlib-optimize/fzn_cumulative.mzn new file mode 100644 index 0000000000..0b4bb51a93 --- /dev/null +++ b/tools/flatzinc/mznlib-optimize/fzn_cumulative.mzn @@ -0,0 +1,7 @@ +% The frontend accepts parameter values or original singleton domains only. +% Do not replace data by lb/ub inferred through propagation. +predicate gecode_cumulatives(array[int] of var int: s, array[int] of var int: d, + array[int] of var int: r, var int: b); +predicate fzn_cumulative(array[int] of var int: s, array[int] of var int: d, + array[int] of var int: r, var int: b) = + gecode_cumulatives(s, d, r, b); diff --git a/tools/flatzinc/mznlib-optimize/fzn_regular.mzn b/tools/flatzinc/mznlib-optimize/fzn_regular.mzn new file mode 100644 index 0000000000..a56685eed9 --- /dev/null +++ b/tools/flatzinc/mznlib-optimize/fzn_regular.mzn @@ -0,0 +1,5 @@ +predicate gecode_regular(array[int] of var int: x, int: Q, int: S, + array[int] of int: d, int: q0, set of int: F); +predicate fzn_regular(array[int] of var int: x, int: Q, int: S, + array[int,int] of int: d, int: q0, set of int: F) = + gecode_regular(x, Q, S, array1d(d), q0, F); diff --git a/tools/flatzinc/mznlib-optimize/fzn_table_int.mzn b/tools/flatzinc/mznlib-optimize/fzn_table_int.mzn new file mode 100644 index 0000000000..5311f9ad6b --- /dev/null +++ b/tools/flatzinc/mznlib-optimize/fzn_table_int.mzn @@ -0,0 +1,4 @@ +predicate gecode_table_int(array[int] of var int: x, array[int] of int: tuples); +predicate fzn_table_int(array[int] of var int: x, array[int,int] of int: t) = + assert(length(x) > 0, "Gecode Optimize: zero-arity flat tables are unsupported", + gecode_table_int(x, array1d(t))); diff --git a/tools/flatzinc/mznlib-optimize/redefinitions.mzn b/tools/flatzinc/mznlib-optimize/redefinitions.mzn new file mode 100644 index 0000000000..2af583f65b --- /dev/null +++ b/tools/flatzinc/mznlib-optimize/redefinitions.mzn @@ -0,0 +1,16 @@ +% This library intentionally does not inherit Gecode's broad native registry. +% Remaining standard decompositions must pass the frontend's whole-model check. +predicate int_eq_imp(var int: x, var int: y, var bool: b); +predicate int_le_imp(var int: x, var int: y, var bool: b); +predicate int_lin_le_imp(array[int] of int: a, array[int] of var int: x, int: b, var bool: r); +% Fail early for selected primitive families that cannot be compiled faithfully. +predicate int_times(var int: x, var int: y, var int: z) = + abort("Gecode Optimize: variable multiplication is unsupported"); +predicate int_div(var int: x, var int: y, var int: z) = + abort("Gecode Optimize: variable division is unsupported"); +predicate int_mod(var int: x, var int: y, var int: z) = + abort("Gecode Optimize: variable modulo is unsupported"); +predicate int_eq_reif(var int: x, var int: y, var bool: b) = + abort("Gecode Optimize: reified integer equality is unsupported"); +predicate int_lin_eq_reif(array[int] of int: a, array[int] of var int: x, int: b, var bool: r) = + abort("Gecode Optimize: reified linear equality is unsupported"); diff --git a/tools/python/build_macos_wheel.py b/tools/python/build_macos_wheel.py new file mode 100644 index 0000000000..a85f9c2513 --- /dev/null +++ b/tools/python/build_macos_wheel.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python3 +"""Package a prebuilt, self-contained macOS C ABI library without downloads. + +Requires the packaging and wheel Python packages, plus Apple's otool and lipo. +Builds are separate: this command neither compiles nor repairs dependency paths. +Only a thin library with system-only dependencies is accepted. A copied package +must pass an isolated automatic-load smoke test before a wheel is published to +the requested local output directory. No package index is contacted. +""" +import argparse +import base64 +import csv +import hashlib +import io +import json +import os +from pathlib import Path +import platform +import shutil +import subprocess +import sys +import tempfile +import zipfile + +from packaging.version import Version + + +ROOT = Path(__file__).resolve().parents[2] +ENTRY = "libgecodeoptimize_c.dylib" + + +def command(arguments, **kwargs): + return subprocess.check_output([str(value) for value in arguments], text=True, + stderr=subprocess.STDOUT, timeout=120, **kwargs) + + +def sha(data): + return hashlib.sha256(data).hexdigest() + + +def check_wheel(archive, binary): + names = archive.namelist() + if len(names) != len(set(names)) or any(name.startswith("/") or ".." in Path(name).parts for name in names): + raise ValueError("invalid wheel member paths") + if any(name.endswith((".pyc", ".pyo")) or "__pycache__" in Path(name).parts for name in names): + raise ValueError("interpreter bytecode must not be included in a portable wheel") + if archive.read("gecode_optimize/_native/" + ENTRY) != binary: + raise ValueError("wheel changed the copied solver library") + records = [name for name in names if name.endswith(".dist-info/RECORD")] + if len(records) != 1: + raise ValueError("wheel must contain exactly one integrity record") + rows = list(csv.reader(io.StringIO(archive.read(records[0]).decode("utf-8")))) + if any(len(row) != 3 for row in rows) or len({row[0] for row in rows}) != len(rows): + raise ValueError("invalid wheel integrity record") + if {row[0] for row in rows} != set(names): + raise ValueError("wheel integrity record does not cover every member") + for name, digest, size in rows: + if name == records[0]: + if digest or size: + raise ValueError("RECORD must not hash itself") + continue + data = archive.read(name) + expected = "sha256=" + base64.urlsafe_b64encode(hashlib.sha256(data).digest()).decode("ascii").rstrip("=") + if digest != expected or size != str(len(data)): + raise ValueError("wheel integrity check failed: " + name) + + +def inspect_library(library): + architectures = command(["lipo", "-archs", library]).split() + if len(architectures) != 1 or architectures[0] not in ("arm64", "x86_64"): + raise ValueError("first wheel builder requires one arm64 or x86_64 architecture") + architecture = architectures[0] + if architecture != platform.machine(): + raise ValueError("wheel must be checked on a host of the same architecture") + identifiers = command(["otool", "-D", library]).splitlines()[1:] + if len(identifiers) != 1: + raise ValueError("input must be a Mach-O dynamic library with one install ID") + dependencies = [] + for line in command(["otool", "-L", library]).splitlines()[1:]: + name, separator, _ = line.strip().partition(" (compatibility version ") + if not separator: + raise ValueError("unrecognized Mach-O dependency record") + if name == identifiers[0].strip(): + continue + if (not name.startswith(("/usr/lib/", "/System/Library/")) + or any(part in (".", "..") for part in name.split("/"))): + raise ValueError("non-system dependency must be linked statically before packaging: " + name) + dependencies.append(name) + records = [] + current = {} + for line in command(["otool", "-l", library]).splitlines(): + parts = line.split() + if line.startswith("Load command "): + if current: + records.append(current) + current = {} + elif len(parts) == 2: + current[parts[0]] = parts[1] + if current: + records.append(current) + minimums = [] + for record in records: + if record.get("cmd") == "LC_BUILD_VERSION": + if record.get("platform") not in ("1", "macos"): + raise ValueError("Mach-O target is not macOS") + minimums.append(record["minos"]) + elif record.get("cmd") == "LC_VERSION_MIN_MACOSX": + minimums.append(record["version"]) + if len(minimums) != 1: + raise ValueError("input must declare exactly one macOS deployment target") + version = tuple(int(part) for part in minimums[0].split(".")) + version = version + (0,) * (3 - len(version)) + if len(version) != 3 or version[0] < 10 or version[2] or (version[0] >= 11 and version[1]): + raise ValueError("rebuild at a wheel-compatible deployment baseline, e.g. macOS 11.0; do not retag a newer binary") + if architecture == "arm64" and version[0] < 11: + raise ValueError("arm64 requires macOS 11 or newer") + tag = "macosx_{}_{}_{}".format(version[0], version[1], architecture) + return tag, {"architecture": architecture, "minimum_macos": minimums[0], + "system_dependencies": dependencies, "install_id": identifiers[0].strip()} + + +def stage_library(source, destination): + # Inspect the exact captured bytes that will enter the wheel. Inspecting the + # build output first can attach old architecture/deployment metadata to a + # new binary when an independent build replaces it between those operations. + with source.open("rb") as stream: + binary = stream.read(512 * 1024 * 1024 + 1) + if len(binary) > 512 * 1024 * 1024: + raise ValueError("input library exceeds the 512 MiB packaging limit") + destination.write_bytes(binary) + os.chmod(destination, 0o755) + tag, properties = inspect_library(destination) + return binary, tag, properties + + +def copy_licenses(root, highs, destination): + entries = [ + (root / "LICENSE", "Gecode-LICENSE"), + (root / "gecode/third-party/boost/LICENSE_1_0.txt", "Boost-LICENSE"), + (highs / "LICENSE.txt", "HiGHS-LICENSE"), + (highs / "highs/io/filereaderlp/LICENSE", "HiGHS-filereaderlp-LICENSE"), + (highs / "extern/zstr/LICENSE", "HiGHS-zstr-LICENSE"), + (highs / "extern/rcm/LICENSE", "HiGHS-rcm-LICENSE"), + (highs / "extern/pdqsort/license.txt", "HiGHS-pdqsort-LICENSE"), + (highs / "extern/metis/LICENSE.txt", "HiGHS-metis-LICENSE"), + ] + destination.mkdir() + for source, name in entries: + if not source.is_file(): + raise ValueError("required dependency notice is missing: " + str(source)) + shutil.copyfile(source, destination / name) + return [name for _, name in entries] + + +SMOKE = r''' +import json, pathlib, sys +sys.path.insert(0, sys.argv[1]) +import gecode_optimize as g +assert pathlib.Path(g.__file__).resolve().is_relative_to(pathlib.Path(sys.argv[1]).resolve()) +library = g.load_library() +assert library.capabilities(g.Backend.HIGHS)["available"] +assert library.capabilities(g.Backend.NATIVE)["available"] +with g.Model(library) as model: + x = model.add_variable(g.VariableType.INTEGER, 0, 5) + model.set_objective([(x, 2)], offset=3) + for backend, guarantee in ((g.Backend.HIGHS, g.Guarantee.NUMERICAL), + (g.Backend.NATIVE, g.Guarantee.EXACT)): + with model.solve(g.Options(backend=backend, guarantee=guarantee)) as result: + assert result.termination == g.Termination.OPTIMAL and result.has_solution + assert result.value(x) == 0 and result.objective == 3 +print(json.dumps({"automatic_load": True, "numerical_and_native": True})) +''' + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--library", required=True, type=Path) + parser.add_argument("--output-dir", required=True, type=Path) + parser.add_argument("--source-root", type=Path, default=ROOT) + parser.add_argument("--highs-source", type=Path) + parser.add_argument("--version", default="0.1.0.dev0") + parser.add_argument("--allow-dirty", action="store_true", help="record a dirty source checkout for local development only") + args = parser.parse_args() + if sys.platform != "darwin": + parser.error("this first builder supports macOS only; Linux/Windows require separate audited recipes") + root = args.source_root.resolve(strict=True) + library = args.library.resolve(strict=True) + if not library.is_file() or library.stat().st_size > 512 * 1024 * 1024: + parser.error("input must be a regular shared library no larger than 512 MiB") + highs = (args.highs_source or root.parent / "deps/HiGHS").resolve(strict=True) + dependency = json.loads((root / "docs/solver-parity/dependencies.json").read_text()) + highs_head = command(["git", "rev-parse", "HEAD"], cwd=highs).strip() + if highs_head != dependency["commit"] or command(["git", "status", "--porcelain"], cwd=highs).strip(): + parser.error("HiGHS source/notices must match the clean pinned dependency") + version = str(Version(args.version)) + head = command(["git", "rev-parse", "HEAD"], cwd=root).strip() + dirty = bool(command(["git", "status", "--porcelain"], cwd=root).strip()) + if dirty and not args.allow_dirty: + parser.error("commit the source snapshot before packaging, or explicitly use --allow-dirty for local development") + output = args.output_dir.resolve() + output.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix=".gecode-wheel-", dir=output) as temporary: + work = Path(temporary) + tree = work / "tree" + package = tree / "gecode_optimize" + native = package / "_native" + native.mkdir(parents=True) + binary, tag, properties = stage_library(library, native / ENTRY) + filename = "gecode_optimize-{}-py3-none-{}.whl".format(version, tag) + target = output / filename + if target.exists(): + raise FileExistsError("refusing to replace existing wheel: " + str(target)) + sources = {} + for source in sorted((root / "python/gecode_optimize").rglob("*.py")): + relative = source.relative_to(root / "python/gecode_optimize") + if "__pycache__" in relative.parts or "_native" in relative.parts: + continue + data = source.read_bytes() + (package / relative).parent.mkdir(parents=True, exist_ok=True) + (package / relative).write_bytes(data) + sources[str(relative)] = sha(data) + if not (package / "__init__.py").is_file() or not (package / "_runtime.py").is_file(): + raise ValueError("Python source package or bundled runtime helper is missing") + detail = dict(schema_version=1, source_head=head, source_dirty=dirty, + python_sources=sources, library_sha256=sha(binary), + highs_source_commit=highs_head, properties=properties, + note="Prebuilt library; binary hash and smoke checks do not prove build provenance or older-OS compatibility") + (native / "build-details.json").write_text(json.dumps(detail, indent=2) + "\n") + dist_info = tree / ("gecode_optimize-" + version + ".dist-info") + dist_info.mkdir() + licenses = copy_licenses(root, highs, dist_info / "licenses") + metadata = ["Metadata-Version: 2.4", "Name: gecode-optimize", "Version: " + version, + "Summary: Gecode optimization API with bundled native and HiGHS solvers", + "Requires-Python: >=3.9"] + metadata += ["License-File: licenses/" + name for name in licenses] + (dist_info / "METADATA").write_text("\n".join(metadata) + "\n\nLocal experimental distribution. No runtime downloads.\n") + (dist_info / "WHEEL").write_text("Wheel-Version: 1.0\nGenerator: gecode-local-wheel\nRoot-Is-Purelib: false\nTag: py3-none-" + tag + "\n") + env = dict(os.environ) + for name in ("GECODE_OPTIMIZE_LIBRARY", "PYTHONPATH", "PYTHONHOME", + "DYLD_LIBRARY_PATH", "DYLD_FALLBACK_LIBRARY_PATH", "DYLD_INSERT_LIBRARIES"): + env.pop(name, None) + smoke = json.loads(command([sys.executable, "-I", "-B", "-c", SMOKE, tree], cwd=work, env=env)) + packed = work / "packed" + packed.mkdir() + command([sys.executable, "-m", "wheel", "pack", tree, "--dest-dir", packed]) + built = packed / filename + if not built.is_file(): + raise ValueError("wheel tool produced an unexpected platform/version tag") + with zipfile.ZipFile(built) as archive: + check_wheel(archive, binary) + if sha(library.read_bytes()) != sha(binary): + raise ValueError("input library changed during packaging; rebuild from a frozen binary") + # Same-filesystem exclusive link publishes only the fully checked wheel. + os.link(built, target) + print(json.dumps(dict(wheel=str(target), sha256=sha(target.read_bytes()), + tag="py3-none-" + tag, smoke=smoke, build_details=detail))) + + +if __name__ == "__main__": + main() diff --git a/tools/python/test_build_macos_wheel.py b/tools/python/test_build_macos_wheel.py new file mode 100644 index 0000000000..65b02a9236 --- /dev/null +++ b/tools/python/test_build_macos_wheel.py @@ -0,0 +1,141 @@ +"""Portable adversarial checks for the offline macOS wheel packager.""" +import base64 +import csv +import hashlib +import importlib.util +import io +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch +import zipfile + +SPEC = importlib.util.spec_from_file_location( + "wheel_builder", Path(__file__).with_name("build_macos_wheel.py")) +builder = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(builder) + + +class MachOAdmissionTests(unittest.TestCase): + def inspect(self, dependency="/usr/lib/libSystem.B.dylib", minimum="11.0", + architecture="arm64", target_platform="1"): + def output(arguments): + kind = arguments[:2] + if kind == ["lipo", "-archs"]: + return architecture + "\n" + if kind == ["otool", "-D"]: + return "staged:\n@rpath/libsolver.dylib\n" + if kind == ["otool", "-L"]: + return ("staged:\n\t@rpath/libsolver.dylib (compatibility version 0.0.0, current version 0.0.0)\n" + + "\t" + dependency + " (compatibility version 1.0.0, current version 1.0.0)\n") + if kind == ["otool", "-l"]: + return ("Load command 0\n cmd LC_BUILD_VERSION\n cmdsize 32\n platform " + + target_platform + "\n minos " + minimum + "\n sdk 26.0\n") + self.fail("unexpected inspection command") + with patch.object(builder, "command", side_effect=output), \ + patch.object(builder.platform, "machine", return_value="arm64"): + return builder.inspect_library(Path("private-staging/library")) + + def test_system_dependencies_and_deployment_target(self): + for dependency in ("/usr/lib/libSystem.B.dylib", "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"): + tag, detail = self.inspect(dependency) + self.assertEqual(tag, "macosx_11_0_arm64") + self.assertEqual(detail["system_dependencies"], [dependency]) + + def test_prefix_traversal_is_rejected(self): + for dependency in ("/usr/lib/../../Users/example/libx.dylib", + "/System/Library/../../Users/example/libx.dylib", + "/usr/lib/./libx.dylib", "@rpath/libx.dylib", + "/usr/library/libx.dylib", "/tmp/libx.dylib"): + with self.subTest(dependency=dependency), self.assertRaisesRegex(ValueError, "non-system"): + self.inspect(dependency) + + def test_newer_minor_binary_is_not_retagged(self): + for minimum in ("15.7", "11.0.1", "10.15", "11.0.0.1"): + with self.subTest(minimum=minimum), self.assertRaises(ValueError): + self.inspect(minimum=minimum) + + def test_platform_and_architecture_must_match(self): + for kwargs in (dict(architecture="x86_64"), dict(architecture="arm64 x86_64"), + dict(target_platform="2")): + with self.subTest(kwargs=kwargs), self.assertRaises(ValueError): + self.inspect(**kwargs) + + def test_inspection_uses_captured_bytes_during_source_replacement(self): + with tempfile.TemporaryDirectory() as temporary: + source = Path(temporary) / "build-output" + staged = Path(temporary) / "private-copy" + source.write_bytes(b"captured binary A") + def inspect(path): + source.write_bytes(b"replacement binary B") + self.assertEqual(path, staged) + self.assertEqual(path.read_bytes(), b"captured binary A") + return "macosx_11_0_arm64", {"inspected": "A"} + with patch.object(builder, "inspect_library", side_effect=inspect): + binary, tag, detail = builder.stage_library(source, staged) + self.assertEqual(binary, staged.read_bytes()) + self.assertNotEqual(binary, source.read_bytes()) + self.assertEqual(detail, {"inspected": "A"}) + self.assertEqual(tag, "macosx_11_0_arm64") + + +class WheelIntegrityTests(unittest.TestCase): + binary = b"captured solver" + binary_name = "gecode_optimize/_native/" + builder.ENTRY + record_name = "gecode_optimize-0.1.dist-info/RECORD" + + def archive(self, *, extra=None, omit_record=None, bad_digest=False, + bad_size=False, duplicate_record=False, altered_binary=False): + files = {self.binary_name: self.binary, "gecode_optimize/__init__.py": b"# package\n"} + files.update(extra or {}) + rows = [] + for name, data in files.items(): + digest = "sha256=" + base64.urlsafe_b64encode(hashlib.sha256(data).digest()).decode().rstrip("=") + if name != omit_record: + rows.append([name, digest, str(len(data))]) + if bad_digest: + rows[0][1] = "sha256=invalid" + if bad_size: + rows[0][2] = "0" + if duplicate_record: + rows.append(rows[0]) + rows.append([self.record_name, "", ""]) + record = io.StringIO() + csv.writer(record).writerows(rows) + files[self.record_name] = record.getvalue().encode() + if altered_binary: + files[self.binary_name] = b"wrong solver" + buffer = io.BytesIO() + with zipfile.ZipFile(buffer, "w") as archive: + for name, data in files.items(): + archive.writestr(name, data) + buffer.seek(0) + return zipfile.ZipFile(buffer) + + def test_valid_record_and_binary(self): + with self.archive() as archive: + builder.check_wheel(archive, self.binary) + + def test_record_corruption_or_missing_member_is_rejected(self): + for kwargs in (dict(bad_digest=True), dict(bad_size=True), dict(duplicate_record=True), + dict(omit_record="gecode_optimize/__init__.py")): + with self.subTest(kwargs=kwargs), self.archive(**kwargs) as archive, self.assertRaises(ValueError): + builder.check_wheel(archive, self.binary) + + def test_changed_solver_is_rejected(self): + with self.archive(altered_binary=True) as archive, self.assertRaisesRegex(ValueError, "changed"): + builder.check_wheel(archive, self.binary) + + def test_bytecode_is_rejected_even_with_valid_hashes(self): + for name in ("gecode_optimize/__pycache__/module.pyc", "gecode_optimize/module.pyo"): + with self.subTest(name=name), self.archive(extra={name: b"code"}) as archive, self.assertRaisesRegex(ValueError, "bytecode"): + builder.check_wheel(archive, self.binary) + + def test_unsafe_archive_paths_are_rejected(self): + for name in ("/absolute", "../outside", "gecode_optimize/../../outside"): + with self.subTest(name=name), self.archive(extra={name: b"x"}) as archive, self.assertRaisesRegex(ValueError, "paths"): + builder.check_wheel(archive, self.binary) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/research/CMakeLists.txt b/tools/research/CMakeLists.txt new file mode 100644 index 0000000000..0ef5cbac9a --- /dev/null +++ b/tools/research/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.21) +project(GecodeLcgProtocolExperiment LANGUAGES CXX) +include(CTest) +find_package(Git REQUIRED) +set(GECODE_LCG_CADICAL_SOURCE "" CACHE PATH "Explicit pinned CaDiCaL source; never downloaded") +set(GECODE_LCG_CADICAL_LIBRARY "" CACHE FILEPATH "Matching prebuilt static CaDiCaL library") +if(NOT EXISTS "${GECODE_LCG_CADICAL_SOURCE}/src/cadical.hpp" OR + NOT EXISTS "${GECODE_LCG_CADICAL_LIBRARY}") + message(FATAL_ERROR "Supply both GECODE_LCG_CADICAL_SOURCE and GECODE_LCG_CADICAL_LIBRARY") +endif() +execute_process(COMMAND "${GIT_EXECUTABLE}" -C "${GECODE_LCG_CADICAL_SOURCE}" rev-parse HEAD + RESULT_VARIABLE _pin_result OUTPUT_VARIABLE _pin OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT _pin_result EQUAL 0 OR NOT _pin STREQUAL "c60730422e758ef1cebe7aeddf2dda31c996bf04") + message(FATAL_ERROR "Protocol experiment requires the audited CaDiCaL 3.0.1 commit") +endif() +execute_process(COMMAND "${GIT_EXECUTABLE}" -C "${GECODE_LCG_CADICAL_SOURCE}" + status --porcelain --untracked-files=no + RESULT_VARIABLE _clean_result OUTPUT_VARIABLE _dirty OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT _clean_result EQUAL 0 OR NOT _dirty STREQUAL "") + message(FATAL_ERROR "Tracked CaDiCaL source must match the recorded commit") +endif() +file(SHA256 "${GECODE_LCG_CADICAL_SOURCE}/src/cadical.hpp" _header_sha) +file(SHA256 "${GECODE_LCG_CADICAL_LIBRARY}" _library_sha) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dependency-provenance.txt" + "commit=${_pin}\nheader_sha256=${_header_sha}\nlibrary_sha256=${_library_sha}\n") +add_executable(cadical-protocol cadical_protocol.cpp) +target_compile_features(cadical-protocol PRIVATE cxx_std_17) +target_include_directories(cadical-protocol PRIVATE "${GECODE_LCG_CADICAL_SOURCE}/src") +target_link_libraries(cadical-protocol PRIVATE "${GECODE_LCG_CADICAL_LIBRARY}") +if(MSVC) + target_compile_options(cadical-protocol PRIVATE /UNDEBUG) +else() + target_compile_options(cadical-protocol PRIVATE -UNDEBUG -Wall -Wextra -Wpedantic) +endif() +add_test(NAME cadical-ipasir-up-protocol COMMAND cadical-protocol) +set_tests_properties(cadical-ipasir-up-protocol PROPERTIES TIMEOUT 60) +# Deliberately no install rule, default Gecode target, or network operation. diff --git a/tools/research/cadical-dependency.json b/tools/research/cadical-dependency.json new file mode 100644 index 0000000000..9edf10a663 --- /dev/null +++ b/tools/research/cadical-dependency.json @@ -0,0 +1,14 @@ +{ + "schema_version": 1, + "purpose": "W10 standalone external-propagation interface experiment", + "name": "CaDiCaL", + "version": "3.0.1", + "repository": "https://github.com/arminbiere/cadical.git", + "tag": "rel-3.0.1", + "commit": "c60730422e758ef1cebe7aeddf2dda31c996bf04", + "license": "MIT", + "automatic_download": false, + "linked_into_gecode": false, + "included_in_wheels": false, + "note": "The VERSION/build header identify 3.0.1; the upstream public header version macros still identify 3.0.0. Pin the commit rather than trusting those macros." +} diff --git a/tools/research/cadical_protocol.cpp b/tools/research/cadical_protocol.cpp new file mode 100644 index 0000000000..e88509c689 --- /dev/null +++ b/tools/research/cadical_protocol.cpp @@ -0,0 +1,260 @@ +/* W10 interface experiment. Not linked into Gecode or installed. + * An independently enumerated signed cardinality constraint exercises IPASIR-UP. + * This bounded fixture deliberately uses fixed-capacity callback storage. + */ +#include "cadical.hpp" +#include +#include +#include +#include +#include +#include + +#ifdef NDEBUG +#error "This protocol experiment requires assertions" +#endif + +namespace { +constexpr int capacity = 8; +struct Clause { + std::array literals{}; + std::size_t size = 0; + void push(int literal) { assert(size < literals.size()); literals[size++] = literal; } +}; +int variable(int literal) { assert(literal && literal != INT32_MIN); return literal < 0 ? -literal : literal; } +bool holds(int literal, unsigned assignment) { + const bool value = (assignment & (1u << (variable(literal) - 1))) != 0; + return literal > 0 ? value : !value; +} +bool holds(const Clause& clause, unsigned assignment) { + for (std::size_t i = 0; i < clause.size; ++i) + if (holds(clause.literals[i], assignment)) return true; + return false; +} +struct Counts { + std::uint64_t assignments = 0, decisions = 0, backtracks = 0; + std::uint64_t propagations = 0, reason_streams = 0, external_clauses = 0; + std::uint64_t checked_models = 0, rejected_models = 0, checked_lemmas = 0; + std::uint64_t nonchronological_backtracks = 0, delayed_reasons = 0; + Counts& operator+=(const Counts& b) { + assignments += b.assignments; decisions += b.decisions; backtracks += b.backtracks; + propagations += b.propagations; reason_streams += b.reason_streams; + external_clauses += b.external_clauses; checked_models += b.checked_models; + rejected_models += b.rejected_models; checked_lemmas += b.checked_lemmas; + nonchronological_backtracks += b.nonchronological_backtracks; + delayed_reasons += b.delayed_reasons; return *this; + } +}; + +class Cardinality final : public CaDiCaL::ExternalPropagator { + CaDiCaL::Solver& solver_; + int n_, limit_; + std::array terms_{}; + std::array values_{}; + std::array levels_{}; + std::array reasons_{}; + std::array reason_events_{}; + std::size_t level_ = 0, reason_cursor_ = 0, clause_cursor_ = 0; + int streaming_literal_ = 0; + std::uint64_t event_ = 0; + Clause pending_; + bool has_pending_ = false; + int value(int lit) const { const auto v = values_[variable(lit)]; return lit > 0 ? v : -v; } + std::size_t key(int lit) const { return static_cast(lit + capacity); } + void check_lemma(const Clause& clause) { + // The checker enumerates the original external constraint. It does not + // inspect the callback trail or trust the clause-generation arithmetic. + for (unsigned a = 0; a < (1u << n_); ++a) + if (satisfied(a)) assert(holds(clause, a)); + ++counts.checked_lemmas; + } + Clause true_prefix(int count) const { + Clause clause; + for (int i = 0; i < n_ && count; ++i) + if (value(terms_[i]) > 0) { clause.push(-terms_[i]); --count; } + assert(count == 0); return clause; + } +public: + Counts counts; + Cardinality(CaDiCaL::Solver& solver, int n, int limit, unsigned negative, bool lazy) + : solver_(solver), n_(n), limit_(limit) { + assert(n > 0 && n <= capacity && limit >= 0 && limit <= n); + is_lazy = lazy; + are_reasons_forgettable = false; // Explicit: header prose and default differ. + for (int i = 0; i < n; ++i) terms_[i] = (negative & (1u << i)) ? -(i + 1) : i + 1; + const int last = solver_.declare_more_variables(n); + assert(last == n); // Each fixture owns a fresh solver and all its variables. + solver_.connect_external_propagator(this); + for (int i = 1; i <= n; ++i) solver_.add_observed_var(i); + } + ~Cardinality() override { solver_.disconnect_external_propagator(); } + bool satisfied(unsigned assignment) const { + int count = 0; + for (int i = 0; i < n_; ++i) count += holds(terms_[i], assignment); + return count <= limit_; + } + void notify_assignment(const std::vector& literals) override { + ++event_; + for (int lit : literals) { + const int v = variable(lit); assert(v <= n_); + const int sign = lit > 0 ? 1 : -1; + assert(!values_[v] || values_[v] == sign); + if (!values_[v]) { values_[v] = sign; levels_[v] = level_; } + ++counts.assignments; + } + } + void notify_new_decision_level() override { ++event_; ++level_; ++counts.decisions; } + void notify_backtrack(std::size_t level) override { + ++event_; assert(level < level_); + if (level_ - level > 1) ++counts.nonchronological_backtracks; + for (int i = 1; i <= n_; ++i) if (values_[i] && levels_[i] > level) values_[i] = 0; + level_ = level; ++counts.backtracks; + // Reasons are immutable while assigned and are retained across backtracks. + // A later propagation of an unassigned literal may replace its old record. + } + int cb_decide() override { + ++event_; + for (int i = 0; i < n_; ++i) if (!value(terms_[i])) return terms_[i]; + return 0; + } + int cb_propagate() override { + ++event_; + int count = 0; + for (int i = 0; i < n_; ++i) count += value(terms_[i]) > 0; + if (count > limit_) { + pending_ = true_prefix(limit_ + 1); check_lemma(pending_); + has_pending_ = true; return 0; + } + if (count == limit_) for (int i = 0; i < n_; ++i) if (!value(terms_[i])) { + const int consequence = -terms_[i]; + auto clause = true_prefix(limit_); clause.push(consequence); check_lemma(clause); + reasons_[key(consequence)] = clause; reason_events_[key(consequence)] = event_; + ++counts.propagations; return consequence; + } + return 0; + } + int cb_add_reason_clause_lit(int propagated) override { + const auto& reason = reasons_[key(propagated)]; + assert(reason.size && reason.literals[reason.size - 1] == propagated); + if (!reason_cursor_) { + streaming_literal_ = propagated; ++counts.reason_streams; + if (event_ > reason_events_[key(propagated)] + 1) ++counts.delayed_reasons; + } + assert(streaming_literal_ == propagated); + if (reason_cursor_ < reason.size) return reason.literals[reason_cursor_++]; + reason_cursor_ = 0; streaming_literal_ = 0; return 0; + } + bool cb_check_found_model(const std::vector& model) override { + ++event_; ++counts.checked_models; + unsigned assignment = 0, seen = 0; + for (int lit : model) { + const auto v = variable(lit); assert(v <= n_); + const auto bit = 1u << (v - 1); assert(!(seen & bit)); seen |= bit; + if (lit > 0) assignment |= bit; + } + assert(seen == (1u << n_) - 1); + if (satisfied(assignment)) return true; + ++counts.rejected_models; + pending_ = Clause{}; + for (int i = 0; i < n_ && pending_.size < static_cast(limit_ + 1); ++i) + if (holds(terms_[i], assignment)) pending_.push(-terms_[i]); + assert(pending_.size == static_cast(limit_ + 1)); + check_lemma(pending_); has_pending_ = true; return false; + } + bool cb_has_external_clause(bool& forgettable) override { + forgettable = false; + if (has_pending_) { assert(!clause_cursor_); ++counts.external_clauses; } + return has_pending_; + } + int cb_add_external_clause_lit() override { + assert(has_pending_); + if (clause_cursor_ < pending_.size) return pending_.literals[clause_cursor_++]; + clause_cursor_ = 0; has_pending_ = false; return 0; + } +}; + +std::vector formula(int kind) { + if (!kind) return {}; + if (kind == 1) return {{{{1, 2}}, 2}, {{{-2, 3}}, 2}, {{{-3, 4}}, 2}}; + return {{{{1, 2, 3}}, 3}, {{{1, 2, -3}}, 3}, + {{{1, -2, 3}}, 3}, {{{-1, 2, 4}}, 3}, {{{-4, -2}}, 2}}; +} +bool oracle(const Cardinality& external, const std::vector& clauses, + const std::vector& assumptions, unsigned assignment) { + if (!external.satisfied(assignment)) return false; + for (const auto& c : clauses) if (!holds(c, assignment)) return false; + for (int a : assumptions) if (!holds(a, assignment)) return false; + return true; +} +struct Stop final : CaDiCaL::Terminator { + bool stopped = true; + std::uint64_t calls = 0; + bool terminate() override { ++calls; return stopped; } +}; +} + +int main() { + Counts total; std::uint64_t queries = 0, sat = 0, unsat = 0; + // Reuse a solver across all 3^4 partial assignments to expose stale reason, + // root-assignment, and failed-assumption lifetime errors. Repeat in reverse. + for (int chrono : {0, 1}) for (bool lazy : {false, true}) + for (unsigned negative : {0u, 5u, 15u}) for (int limit = 0; limit <= 4; ++limit) + for (int kind = 0; kind < 3; ++kind) { + CaDiCaL::Solver solver; + solver.set("quiet", 1); // A library compiled with -DQUIET has no option. + assert(solver.set("chrono", chrono)); + Cardinality external(solver, 4, limit, negative, lazy); + const auto clauses = formula(kind); + for (const auto& c : clauses) { + for (std::size_t i = 0; i < c.size; ++i) solver.add(c.literals[i]); + solver.add(0); + } + for (int pass = 0; pass < 2; ++pass) for (int ordinal = 0; ordinal < 81; ++ordinal) { + int code = pass ? 80 - ordinal : ordinal; + std::vector assumptions; + for (int i = 1; i <= 4; ++i) { + int digit = code % 3; code /= 3; + if (digit) { assumptions.push_back(digit == 1 ? i : -i); solver.assume(assumptions.back()); } + } + bool expected = false; + for (unsigned a = 0; a < 16; ++a) expected |= oracle(external, clauses, assumptions, a); + const int result = solver.solve(); ++queries; + assert(result == (expected ? 10 : 20)); + if (result == 10) { + ++sat; unsigned a = 0; + for (int i = 1; i <= 4; ++i) if (solver.val(i) > 0) a |= 1u << (i - 1); + assert(oracle(external, clauses, assumptions, a)); + } else ++unsat; + } + total += external.counts; + } + // An already requested cooperative stop must not masquerade as UNSAT. + // Stop checks may race with a trivial proof, so use a fresh nontrivial solve + // and assert the observed pinned-backend result, then resume the same owner. + { + CaDiCaL::Solver solver; solver.set("quiet", 1); + Cardinality external(solver, 8, 3, 0, false); + Stop stop; solver.connect_terminator(&stop); + const int first = solver.solve(); assert(first == 0 && stop.calls); + stop.stopped = false; + assert(solver.solve() == 10); + unsigned resumed = 0; + for (int i = 1; i <= 8; ++i) if (solver.val(i) > 0) resumed |= 1u << (i - 1); + assert(external.satisfied(resumed)); + solver.disconnect_terminator(); total += external.counts; + } + assert(total.propagations && total.reason_streams && total.external_clauses); + assert(total.rejected_models && total.backtracks && total.nonchronological_backtracks); + assert(total.delayed_reasons && total.checked_lemmas); + std::cout << "{\"schema_version\":1,\"experiment\":\"cadical-ipasir-up\"," + << "\"queries\":" << queries << ",\"sat\":" << sat << ",\"unsat\":" << unsat + << ",\"assignments\":" << total.assignments << ",\"decisions\":" << total.decisions + << ",\"backtracks\":" << total.backtracks + << ",\"nonchronological_backtracks\":" << total.nonchronological_backtracks + << ",\"propagations\":" << total.propagations << ",\"reason_streams\":" << total.reason_streams + << ",\"delayed_reasons\":" << total.delayed_reasons + << ",\"external_clauses\":" << total.external_clauses + << ",\"checked_models\":" << total.checked_models + << ",\"rejected_models\":" << total.rejected_models + << ",\"checked_lemmas\":" << total.checked_lemmas << ",\"status\":\"passed\"}\n"; +}